@smart-cloud/publisher-exporter 1.1.45 → 1.1.46

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 f from'path';import {gunzipSync}from'zlib';import yt,{createHash}from'crypto';import pr from'http';import gr from'https';import xr from'fast-glob';import {availableParallelism}from'os';import {Worker}from'worker_threads';var tr=".deploy-plan.json",rr="deploy-plan.json",sr=".crawl-incomplete.json",nr="crawl-incomplete.json";function st(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?f.resolve(e):""}function nt(e){let t=String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").trim(),r=f.posix.normalize(t);return !t||!r||r==="."||/^[a-zA-Z]:/.test(r)||r.startsWith("../")||r===".."?null:r}function ir(e){let t=String(e||"").trim();if(!t.startsWith("/")||t.startsWith("//")||t.includes("*")||t.includes("#"))return null;try{let r=new URL(t,"https://content-sync.invalid");return r.origin!=="https://content-sync.invalid"?null:`${f.posix.normalize(r.pathname)}${r.search}`}catch{return null}}function G(e){return [...new Set(e.map(nt).filter(t=>t!==null))]}function or(e,t){let r={generatedAt:String(t.generatedAt||new Date().toISOString()),outputDir:f.resolve(e.outputDir),runMode:t.runMode,crawlMode:t.crawlMode,fullSyncRequired:!!t.fullSyncRequired,changedFiles:G(t.changedFiles||[]),deletedFiles:G(t.deletedFiles||[]),rewriteTargets:G(t.rewriteTargets||[])};return t.schemaVersion===2?{...r,schemaVersion:2,runMode:"content-sync",crawlMode:"incremental",fullSyncRequired:false,consumerId:String(t.consumerId||"").trim(),fromSequence:Math.max(0,Number(t.fromSequence)||0),toSequence:Math.max(0,Number(t.toSequence)||0),impactHash:String(t.impactHash||"").trim(),uploadGroups:{assets:G(t.uploadGroups?.assets||[]),content:G(t.uploadGroups?.content||[]),listings:G(t.uploadGroups?.listings||[]),sitemapLeaves:G(t.uploadGroups?.sitemapLeaves||[]),sitemapIndexes:G(t.uploadGroups?.sitemapIndexes||[])},invalidationPaths:[...new Set((t.invalidationPaths||[]).map(ir).filter(s=>s!==null))].sort()}:{schemaVersion:1,...r,runMode:t.runMode}}function it(e){let t=f.join(f.resolve(e.outputDir),tr),r=st();return r?[f.join(r,rr),t]:[t]}function ot(e){let t=f.join(f.resolve(e.outputDir),sr),r=st();return r?[f.join(r,nr),t]:[t]}function Z(e,t){let r=f.resolve(e),s=f.resolve(t),n=f.relative(r,s).replace(/\\/g,"/");return nt(n)}async function Le(e,t){let r=or(e,t);for(let s of it(e)){await b.mkdir(f.dirname(s),{recursive:true});let n=`${s}.${process.pid}.${Date.now()}.tmp`;await b.writeFile(n,JSON.stringify(r,null,2),"utf8"),await b.rename(n,s);}}async function at(e){for(let t of it(e))try{await b.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}async function ut(e,t){let r={schemaVersion:1,startedAt:String(t.startedAt||new Date().toISOString()),outputDir:f.resolve(e.outputDir)};for(let s of ot(e)){await b.mkdir(f.dirname(s),{recursive:true});let n=`${s}.${process.pid}.tmp`;await b.writeFile(n,JSON.stringify(r,null,2),"utf8"),await b.rename(n,s);}}async function ct(e){for(let t of ot(e))try{await b.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}function ur(e){return new URL(e).pathname.split("/").filter(Boolean).some(r=>{try{return decodeURIComponent(r).endsWith("__trashed")}catch{return r.endsWith("__trashed")}})}function De(e){return Array.isArray(e)?e.map(De):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).sort(([t],[r])=>t.localeCompare(r)).map(([t,r])=>[t,De(r)])):e}function cr(e){return JSON.stringify(De(e))}function lr(e){return createHash("sha256").update(cr(e)).digest("hex")}function lt(e){let{impactHash:t,...r}=e;if(e.schemaVersion!==1||!t)throw new Error("Invalid content-sync impact plan schema.");if(lr(r)!==t)throw new Error("Content-sync impact plan hash mismatch.");for(let s of [...e.directRenderUrls,...e.deleteUrls])if(ur(s))throw new Error(`Content-sync impact contains a WordPress trash alias instead of the last public URL: ${s}`)}function pt(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function hr(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 Fe(e){return !e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).map(([t,r])=>[t.trim(),String(r??"")]).filter(([t])=>t.length>0))}function fr(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 o=pt(i.targetOrigin);o&&(u.targetOrigin=o);}let c=Fe(i.extraReplacements);if(Object.keys(c).length>0&&(u.extraReplacements=c),i.s3&&typeof i.s3=="object"){let o={},a=i.s3;typeof a.bucket=="string"&&(o.bucket=a.bucket.trim()),typeof a.prefix=="string"&&(o.prefix=a.prefix.trim()),typeof a.region=="string"&&(o.region=a.region.trim()),typeof a.htmlCacheControl=="string"&&(o.htmlCacheControl=a.htmlCacheControl.trim()),typeof a.assetCacheControl=="string"&&(o.assetCacheControl=a.assetCacheControl.trim()),Object.keys(o).length>0&&(u.s3=o);}if(i.cloudFront&&typeof i.cloudFront=="object"){let o={},a=i.cloudFront;typeof a.distributionId=="string"&&(o.distributionId=a.distributionId.trim()),Array.isArray(a.invalidationPaths)&&(o.invalidationPaths=a.invalidationPaths.map(p=>String(p??"").trim()).filter(p=>p.length>0)),Object.keys(o).length>0&&(u.cloudFront=o);}t[n]=u;}return t}function Ee(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function mr(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"&&s!=="content-sync")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(),c=String(r.url??"").trim(),o=Array.isArray(r.postTypes)?[...new Set(r.postTypes.map(p=>String(p??"").trim().toLowerCase().replace(/[^a-z0-9_-]/g,"")).filter(Boolean))]:[],a=Array.isArray(r.listingPaths)?[...new Set(r.listingPaths.map(p=>String(p??"").trim()).filter(Boolean))]:[];return s==="content-sync"&&o.length===0?null:{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"||s==="content-sync")&&u?{deploymentProfile:u}:{},...c?{url:c}:{},...o.length>0?{postTypes:o}:{},...a.length>0?{listingPaths:a}:{},...typeof r.includeSubsites=="boolean"?{includeSubsites:r.includeSubsites}:{},...typeof r.includePostTypeArchives=="boolean"?{includePostTypeArchives:r.includePostTypeArchives}:{},...typeof r.includeTaxonomyArchives=="boolean"?{includeTaxonomyArchives:r.includeTaxonomyArchives}:{},...typeof r.includeAuthorArchives=="boolean"?{includeAuthorArchives:r.includeAuthorArchives}:{},...typeof r.includeDateArchives=="boolean"?{includeDateArchives:r.includeDateArchives}:{},...typeof r.includePostsPage=="boolean"?{includePostsPage:r.includePostsPage}:{},...typeof r.includeSitemapChain=="boolean"?{includeSitemapChain:r.includeSitemapChain}:{}}}function gt(e){let t=e&&typeof e=="object"?e:{},r=Array.isArray(t.rules)?t.rules.map((s,n)=>mr(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 wr(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 Oe(e){let t=e&&typeof e=="object"?e:{},r=String(t.accountId??"").trim(),s=String(t.siteId??"").trim(),n=t.subscriber===true,i=wr(t.siteSettings),u={...i??{},...r?{accountId:i?.accountId??r}:{},...s?{siteId:i?.siteId??s}:{},...i?.subscriber===true||n?{subscriber:true}:{}},c={},o=String(t.apiBase??"").trim();o&&(c.apiBase=o);let a=String(t.runtimeToken??t.nonce??"").trim();a&&(c.runtimeToken=a);let p=String(t.virtualAssetBaseUrl??t.uploadUrl??"").trim();p&&(c.virtualAssetBaseUrl=p),Object.keys(u).length>0&&(c.siteSettings=u);let d=Ee(t.subscriptionType);return d&&(c.subscriptionType=d),c}function yr(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function ht(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function Pr(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 ft(e,t,r=5){let s=new URL(ht(e)),n=String(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase(),i=s.protocol==="http:"?pr:gr,u=Pr(e,t);return await new Promise((c,o)=>{let a=i.request(s,{method:n,headers:Object.fromEntries(u.entries()),...s.protocol==="https:"?{rejectUnauthorized:false}:{}},p=>{let d=[];p.on("data",l=>{d.push(Buffer.isBuffer(l)?l:Buffer.from(l));}),p.on("error",o),p.on("end",()=>{let l=p.statusCode??0,m=p.headers.location;if(r>0&&m&&[301,302,303,307,308].includes(l)){c(ft(new URL(m,s),{method:l===303?"GET":n},r-1));return}let y=new Headers;for(let[w,g]of Object.entries(p.headers))Array.isArray(g)?y.set(w,g.join(", ")):typeof g=="string"&&y.set(w,g);c(new Response(Buffer.concat(d),{status:l,statusText:p.statusMessage??"",headers:y}));});});a.on("error",o),a.end();})}function Sr(e){let t=Oe(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.virtualAssetBaseUrl??t.uploadUrl??"").trim();if(e.wpsuite={...t.apiBase?{apiBase:t.apiBase}:{},...t.runtimeToken?{runtimeToken:t.runtimeToken}:{},...i?{virtualAssetBaseUrl:i}:{},...Object.keys(r).length>0?{siteSettings:r}:{},...t.subscriptionType?{subscriptionType:t.subscriptionType}:{}},!s||!n||!i)return false;yr(e.sourceOrigin);let u=globalThis,o={...u.WpSuite??{},siteSettings:r,uploadUrl:i};return t.apiBase&&(o.apiBase=t.apiBase),u.WpSuite=o,true}async function br(e){let t=String(e.wpsuite?.virtualAssetBaseUrl??e.wpsuite?.uploadUrl??"").trim();if(!Sr(e)){let n=e.wpsuite?.siteSettings,i=[String(n?.accountId??"").trim()?"":"accountId",String(n?.siteId??"").trim()?"":"siteId",t?"":"virtualAssetBaseUrl"].filter(Boolean);return {remote:null,diagnostic:{status:"invalid-runtime",virtualAssetBaseUrl:t,subscriptionType:null,error:`Missing WP Suite runtime field(s): ${i.join(", ")}.`,requests:[]}}}let r=globalThis.fetch,s=[];try{typeof r=="function"&&/^https?:\/\//i.test(t)&&(globalThis.fetch=(async(o,a)=>{let p=ht(o);if(p.startsWith(t)){let d=(()=>{try{return new URL(p).pathname}catch{return p}})();try{let l=e.ignoreHttpsErrors&&p.startsWith("https://")?await ft(o,a):await r(o,a);return s.push({path:d,status:l.status,ok:l.ok,error:null}),l}catch(l){throw s.push({path:d,status:null,ok:!1,error:l instanceof Error?l.message:String(l)}),l}}return r(o,a)}));let{getConfig:n}=await import('@smart-cloud/wpsuite-core'),i=await n("publisher"),u=i&&typeof i=="object"?i:null,c=Ee(u?.subscriptionType);return {remote:u,diagnostic:{status:u?"loaded":"unavailable",virtualAssetBaseUrl:t,subscriptionType:c??null,error:u?null:"WP Suite publisher config loader returned no configuration.",requests:s}}}catch(n){return {remote:null,diagnostic:{status:"unavailable",virtualAssetBaseUrl:t,subscriptionType:null,error:n instanceof Error?n.message:String(n),requests:s}}}finally{typeof r=="function"&&(globalThis.fetch=r);}}function vr(e,t){let r=fr(t?.deploymentProfiles),s=String(t?.defaultDeploymentProfile??"").trim(),n=r[s]?s:"",i=Ee(t?.subscriptionType),u=Oe(e.wpsuite);return {...e,scheduler:gt(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 Ue(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 Cr(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?f.resolve(e):""}function dt(e,t,r){let s=String(t||"").trim();return s&&f.isAbsolute(s)?f.resolve(s):f.resolve(e,Ue(s,r))}async function be(e,t={}){let r=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",s=await b.readFile(r,"utf8"),n=JSON.parse(s);n.sourceOrigin=n.sourceOrigin.replace(/\/$/,""),n.targetOrigin=pt(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=hr(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=Fe(n.extraReplacements),n.postCrawlCopyMap=Fe(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=Oe(n.wpsuite),n.scheduler=gt(void 0),n.deploymentProfiles={},n.defaultDeploymentProfile="",n.deploymentTargetOverride=String(n.deploymentTargetOverride??"").trim();let i=await br(n);t.onRemotePublisherConfigDiagnostic?.(i.diagnostic);let u=vr(n,i.remote),c=Cr(),o=c?f.resolve(c,".."):"";return o?(u.outputDir=dt(o,u.outputDir,"export"),u.logDir=dt(o,u.logDir,"logs")):(f.isAbsolute(u.outputDir)||(u.outputDir=Ue(u.outputDir,"export")),f.isAbsolute(u.logDir)||(u.logDir=Ue(u.logDir,"logs"))),u}function pe(e,t=10){return yt.createHash("sha1").update(e).digest("hex").slice(0,t)}async function Rr(e){await b.mkdir(f.dirname(e),{recursive:true});}async function ge(e,t,r){await Rr(e);let s=f.join(f.dirname(e),`.${f.basename(e)}.${process.pid}.${Date.now()}.${yt.randomBytes(6).toString("hex")}.tmp`);try{typeof t=="string"?await b.writeFile(s,t,r??"utf8"):await b.writeFile(s,t),await b.rename(s,e);}catch(n){throw await b.unlink(s).catch(()=>{}),n}}function X(e){return [".html",".htm",".css",".js",".mjs",".json",".xml",".xsl",".txt",".svg",".map",".enc",".jws"].includes(f.extname(e).toLowerCase())}function H(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 oe(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function ve(e){return e.replace(/\//g,"\\/")}function mt(e){return e.replace(/\//g,"\\\\/")}function Ar(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 wt(e,t,r){if(!t)return;e[t]=r;let s=ve(t),n=ve(r);e[s]=n;let i=mt(t),u=mt(r);e[i]=u;let c=oe(t),o=oe(r);e[c]=o;let a=oe(s),p=oe(n);e[a]=p;let d=oe(i),l=oe(u);e[d]=l;}function Ce(e,t,r){wt(e,t,r);let s=Ar(t);s&&s!==t&&wt(e,s,r);}function je(e,t){let r=t.startsWith("/")?t:`/${t}`,s=(e||"").replace(/\/$/,"");return !s||s==="."||s==="/"?r:`${s}${r}`}function Pt(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function St(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 Mr=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],$r=new Set([".html",".htm"]),bt="WPSuite.io Static Publisher",Lr=bt.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function Dr(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Fr(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function Ur(e,t,r){return Fr(t)?e.replace(new RegExp(`(?<!:)${Dr(t)}`,"g"),r):e.split(t).join(r)}function Er(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 $r.has(n)?/<head\b|<html\b|<!doctype html/i.test(t):false}function Or(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${Lr}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${bt}" />`;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 v from'fs/promises';import f from'path';import {gunzipSync}from'zlib';import St,{createHash}from'crypto';import Pr from'http';import Sr from'https';import Dr from'fast-glob';import {availableParallelism}from'os';import {Worker}from'worker_threads';var ur=".deploy-plan.json",cr="deploy-plan.json",lr=".crawl-incomplete.json",dr="crawl-incomplete.json";function it(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?f.resolve(e):""}function ot(e){let t=String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").trim(),r=f.posix.normalize(t);return !t||!r||r==="."||/^[a-zA-Z]:/.test(r)||r.startsWith("../")||r===".."?null:r}function pr(e){let t=String(e||"").trim();if(!t.startsWith("/")||t.startsWith("//")||t.includes("*")||t.includes("#"))return null;try{let r=new URL(t,"https://content-sync.invalid");return r.origin!=="https://content-sync.invalid"?null:`${f.posix.normalize(r.pathname)}${r.search}`}catch{return null}}function G(e){return [...new Set(e.map(ot).filter(t=>t!==null))]}function gr(e,t){let r={generatedAt:String(t.generatedAt||new Date().toISOString()),outputDir:f.resolve(e.outputDir),runMode:t.runMode,crawlMode:t.crawlMode,fullSyncRequired:!!t.fullSyncRequired,changedFiles:G(t.changedFiles||[]),deletedFiles:G(t.deletedFiles||[]),rewriteTargets:G(t.rewriteTargets||[])};return t.schemaVersion===2?{...r,schemaVersion:2,runMode:"content-sync",crawlMode:"incremental",fullSyncRequired:false,consumerId:String(t.consumerId||"").trim(),fromSequence:Math.max(0,Number(t.fromSequence)||0),toSequence:Math.max(0,Number(t.toSequence)||0),impactHash:String(t.impactHash||"").trim(),uploadGroups:{assets:G(t.uploadGroups?.assets||[]),content:G(t.uploadGroups?.content||[]),listings:G(t.uploadGroups?.listings||[]),sitemapLeaves:G(t.uploadGroups?.sitemapLeaves||[]),sitemapIndexes:G(t.uploadGroups?.sitemapIndexes||[])},invalidationPaths:[...new Set((t.invalidationPaths||[]).map(pr).filter(s=>s!==null))].sort()}:{schemaVersion:1,...r,runMode:t.runMode}}function at(e){let t=f.join(f.resolve(e.outputDir),ur),r=it();return r?[f.join(r,cr),t]:[t]}function ut(e){let t=f.join(f.resolve(e.outputDir),lr),r=it();return r?[f.join(r,dr),t]:[t]}function Z(e,t){let r=f.resolve(e),s=f.resolve(t),n=f.relative(r,s).replace(/\\/g,"/");return ot(n)}async function Fe(e,t){let r=gr(e,t);for(let s of at(e)){await v.mkdir(f.dirname(s),{recursive:true});let n=`${s}.${process.pid}.${Date.now()}.tmp`;await v.writeFile(n,JSON.stringify(r,null,2),"utf8"),await v.rename(n,s);}}async function ct(e){for(let t of at(e))try{await v.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}async function lt(e,t){let r={schemaVersion:1,startedAt:String(t.startedAt||new Date().toISOString()),outputDir:f.resolve(e.outputDir)};for(let s of ut(e)){await v.mkdir(f.dirname(s),{recursive:true});let n=`${s}.${process.pid}.tmp`;await v.writeFile(n,JSON.stringify(r,null,2),"utf8"),await v.rename(n,s);}}async function dt(e){for(let t of ut(e))try{await v.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}function fr(e){return new URL(e).pathname.split("/").filter(Boolean).some(r=>{try{return decodeURIComponent(r).endsWith("__trashed")}catch{return r.endsWith("__trashed")}})}function Ee(e){return Array.isArray(e)?e.map(Ee):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).sort(([t],[r])=>t.localeCompare(r)).map(([t,r])=>[t,Ee(r)])):e}function mr(e){return JSON.stringify(Ee(e))}function wr(e){return createHash("sha256").update(mr(e)).digest("hex")}function pt(e){let{impactHash:t,...r}=e;if(e.schemaVersion!==1||!t)throw new Error("Invalid content-sync impact plan schema.");if(wr(r)!==t)throw new Error("Content-sync impact plan hash mismatch.");for(let s of [...e.directRenderUrls,...e.deleteUrls])if(fr(s))throw new Error(`Content-sync impact contains a WordPress trash alias instead of the last public URL: ${s}`)}function ht(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function br(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 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 vr(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 o=ht(i.targetOrigin);o&&(u.targetOrigin=o);}let c=Oe(i.extraReplacements);if(Object.keys(c).length>0&&(u.extraReplacements=c),i.s3&&typeof i.s3=="object"){let o={},a=i.s3;typeof a.bucket=="string"&&(o.bucket=a.bucket.trim()),typeof a.prefix=="string"&&(o.prefix=a.prefix.trim()),typeof a.region=="string"&&(o.region=a.region.trim()),typeof a.htmlCacheControl=="string"&&(o.htmlCacheControl=a.htmlCacheControl.trim()),typeof a.assetCacheControl=="string"&&(o.assetCacheControl=a.assetCacheControl.trim()),Object.keys(o).length>0&&(u.s3=o);}if(i.cloudFront&&typeof i.cloudFront=="object"){let o={},a=i.cloudFront;typeof a.distributionId=="string"&&(o.distributionId=a.distributionId.trim()),Array.isArray(a.invalidationPaths)&&(o.invalidationPaths=a.invalidationPaths.map(l=>String(l??"").trim()).filter(l=>l.length>0)),Object.keys(o).length>0&&(u.cloudFront=o);}t[n]=u;}return t}function qe(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function Cr(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"&&s!=="content-sync")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(),c=String(r.url??"").trim(),o=Array.isArray(r.postTypes)?[...new Set(r.postTypes.map(l=>String(l??"").trim().toLowerCase().replace(/[^a-z0-9_-]/g,"")).filter(Boolean))]:[],a=Array.isArray(r.listingPaths)?[...new Set(r.listingPaths.map(l=>String(l??"").trim()).filter(Boolean))]:[];return s==="content-sync"&&o.length===0?null:{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"||s==="content-sync")&&u?{deploymentProfile:u}:{},...c?{url:c}:{},...o.length>0?{postTypes:o}:{},...a.length>0?{listingPaths:a}:{},...typeof r.includeSubsites=="boolean"?{includeSubsites:r.includeSubsites}:{},...typeof r.includePostTypeArchives=="boolean"?{includePostTypeArchives:r.includePostTypeArchives}:{},...typeof r.includeTaxonomyArchives=="boolean"?{includeTaxonomyArchives:r.includeTaxonomyArchives}:{},...typeof r.includeAuthorArchives=="boolean"?{includeAuthorArchives:r.includeAuthorArchives}:{},...typeof r.includeDateArchives=="boolean"?{includeDateArchives:r.includeDateArchives}:{},...typeof r.includePostsPage=="boolean"?{includePostsPage:r.includePostsPage}:{},...typeof r.includeSitemapChain=="boolean"?{includeSitemapChain:r.includeSitemapChain}:{}}}function ft(e){let t=e&&typeof e=="object"?e:{},r=Array.isArray(t.rules)?t.rules.map((s,n)=>Cr(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 Rr(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 Ne(e){let t=e&&typeof e=="object"?e:{},r=String(t.accountId??"").trim(),s=String(t.siteId??"").trim(),n=t.subscriber===true,i=Rr(t.siteSettings),u={...i??{},...r?{accountId:i?.accountId??r}:{},...s?{siteId:i?.siteId??s}:{},...i?.subscriber===true||n?{subscriber:true}:{}},c={},o=String(t.apiBase??"").trim();o&&(c.apiBase=o);let a=String(t.runtimeToken??t.nonce??"").trim();a&&(c.runtimeToken=a);let l=String(t.virtualAssetBaseUrl??t.uploadUrl??"").trim();l&&(c.virtualAssetBaseUrl=l),Object.keys(u).length>0&&(c.siteSettings=u);let p=qe(t.subscriptionType);return p&&(c.subscriptionType=p),c}function Ar(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function mt(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function kr(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 wt(e,t,r=5){let s=new URL(mt(e)),n=String(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase(),i=s.protocol==="http:"?Pr:Sr,u=kr(e,t);return await new Promise((c,o)=>{let a=i.request(s,{method:n,headers:Object.fromEntries(u.entries()),...s.protocol==="https:"?{rejectUnauthorized:false}:{}},l=>{let p=[];l.on("data",d=>{p.push(Buffer.isBuffer(d)?d:Buffer.from(d));}),l.on("error",o),l.on("end",()=>{let d=l.statusCode??0,m=l.headers.location;if(r>0&&m&&[301,302,303,307,308].includes(d)){c(wt(new URL(m,s),{method:d===303?"GET":n},r-1));return}let S=new Headers;for(let[w,g]of Object.entries(l.headers))Array.isArray(g)?S.set(w,g.join(", ")):typeof g=="string"&&S.set(w,g);c(new Response(Buffer.concat(p),{status:d,statusText:l.statusMessage??"",headers:S}));});});a.on("error",o),a.end();})}function xr(e){let t=Ne(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.virtualAssetBaseUrl??t.uploadUrl??"").trim();if(e.wpsuite={...t.apiBase?{apiBase:t.apiBase}:{},...t.runtimeToken?{runtimeToken:t.runtimeToken}:{},...i?{virtualAssetBaseUrl:i}:{},...Object.keys(r).length>0?{siteSettings:r}:{},...t.subscriptionType?{subscriptionType:t.subscriptionType}:{}},!s||!n||!i)return false;Ar(e.sourceOrigin);let u=globalThis,o={...u.WpSuite??{},siteSettings:r,uploadUrl:i};return t.apiBase&&(o.apiBase=t.apiBase),u.WpSuite=o,true}async function Tr(e){let t=String(e.wpsuite?.virtualAssetBaseUrl??e.wpsuite?.uploadUrl??"").trim();if(!xr(e)){let n=e.wpsuite?.siteSettings,i=[String(n?.accountId??"").trim()?"":"accountId",String(n?.siteId??"").trim()?"":"siteId",t?"":"virtualAssetBaseUrl"].filter(Boolean);return {remote:null,diagnostic:{status:"invalid-runtime",virtualAssetBaseUrl:t,subscriptionType:null,error:`Missing WP Suite runtime field(s): ${i.join(", ")}.`,requests:[]}}}let r=globalThis.fetch,s=[];try{typeof r=="function"&&/^https?:\/\//i.test(t)&&(globalThis.fetch=(async(o,a)=>{let l=mt(o);if(l.startsWith(t)){let p=(()=>{try{return new URL(l).pathname}catch{return l}})();try{let d=e.ignoreHttpsErrors&&l.startsWith("https://")?await wt(o,a):await r(o,a);return s.push({path:p,status:d.status,ok:d.ok,error:null}),d}catch(d){throw s.push({path:p,status:null,ok:!1,error:d instanceof Error?d.message:String(d)}),d}}return r(o,a)}));let{getConfig:n}=await import('@smart-cloud/wpsuite-core'),i=await n("publisher"),u=i&&typeof i=="object"?i:null,c=qe(u?.subscriptionType);return {remote:u,diagnostic:{status:u?"loaded":"unavailable",virtualAssetBaseUrl:t,subscriptionType:c??null,error:u?null:"WP Suite publisher config loader returned no configuration.",requests:s}}}catch(n){return {remote:null,diagnostic:{status:"unavailable",virtualAssetBaseUrl:t,subscriptionType:null,error:n instanceof Error?n.message:String(n),requests:s}}}finally{typeof r=="function"&&(globalThis.fetch=r);}}function Ir(e,t){let r=vr(t?.deploymentProfiles),s=String(t?.defaultDeploymentProfile??"").trim(),n=r[s]?s:"",i=qe(t?.subscriptionType),u=Ne(e.wpsuite);return {...e,scheduler:ft(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 je(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 Mr(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?f.resolve(e):""}function gt(e,t,r){let s=String(t||"").trim();return s&&f.isAbsolute(s)?f.resolve(s):f.resolve(e,je(s,r))}async function Ce(e,t={}){let r=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",s=await v.readFile(r,"utf8"),n=JSON.parse(s);n.sourceOrigin=n.sourceOrigin.replace(/\/$/,""),n.targetOrigin=ht(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=br(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=Ne(n.wpsuite),n.scheduler=ft(void 0),n.deploymentProfiles={},n.defaultDeploymentProfile="",n.deploymentTargetOverride=String(n.deploymentTargetOverride??"").trim();let i=await Tr(n);t.onRemotePublisherConfigDiagnostic?.(i.diagnostic);let u=Ir(n,i.remote),c=Mr(),o=c?f.resolve(c,".."):"";return o?(u.outputDir=gt(o,u.outputDir,"export"),u.logDir=gt(o,u.logDir,"logs")):(f.isAbsolute(u.outputDir)||(u.outputDir=je(u.outputDir,"export")),f.isAbsolute(u.logDir)||(u.logDir=je(u.logDir,"logs"))),u}function we(e,t=10){return St.createHash("sha1").update(e).digest("hex").slice(0,t)}async function $r(e){await v.mkdir(f.dirname(e),{recursive:true});}async function ye(e,t,r){await $r(e);let s=f.join(f.dirname(e),`.${f.basename(e)}.${process.pid}.${Date.now()}.${St.randomBytes(6).toString("hex")}.tmp`);try{typeof t=="string"?await v.writeFile(s,t,r??"utf8"):await v.writeFile(s,t),await v.rename(s,e);}catch(n){throw await v.unlink(s).catch(()=>{}),n}}function X(e){return [".html",".htm",".css",".js",".mjs",".json",".xml",".xsl",".txt",".svg",".map",".enc",".jws"].includes(f.extname(e).toLowerCase())}function Q(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 ae(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function Re(e){return e.replace(/\//g,"\\/")}function yt(e){return e.replace(/\//g,"\\\\/")}function Lr(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 Pt(e,t,r){if(!t)return;e[t]=r;let s=Re(t),n=Re(r);e[s]=n;let i=yt(t),u=yt(r);e[i]=u;let c=ae(t),o=ae(r);e[c]=o;let a=ae(s),l=ae(n);e[a]=l;let p=ae(i),d=ae(u);e[p]=d;}function Ae(e,t,r){Pt(e,t,r);let s=Lr(t);s&&s!==t&&Pt(e,s,r);}function We(e,t){let r=t.startsWith("/")?t:`/${t}`,s=(e||"").replace(/\/$/,"");return !s||s==="."||s==="/"?r:`${s}${r}`}function bt(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function vt(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/"],jr=new Set([".html",".htm"]),Ct="WPSuite.io Static Publisher",qr=Ct.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function Nr(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Wr(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function _r(e,t,r){return Wr(t)?e.replace(new RegExp(`(?<!:)${Nr(t)}`,"g"),r):e.split(t).join(r)}function Br(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 jr.has(n)?/<head\b|<html\b|<!doctype html/i.test(t):false}function Qr(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${qr}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${Ct}" />`;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 jr(e){let t=H(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function qr(e,t){let r=[...new Set(t)].filter(i=>i.includes("/")&&!/\\+\//.test(i)).map(i=>[i,ve(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[c,o]of r)u=u.split(c).join(o);return u},n=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(i,u,c,o)=>`${u}${s(c)}${o}`);return n=n.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(i,u,c,o,a)=>jr(o)?`${u}${s(o)}${a}`:i),n}function Nr(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=Nr(t,r);if(!s)return e;let n=e;for(let i of Mr){let u=i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),c=new RegExp(`(?:\\.{1,}/)+${u}`,"g"),o=new RegExp(`(?<!\\.)/${u}`,"g");n=n.replace(c,`${s}${i}`).replace(o,`${s}${i}`);let a=i.replace(/\//g,"\\/"),p=s.replace(/\//g,"\\/"),d=a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),l=new RegExp(`(?:\\.{1,}\\\\/)+${d}`,"g"),m=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${d}`,"g"),y=new RegExp(`(?<![\\.\\\\])\\/${d}`,"g");n=n.replace(l,`${p}${a}`).replace(m,`${p}${a}`).replace(y,`${p}${a}`);}return n}function Ne(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:Pt(t,e.targetOrigin),i=s?`${s.search}${s.hash}`:"";return e.urlRewriteMode==="root-relative"?`${n}${i}`:`${St(e.outputDir,r,n)}${i}`}function qe(e,t,r,s,n){Ce(e,r,Ne(t,s,n));}function _r(e,t,r,s,n){if(!r||r===s)return;Ce(e,r,s);let i=Ne(t,r,n),u=Ne(t,s,n);Ce(e,i,u);}function We(e,t,r,s,n={}){let i=e,u={};qe(u,t,t.sourceOrigin,t.targetOrigin,s);for(let[o,a]of Object.entries(t.extraReplacements))qe(u,t,o,a,s);for(let[o,a]of Object.entries(r))qe(u,t,o,a,s);for(let[o,a]of Object.entries(n)){let p=r[o];!p||p===a||_r(u,t,a,p,s);}let c=Object.entries(u).sort((o,a)=>a[0].length-o[0].length);for(let[o,a]of c)i=Ur(i,o,a);return t.urlRewriteMode!=="absolute"&&(i=Wr(i,t,s)),i=qr(i,c.map(([,o])=>o)),Er(t,i,s)&&(i=Or(i)),i}async function Qr(e,t,r,s){let n=f.join(e.outputDir,s),i=f.extname(n).toLowerCase(),u;try{u=await b.readFile(n,"utf8");}catch(a){if(a.code!=="ENOENT")throw a;return {changed:false}}let o=We(u,e,t,i===".js"||i===".mjs"?void 0:n,r);return o!==u?(await ge(n,o,"utf8"),{changed:true}):{changed:false}}async function Br(e,t){return await new Promise((r,s)=>{let n=o=>{if(c(),o?.error){s(new Error(o.error));return}r({changed:!!o?.changed});},i=o=>{c(),s(o);},u=o=>{c(),o!==0&&s(new Error(`Rewrite worker exited with code ${o}.`));},c=()=>{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 vt(e,t,r={}){let n=(r.files?[...new Set(r.files)].map(l=>f.resolve(l)).filter(l=>l.startsWith(f.resolve(e.outputDir))).map(l=>f.relative(e.outputDir,l).replace(/\\/g,"/")).filter(l=>l.length>0):await xr(["**/*"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(l=>l!=="asset-map.json"&&X(l)),i=0;if(n.length===0)return 0;let u=Math.max(1,Number(e.rewriteConcurrency||e.assetDownloadConcurrency||1)),c=Math.max(1,Math.min(u,n.length,availableParallelism()));await r.onStart?.({totalFiles:n.length,workerCount:c});let o=0,a=0,p=null;if(c===1){for(let l of n){let m=await Qr(e,t,r.previousAssetMap??{},l);m.changed&&(i+=1),a+=1,await r.onProgress?.({index:a,totalFiles:n.length,changedTextFiles:i,file:l,changed:m.changed});}return i}let d=Array.from({length:c},async()=>{let l=new Worker(new URL("./rewrite-worker.js",import.meta.url),{workerData:{config:e,assetMap:t,previousAssetMap:r.previousAssetMap??{}}});try{for(;!p;){let m=o;if(m>=n.length)return;o+=1;let y=n[m],w=await Br(l,y);w.changed&&(i+=1),a+=1,await r.onProgress?.({index:a,totalFiles:n.length,changedTextFiles:i,file:y,changed:w.changed});}}catch(m){throw p=m instanceof Error?m:new Error(String(m)),p}finally{await l.terminate().catch(()=>{});}});return await Promise.all(d),i}var ee={error:0,warn:1,info:2,debug:3},Hr=/^(?:authorization|proxyAuthorization|runtimeToken|siteKey|nonce|accessToken|refreshToken|accessKeyId|secretAccessKey|sessionToken|xStaticPublisherToken|xApiKey)$/i;function z(e){return e.replace(/((?:x-static-publisher-token|authorization|proxy-authorization|x-api-key|aws-access-key-id|aws-secret-access-key|aws-session-token)\s*:\s*)[^\r\n]+/gi,"$1[REDACTED]").replace(/\b(Basic|Bearer)\s+[^\s]+/gi,"$1 [REDACTED]").replace(/([?&](?:token|access_token|refresh_token|api_key|key|nonce)=)[^&\s]+/gi,"$1[REDACTED]").replace(/((?:"|')?(?:runtimeToken|siteKey|nonce|accessToken|refreshToken|accessKeyId|secretAccessKey|sessionToken)(?:"|')?\s*[:=]\s*(?:"|'))[^"']+/gi,"$1[REDACTED]")}function Ae(e){return typeof e=="string"?z(e):Array.isArray(e)?e.map(t=>Ae(t)):e instanceof Error?{name:e.name,message:z(e.message),...e.stack?{stack:z(e.stack)}:{}}:e&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,r])=>[t,Hr.test(t)?"[REDACTED]":Ae(r)])):e}function _e(e){return e?Ae(e):void 0}var Ct=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",Re=Ct?f.join(Ct,"current-progress.json"):"",Rt=Promise.resolve();function At(e){return e.includes("crawl")?"crawl":e.includes("deploy")?"deploy":e.includes("invalidate")?"invalidate":e}function zr(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 Jr(e,t,r){Re&&(Rt=Rt.then(async()=>{let s=new Date,n=s.toISOString();await b.mkdir(f.dirname(Re),{recursive:true});let i=await b.readFile(Re,"utf8").then(h=>JSON.parse(h)).catch(()=>null),u=i&&typeof i.details=="object"&&i.details?i.details:{},c=At(e),o=i?.currentStep||At(i?.source||""),a=i?.startedAt||n,p={...i?.stepDurationsSec??{}},d=i?.stepStartedAt||n;if(o&&o!==c&&i?.stepStartedAt){let h=Math.max(0,Math.round((s.getTime()-new Date(i.stepStartedAt).getTime())/1e3));p[o]=(p[o]??0)+h,d=n;}let l=Math.max(0,Math.round((s.getTime()-new Date(d).getTime())/1e3)),m=Math.max(0,Math.round((s.getTime()-new Date(a).getTime())/1e3)),y=z(t),w=_e(r)??{},g={checkedAt:n,source:e,message:y,details:zr(u,w),startedAt:a,currentStep:c,stepStartedAt:d,stepElapsedSec:l,totalElapsedSec:m,stepDurationsSec:p};await b.writeFile(Re,JSON.stringify(g,null,2),"utf8");}).catch(()=>{}));}async function Vr(e,t){await b.mkdir(f.dirname(e),{recursive:true}),await b.appendFile(e,`${JSON.stringify(Ae(t))}
5
- `,"utf8");}function Gr(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){let s=_e(r);return {checkedAt:new Date().toISOString(),currentStep:Gr(e,s),level:e,message:z(t),details:s??{}}}var ae=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 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(()=>Vr(t,r));}updateCurrentEvent(t,r,s){let n=Kr(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=z(r),i=_e(s),u=JSON.stringify({time:new Date().toISOString(),level:t,message:n,...i||{}});this.enqueueLine(u),this.updateCurrentEvent(t,n,i),t==="error"?console.error(n,i||""):t==="warn"?console.warn(n,i||""):(ee[this.level]>=ee.debug||["summary","page","sitemap","asset","timing"].includes(t))&&console.log(n);}info(t,r){this.push("info",t,r);}debug(t,r){ee[this.level]<ee.debug||this.push("debug",t,r);}progress(t,r){Jr("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),ee[this.level]>=ee.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),ee[this.level]>=ee.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 Qe="(?: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)";function xt(e){return !!e&&/^(?:\.{1,2}\/)?[A-Za-z0-9@_][A-Za-z0-9@._/-]*\.(?:js|mjs)(?:[?#][^\s<>\\]*)?$/i.test(e)&&!e.startsWith("/")&&!e.startsWith("//")&&!/^[a-z][a-z0-9+.-]*:/i.test(e)&&!/(?:^|\/)node_modules(?:\/|$)|(?:^|\/)\.pnpm(?:\/|$)/i.test(e)}function Tt(e){let t=new Set,r=[],s=/\bimport\s*\(\s*["'`]([^"'`\s<>\\]+)["'`]\s*\)/g,n=/\b(?:[A-Za-z_$][\w$]*\.)?u\s*=\s*(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>\s*["'`]([^"'`\s<>\\]+)["'`]/g;for(let i of e.matchAll(s))i[1]&&xt(i[1])&&r.push({index:i.index??0,value:i[1]});for(let i of e.matchAll(n))i[1]&&xt(i[1])&&r.push({index:i.index??0,value:i[1]});for(let i of r.sort((u,c)=>u.index-c.index))t.add(i.value);return [...t]}var es=["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"],Nt=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"]),Wt=new Set(["",".html",".htm"]),ts=new Set([".css",".xml",".xsl",".svg",".json",".html",".htm",".txt",".enc",".jws"]),rs=["/wp-content/","/wp-includes/","/wp-admin/","/static/","/assets/","/build/","/_next/"];function ss(e){let t=[],r="full",s="full",n=false,i=false,u="";for(let c=0;c<e.length;c++){let o=e[c];if(o==="--retry-timeouts")r="retry-timeouts",n=true;else if(o==="--resume")n=true;else if(o==="--resume-rewrite")n=true,i=true;else if(o==="--crawl-mode"){let a=e[++c];if(!a)throw new Error("--crawl-mode requires a value");s=a==="incremental"?"incremental":"full",n||=s==="incremental";}else if(o.startsWith("--crawl-mode="))s=o.slice(13)==="incremental"?"incremental":"full",n||=s==="incremental";else if(o==="--incremental")s="incremental",n=true;else if(o==="--url"){let a=e[++c];if(!a)throw new Error("--url requires a value");r="single-url",n=true,t.push(a);}else if(o.startsWith("--url="))r="single-url",n=true,t.push(o.slice(6));else if(o==="--urls"){let a=e[++c];if(!a)throw new Error("--urls requires a file path");r="single-url",n=true,t.push(`@${a}`);}else if(o==="--content-sync-plan"){let a=e[++c];if(!a)throw new Error("--content-sync-plan requires a file path");r="content-sync",s="incremental",n=true,u=f.resolve(a);}else o.startsWith("--content-sync-plan=")&&(r="content-sync",s="incremental",n=true,u=f.resolve(o.slice(20)));}return {mode:r,crawlMode:s,urls:t,preserveOutput:n,resumeRewrite:i,contentSyncPlanPath:u}}function Ze(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?f.resolve(e):""}function ns(){let e=Ze();return e?f.resolve(e,".."):""}function is(){let e=process.env.STATIC_PUBLISHER_WP_ROOT||process.env.WPSUITE_STATIC_PUBLISHER_WP_ROOT||"";return e.trim()?f.resolve(e):""}function os(e){let t=e.trim(),r=[{alias:"@storage-root",root:ns(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@runtime",root:Ze(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@wp-root",root:is(),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 _t(e){let t=String(process.env.STATIC_PUBLISHER_CRAWL_MANIFEST_PATH||"").trim();if(t)return f.resolve(t);let r=Ze();return r?f.join(r,"crawl-manifest.json"):f.join(e.outputDir,".crawl-manifest.json")}function Qt(){return {schemaVersion:3,updatedAt:"",pages:{},assets:{}}}function kt(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 as(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 ze(e){let t=e?.["content-type"]?.trim();return t||null}function us(){return {rewriteTargets:new Set,changedFiles:new Set,deletedFiles:new Set}}function q(e,t,r){let s=Z(t.outputDir,r);s&&(e.changedFiles.add(s),e.deletedFiles.delete(s));}function It(e,t,r){let s=Z(t.outputDir,r);s&&(e.deletedFiles.add(s),e.changedFiles.delete(s));}function ne(e,t){e.rewriteTargets.add(f.resolve(t));}async function cs(e){try{let t=await b.readFile(_t(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,kt(n)])),assets:Object.fromEntries(Object.entries(r.assets).map(([s,n])=>[s,as(n)]))};if(r.schemaVersion===1)return {schemaVersion:3,updatedAt:String(r.updatedAt||""),pages:Object.fromEntries(Object.entries(r.pages).map(([s,n])=>[s,kt(n)])),assets:{}}}}catch{}return Qt()}function Je(e){return JSON.parse(JSON.stringify(e))}async function ls(e,t){let r=_t(e);await b.mkdir(f.dirname(r),{recursive:true}),await b.writeFile(r,JSON.stringify(t,null,2),"utf8");}async function te(e,t){if(!t.trackManifest)return;let r=async()=>{let s=Je(t.manifest);s.updatedAt=new Date().toISOString(),t.manifest.updatedAt=s.updatedAt,await ls(e,s);};t.manifestSaveChain=t.manifestSaveChain.then(r,r),await t.manifestSaveChain;}function fe(e){if(!e)return null;let t=e.trim();return t||null}function ds(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 ps(e,t,r,s){let n=[...new Set(r.map(c=>c.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 c=await t.post(u,{timeout:3e4,failOnStatusCode:!1,headers:{"content-type":"application/json","x-static-publisher-token":i},data:JSON.stringify({urls:n})});if(!c.ok())return s.warn(`Change token lookup failed with HTTP ${c.status()}`,{endpoint:u,status:c.status()}),new Map;let o=await c.json().catch(()=>null);if(!o||!Array.isArray(o.items))return new Map;let a=new Map;for(let p of o.items)!p||typeof p.url!="string"||a.set(p.url,p);return a}catch(c){return s.warn("Change token lookup failed; falling back to sitemap metadata",{endpoint:u,error:c instanceof Error?`${c.name}: ${c.message.split(/\r?\n/u,1)[0]}`:"Unknown change-token request failure"}),new Map}}async function Be(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 ps(e,t,[s],n)).get(s)??null;return et(e,s)&&(!u||u.supported!==true||!u.token)&&(u=await fs(e,t,s,n)),u=hs(e,u),r.changeTokenCache.set(s,u),u}function gs(e){return `subscriber=${e.wpsuite?.siteSettings?.subscriber===true?"1":"0"}`}function hs(e,t){if(!t?.supported||!t.token)return t;let r=gs(e);return {...t,token:pe(`${t.token}
7
- ${r}`,40),tokenSource:t.tokenSource?`${t.tokenSource}+site-subscriber`:"site-subscriber"}}async function fs(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=pe(`${r}
4
+ `;return e.replace(/<head\b[^>]*>/i,n=>`${n}${s} ${t}`)}function Hr(e){let t=Q(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function zr(e,t){let r=[...new Set(t)].filter(i=>i.includes("/")&&!/\\+\//.test(i)).map(i=>[i,Re(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[c,o]of r)u=u.split(c).join(o);return u},n=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(i,u,c,o)=>`${u}${s(c)}${o}`);return n=n.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(i,u,c,o,a)=>Hr(o)?`${u}${s(o)}${a}`:i),n}function Jr(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 Vr(e,t,r){let s=Jr(t,r);if(!s)return e;let n=e;for(let i of Or){let u=i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),c=new RegExp(`(?:\\.{1,}/)+${u}`,"g"),o=new RegExp(`(?<!\\.)/${u}`,"g");n=n.replace(c,`${s}${i}`).replace(o,`${s}${i}`);let a=i.replace(/\//g,"\\/"),l=s.replace(/\//g,"\\/"),p=a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),d=new RegExp(`(?:\\.{1,}\\\\/)+${p}`,"g"),m=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${p}`,"g"),S=new RegExp(`(?<![\\.\\\\])\\/${p}`,"g");n=n.replace(d,`${l}${a}`).replace(m,`${l}${a}`).replace(S,`${l}${a}`);}return n}function Be(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:bt(t,e.targetOrigin),i=s?`${s.search}${s.hash}`:"";return e.urlRewriteMode==="root-relative"?`${n}${i}`:`${vt(e.outputDir,r,n)}${i}`}function _e(e,t,r,s,n){Ae(e,r,Be(t,s,n));}function Gr(e,t,r,s,n){if(!r||r===s)return;Ae(e,r,s);let i=Be(t,r,n),u=Be(t,s,n);Ae(e,i,u);}function Qe(e,t,r,s,n={}){let i=e,u={};_e(u,t,t.sourceOrigin,t.targetOrigin,s);for(let[o,a]of Object.entries(t.extraReplacements))_e(u,t,o,a,s);for(let[o,a]of Object.entries(r))_e(u,t,o,a,s);for(let[o,a]of Object.entries(n)){let l=r[o];!l||l===a||Gr(u,t,a,l,s);}let c=Object.entries(u).sort((o,a)=>a[0].length-o[0].length);for(let[o,a]of c)i=_r(i,o,a);return t.urlRewriteMode!=="absolute"&&(i=Vr(i,t,s)),i=zr(i,c.map(([,o])=>o)),Br(t,i,s)&&(i=Qr(i)),i}async function Kr(e,t,r,s){let n=f.join(e.outputDir,s),i=f.extname(n).toLowerCase(),u;try{u=await v.readFile(n,"utf8");}catch(a){if(a.code!=="ENOENT")throw a;return {changed:false}}let o=Qe(u,e,t,i===".js"||i===".mjs"?void 0:n,r);return o!==u?(await ye(n,o,"utf8"),{changed:true}):{changed:false}}async function Zr(e,t){return await new Promise((r,s)=>{let n=o=>{if(c(),o?.error){s(new Error(o.error));return}r({changed:!!o?.changed});},i=o=>{c(),s(o);},u=o=>{c(),o!==0&&s(new Error(`Rewrite worker exited with code ${o}.`));},c=()=>{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 Rt(e,t,r={}){let n=(r.files?[...new Set(r.files)].map(d=>f.resolve(d)).filter(d=>d.startsWith(f.resolve(e.outputDir))).map(d=>f.relative(e.outputDir,d).replace(/\\/g,"/")).filter(d=>d.length>0):await Dr(["**/*"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(d=>d!=="asset-map.json"&&X(d)),i=0;if(n.length===0)return 0;let u=Math.max(1,Number(e.rewriteConcurrency||e.assetDownloadConcurrency||1)),c=Math.max(1,Math.min(u,n.length,availableParallelism()));await r.onStart?.({totalFiles:n.length,workerCount:c});let o=0,a=0,l=null;if(c===1){for(let d of n){let m=await Kr(e,t,r.previousAssetMap??{},d);m.changed&&(i+=1),a+=1,await r.onProgress?.({index:a,totalFiles:n.length,changedTextFiles:i,file:d,changed:m.changed});}return i}let p=Array.from({length:c},async()=>{let d=new Worker(new URL("./rewrite-worker.js",import.meta.url),{workerData:{config:e,assetMap:t,previousAssetMap:r.previousAssetMap??{}}});try{for(;!l;){let m=o;if(m>=n.length)return;o+=1;let S=n[m],w=await Zr(d,S);w.changed&&(i+=1),a+=1,await r.onProgress?.({index:a,totalFiles:n.length,changedTextFiles:i,file:S,changed:w.changed});}}catch(m){throw l=m instanceof Error?m:new Error(String(m)),l}finally{await d.terminate().catch(()=>{});}});return await Promise.all(p),i}var ee={error:0,warn:1,info:2,debug:3},Yr=/^(?:authorization|proxyAuthorization|runtimeToken|siteKey|nonce|accessToken|refreshToken|accessKeyId|secretAccessKey|sessionToken|xStaticPublisherToken|xApiKey)$/i;function H(e){return e.replace(/((?:x-static-publisher-token|authorization|proxy-authorization|x-api-key|aws-access-key-id|aws-secret-access-key|aws-session-token)\s*:\s*)[^\r\n]+/gi,"$1[REDACTED]").replace(/\b(Basic|Bearer)\s+[^\s]+/gi,"$1 [REDACTED]").replace(/([?&](?:token|access_token|refresh_token|api_key|key|nonce)=)[^&\s]+/gi,"$1[REDACTED]").replace(/((?:"|')?(?:runtimeToken|siteKey|nonce|accessToken|refreshToken|accessKeyId|secretAccessKey|sessionToken)(?:"|')?\s*[:=]\s*(?:"|'))[^"']+/gi,"$1[REDACTED]")}function xe(e){return typeof e=="string"?H(e):Array.isArray(e)?e.map(t=>xe(t)):e instanceof Error?{name:e.name,message:H(e.message),...e.stack?{stack:H(e.stack)}:{}}:e&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,r])=>[t,Yr.test(t)?"[REDACTED]":xe(r)])):e}function He(e){return e?xe(e):void 0}var At=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",ke=At?f.join(At,"current-progress.json"):"",kt=Promise.resolve();function xt(e){return e.includes("crawl")?"crawl":e.includes("deploy")?"deploy":e.includes("invalidate")?"invalidate":e}function Xr(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 es(e,t,r){ke&&(kt=kt.then(async()=>{let s=new Date,n=s.toISOString();await v.mkdir(f.dirname(ke),{recursive:true});let i=await v.readFile(ke,"utf8").then(h=>JSON.parse(h)).catch(()=>null),u=i&&typeof i.details=="object"&&i.details?i.details:{},c=xt(e),o=i?.currentStep||xt(i?.source||""),a=i?.startedAt||n,l={...i?.stepDurationsSec??{}},p=i?.stepStartedAt||n;if(o&&o!==c&&i?.stepStartedAt){let h=Math.max(0,Math.round((s.getTime()-new Date(i.stepStartedAt).getTime())/1e3));l[o]=(l[o]??0)+h,p=n;}let d=Math.max(0,Math.round((s.getTime()-new Date(p).getTime())/1e3)),m=Math.max(0,Math.round((s.getTime()-new Date(a).getTime())/1e3)),S=H(t),w=He(r)??{},g={checkedAt:n,source:e,message:S,details:Xr(u,w),startedAt:a,currentStep:c,stepStartedAt:p,stepElapsedSec:d,totalElapsedSec:m,stepDurationsSec:l};await v.writeFile(ke,JSON.stringify(g,null,2),"utf8");}).catch(()=>{}));}async function ts(e,t){await v.mkdir(f.dirname(e),{recursive:true}),await v.appendFile(e,`${JSON.stringify(xe(t))}
5
+ `,"utf8");}function rs(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 ss(e,t,r){let s=He(r);return {checkedAt:new Date().toISOString(),currentStep:rs(e,s),level:e,message:H(t),details:s??{}}}var ue=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 v.mkdir(this.logDir,{recursive:true}),await v.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 v.appendFile(this.logPath,`${t}
6
+ `,"utf8");});}enqueueJsonLine(t,r){this.enqueueTask(()=>ts(t,r));}updateCurrentEvent(t,r,s){let n=ss(t,r,s);this.enqueueTask(async()=>{await v.mkdir(this.logDir,{recursive:true}),await v.writeFile(this.currentEventPath,JSON.stringify(n,null,2),"utf8");});}push(t,r,s){let n=H(r),i=He(s),u=JSON.stringify({time:new Date().toISOString(),level:t,message:n,...i||{}});this.enqueueLine(u),this.updateCurrentEvent(t,n,i),t==="error"?console.error(n,i||""):t==="warn"?console.warn(n,i||""):(ee[this.level]>=ee.debug||["summary","page","sitemap","asset","timing"].includes(t))&&console.log(n);}info(t,r){this.push("info",t,r);}debug(t,r){ee[this.level]<ee.debug||this.push("debug",t,r);}progress(t,r){es("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),ee[this.level]>=ee.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),ee[this.level]>=ee.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 ze="(?: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)";function Tt(e){return !!e&&/^(?:\.{1,2}\/)?[A-Za-z0-9@_][A-Za-z0-9@._/-]*\.(?:js|mjs)(?:[?#][^\s<>\\]*)?$/i.test(e)&&!e.startsWith("/")&&!e.startsWith("//")&&!/^[a-z][a-z0-9+.-]*:/i.test(e)&&!/(?:^|\/)node_modules(?:\/|$)|(?:^|\/)\.pnpm(?:\/|$)/i.test(e)}function It(e){let t=new Set,r=[],s=/\bimport\s*\(\s*["'`]([^"'`\s<>\\]+)["'`]\s*\)/g,n=/\b(?:[A-Za-z_$][\w$]*\.)?u\s*=\s*(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>\s*["'`]([^"'`\s<>\\]+)["'`]/g;for(let i of e.matchAll(s))i[1]&&Tt(i[1])&&r.push({index:i.index??0,value:i[1]});for(let i of e.matchAll(n))i[1]&&Tt(i[1])&&r.push({index:i.index??0,value:i[1]});for(let i of r.sort((u,c)=>u.index-c.index))t.add(i.value);return [...t]}function Mt(e,t){return typeof e=="string"&&e.length>0&&t?.supported===true&&typeof t.token=="string"&&t.token.length>0&&e===t.token}function $t(e,t){try{let r=new URL(e),s=new URL(t,r);if(s.origin!==r.origin)return !1;let n=r.pathname.replace(/\/+$/,"");if(n&&s.pathname!==n&&!s.pathname.startsWith(`${n}/`))return !1;let i=n?s.pathname.slice(n.length)||"/":s.pathname;return ["/wp-includes/","/wp-content/plugins/","/wp-content/themes/","/wp-content/mu-plugins/"].some(u=>i.startsWith(u))}catch{return false}}var as=["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"],Qt=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"]),Ht=new Set(["",".html",".htm"]),us=new Set([".css",".xml",".xsl",".svg",".json",".html",".htm",".txt",".enc",".jws"]),cs=["/wp-content/","/wp-includes/","/wp-admin/","/static/","/assets/","/build/","/_next/"];function ls(e){let t=[],r="full",s="full",n=false,i=false,u="";for(let c=0;c<e.length;c++){let o=e[c];if(o==="--retry-timeouts")r="retry-timeouts",n=true;else if(o==="--resume")n=true;else if(o==="--resume-rewrite")n=true,i=true;else if(o==="--crawl-mode"){let a=e[++c];if(!a)throw new Error("--crawl-mode requires a value");s=a==="incremental"?"incremental":"full",n||=s==="incremental";}else if(o.startsWith("--crawl-mode="))s=o.slice(13)==="incremental"?"incremental":"full",n||=s==="incremental";else if(o==="--incremental")s="incremental",n=true;else if(o==="--url"){let a=e[++c];if(!a)throw new Error("--url requires a value");r="single-url",n=true,t.push(a);}else if(o.startsWith("--url="))r="single-url",n=true,t.push(o.slice(6));else if(o==="--urls"){let a=e[++c];if(!a)throw new Error("--urls requires a file path");r="single-url",n=true,t.push(`@${a}`);}else if(o==="--content-sync-plan"){let a=e[++c];if(!a)throw new Error("--content-sync-plan requires a file path");r="content-sync",s="incremental",n=true,u=f.resolve(a);}else o.startsWith("--content-sync-plan=")&&(r="content-sync",s="incremental",n=true,u=f.resolve(o.slice(20)));}return {mode:r,crawlMode:s,urls:t,preserveOutput:n,resumeRewrite:i,contentSyncPlanPath:u}}function Xe(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?f.resolve(e):""}function ds(){let e=Xe();return e?f.resolve(e,".."):""}function ps(){let e=process.env.STATIC_PUBLISHER_WP_ROOT||process.env.WPSUITE_STATIC_PUBLISHER_WP_ROOT||"";return e.trim()?f.resolve(e):""}function gs(e){let t=e.trim(),r=[{alias:"@storage-root",root:ds(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@runtime",root:Xe(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@wp-root",root:ps(),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 zt(e){let t=String(process.env.STATIC_PUBLISHER_CRAWL_MANIFEST_PATH||"").trim();if(t)return f.resolve(t);let r=Xe();return r?f.join(r,"crawl-manifest.json"):f.join(e.outputDir,".crawl-manifest.json")}function Jt(){return {schemaVersion:4,updatedAt:"",pages:{},assets:{}}}function Lt(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 hs(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,changeToken:typeof e.changeToken=="string"?e.changeToken:null,tokenSource:typeof e.tokenSource=="string"?e.tokenSource: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 Ve(e){let t=e?.["content-type"]?.trim();return t||null}function fs(){return {rewriteTargets:new Set,changedFiles:new Set,deletedFiles:new Set}}function j(e,t,r){let s=Z(t.outputDir,r);s&&(e.changedFiles.add(s),e.deletedFiles.delete(s));}function Dt(e,t,r){let s=Z(t.outputDir,r);s&&(e.deletedFiles.add(s),e.changedFiles.delete(s));}function ie(e,t){e.rewriteTargets.add(f.resolve(t));}async function ms(e){try{let t=await v.readFile(zt(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.schemaVersion===4)&&r.assets&&typeof r.assets=="object")return {schemaVersion:4,updatedAt:String(r.updatedAt||""),pages:Object.fromEntries(Object.entries(r.pages).map(([s,n])=>[s,Lt(n)])),assets:Object.fromEntries(Object.entries(r.assets).map(([s,n])=>[s,hs(n)]))};if(r.schemaVersion===1)return {schemaVersion:4,updatedAt:String(r.updatedAt||""),pages:Object.fromEntries(Object.entries(r.pages).map(([s,n])=>[s,Lt(n)])),assets:{}}}}catch{}return Jt()}function Ge(e){return JSON.parse(JSON.stringify(e))}async function ws(e,t){let r=zt(e);await v.mkdir(f.dirname(r),{recursive:true}),await v.writeFile(r,JSON.stringify(t,null,2),"utf8");}async function te(e,t){if(!t.trackManifest)return;let r=async()=>{let s=Ge(t.manifest);s.updatedAt=new Date().toISOString(),t.manifest.updatedAt=s.updatedAt,await ws(e,s);};t.manifestSaveChain=t.manifestSaveChain.then(r,r),await t.manifestSaveChain;}function Pe(e){if(!e)return null;let t=e.trim();return t||null}function ys(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 Vt(e,t,r,s){let n=[...new Set(r.map(c=>c.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 c=await t.post(u,{timeout:3e4,failOnStatusCode:!1,headers:{"content-type":"application/json","x-static-publisher-token":i},data:JSON.stringify({urls:n})});if(!c.ok())return s.warn(`Change token lookup failed with HTTP ${c.status()}`,{endpoint:u,status:c.status()}),new Map;let o=await c.json().catch(()=>null);if(!o||!Array.isArray(o.items))return new Map;let a=new Map;for(let l of o.items)!l||typeof l.url!="string"||a.set(l.url,l);return a}catch(c){return s.warn("Change token lookup failed; falling back to sitemap metadata",{endpoint:u,error:c instanceof Error?`${c.name}: ${c.message.split(/\r?\n/u,1)[0]}`:"Unknown change-token request failure"}),new Map}}async function Me(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 Vt(e,t,[s],n)).get(s)??null;return rt(e,s)&&(!u||u.supported!==true||!u.token)&&(u=await bs(e,t,s,n)),u=Gt(e,u),r.changeTokenCache.set(s,u),u}async function Ps(e,t,r,s,n){if(!r.trackManifest)return;let i=[...new Set(s.map(u=>u.trim()).filter(Boolean))].filter(u=>!r.changeTokenCache.has(u));for(let u=0;u<i.length;u+=250){let c=i.slice(u,u+250),o=await Vt(e,t,c,n);for(let a of c)r.changeTokenCache.set(a,Gt(e,o.get(a)??null));}}function Ss(e){return `subscriber=${e.wpsuite?.siteSettings?.subscriber===true?"1":"0"}`}function Gt(e,t){if(!t?.supported||!t.token||t.tokenSource==="wp-media-file")return t;let r=Ss(e);return {...t,token:we(`${t.token}
7
+ ${r}`,40),tokenSource:t.tokenSource?`${t.tokenSource}+site-subscriber`:"site-subscriber"}}async function bs(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=we(`${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 ms(e,t,r,s,n,i){let u=et(e,n);if(!s.enabled)return {action:"render",changeToken:s.trackManifest?await Be(e,t,s,n,i):null};let c=s.manifest.pages[n];if(!c)return {action:"render",changeToken:await Be(e,t,s,n,i)};let o=await Be(e,t,s,n,i);if(o?.supported&&o.token)return c.changeToken===o.token?u&&!await ws(e,t,n,i)?{action:"render",changeToken:o}:{action:"reuse",changeToken:o}:{action:"render",changeToken:o};let a=fe(r.sitemapLastmodByPage[n]);return a&&c.sitemapLastmod&&c.sitemapLastmod===a?{action:"reuse",changeToken:o}:{action:"render",changeToken:o}}async function ws(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 ys(e,t,r,s,n){let i=Mt(r.previousManifest,void 0,s,"previous-manifest"),u=0;for(let[l,m]of Object.entries(r.manifest.pages))if(!r.seenPages.has(l)){It(n,e,m.outputPath);try{await b.unlink(m.outputPath);}catch(y){(y.code||"")!=="ENOENT"&&s.warn(`Failed to remove stale incremental page output for ${l}`,{url:l,outputPath:m.outputPath,error:String(y)});}delete r.manifest.pages[l],u++;}let c=Mt(r.manifest,r.runId,s,"active-manifest"),o=new Set,a=new Set;for(let l of c){for(let w of me(e,l))o.add(w);let m=r.manifest.assets[l]?.outputPath;m&&a.add(m);let y=ue(e,t.assetMap,l);y&&a.add(y);}for(let l of Object.keys(r.manifest.assets))c.has(l)||delete r.manifest.assets[l];let p=0,d=0;for(let l of i){let m=new Set,y=r.previousManifest.assets[l]?.outputPath;y&&m.add(y);let w=ue(e,t.assetMap,l);if(!c.has(l)&&w)m.add(w);else if(!c.has(l)){let g=Us(e,l,s,"incremental-cleanup");g&&(m.add(g.originalFilePath),g.hashedFilePath&&m.add(g.hashedFilePath));}for(let g of m)if(!a.has(g)){It(n,e,g);try{await b.unlink(g),p++;}catch(h){(h.code||"")!=="ENOENT"&&s.warn(`Failed to remove stale incremental asset output for ${l}`,{url:l,outputPath:g,error:String(h)});}}for(let g of me(e,l))o.has(g)||Object.prototype.hasOwnProperty.call(t.assetMap,g)&&(delete t.assetMap[g],d++);}(u>0||p>0||d>0)&&s.info(`Incremental cleanup removed ${u} stale pages, ${p} stale assets, ${d} stale asset mappings`,{removedPages:u,removedAssets:p,removedAssetMappings:d,phase:"incremental-cleanup"});}function Mt(e,t,r,s){let n=new Set,i=u=>{let c=u.trim();if(c){if(r){let o=re(c,r,"asset",s??"manifest");if(!o)return;n.add(o.toString());return}n.add(c);}};for(let u of Object.values(e.pages))for(let c of u.discoveredAssets||[])i(c);for(let[u,c]of Object.entries(e.assets||{}))t&&c.lastSeenRunId!==t||i(u);return n}function $t(e,t,r){for(let s of t)for(let n of me(e,s))if(r.has(n))return true;return false}function Ps(e,t,r,s,n){let i=new Set(r.rewriteTargets);for(let c of Object.values(t.manifest.pages))c.rewriteComplete||i.add(f.resolve(c.outputPath));for(let c of Object.values(t.manifest.assets))c.isText&&!c.rewriteComplete&&i.add(f.resolve(c.outputPath));let u=ds(s,n);if(u.size===0)return [...i];for(let c of Object.values(t.manifest.pages))$t(e,c.discoveredAssets,u)&&i.add(f.resolve(c.outputPath));for(let[c,o]of Object.entries(t.manifest.assets)){o.isText&&$t(e,o.discoveredAssets,u)&&i.add(f.resolve(o.outputPath));for(let a of me(e,c))if(u.has(a)){q(r,e,o.outputPath),o.isText&&i.add(f.resolve(o.outputPath));break}}return [...i]}function Ss(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 bs(e,t,r){let s=new Set,n=i=>{if(!i)return;let u=Z(e.outputDir,i);u&&s.add(u);};for(let i of t.donePages)n(V(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 vs(e,t,r,s,n){let i=[...s.deletedFiles].sort(),u=bs(e,t,r),c=0;for(let p of [...u].sort()){try{if((await b.stat(f.join(e.outputDir,p))).isFile())continue}catch{}c++,n.warn(`Active output is missing after crawl: ${p}`,{phase:"deploy-plan",file:p,outputPath:f.join(e.outputDir,p)});}if(c>0&&n.warn(`Detected ${c} active output file(s) missing before deploy plan save.`,{phase:"deploy-plan",missingActiveOutputs:c}),i.length===0)return [];let o=[],a=0;for(let p of i){if(!u.has(p)){o.push(p);continue}a++;let d=f.join(e.outputDir,p),l;try{l=(await b.stat(d)).isFile();}catch{l=false;}n.warn(`Deploy plan protected active output from deletion: ${p}`,{phase:"deploy-plan",file:p,outputPath:d,exists:l});}return a>0&&n.info(`Deploy plan skipped ${a} active output deletion(s).`,{phase:"deploy-plan",protectedDeletes:a,deletedFiles:o.length}),o}function me(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 Cs(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 Bt(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,Xe(s.pathname))}catch{return null}}function Rs(e,t,r){for(let s of Cs(e,r)){let n=t[s];if(!n)continue;let i=Bt(e,n);if(i)return {outputPath:i,publicUrl:n}}return null}function As(e,t,r){for(let s of me(e,r)){let n=t[s];if(!n)continue;let i=Bt(e,n);if(i)return i}return null}function ue(e,t,r){let s=As(e,t,r);if(s)return s;try{return $e(e,r).originalFilePath}catch{return null}}function xs(){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 Lt(e){let t=xs();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 Ts(e,t){let r=new Set;for(let s of t.donePages)r.add(f.resolve(V(e,s)));for(let s of t.doneAssets){let n=ue(e,t.assetMap,s);!n||!X(n)||r.add(f.resolve(n));}for(let s of t.doneSitemaps){let n=ue(e,t.assetMap,s);!n||!X(n)||r.add(f.resolve(n));}return [...r]}var Ie="re:",xe=new Map;function ks(e){if(!e.startsWith(Ie))return null;let t=xe.get(e);if(t!==void 0)return t||null;let r=e.slice(Ie.length).trim();if(!r)return xe.set(e,false),null;try{let s=new RegExp(r);return xe.set(e,s),s}catch{return console.warn(`[crawl] Ignoring invalid path matcher regex: ${e}`),xe.set(e,false),null}}function Ye(e,t){let r=ks(t);return r?r.test(e):t.startsWith(Ie)?false:e.startsWith(t)}function Is(e,t){return t.find(r=>Ye(e,r))}function Ht(e,t){let r=Is(t.pathname,e.blockedPathPrefixes);if(r)return r.startsWith(Ie)?`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 Ms(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 $s(e,t){return Ms(e).has(t.hostname)}function Ls(e){let t=H(e.trim()).replace(/\\\//g,"/").replace(/^['"]|['"]$/g,"").trim();return t=t.replace(/[)]+$/g,"").trim(),t=t.replace(/;.*$/g,"").trim(),t}function Ve(e){let t=H(e).replace(/\\\//g,"/");return /[{}]|\bwindow\.|\blocation\.|\bincludes\(|\?\?null|\+|%7B|%7D|%22|<|>|\s/.test(t)||/[()[\]'"]/.test(t)}function Ds(e){let t=H(e).replace(/\\\//g,"/").trim(),r=f.extname(t).toLowerCase();return Nt.has(r)||Wt.has(r)?false:/^(?:this|[A-Za-z_$][\w$]*)\.[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/.test(t)}function ce(e){return rs.some(t=>e.pathname.startsWith(t))}function U(e,t,r=e.sourceOrigin,s,n="url"){let i=Ls(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(Ve(i))return s?.ignore(n,t,"looks like JavaScript/code fragment",r),null;if(Ds(i))return s?.ignore(n,t,"looks like JavaScript property access",r),null;try{let u=new URL(i,r);if(zt(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(!$s(e,u))return s?.ignore(n,u.toString(),"host not allowed",r),null;let c=Ht(e,u);if(c)return s?.reject(n,u.toString(),c,r),null;let o=new URL(e.sourceOrigin);return u.protocol=o.protocol,u.host=o.host,u.hash="",u}catch{return s?.reject(n,t,"invalid URL",r),null}}function zt(e){try{return decodeURIComponent(e.pathname),decodeURIComponent(e.search),decodeURIComponent(e.hash),!1}catch{return true}}function re(e,t,r,s){try{let n=new URL(e);return zt(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 Jt(e){return Nt.has(f.extname(e.pathname).toLowerCase())}function se(e){return ce(e)?false:Wt.has(f.extname(e.pathname).toLowerCase())}function le(e){let t=e.pathname.toLowerCase();return t.endsWith(".xml")&&(t.includes("sitemap")||t.endsWith("/sitemap.xml"))}function M(e,t){return !!(le(t)||t.pathname==="/robots.txt"||t.pathname==="/llms.txt"||t.pathname.toLowerCase().endsWith(".xsl")||e.assetPathPrefixes.length>0&&e.assetPathPrefixes.some(r=>Ye(t.pathname,r))||Jt(t)||!se(t)&&!ce(t))}function V(e,t){let r=new URL(t),s=Xe(r.pathname);return s.endsWith("/")?s+="index.html":f.extname(s)||(s+="/index.html"),f.join(e.outputDir,s)}function Xe(e){try{return decodeURIComponent(e)}catch{return e}}function Fs(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 et(e,t){let r=Fs(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=Xe(r.pathname);s.endsWith("/")&&(s+="index.html");let n=!!r.search,i=s,u=f.join(e.outputDir,i),c=je(e.targetOrigin,i),o=`${c}${r.search}`;if(!n)return {originalPathname:i,originalFilePath:u,originalPublicUrl:c,originalPublicUrlWithSearch:o,preferQueryHashed:n};let a=f.extname(s),d=`${a?s.slice(0,-a.length):s}.${pe(r.search)}${a||".bin"}`;return {originalPathname:i,originalFilePath:u,originalPublicUrl:c,originalPublicUrlWithSearch:o,preferQueryHashed:n,hashedPathname:d,hashedFilePath:f.join(e.outputDir,d),hashedPublicUrl:je(e.targetOrigin,d)}}function Us(e,t,r,s){let n=re(t,r,"asset",s);return n?$e(e,n.toString()):null}function Es(e,t,r,s,n){t[r]=s;try{let i=new URL(r),c=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{c.push(new URL(e.targetOrigin).origin);}catch{}for(let o of c)try{let a=new URL(o);t[a.origin+i.pathname+i.search]=s;}catch{}try{let o=(()=>{let a=new URL(s,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin);return `${a.pathname}${a.search}`})();t[i.pathname+i.search]=o;}catch{}try{let o=new URL(s,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[i.pathname]=o;}catch{}try{let o=new URL(n,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[i.pathname]=o;}catch{}}catch{}}async function Vt(e){try{return await b.readFile(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}async function we(e){try{return await b.stat(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}function Os(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 Gt(e){let t=String(e["last-modified"]||"").trim();if(!t)return null;let r=Date.parse(t);return Number.isFinite(r)?r:null}function js(e,t){let r=Gt(t),s=Os(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 qs(e,t){if(!t)return;let r=Gt(t);if(r===null)return;let s=await we(e);if(!s)return;let n=new Date(r);await b.utimes(e,s.atime,n).catch(()=>{});}function Dt(e,t){let r=f.extname(e.pathname).toLowerCase(),s=t["content-type"]||"";return ts.has(r)||es.some(n=>s.includes(n))&&!s.startsWith("image/")&&!s.includes("font")}function Ns(e){try{let t=f.extname(new URL(e).pathname).toLowerCase();return t===".js"||t===".mjs"}catch{return false}}function he(e,t){(e.doneAssets.size%25===0||e.doneAssets.size===1||e.doneAssets.size===e.stats.assetsQueued)&&t.progress(`Asset download progress: processed ${e.doneAssets.size}, discovered ${e.stats.assetsQueued}.`,{doneAssets:e.doneAssets.size,assetsQueued:e.stats.assetsQueued,phase:"download-assets"});}function Ws(e){return pe(e.toString("base64"),40)}function _s(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 Qs(e,t,r){let s=e.assetVariantDigestsByOriginalPath.get(t);s||(s=new Set,e.assetVariantDigestsByOriginalPath.set(t,s)),s.add(r);}async function Ge(e,t,r,s,n,i,u){let c=$e(e,r),o=Ws(s),a=c.originalFilePath,p=c.originalPublicUrlWithSearch;if(c.preferQueryHashed&&c.hashedFilePath&&c.hashedPublicUrl&&_s(n,c.originalFilePath,o)){let y=Rs(e,t,r);y?(a=y.outputPath,p=y.publicUrl):(a=c.hashedFilePath,p=c.hashedPublicUrl);}Es(e,t,r,p,c.originalPublicUrl);let d=X(a)?Buffer.from(We(s.toString("utf8"),e,t,a),"utf8"):s,l=await Vt(a),m=false;return (l===null||!l.equals(d))&&(await ge(a,d),m=true),i?.debug(`${m?"Saved":"Skipped unchanged"} asset output ${r}`,{phase:"download-assets",url:r,outputPath:a,bytes:d.length,wroteFile:m}),Qs(n,c.originalFilePath,o),await qs(a,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:a,publicUrl:p,wroteFile:m}}function ye(e,t,r,s,n){let i=()=>{let d=String(n??"").trim();if(!d)return {discoveredFrom:"",discoveredFromType:"unknown"};if(d==="seed-path"||d==="cli"||d==="generated-404-request-path")return {discoveredFrom:d,discoveredFromType:d};if(/^https?:\/\//i.test(d))try{let l=new URL(d);return le(l)?{discoveredFrom:d,discoveredFromType:"sitemap"}:M(e,l)?{discoveredFrom:d,discoveredFromType:"asset"}:se(l)&&!ce(l)?{discoveredFrom:d,discoveredFromType:"page"}:{discoveredFrom:d,discoveredFromType:"url"}}catch{return {discoveredFrom:d,discoveredFromType:"url"}}return {discoveredFrom:d,discoveredFromType:"url"}},u=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,c=U(e,r,u,s,"page");if(!c)return;if(!se(c)||Jt(c)){if(M(e,c)){s.info(`Seeded/non-page URL queued as asset: ${c.toString()}`,{url:c.toString(),source:n}),E(e,t,c.toString(),s,n);return}s.reject("page",c.toString(),ce(c)?"asset/internal path cannot be page":"not page-like",n);return}let o=c.toString(),{discoveredFrom:a,discoveredFromType:p}=i();a&&!t.pageDiscoverySources.has(o)&&t.pageDiscoverySources.set(o,a),!t.donePages.has(o)&&!t.queuedPages.has(o)&&(t.queuedPages.add(o),t.pageQueue.push(o),t.stats.pagesQueued++,s.debug(`Queued discovered page ${o}`,{phase:"discovery",url:o,discoveredFrom:a,discoveredFromType:p,outputPath:V(e,o)}),(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 E(e,t,r,s,n){let i=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,u=U(e,r,i,s,"asset");if(!u)return;if(!M(e,u)){s.reject("asset",u.toString(),"not a safe asset path/prefix",n);return}let c=u.toString();!t.doneAssets.has(c)&&!t.queuedAssets.has(c)&&(t.queuedAssets.add(c),t.assetQueue.push(c),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 Me(e,t,r,s,n){let i=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,u=U(e,r,i,s,"sitemap");if(!u)return;if(!le(u)){s.reject("sitemap",u.toString(),"not sitemap-like",n);return}let c=u.toString();!t.doneSitemaps.has(c)&&!t.queuedSitemaps.has(c)&&(t.queuedSitemaps.add(c),t.sitemapQueue.push(c),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 Bs(e){let t=H(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:fe(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 Hs(e){return e.split(",").map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function zs(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 Js(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 He(e){return e.trim().replace(/\\/g,"/").replace(/^https?:\/\/[^/]+/i,"").replace(/^\/+/,"")}async function Kt(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 c=f.join(e,u.name),o=f.join(t,u.name);if(u.isDirectory()){n.push(...await Kt(c,o,r,s));continue}await Zt(c,o,r,s)&&n.push(o);}return n}async function Gs(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 Zt(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 Gs(e,t)?(s.debug("Skipped unchanged post-crawl copy target",{phase:"copy-extra-paths",sourcePath:e,targetPath:t}),false):(await b.mkdir(f.dirname(t),{recursive:true}),await b.copyFile(e,t),true)}async function Ks(e,t,r){let s=Object.entries(e.postCrawlCopyMap||{}).map(([c,o])=>({sourcePath:c.trim(),prefix:String(o||"").trim()}));if(s.length===0)return [];let n=0,i=[],u=new Set([...t.donePages].map(c=>f.resolve(V(e,c))));r.mark("copy-extra-paths");for(let c of s){let o=c.sourcePath,a=c.prefix;if(!o||!a){r.warn("Skipped post-crawl copy mapping with empty key/value",{sourcePath:o,prefixPath:a});continue}let p=os(o);if(!p.resolvedPath){r.warn("Skipped post-crawl copy source because alias root is not configured",{sourcePath:o,alias:p.alias||"",requiredEnv:p.requiredEnv||"",prefixPath:a});continue}let d=p.resolvedPath,l=He(a);if(!l){r.warn("Skipped post-crawl copy mapping with invalid export prefix",{sourcePath:o,prefixPath:a});continue}let m;try{m=await b.stat(d);}catch{r.warn("Skipped post-crawl copy source because it does not exist",{sourcePath:o,sourceAbs:d,prefixPath:a});continue}let y=f.resolve(e.outputDir,l);if(m.isDirectory()){let v=await Kt(d,y,u,r);i.push(...v),n+=v.length,v.length>0&&r.progress(`Copied static directory to export: ${d} -> /${l}`,{phase:"copy-extra-paths",sourcePath:d,targetPath:`/${l}`,copiedItems:n,changedFiles:v.length});continue}let w=f.basename(d),g=a.endsWith("/")?f.join(y,w):y;await Zt(d,g,u,r)&&(i.push(g),n++,r.progress(`Copied static file to export: ${d} -> /${He(a.endsWith("/")?`${a}${w}`:a)}`,{phase:"copy-extra-paths",sourcePath:d,targetPath:`/${He(a.endsWith("/")?`${a}${w}`:a)}`,copiedItems:n}));}return r.endMark("copy-extra-paths",{mappedSources:s.length,copiedItems:n}),i}function Pe(e,t,r,s,n){let i=new Set,u=H(r).replace(/\\\//g,"/"),c=n==="page-html"?Js(u):u,o=Vs(t,n);if(o){for(let p of zs(c)){let d=U(e,p,t,s,`${n}:css-url`);d&&M(e,d)&&i.add(d.toString());}for(let p of c.matchAll(/@import\s+(?:url\()?\s*['"]?([^'"\s;]+)['"]?\s*\)?/gi)){let d=U(e,p[1],t,s,`${n}:css-import`);d&&M(e,d)&&i.add(d.toString());}}if(o||n==="page-html")for(let p of c.matchAll(/<\?xml-stylesheet[^>]+href=["']([^"']+)["'][^>]*\?>/gi)){let d=U(e,p[1],t,s,`${n}:xml-stylesheet`);d&&M(e,d)&&i.add(d.toString());}let a=new RegExp(`(?:https?:)?//[^\\s'"<>\\);]+\\.${Qe}(?:\\?[^\\s'"<>\\);]*)?|(?<!\\.)/[^\\s'"<>\\);]+\\.${Qe}(?:\\?[^\\s'"<>\\);]*)?`,"gi");if(n==="page-html")for(let p of u.matchAll(a)){let d=p[0].startsWith("//")?`${new URL(e.sourceOrigin).protocol}${p[0]}`:p[0];if(Ve(d)){s.ignore(`${n}:serialized-url`,d,"looks like JavaScript/code fragment",t);continue}let l=U(e,d,t,s,`${n}:serialized-url`);l&&M(e,l)?i.add(l.toString()):l&&s.ignore("asset",l.toString(),"serialized URL did not pass safe asset path filter",t);}if(n!=="page-html"&&Ns(t))for(let p of Tt(u)){if(Ve(p)||!/\.(?:js|mjs)(?:[?#]|$)/i.test(p))continue;let d=U(e,p,t,s,`${n}:relative-asset`);d&&M(e,d)&&i.add(d.toString());}return [...i]}function Zs(e,t,r,s){let n=new Set,i=H(r);for(let u of i.matchAll(/href=["']([^"'#\s][^"']*?)["']/gi)){let c=u[1],o=U(e,c,t,s,"page-link");o&&(Ht(e,o)||se(o)&&!ce(o)&&!M(e,o)&&n.add(o.toString()));}return [...n]}async function Ft(e,t,r,s,n,i,u=false){let c=new Map,o=(a,p)=>{let d=[p],l=new Set;for(;d.length>0;){let m=d.pop();if(m===a)return true;l.has(m)||(l.add(m),d.push(...c.get(m)??[]));}return false};for(;r.sitemapQueue.length>0;){let a=r.sitemapQueue.shift();r.queuedSitemaps.delete(a);let p=re(a,s,"sitemap","sitemap-queue");if(!p)continue;let d=p.toString();if(!r.doneSitemaps.has(d)){r.doneSitemaps.add(d),s.sitemap(`Fetching sitemap ${d}`,{url:d});try{let l=await t.get(d,{timeout:6e4});if(!l.ok()){if(s.skip("sitemap",d,l.status()),u)throw new Error(`Required content-sync sitemap returned HTTP ${l.status()}: ${d}`);continue}let m=await l.body(),y=l.url()||d,w=re(y,s,"sitemap-response",d);if(!w)continue;let g=w.toString(),h=await Ge(e,r.assetMap,g,m,r,s);q(n,e,h.outputPath),ne(n,h.outputPath);let v=m.toString("utf8");/<sitemapindex(?:\s|>)/i.test(v)?r.sitemapIndexUrls.add(g):r.sitemapLeafUrls.add(g);let $=Pe(e,g,v,s,"sitemap");for(let k of $)E(e,r,k,s,g);let x=[];for(let k of Bs(v)){let C=U(e,k.loc,g,s,"sitemap-loc");if(!C){if(u)throw new Error(`Content-sync sitemap contains an inadmissible location: ${k.loc}`);continue}if(le(C)){if(o(g,C.toString()))throw new Error(`Sitemap index cycle detected: ${g} -> ${C.toString()}`);c.has(g)||c.set(g,new Set),c.get(g).add(C.toString()),x.push(C.toString()),Me(e,r,C.toString(),s,g);}else if(u){if(se(C)&&!M(e,C)){let O=i.requiredUrls.has(C.toString()),I=i.manifest.pages[C.toString()],P=!!I&&!!await we(I.outputPath);if(!O&&!P)throw new Error(`Content-sync sitemap coverage is incomplete for ${C.toString()}.`)}s.ignore("sitemap-loc",C.toString(),"content-sync sitemap-only traversal does not enqueue urlset locations",g);}else M(e,C)?E(e,r,C.toString(),s,g):se(C)?(k.lastmod&&(r.sitemapLastmodByPage[C.toString()]=k.lastmod),ye(e,r,C.toString(),s,g)):s.reject("sitemap-loc",C.toString(),"not page/sitemap/asset-like",g);}i.trackManifest&&(i.manifest.assets[g]={url:g,outputPath:h.outputPath,isText:!0,contentType:l.headers()["content-type"]??"application/xml",discoveredAssets:[...new Set([...$,...x])],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!1},await te(e,i));}catch(l){if(s.error(`Failed sitemap ${d}`,{url:d,error:String(l)}),u)throw l}}}}async function Ys(e,t,r,s,n,i,u){let c=U(e,s,e.sourceOrigin,n,"asset-fetch");if(!c||!M(e,c))return;let o=c.toString();if(r.doneAssets.has(o))return;let a=i.enabled||i.strictTargeted?i.previousManifest.assets[o]:void 0,p=i.strictTargeted?i.manifest.assets[o]:void 0;if(p?.lastSeenRunId===i.runId&&await we(p.outputPath)){r.doneAssets.add(o);for(let l of p.discoveredAssets||[])E(e,r,l,n,o);q(u,e,p.outputPath),p.isText&&ne(u,p.outputPath),n.info(`Resumed completed content-sync asset ${o}`,{url:o,source:"content-sync-checkpoint"}),he(r,n);return}let d=(l,m={})=>{if(!a||i.strictTargeted)return false;i.manifest.assets[o]={...a,discoveredAssets:[...a.discoveredAssets||[]],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId},delete i.manifest.pages[o],r.doneAssets.add(o);for(let y of a.discoveredAssets||[])E(e,r,y,n,o);return n.warn(`Keeping previous incremental asset ${o} after fetch issue.`,{url:o,reason:l,preservedFromPreviousManifest:true,...m,phase:"download-assets"}),he(r,n),true};n.asset(`Fetching asset ${o}`,{url:o});try{let l=ue(e,r.assetMap,o),m=l?await we(l):null;if(l&&m)try{let O=await F(`fetch asset headers ${o}`,6e4,()=>t.head(o,{timeout:6e4})),I=O.headers();if(O.ok()&&js(m,I)){let P=await Vt(l);if(P!==null){let R=O.url()||o,S=re(R,n,"asset-response",o);if(!S)return;let A=S.toString(),D=await Ge(e,r.assetMap,A,P,r,n,I);D.wroteFile&&(q(u,e,D.outputPath),X(D.outputPath)&&ne(u,D.outputPath)),r.doneAssets.add(o),n.info(`Reused existing asset ${o} based on response headers.`,{url:o,filePath:l,lastModified:I["last-modified"]||"",contentLength:I["content-length"]||"",phase:"download-assets"}),he(r,n);let j=Dt(c,I),ie=a?.discoveredAssets?[...a.discoveredAssets]:[];if(j||a?.isText){let N=P.toString("utf8"),Se=Pe(e,A,N,n,"asset:cached");(Se.length>0||!a)&&(ie=Se);for(let T of ie)E(e,r,T,n,A);}if(i.trackManifest){let N=j||!!a?.isText;i.manifest.assets[o]={url:o,outputPath:D.outputPath,isText:N,contentType:ze(I)||a?.contentType||null,discoveredAssets:ie,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!N},delete i.manifest.pages[o],(i.enabled||i.strictTargeted)&&N&&await te(e,i);}return}}}catch{}let y=await F(`fetch asset ${o}`,6e4,()=>t.get(o,{timeout:6e4}));if(!y.ok()){if(d(`http-${y.status()}`,{status:y.status()}))return;if(i.strictTargeted)throw new Error(`Required content-sync asset returned HTTP ${y.status()}: ${o}`);n.skip("asset",o,y.status());return}let w=await F(`read asset response ${o}`,6e4,()=>y.body()),g=y.url()||o,h=re(g,n,"asset-response",o);if(!h)return;let v=h.toString(),$=y.headers(),x=await Ge(e,r.assetMap,v,w,r,n,$);x.wroteFile&&(q(u,e,x.outputPath),X(x.outputPath)&&ne(u,x.outputPath)),r.doneAssets.add(o),he(r,n);let k=Dt(c,$),C=[];if(k){let O=w.toString("utf8");C=Pe(e,v,O,n,`asset:${f.extname(c.pathname).toLowerCase()||$["content-type"]||"unknown"}`);for(let I of C)E(e,r,I,n,v);}i.trackManifest&&(i.manifest.assets[o]={url:o,outputPath:x.outputPath,isText:k,contentType:ze($),discoveredAssets:C,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!k},delete i.manifest.pages[o],(i.enabled||i.strictTargeted)&&k&&await te(e,i));}catch(l){if(d("fetch-error",{error:String(l)}))return;if(n.error(`Failed asset ${o}`,{url:o,error:String(l)}),i.strictTargeted)throw l}finally{r.doneAssets.has(o)||(r.doneAssets.add(o),he(r,n));}}async function Xs(e,t,r,s,n,i){let u=Math.max(1,Number(e.assetDownloadConcurrency||e.concurrency||1)),c=Array.from({length:u},async()=>{for(;r.assetQueue.length>0;){let o=r.assetQueue.shift();o&&(r.queuedAssets.delete(o),await Ys(e,t,r,o,s,n,i));}});await Promise.all(c);}function en(e){let t=Math.ceil(e/1e3);return `${t} second${t===1?"":"s"}`}function J(e){return Math.max(6e4,e.navigationTimeoutMs*2,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+15e3)}function ke(e){return Math.max(15e3,Math.min(6e4,J(e)))}function tn(e){return Math.max(15e3,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+1e4)}function tt(e){return e.stats.pagesCompleted}function Yt(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 rn(e,t,r){let s=Yt(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 F(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 ${en(t)}.`));},t);})])}finally{s!==void 0&&globalThis.clearTimeout(s);}}async function sn(e,t){let r=tn(e);await t.evaluate(async s=>{await new Promise(n=>{let i=0,u=700,c=Date.now(),o=()=>{window.clearInterval(a),window.scrollTo(0,0),n();},a=window.setInterval(()=>{if(Date.now()-c>=s.maxDurationMs){o();return}window.scrollBy(0,u),i+=u;let p=document.body?.scrollHeight||0,d=document.documentElement?.scrollHeight||0,l=Math.max(p,d);i>=l+window.innerHeight&&o();},120);});},{maxDurationMs:r});}async function nn(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 sn(e,t),await t.waitForTimeout(e.readiness.fallbackWaitMs);}async function on(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 an(e,t){return e.noJavaScriptRenderPathPrefixes.some(r=>Ye(t,r))}async function un(e,t,r,s,n=true){let i=new Set;if(n){let c=await t.evaluate(()=>{let o=new Set,a=["href","src","poster","data-src","data-lazy-src","data-original","data-bg","data-background","data-href"],p=new Set,d=["srcset","data-srcset","data-lazy-srcset"];return document.querySelectorAll("*").forEach(l=>{for(let y of a){let w=l.getAttribute(y);w&&o.add(w);}for(let y of d){let w=l.getAttribute(y);w&&w.split(",").forEach(g=>{let h=g.trim().split(/\s+/)[0];h&&o.add(h);});}let m=l.getAttribute("style");m&&p.add(m);}),{attrs:[...o],styles:[...p]}});for(let o of c.attrs)for(let a of Hs(o)){let p=U(e,a,r,s,"dom-attr");p&&M(e,p)&&i.add(p.toString());}for(let o of c.styles)for(let a of Pe(e,r,o,s,"dom-style"))i.add(a);}let u=await t.content();for(let c of Pe(e,r,u,s,"page-html"))i.add(c);return [...i]}async function Ut(e,t,r,s,n){let i=V(e,t);await ge(i,r,"utf8");let u=await b.stat(i);n?.debug(`Saved page output ${t}`,{phase:"save-pages",url:t,outputPath:i,bytes:u.size}),s.stats.pagesSaved++;let c=Math.min(s.stats.pagesQueued,tt(s)+1);n&&(s.stats.pagesSaved%10===0||s.stats.pagesSaved===1)&&n.progress(`Page progress: processed ${c}, rendered ${s.stats.pagesRendered}, saved ${s.stats.pagesSaved}, discovered ${s.stats.pagesQueued}.`,{donePages:c,claimedPages:s.donePages.size,pagesRendered:s.stats.pagesRendered,pagesSaved:s.stats.pagesSaved,pagesQueued:s.stats.pagesQueued,pageQueue:s.pageQueue.length,phase:"save-pages"});}function cn(e){let t=tt(e);return t%5===0||t===1||t===e.stats.pagesQueued}function ln(e,t){let r=tt(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 dn(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 pn(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 dn(s),s}async function gn(e,t,r,s,n,i,u){let c=await chromium.launch({headless:true}),o=Yt(c);o.pid!==null&&r.debug(`Launched crawl worker browser PID ${o.pid}`,{browserPid:o.pid});try{for(;t.pageQueue.length>0&&!(e.maxPages>0&&t.donePages.size>=e.maxPages);){let a=t.pageQueue.shift();if(!a)break;t.queuedPages.delete(a);let p=null,d=null;try{let l=re(a,r,"page","page-queue");if(!l)continue;let m=l.toString();if(a=m,t.queuedPages.delete(a),t.donePages.has(a))continue;t.donePages.add(a),i.enabled&&i.seenPages.add(a);let y=et(e,a),w=an(e,l.pathname);if(!se(l)||M(e,l)||ce(l)){if(M(e,l)){r.info(`Worker redirected non-page URL to asset queue: ${a}`,{url:a,source:"worker-guard"}),E(e,t,a,r,"worker-guard");continue}r.reject("page",a,"guard rejected non-page URL before rendering","worker");continue}let g=i.strictTargeted?i.manifest.pages[a]:void 0;if(g?.lastSeenRunId===i.runId&&await we(g.outputPath)){i.seenPages.add(a);for(let S of g.discoveredAssets||[])E(e,t,S,r,a);q(u,e,g.outputPath),ne(u,g.outputPath),r.info(`Resumed completed content-sync page ${a}`,{url:a,source:"content-sync-checkpoint"});continue}let h=await ms(e,n,t,i,a,r);if(i.enabled&&s!=="single-url"&&s!=="content-sync"){let S=i.manifest.pages[a];if(h.action==="reuse"&&S){for(let A of S.discoveredAssets)E(e,t,A,r,a);for(let A of S.discoveredPages)ye(e,t,A,r,a);S.lastSeenRunId=i.runId,S.sitemapLastmod=fe(t.sitemapLastmodByPage[a])??S.sitemapLastmod,h.changeToken?.supported&&(S.changeToken=h.changeToken.token,S.tokenSource=h.changeToken.tokenSource??S.tokenSource),r.info(`Incremental reuse skipped unchanged page ${a}`,{url:a,mode:"incremental",reason:h.changeToken?.supported===!0?"change-token-match":"sitemap-lastmod-match"});continue}}p=await F(`create page context ${a}`,J(e),()=>pn(c,e,w)),d=await F(`create page ${a}`,J(e),()=>p.newPage());let v=!1,$=new Set;await d.route("**/*",async S=>{let A=S.request();if(A.isNavigationRequest()&&A.frame()===d.mainFrame())try{let D=new URL(A.url()),j=new URL(m);if(D.hash="",j.hash="",D.href===j.href){if(v){r.warn(`Blocked same-page navigation/reload for ${a}`,{url:a,requestUrl:A.url()}),await S.abort("aborted");return}v=!0;}}catch{}await S.continue();}),d.on("response",S=>{try{let A=U(e,S.url(),e.sourceOrigin,r,"network-response");A&&M(e,A)&&($.add(A.toString()),E(e,t,A.toString(),r,a));}catch{}}),r.page(`Rendering ${a}`,{url:a});let x=null,k=null;try{if(x=await d.goto(a,{waitUntil:"domcontentloaded",timeout:e.navigationTimeoutMs}),x&&x.ok())try{k=await F(`read response body ${a}`,J(e),()=>x.text());}catch{k=null;}}catch(S){r.warn(`Navigation issue for ${a}; saving current DOM if available`,{url:a,error:String(S)});}if(s==="content-sync"&&x){let S=re(x.url(),r,"content-sync-final-response",a)?.toString();if(S&&S!==m){if(i.deleteOnMissingUrls.has(a)){await Ke(e,i,u,a,i.deleteOnMissingUrls),r.info(`Removed stale content-sync archive route redirected to ${S}`,{url:a,finalResponseUrl:S,source:"content-sync-tombstone"});continue}throw new Error(`Required content-sync route redirected outside its planned URL: ${a} -> ${S}`)}}if(y){let S=x?.status()??null;if(S!==404){r.error(`Generated 404 request path returned unexpected status for ${a}`,{url:a,expectedStatus:404,status:S,requestPath:e.generated404RequestPath});continue}r.info(`Capturing rendered 404 page for ${a}`,{url:a,status:S,outputPath:V(e,a)});}else if(x&&!x.ok()){if(s==="content-sync"&&(x.status()===404||x.status()===410)&&i.deleteOnMissingUrls.has(a)){await Ke(e,i,u,a,i.deleteOnMissingUrls),r.info(`Removed stale content-sync archive page ${a}`,{url:a,status:x.status(),source:"content-sync-tombstone"}),await d.close();continue}if(s==="content-sync")throw new Error(`Required content-sync route returned HTTP ${x.status()}: ${a}`);r.skip("page",a,x.status(),t.pageDiscoverySources.get(a)),await d.close();continue}w?(r.info(`Rendering without JS execution for ${a}`,{url:a,mode:"no-js"}),await F(`wait for rendered page ${a}`,J(e),()=>on(e,d))):await F(`wait for rendered page ${a}`,J(e),()=>nn(e,d)),t.stats.pagesRendered++;let C=await F(`extract rendered assets ${a}`,J(e),()=>un(e,d,m,r,!w));for(let S of C)E(e,t,S,r,a);let O=[...new Set([...C,...$])],I=k??await F(`capture rendered html ${a}`,J(e),()=>d.content()),P=s!=="single-url"&&s!=="content-sync"&&!y?Zs(e,a,I,r):[];if(s!=="single-url"&&s!=="content-sync"&&!y)for(let S of P)ye(e,t,S,r,a);await Ut(e,a,I,t,r);let R=V(e,a);if(q(u,e,R),ne(u,R),i.trackManifest){let S=x?.headers();i.manifest.pages[a]={url:a,outputPath:R,contentType:ze(S),changeToken:h.changeToken?.supported?h.changeToken.token:null,tokenSource:h.changeToken?.supported?h.changeToken.tokenSource??null:null,sitemapLastmod:fe(t.sitemapLastmodByPage[a])??null,discoveredPages:P,discoveredAssets:O,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!1},(i.enabled||i.strictTargeted)&&await te(e,i);}}catch(l){if(i.strictTargeted)throw r.error(`Failed required content-sync page ${a}`,{url:a,error:String(l)}),l;try{let m=d?await F(`capture partial html ${a}`,J(e),()=>d.content()):"";if(m&&m.trim()){await Ut(e,a,m,t,r);let y=V(e,a);if(q(u,e,y),ne(u,y),i.trackManifest){let w=i.manifest.pages[a]??i.previousManifest.pages[a];i.manifest.pages[a]={url:a,outputPath:y,contentType:w?.contentType??null,changeToken:null,tokenSource:null,sitemapLastmod:fe(t.sitemapLastmodByPage[a])??w?.sitemapLastmod??null,discoveredPages:w?.discoveredPages?[...w.discoveredPages]:[],discoveredAssets:w?.discoveredAssets?[...w.discoveredAssets]:[],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!1},(i.enabled||i.strictTargeted)&&await te(e,i);}r.warn(`Saved partial DOM for ${a}`,{url:a,error:String(l)});}}catch(m){r.error(`Could not save partial DOM for ${a}`,{url:a,error:String(m)});}r.error(`Failed page ${a}`,{url:a,error:String(l)});}finally{t.stats.pagesCompleted++,cn(t)&&ln(t,r),d&&await F(`close page ${a}`,ke(e),()=>d.close()).catch(l=>{r.warn(`Timed out while closing page ${a}`,{url:a,browserPid:o.pid,error:String(l)});}),p&&await F(`close page context ${a}`,ke(e),()=>p.close()).catch(l=>{r.warn(`Timed out while closing page context for ${a}`,{url:a,browserPid:o.pid,error:String(l)});});}}}finally{await F("close worker browser",ke(e),()=>c.close()).catch(a=>(r.warn("Timed out while closing crawl worker browser",{browserPid:o.pid,error:String(a)}),rn(c,r,"browser.close timeout")));}}async function hn(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 Et(e){let t=String(e||"").toLowerCase();return t.includes("timeout")||t.includes("timed out")||t.includes("navigation timeout")}function fn(e){let t=String(e?.job?.command||"").trim(),r=String(e?.job?.crawlMode||"full").trim();return t!=="publish"&&t!=="crawl"?false:r!=="incremental"}function mn(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 Ot(e){let t=String(e.originalFileName||"").toLowerCase();return t.endsWith("errors.jsonl")?0:t.endsWith("errors.json")?1:2}function wn(e,t){let r=Array.isArray(t?.artifacts)?t.artifacts.filter(s=>String(s?.role||"").trim()==="errors"&&String(s?.storedFileName||"").trim()!=="").sort((s,n)=>Ot(s)-Ot(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 jt(e){let t=await Xt(f.join(e,"job.json"));for(let r of wn(e,t)){let s=await hn(r);if(s.length>0)return s}return []}async function yn(e){let t=f.join(e.logDir,"archive"),r;try{r=await b.readdir(t);}catch{return ""}let s="",n=0;for(let i of r){let u=f.join(t,i);if(!(await b.stat(u).catch(()=>null))?.isDirectory())continue;let o=await Xt(f.join(u,"job.json"));if(!fn(o))continue;let a=mn(o);a>=n&&(n=a,s=u);}return s}async function Pn(e){let t=await yn(e),r=t!==""?await jt(t):await jt(e.logDir),s=new Set;for(let n of r)if(Et(n.error)||Et(n.message)){let i=n.url;typeof i=="string"&&i&&s.add(i);}return [...s]}async function Sn(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 bn(e){if(!e)throw new Error("Content-sync crawl requires an immutable impact plan.");let t=JSON.parse(await b.readFile(e,"utf8"));return lt(t),t}function vn(e,t){let r;try{r=new URL(e);}catch{return false}return t.archiveFamilies.some(s=>{let n=new URL(s.url);if(r.origin!==n.origin)return false;if(r.toString()===n.toString())return true;if(r.searchParams.has("paged")&&r.pathname===n.pathname)return /^\d+$/.test(r.searchParams.get("paged")||"");let i=n.pathname.replace(/\/+$/,""),u=r.pathname.slice(i.length).replace(/^\/+/,""),c=String(s.paginationBase||"page").replace(/^\/+|\/+$/g,"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return r.pathname.startsWith(`${i}/`)&&new RegExp(`^${c}/\\d+/?$`).test(u)})}function Te(e,t,r){let s=r==="page"?V(e,t):$e(e,t).originalFilePath;return Z(e.outputDir,s)}async function Ke(e,t,r,s,n){let i=t.manifest.pages[s];if(!i)return;let u=Z(e.outputDir,i.outputPath);if(!u)throw new Error(`Manifest-owned page path escaped output root: ${s}`);let c=f.resolve(i.outputPath);Object.entries(t.manifest.pages).some(([a,p])=>a!==s&&!n.has(a)&&f.resolve(p.outputPath)===c)||(await b.rm(i.outputPath,{force:true}),r.deletedFiles.add(u)),delete t.manifest.pages[s];}function Cn(e,t){let r=new Set,s=[...t];for(;s.length>0;){let n=s.shift();if(r.has(n))continue;r.add(n);let i=e.assets[n];for(let u of i?.discoveredAssets??[])try{le(new URL(u))&&s.push(u);}catch{}}return r}async function Rn(e,t,r,s,n){let i=Cn(r.previousManifest,n);for(let u of i){if(t.doneSitemaps.has(u))continue;let c=r.previousManifest.assets[u];if(!c)continue;let o=Z(e.outputDir,c.outputPath);if(!o)throw new Error(`Manifest-owned sitemap path escaped output root: ${u}`);await b.rm(c.outputPath,{force:true}),s.deletedFiles.add(o),delete r.manifest.assets[u];}await te(e,r);}async function An(e){try{let t=await b.readFile(f.join(e.outputDir,"asset-map.json"),"utf8");return JSON.parse(t)}catch{return {}}}async function xn(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(f.join(e,r));}catch(s){if(s.code!=="ENOENT")throw s}}));}function qt(e,t,r,s,n){let i=U(e,r,e.sourceOrigin,s,"manual-url");i&&(le(i)?Me(e,t,i.toString(),s,n):M(e,i)?E(e,t,i.toString(),s,n):se(i)?ye(e,t,i.toString(),s,n):s.reject("manual-url",i.toString(),"not page/sitemap/asset-like",n));}async function er(e=process.argv.slice(2)){let t=[],r=await be(void 0,{onRemotePublisherConfigDiagnostic:P=>{t.push(P);}}),s=t.at(-1)??null,n=ss(e),i=n.mode==="content-sync"?await bn(n.contentSyncPlanPath):null;if(n.resumeRewrite&&n.mode!=="full")throw new Error("--resume-rewrite is only supported for full crawl/publish jobs.");let u=[];n.mode==="retry-timeouts"&&(u=await Pn(r)),n.mode==="single-url"&&(u=await Sn(n.urls)),i&&(u=[...i.directRenderUrls,...i.archiveFamilyUrls]);let c=n.crawlMode==="incremental"&&n.mode==="full",o=c&&typeof r.subscriptionType=="string"&&r.subscriptionType.trim()!=="";if(i&&r.subscriptionType!=="PROFESSIONAL"&&r.subscriptionType!=="AGENCY")throw new Error("Content-sync requires an active Professional or Agency subscription.");let a=(n.mode==="full"||n.mode==="single-url"||n.mode==="content-sync")&&!n.resumeRewrite,p=n.mode!=="full"||n.resumeRewrite||o,d=p?await An(r):{},l=o||n.mode==="single-url"||n.mode==="content-sync"?await cs(r):Qt(),m=new Set(u),y=new Set;if(i){for(let P of i.archiveFamilies)if(P.foundPosts===0)for(let R of P.pageUrls)y.add(R);for(let P of Object.keys(l.pages))vn(P,i)&&!m.has(P)&&(u.push(P),y.add(P));}let w={enabled:o,trackManifest:a,manifest:Je(l),previousManifest:Je(l),runId:i?.jobId??`${Date.now()}`,seenPages:new Set,changeTokenCache:new Map,manifestSaveChain:Promise.resolve(),strictTargeted:!!i,requiredUrls:m,deleteOnMissingUrls:y};await xn(r.logDir);let g=new ae(r.logDir,r.logLevel);if(s){let P={status:s.status,virtualAssetBaseUrl:s.virtualAssetBaseUrl,subscriptionType:s.subscriptionType??null,error:s.error,requests:s.requests,source:"remote-publisher-config"};s.status==="loaded"&&s.subscriptionType?g.info("Loaded remote WP Suite publisher configuration.",P):g.warn("Remote WP Suite publisher configuration is unavailable or has no active subscription type.",P);}if(c&&!o){let P="Incremental crawl requires an active remote publisher subscription; refusing to fall back to a destructive full crawl.";throw g.error(P,{requestedMode:n.crawlMode,subscriptionType:r.subscriptionType??null,source:"incremental-subscription-guard"}),await g.flush(),new Error(P)}let h={pageQueue:[],queuedPages:new Set,donePages:new Set,pageDiscoverySources:new Map,assetQueue:[],queuedAssets:new Set,doneAssets:new Set,sitemapQueue:[],queuedSitemaps:new Set,doneSitemaps:new Set,sitemapIndexUrls:new Set,sitemapLeafUrls:new Set,sitemapLastmodByPage:{},assetMap:{...d},assetVariantDigestsByOriginalPath:new Map,stats:{pagesQueued:0,pagesRendered:0,pagesCompleted:0,assetsQueued:0,sitemapsQueued:0,assetsSaved:0,pagesSaved:0}},v=us();if(await at(r),await ut(r,{startedAt:new Date().toISOString(),outputDir:f.resolve(r.outputDir)}),p||await b.rm(r.outputDir,{recursive:true,force:true}),await b.mkdir(r.outputDir,{recursive:true}),i){let P=new Set([...i.deleteUrls,...w.deleteOnMissingUrls]);for(let R of i.deleteUrls)await Ke(r,w,v,R,P);}if(n.resumeRewrite)g.info("Resuming final rewrite from existing output.",{phase:"rewrite-text",mode:n.mode,crawlMode:n.crawlMode});else {let P=await request.newContext({ignoreHTTPSErrors:r.ignoreHttpsErrors});try{if(g.mark("discovery"),n.mode==="full"?(r.sitemapPaths.forEach(S=>Me(r,h,S,g)),await Ft(r,P,h,g,v,w),r.seedPaths.forEach(S=>qt(r,h,S,g,"seed-path")),r.generated404RequestPath&&ye(r,h,r.generated404RequestPath,g,"generated-404-request-path")):(u.forEach(S=>qt(r,h,S,g,"cli")),i?.sitemapUrls.forEach(S=>Me(r,h,S,g,"content-sync-impact")),await Ft(r,P,h,g,v,w,n.mode==="content-sync"),i&&await Rn(r,h,w,v,i.sitemapUrls)),g.endMark("discovery",{pages:h.pageQueue.length,assets:h.assetQueue.length,sitemaps:h.sitemapQueue.length}),g.summary(`Queued ${h.pageQueue.length} pages, ${h.assetQueue.length} assets, ${h.sitemapQueue.length} sitemaps.`,{mode:n.mode,crawlMode:n.crawlMode,queuedPages:h.pageQueue.length,queuedAssets:h.assetQueue.length,queuedSitemaps:h.sitemapQueue.length}),n.mode==="retry-timeouts"&&h.pageQueue.length===0&&h.assetQueue.length===0&&h.sitemapQueue.length===0){g.summary("No timed-out URLs were queued. Skipping retry crawl.",{mode:n.mode,crawlMode:n.crawlMode,queuedPages:0,queuedAssets:0,queuedSitemaps:0}),await g.flush();return}g.mark("render-pages");let R=Array.from({length:Math.max(1,r.concurrency)},()=>gn(r,h,g,n.mode,P,w,v));if(await Promise.all(R),g.endMark("render-pages",{pages:h.stats.pagesCompleted}),g.mark("download-assets"),g.progress("Asset download phase started.",{phase:"download-assets",doneAssets:h.doneAssets.size,assetsQueued:h.stats.assetsQueued,assetQueue:h.assetQueue.length}),await Xs(r,P,h,g,w,v),g.endMark("download-assets",{assets:h.doneAssets.size}),w.enabled&&r.maxPages===0&&await ys(r,h,w,g,v),n.mode==="full"){let S=await Ks(r,h,g);for(let A of S)q(v,r,A);}}finally{await F("dispose crawl request context",ke(r),()=>P.dispose()).catch(R=>{g.warn("Timed out while disposing crawl request context",{error:String(R)});});}}w.trackManifest&&await te(r,w),await b.writeFile(f.join(r.outputDir,"asset-map.json"),JSON.stringify(h.assetMap,null,2),"utf8"),JSON.stringify(d,null,2)!==JSON.stringify(h.assetMap,null,2)&&q(v,r,f.join(r.outputDir,"asset-map.json"));let $=n.mode==="single-url"||n.mode==="content-sync"?Ts(r,h):w.enabled&&!n.resumeRewrite?Ps(r,w,v,d,h.assetMap):void 0;g.mark("rewrite-text");let x=n.mode==="single-url"||n.mode==="content-sync"?`Rewriting text files touched by URL crawl: 0/${$?.length??0}`:"Rewriting text files...";g.progress(x,{phase:"rewrite-text",index:0,totalFiles:$?.length,changedTextFiles:0}),await Lt(x);let k=Date.now(),C=await vt(r,h.assetMap,{files:$,previousAssetMap:d,onStart:({totalFiles:P,workerCount:R})=>{g.info(`Rewrite phase scanning ${P} text files.`,{phase:"rewrite-text",totalFiles:P,workerCount:R});},onProgress:async({index:P,totalFiles:R,changedTextFiles:S,file:A,changed:D})=>{D&&q(v,r,f.join(r.outputDir,A)),g.checkpoint(`Rewriting text file ${P}/${R}`,{phase:"rewrite-text",index:P,totalFiles:R,changedTextFiles:S,file:A}),g.debug(`${D?"Rewrote":"Checked unchanged"} text file ${P}/${R}: ${A}`,{phase:"rewrite-text",index:P,totalFiles:R,changedTextFiles:S,file:A,changed:D});let j=Date.now();if(!(P===1||P===R||P%50===0||j-k>=5e3))return;k=j;let N=`Rewriting text files: ${P}/${R}`;g.progress(N,{phase:"rewrite-text",index:P,totalFiles:R,changedTextFiles:S,file:A}),await Lt(N);}});w.trackManifest&&(Ss(w,$),await te(r,w)),g.endMark("rewrite-text",{changedTextFiles:C});let O=i?[...v.deletedFiles].sort():w.enabled&&!n.resumeRewrite?await vs(r,h,w,v,g):[],I=[...new Set(($||[]).map(P=>Z(r.outputDir,f.isAbsolute(P)?P:f.join(r.outputDir,P))).filter(P=>P!==null))].sort();if(i){let P=[...v.changedFiles].sort(),R=new Set(P),S=new Set(i.directRenderUrls.map(T=>Te(r,T,"page")).filter(T=>!!T&&R.has(T))),A=new Set(i.archiveFamilyUrls.map(T=>Te(r,T,"page")).filter(T=>!!T&&R.has(T))),D=new Set([...h.sitemapLeafUrls].map(T=>Te(r,T,"asset")).filter(T=>!!T&&R.has(T))),j=new Set([...h.sitemapIndexUrls].map(T=>Te(r,T,"asset")).filter(T=>!!T&&R.has(T))),ie=new Set([...S,...A,...D,...j]),N=P.filter(T=>!ie.has(T)),Se=[...new Set([...i.directRenderUrls,...i.archiveFamilyUrls,...i.sitemapUrls,...h.sitemapLeafUrls,...h.sitemapIndexUrls,...i.deleteUrls].map(T=>{let rt=new URL(T);return `${rt.pathname}${rt.search}`}))].sort();await Le(r,{schemaVersion:2,generatedAt:new Date().toISOString(),outputDir:f.resolve(r.outputDir),runMode:"content-sync",crawlMode:"incremental",fullSyncRequired:false,changedFiles:P,deletedFiles:O,rewriteTargets:I,consumerId:i.consumerId,fromSequence:i.fromSequence,toSequence:i.toSequence,impactHash:i.impactHash,uploadGroups:{assets:N,content:[...S].sort(),listings:[...A].sort(),sitemapLeaves:[...D].sort(),sitemapIndexes:[...j].reverse()},invalidationPaths:Se});}else await Le(r,{schemaVersion:1,generatedAt:new Date().toISOString(),outputDir:f.resolve(r.outputDir),runMode:n.mode,crawlMode:n.crawlMode,fullSyncRequired:!(w.enabled&&!n.resumeRewrite),changedFiles:w.enabled&&!n.resumeRewrite?[...v.changedFiles].sort():[],deletedFiles:w.enabled&&!n.resumeRewrite?O:[],rewriteTargets:w.enabled&&!n.resumeRewrite?I:[]});await ct(r),g.summary(n.resumeRewrite?`Done. Resumed final rewrite over existing output and changed ${C} text files.`:`Done. Rendered ${h.stats.pagesRendered} pages, processed ${h.doneSitemaps.size} sitemaps, downloaded ${h.doneAssets.size} assets.`,{mode:n.mode,crawlMode:n.crawlMode,resumeRewrite:n.resumeRewrite,...h.stats,pagesRendered:h.stats.pagesRendered,donePages:h.stats.pagesCompleted,claimedPages:h.donePages.size,doneSitemaps:h.doneSitemaps.size,doneAssets:h.doneAssets.size,changedTextFiles:C}),await g.flush();}er().catch(async e=>{let t=z(e instanceof Error?e.message:String(e));console.error(t);try{let s=(await be().catch(()=>null))?.logDir??"logs",n=new ae(s,"debug");n.error(`Unhandled error: ${t}`,e instanceof Error&&e.stack?{stack:z(e.stack)}:void 0),await n.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 vs(e,t,r,s,n,i){let u=rt(e,n);if(!s.enabled)return {action:"render",changeToken:s.trackManifest?await Me(e,t,s,n,i):null};let c=s.manifest.pages[n];if(!c)return {action:"render",changeToken:await Me(e,t,s,n,i)};let o=await Me(e,t,s,n,i);if(o?.supported&&o.token)return c.changeToken===o.token?u&&!await Cs(e,t,n,i)?{action:"render",changeToken:o}:{action:"reuse",changeToken:o}:{action:"render",changeToken:o};let a=Pe(r.sitemapLastmodByPage[n]);return a&&c.sitemapLastmod&&c.sitemapLastmod===a?{action:"reuse",changeToken:o}:{action:"render",changeToken:o}}async function Cs(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 Rs(e,t,r,s,n){let i=Ut(r.previousManifest,void 0,s,"previous-manifest"),u=0;for(let[d,m]of Object.entries(r.manifest.pages))if(!r.seenPages.has(d)){Dt(n,e,m.outputPath);try{await v.unlink(m.outputPath);}catch(S){(S.code||"")!=="ENOENT"&&s.warn(`Failed to remove stale incremental page output for ${d}`,{url:d,outputPath:m.outputPath,error:String(S)});}delete r.manifest.pages[d],u++;}let c=Ut(r.manifest,r.runId,s,"active-manifest"),o=new Set,a=new Set;for(let d of c){for(let w of Se(e,d))o.add(w);let m=r.manifest.assets[d]?.outputPath;m&&a.add(m);let S=de(e,t.assetMap,d);S&&a.add(S);}for(let d of Object.keys(r.manifest.assets))c.has(d)||delete r.manifest.assets[d];let l=0,p=0;for(let d of i){let m=new Set,S=r.previousManifest.assets[d]?.outputPath;S&&m.add(S);let w=de(e,t.assetMap,d);if(!c.has(d)&&w)m.add(w);else if(!c.has(d)){let g=Ws(e,d,s,"incremental-cleanup");g&&(m.add(g.originalFilePath),g.hashedFilePath&&m.add(g.hashedFilePath));}for(let g of m)if(!a.has(g)){Dt(n,e,g);try{await v.unlink(g),l++;}catch(h){(h.code||"")!=="ENOENT"&&s.warn(`Failed to remove stale incremental asset output for ${d}`,{url:d,outputPath:g,error:String(h)});}}for(let g of Se(e,d))o.has(g)||Object.prototype.hasOwnProperty.call(t.assetMap,g)&&(delete t.assetMap[g],p++);}(u>0||l>0||p>0)&&s.info(`Incremental cleanup removed ${u} stale pages, ${l} stale assets, ${p} stale asset mappings`,{removedPages:u,removedAssets:l,removedAssetMappings:p,phase:"incremental-cleanup"});}function Ut(e,t,r,s){let n=new Set,i=u=>{let c=u.trim();if(c){if(r){let o=re(c,r,"asset",s??"manifest");if(!o)return;n.add(o.toString());return}n.add(c);}};for(let u of Object.values(e.pages))for(let c of u.discoveredAssets||[])i(c);for(let[u,c]of Object.entries(e.assets||{}))t&&c.lastSeenRunId!==t||i(u);return n}function Ft(e,t,r){for(let s of t)for(let n of Se(e,s))if(r.has(n))return true;return false}function As(e,t,r,s,n){let i=new Set(r.rewriteTargets);for(let c of Object.values(t.manifest.pages))c.rewriteComplete||i.add(f.resolve(c.outputPath));for(let c of Object.values(t.manifest.assets))c.isText&&!c.rewriteComplete&&i.add(f.resolve(c.outputPath));let u=ys(s,n);if(u.size===0)return [...i];for(let c of Object.values(t.manifest.pages))Ft(e,c.discoveredAssets,u)&&i.add(f.resolve(c.outputPath));for(let[c,o]of Object.entries(t.manifest.assets)){o.isText&&Ft(e,o.discoveredAssets,u)&&i.add(f.resolve(o.outputPath));for(let a of Se(e,c))if(u.has(a)){j(r,e,o.outputPath),o.isText&&i.add(f.resolve(o.outputPath));break}}return [...i]}function ks(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 xs(e,t,r){let s=new Set,n=i=>{if(!i)return;let u=Z(e.outputDir,i);u&&s.add(u);};for(let i of t.donePages)n(J(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(de(e,t.assetMap,i));for(let i of Object.values(r.manifest.assets))i.lastSeenRunId===r.runId&&n(i.outputPath);return s}async function Ts(e,t,r,s,n){let i=[...s.deletedFiles].sort(),u=xs(e,t,r),c=0;for(let l of [...u].sort()){try{if((await v.stat(f.join(e.outputDir,l))).isFile())continue}catch{}c++,n.warn(`Active output is missing after crawl: ${l}`,{phase:"deploy-plan",file:l,outputPath:f.join(e.outputDir,l)});}if(c>0&&n.warn(`Detected ${c} active output file(s) missing before deploy plan save.`,{phase:"deploy-plan",missingActiveOutputs:c}),i.length===0)return [];let o=[],a=0;for(let l of i){if(!u.has(l)){o.push(l);continue}a++;let p=f.join(e.outputDir,l),d;try{d=(await v.stat(p)).isFile();}catch{d=false;}n.warn(`Deploy plan protected active output from deletion: ${l}`,{phase:"deploy-plan",file:l,outputPath:p,exists:d});}return a>0&&n.info(`Deploy plan skipped ${a} active output deletion(s).`,{phase:"deploy-plan",protectedDeletes:a,deletedFiles:o.length}),o}function Se(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 Is(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 Kt(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,tt(s.pathname))}catch{return null}}function Ms(e,t,r){for(let s of Is(e,r)){let n=t[s];if(!n)continue;let i=Kt(e,n);if(i)return {outputPath:i,publicUrl:n}}return null}function $s(e,t,r){for(let s of Se(e,r)){let n=t[s];if(!n)continue;let i=Kt(e,n);if(i)return i}return null}function de(e,t,r){let s=$s(e,t,r);if(s)return s;try{return Ue(e,r).originalFilePath}catch{return null}}function Ls(){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 Et(e){let t=Ls();if(t)try{let r=await v.readFile(t,"utf8"),s=JSON.parse(r);if(!s||typeof s!="object")return;await v.writeFile(t,JSON.stringify({...s,checkedAt:new Date().toISOString(),status:"running",currentStep:"rewrite",message:e},null,2),"utf8");}catch{}}function Ds(e,t){let r=new Set;for(let s of t.donePages)r.add(f.resolve(J(e,s)));for(let s of t.doneAssets){let n=de(e,t.assetMap,s);!n||!X(n)||r.add(f.resolve(n));}for(let s of t.doneSitemaps){let n=de(e,t.assetMap,s);!n||!X(n)||r.add(f.resolve(n));}return [...r]}var Le="re:",Te=new Map;function Us(e){if(!e.startsWith(Le))return null;let t=Te.get(e);if(t!==void 0)return t||null;let r=e.slice(Le.length).trim();if(!r)return Te.set(e,false),null;try{let s=new RegExp(r);return Te.set(e,s),s}catch{return console.warn(`[crawl] Ignoring invalid path matcher regex: ${e}`),Te.set(e,false),null}}function et(e,t){let r=Us(t);return r?r.test(e):t.startsWith(Le)?false:e.startsWith(t)}function Fs(e,t){return t.find(r=>et(e,r))}function Zt(e,t){let r=Fs(t.pathname,e.blockedPathPrefixes);if(r)return r.startsWith(Le)?`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 Es(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 Es(e).has(t.hostname)}function js(e){let t=Q(e.trim()).replace(/\\\//g,"/").replace(/^['"]|['"]$/g,"").trim();return t=t.replace(/[)]+$/g,"").trim(),t=t.replace(/;.*$/g,"").trim(),t}function Ke(e){let t=Q(e).replace(/\\\//g,"/");return /[{}]|\bwindow\.|\blocation\.|\bincludes\(|\?\?null|\+|%7B|%7D|%22|<|>|\s/.test(t)||/[()[\]'"]/.test(t)}function qs(e){let t=Q(e).replace(/\\\//g,"/").trim(),r=f.extname(t).toLowerCase();return Qt.has(r)||Ht.has(r)?false:/^(?:this|[A-Za-z_$][\w$]*)\.[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/.test(t)}function pe(e){return cs.some(t=>e.pathname.startsWith(t))}function U(e,t,r=e.sourceOrigin,s,n="url"){let i=js(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(Ke(i))return s?.ignore(n,t,"looks like JavaScript/code fragment",r),null;if(qs(i))return s?.ignore(n,t,"looks like JavaScript property access",r),null;try{let u=new URL(i,r);if(Yt(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 c=Zt(e,u);if(c)return s?.reject(n,u.toString(),c,r),null;let o=new URL(e.sourceOrigin);return u.protocol=o.protocol,u.host=o.host,u.hash="",u}catch{return s?.reject(n,t,"invalid URL",r),null}}function Yt(e){try{return decodeURIComponent(e.pathname),decodeURIComponent(e.search),decodeURIComponent(e.hash),!1}catch{return true}}function re(e,t,r,s){try{let n=new URL(e);return Yt(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 Xt(e){return Qt.has(f.extname(e.pathname).toLowerCase())}function se(e){return pe(e)?false:Ht.has(f.extname(e.pathname).toLowerCase())}function ge(e){let t=e.pathname.toLowerCase();return t.endsWith(".xml")&&(t.includes("sitemap")||t.endsWith("/sitemap.xml"))}function T(e,t){return !!(ge(t)||t.pathname==="/robots.txt"||t.pathname==="/llms.txt"||t.pathname.toLowerCase().endsWith(".xsl")||e.assetPathPrefixes.length>0&&e.assetPathPrefixes.some(r=>et(t.pathname,r))||Xt(t)||!se(t)&&!pe(t))}function J(e,t){let r=new URL(t),s=tt(r.pathname);return s.endsWith("/")?s+="index.html":f.extname(s)||(s+="/index.html"),f.join(e.outputDir,s)}function tt(e){try{return decodeURIComponent(e)}catch{return e}}function Ns(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 rt(e,t){let r=Ns(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=tt(r.pathname);s.endsWith("/")&&(s+="index.html");let n=!!r.search,i=s,u=f.join(e.outputDir,i),c=We(e.targetOrigin,i),o=`${c}${r.search}`;if(!n)return {originalPathname:i,originalFilePath:u,originalPublicUrl:c,originalPublicUrlWithSearch:o,preferQueryHashed:n};let a=f.extname(s),p=`${a?s.slice(0,-a.length):s}.${we(r.search)}${a||".bin"}`;return {originalPathname:i,originalFilePath:u,originalPublicUrl:c,originalPublicUrlWithSearch:o,preferQueryHashed:n,hashedPathname:p,hashedFilePath:f.join(e.outputDir,p),hashedPublicUrl:We(e.targetOrigin,p)}}function Ws(e,t,r,s){let n=re(t,r,"asset",s);return n?Ue(e,n.toString()):null}function _s(e,t,r,s,n){t[r]=s;try{let i=new URL(r),c=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{c.push(new URL(e.targetOrigin).origin);}catch{}for(let o of c)try{let a=new URL(o);t[a.origin+i.pathname+i.search]=s;}catch{}try{let o=(()=>{let a=new URL(s,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin);return `${a.pathname}${a.search}`})();t[i.pathname+i.search]=o;}catch{}try{let o=new URL(s,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[i.pathname]=o;}catch{}try{let o=new URL(n,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[i.pathname]=o;}catch{}}catch{}}async function er(e){try{return await v.readFile(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}async function le(e){try{return await v.stat(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}function Bs(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 tr(e){let t=String(e["last-modified"]||"").trim();if(!t)return null;let r=Date.parse(t);return Number.isFinite(r)?r:null}function Qs(e,t){let r=tr(t),s=Bs(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 Hs(e,t){if(!t)return;let r=tr(t);if(r===null)return;let s=await le(e);if(!s)return;let n=new Date(r);await v.utimes(e,s.atime,n).catch(()=>{});}function Ot(e,t){let r=f.extname(e.pathname).toLowerCase(),s=t["content-type"]||"";return us.has(r)||as.some(n=>s.includes(n))&&!s.startsWith("image/")&&!s.includes("font")}function zs(e){try{let t=f.extname(new URL(e).pathname).toLowerCase();return t===".js"||t===".mjs"}catch{return false}}function ce(e,t){(e.doneAssets.size%25===0||e.doneAssets.size===1||e.doneAssets.size===e.stats.assetsQueued)&&t.progress(`Asset processing progress: processed ${e.doneAssets.size}, discovered ${e.stats.assetsQueued}.`,{doneAssets:e.doneAssets.size,assetsQueued:e.stats.assetsQueued,phase:"download-assets"});}function Js(e){return we(e.toString("base64"),40)}function Vs(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 Gs(e,t,r){let s=e.assetVariantDigestsByOriginalPath.get(t);s||(s=new Set,e.assetVariantDigestsByOriginalPath.set(t,s)),s.add(r);}async function Ze(e,t,r,s,n,i,u){let c=Ue(e,r),o=Js(s),a=c.originalFilePath,l=c.originalPublicUrlWithSearch;if(c.preferQueryHashed&&c.hashedFilePath&&c.hashedPublicUrl&&Vs(n,c.originalFilePath,o)){let S=Ms(e,t,r);S?(a=S.outputPath,l=S.publicUrl):(a=c.hashedFilePath,l=c.hashedPublicUrl);}_s(e,t,r,l,c.originalPublicUrl);let p=X(a)?Buffer.from(Qe(s.toString("utf8"),e,t,a),"utf8"):s,d=await er(a),m=false;return (d===null||!d.equals(p))&&(await ye(a,p),m=true),i?.debug(`${m?"Saved":"Skipped unchanged"} asset output ${r}`,{phase:"download-assets",url:r,outputPath:a,bytes:p.length,wroteFile:m}),Gs(n,c.originalFilePath,o),await Hs(a,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:a,publicUrl:l,wroteFile:m}}function be(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 d=new URL(p);return ge(d)?{discoveredFrom:p,discoveredFromType:"sitemap"}:T(e,d)?{discoveredFrom:p,discoveredFromType:"asset"}:se(d)&&!pe(d)?{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,c=U(e,r,u,s,"page");if(!c)return;if(!se(c)||Xt(c)){if(T(e,c)){s.info(`Seeded/non-page URL queued as asset: ${c.toString()}`,{url:c.toString(),source:n}),F(e,t,c.toString(),s,n);return}s.reject("page",c.toString(),pe(c)?"asset/internal path cannot be page":"not page-like",n);return}let o=c.toString(),{discoveredFrom:a,discoveredFromType:l}=i();a&&!t.pageDiscoverySources.has(o)&&t.pageDiscoverySources.set(o,a),!t.donePages.has(o)&&!t.queuedPages.has(o)&&(t.queuedPages.add(o),t.pageQueue.push(o),t.stats.pagesQueued++,s.debug(`Queued discovered page ${o}`,{phase:"discovery",url:o,discoveredFrom:a,discoveredFromType:l,outputPath:J(e,o)}),(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 F(e,t,r,s,n){let i=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,u=U(e,r,i,s,"asset");if(!u)return;if(!T(e,u)){s.reject("asset",u.toString(),"not a safe asset path/prefix",n);return}let c=u.toString();!t.doneAssets.has(c)&&!t.queuedAssets.has(c)&&(t.queuedAssets.add(c),t.assetQueue.push(c),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 De(e,t,r,s,n){let i=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,u=U(e,r,i,s,"sitemap");if(!u)return;if(!ge(u)){s.reject("sitemap",u.toString(),"not sitemap-like",n);return}let c=u.toString();!t.doneSitemaps.has(c)&&!t.queuedSitemaps.has(c)&&(t.queuedSitemaps.add(c),t.sitemapQueue.push(c),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 Ks(e){let t=Q(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:Pe(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 Zs(e){return e.split(",").map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function Ys(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 Xs(e){return e.replace(/<script\b[^>]*>[\s\S]*?<\/script\s*>/gi,"")}function en(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 Je(e){return e.trim().replace(/\\/g,"/").replace(/^https?:\/\/[^/]+/i,"").replace(/^\/+/,"")}async function rr(e,t,r,s){let n=[];await v.mkdir(t,{recursive:true});let i=await v.readdir(e,{withFileTypes:true});for(let u of i){let c=f.join(e,u.name),o=f.join(t,u.name);if(u.isDirectory()){n.push(...await rr(c,o,r,s));continue}await sr(c,o,r,s)&&n.push(o);}return n}async function tn(e,t){try{let[r,s]=await Promise.all([v.stat(e),v.stat(t)]);if(r.size!==s.size)return !1;let[n,i]=await Promise.all([v.readFile(e),v.readFile(t)]);return n.equals(i)}catch{return false}}async function sr(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 tn(e,t)?(s.debug("Skipped unchanged post-crawl copy target",{phase:"copy-extra-paths",sourcePath:e,targetPath:t}),false):(await v.mkdir(f.dirname(t),{recursive:true}),await v.copyFile(e,t),true)}async function rn(e,t,r){let s=Object.entries(e.postCrawlCopyMap||{}).map(([c,o])=>({sourcePath:c.trim(),prefix:String(o||"").trim()}));if(s.length===0)return [];let n=0,i=[],u=new Set([...t.donePages].map(c=>f.resolve(J(e,c))));r.mark("copy-extra-paths");for(let c of s){let o=c.sourcePath,a=c.prefix;if(!o||!a){r.warn("Skipped post-crawl copy mapping with empty key/value",{sourcePath:o,prefixPath:a});continue}let l=gs(o);if(!l.resolvedPath){r.warn("Skipped post-crawl copy source because alias root is not configured",{sourcePath:o,alias:l.alias||"",requiredEnv:l.requiredEnv||"",prefixPath:a});continue}let p=l.resolvedPath,d=Je(a);if(!d){r.warn("Skipped post-crawl copy mapping with invalid export prefix",{sourcePath:o,prefixPath:a});continue}let m;try{m=await v.stat(p);}catch{r.warn("Skipped post-crawl copy source because it does not exist",{sourcePath:o,sourceAbs:p,prefixPath:a});continue}let S=f.resolve(e.outputDir,d);if(m.isDirectory()){let b=await rr(p,S,u,r);i.push(...b),n+=b.length,b.length>0&&r.progress(`Copied static directory to export: ${p} -> /${d}`,{phase:"copy-extra-paths",sourcePath:p,targetPath:`/${d}`,copiedItems:n,changedFiles:b.length});continue}let w=f.basename(p),g=a.endsWith("/")?f.join(S,w):S;await sr(p,g,u,r)&&(i.push(g),n++,r.progress(`Copied static file to export: ${p} -> /${Je(a.endsWith("/")?`${a}${w}`:a)}`,{phase:"copy-extra-paths",sourcePath:p,targetPath:`/${Je(a.endsWith("/")?`${a}${w}`:a)}`,copiedItems:n}));}return r.endMark("copy-extra-paths",{mappedSources:s.length,copiedItems:n}),i}function ve(e,t,r,s,n){let i=new Set,u=Q(r).replace(/\\\//g,"/"),c=n==="page-html"?Xs(u):u,o=en(t,n);if(o){for(let l of Ys(c)){let p=U(e,l,t,s,`${n}:css-url`);p&&T(e,p)&&i.add(p.toString());}for(let l of c.matchAll(/@import\s+(?:url\()?\s*['"]?([^'"\s;]+)['"]?\s*\)?/gi)){let p=U(e,l[1],t,s,`${n}:css-import`);p&&T(e,p)&&i.add(p.toString());}}if(o||n==="page-html")for(let l of c.matchAll(/<\?xml-stylesheet[^>]+href=["']([^"']+)["'][^>]*\?>/gi)){let p=U(e,l[1],t,s,`${n}:xml-stylesheet`);p&&T(e,p)&&i.add(p.toString());}let a=new RegExp(`(?:https?:)?//[^\\s'"<>\\);]+\\.${ze}(?:\\?[^\\s'"<>\\);]*)?|(?<!\\.)/[^\\s'"<>\\);]+\\.${ze}(?:\\?[^\\s'"<>\\);]*)?`,"gi");if(n==="page-html")for(let l of u.matchAll(a)){let p=l[0].startsWith("//")?`${new URL(e.sourceOrigin).protocol}${l[0]}`:l[0];if(Ke(p)){s.ignore(`${n}:serialized-url`,p,"looks like JavaScript/code fragment",t);continue}let d=U(e,p,t,s,`${n}:serialized-url`);d&&T(e,d)?i.add(d.toString()):d&&s.ignore("asset",d.toString(),"serialized URL did not pass safe asset path filter",t);}if(n!=="page-html"&&zs(t))for(let l of It(u)){if(Ke(l)||!/\.(?:js|mjs)(?:[?#]|$)/i.test(l))continue;let p=U(e,l,t,s,`${n}:relative-asset`);p&&T(e,p)&&i.add(p.toString());}return [...i]}function sn(e,t,r,s){let n=new Set,i=Q(r);for(let u of i.matchAll(/href=["']([^"'#\s][^"']*?)["']/gi)){let c=u[1],o=U(e,c,t,s,"page-link");o&&(Zt(e,o)||se(o)&&!pe(o)&&!T(e,o)&&n.add(o.toString()));}return [...n]}async function jt(e,t,r,s,n,i,u=false){let c=new Map,o=(a,l)=>{let p=[l],d=new Set;for(;p.length>0;){let m=p.pop();if(m===a)return true;d.has(m)||(d.add(m),p.push(...c.get(m)??[]));}return false};for(;r.sitemapQueue.length>0;){let a=r.sitemapQueue.shift();r.queuedSitemaps.delete(a);let l=re(a,s,"sitemap","sitemap-queue");if(!l)continue;let p=l.toString();if(!r.doneSitemaps.has(p)){r.doneSitemaps.add(p),s.sitemap(`Fetching sitemap ${p}`,{url:p});try{let d=await t.get(p,{timeout:6e4});if(!d.ok()){if(s.skip("sitemap",p,d.status()),u)throw new Error(`Required content-sync sitemap returned HTTP ${d.status()}: ${p}`);continue}let m=await d.body(),S=d.url()||p,w=re(S,s,"sitemap-response",p);if(!w)continue;let g=w.toString(),h=await Ze(e,r.assetMap,g,m,r,s);j(n,e,h.outputPath),ie(n,h.outputPath);let b=m.toString("utf8");/<sitemapindex(?:\s|>)/i.test(b)?r.sitemapIndexUrls.add(g):r.sitemapLeafUrls.add(g);let L=ve(e,g,b,s,"sitemap");for(let I of L)F(e,r,I,s,g);let x=[];for(let I of Ks(b)){let R=U(e,I.loc,g,s,"sitemap-loc");if(!R){if(u)throw new Error(`Content-sync sitemap contains an inadmissible location: ${I.loc}`);continue}if(ge(R)){if(o(g,R.toString()))throw new Error(`Sitemap index cycle detected: ${g} -> ${R.toString()}`);c.has(g)||c.set(g,new Set),c.get(g).add(R.toString()),x.push(R.toString()),De(e,r,R.toString(),s,g);}else if(u){if(se(R)&&!T(e,R)){let O=i.requiredUrls.has(R.toString()),D=i.manifest.pages[R.toString()],P=!!D&&!!await le(D.outputPath);if(!O&&!P)throw new Error(`Content-sync sitemap coverage is incomplete for ${R.toString()}.`)}s.ignore("sitemap-loc",R.toString(),"content-sync sitemap-only traversal does not enqueue urlset locations",g);}else T(e,R)?F(e,r,R.toString(),s,g):se(R)?(I.lastmod&&(r.sitemapLastmodByPage[R.toString()]=I.lastmod),be(e,r,R.toString(),s,g)):s.reject("sitemap-loc",R.toString(),"not page/sitemap/asset-like",g);}i.trackManifest&&(i.manifest.assets[g]={url:g,outputPath:h.outputPath,isText:!0,contentType:d.headers()["content-type"]??"application/xml",changeToken:null,tokenSource:null,discoveredAssets:[...new Set([...L,...x])],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!1},await te(e,i));}catch(d){if(s.error(`Failed sitemap ${p}`,{url:p,error:String(d)}),u)throw d}}}}async function nn(e,t,r,s,n,i,u){let c=U(e,s,e.sourceOrigin,n,"asset-fetch");if(!c||!T(e,c))return;let o=c.toString();if(r.doneAssets.has(o))return;let a=i.enabled||i.strictTargeted?i.previousManifest.assets[o]:void 0,l=i.trackManifest?await Me(e,t,i,o,n):null,p=l?.token??null,d=Mt(a?.changeToken,l),m=i.strictTargeted&&(!l?.supported||!l.token)&&$t(e.sourceOrigin,o),S=i.strictTargeted?i.manifest.assets[o]:void 0;if(S?.lastSeenRunId===i.runId&&await le(S.outputPath)){r.doneAssets.add(o);for(let g of S.discoveredAssets||[])F(e,r,g,n,o);j(u,e,S.outputPath),S.isText&&ie(u,S.outputPath),n.info(`Resumed completed content-sync asset ${o}`,{url:o,source:"content-sync-checkpoint"}),ce(r,n);return}if(a&&(d||m)&&await le(a.outputPath)){i.manifest.assets[o]={...a,changeToken:p,tokenSource:l?.tokenSource??a.tokenSource,discoveredAssets:[...a.discoveredAssets||[]],lastSeenRunId:i.runId},delete i.manifest.pages[o],r.doneAssets.add(o);for(let g of a.discoveredAssets||[])F(e,r,g,n,o);n.info(`Reused unchanged trusted asset ${o}.`,{url:o,tokenSource:l?.tokenSource??"unknown",phase:"download-assets",source:d?"asset-change-token-match":"content-sync-release-fingerprint"}),ce(r,n);return}let w=(g,h={})=>{if(!a||i.strictTargeted)return false;i.manifest.assets[o]={...a,discoveredAssets:[...a.discoveredAssets||[]],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId},delete i.manifest.pages[o],r.doneAssets.add(o);for(let b of a.discoveredAssets||[])F(e,r,b,n,o);return n.warn(`Keeping previous incremental asset ${o} after fetch issue.`,{url:o,reason:g,preservedFromPreviousManifest:true,...h,phase:"download-assets"}),ce(r,n),true};n.asset(`Fetching asset ${o}`,{url:o});try{let g=de(e,r.assetMap,o),h=g?await le(g):null;if(g&&h)try{let y=await $(`fetch asset headers ${o}`,6e4,()=>t.head(o,{timeout:6e4})),C=y.headers();if(y.ok()&&Qs(h,C)){let E=await er(g);if(E!==null){let q=y.url()||o,he=re(q,n,"asset-response",o);if(!he)return;let V=he.toString(),ne=await Ze(e,r.assetMap,V,E,r,n,C);ne.wroteFile&&(j(u,e,ne.outputPath),X(ne.outputPath)&&ie(u,ne.outputPath)),r.doneAssets.add(o),n.info(`Reused existing asset ${o} based on response headers.`,{url:o,filePath:g,lastModified:C["last-modified"]||"",contentLength:C["content-length"]||"",phase:"download-assets"}),ce(r,n);let k=Ot(c,C),oe=a?.discoveredAssets?[...a.discoveredAssets]:[];if(k||a?.isText){let fe=E.toString("utf8"),nt=ve(e,V,fe,n,"asset:cached");(nt.length>0||!a)&&(oe=nt);for(let ar of oe)F(e,r,ar,n,V);}if(i.trackManifest){let fe=k||!!a?.isText;i.manifest.assets[o]={url:o,outputPath:ne.outputPath,isText:fe,contentType:Ve(C)||a?.contentType||null,changeToken:l?.supported?l.token:null,tokenSource:l?.supported?l.tokenSource??null:null,discoveredAssets:oe,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!fe},delete i.manifest.pages[o],(i.enabled||i.strictTargeted)&&fe&&await te(e,i);}return}}}catch{}let b=await $(`fetch asset ${o}`,6e4,()=>t.get(o,{timeout:6e4}));if(!b.ok()){if(w(`http-${b.status()}`,{status:b.status()}))return;if(i.strictTargeted)throw new Error(`Required content-sync asset returned HTTP ${b.status()}: ${o}`);n.skip("asset",o,b.status());return}let L=await $(`read asset response ${o}`,6e4,()=>b.body()),x=b.url()||o,I=re(x,n,"asset-response",o);if(!I)return;let R=I.toString(),O=b.headers(),D=await Ze(e,r.assetMap,R,L,r,n,O);D.wroteFile&&(j(u,e,D.outputPath),X(D.outputPath)&&ie(u,D.outputPath)),r.doneAssets.add(o),ce(r,n);let P=Ot(c,O),A=[];if(P){let y=L.toString("utf8");A=ve(e,R,y,n,`asset:${f.extname(c.pathname).toLowerCase()||O["content-type"]||"unknown"}`);for(let C of A)F(e,r,C,n,R);}i.trackManifest&&(i.manifest.assets[o]={url:o,outputPath:D.outputPath,isText:P,contentType:Ve(O),changeToken:l?.supported?l.token:null,tokenSource:l?.supported?l.tokenSource??null:null,discoveredAssets:A,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!P},delete i.manifest.pages[o],(i.enabled||i.strictTargeted)&&P&&await te(e,i));}catch(g){if(w("fetch-error",{error:String(g)}))return;if(n.error(`Failed asset ${o}`,{url:o,error:String(g)}),i.strictTargeted)throw g}finally{r.doneAssets.has(o)||(r.doneAssets.add(o),ce(r,n));}}async function on(e,t,r,s,n,i){let u=Math.max(1,Number(e.assetDownloadConcurrency||e.concurrency||1)),c=Array.from({length:u},async()=>{for(;r.assetQueue.length>0;){let o=r.assetQueue.shift();o&&(r.queuedAssets.delete(o),await nn(e,t,r,o,s,n,i));}});await Promise.all(c);}function an(e){let t=Math.ceil(e/1e3);return `${t} second${t===1?"":"s"}`}function z(e){return Math.max(6e4,e.navigationTimeoutMs*2,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+15e3)}function $e(e){return Math.max(15e3,Math.min(6e4,z(e)))}function un(e){return Math.max(15e3,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+1e4)}function st(e){return e.stats.pagesCompleted}function nr(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 cn(e,t,r){let s=nr(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 $(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 ${an(t)}.`));},t);})])}finally{s!==void 0&&globalThis.clearTimeout(s);}}async function ln(e,t){let r=un(e);await t.evaluate(async s=>{await new Promise(n=>{let i=0,u=700,c=Date.now(),o=()=>{window.clearInterval(a),window.scrollTo(0,0),n();},a=window.setInterval(()=>{if(Date.now()-c>=s.maxDurationMs){o();return}window.scrollBy(0,u),i+=u;let l=document.body?.scrollHeight||0,p=document.documentElement?.scrollHeight||0,d=Math.max(l,p);i>=d+window.innerHeight&&o();},120);});},{maxDurationMs:r});}async function dn(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 ln(e,t),await t.waitForTimeout(e.readiness.fallbackWaitMs);}async function pn(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 gn(e,t){return e.noJavaScriptRenderPathPrefixes.some(r=>et(t,r))}async function hn(e,t,r,s,n=true){let i=new Set;if(n){let c=await t.evaluate(()=>{let o=new Set,a=["href","src","poster","data-src","data-lazy-src","data-original","data-bg","data-background","data-href"],l=new Set,p=["srcset","data-srcset","data-lazy-srcset"];return document.querySelectorAll("*").forEach(d=>{for(let S of a){let w=d.getAttribute(S);w&&o.add(w);}for(let S of p){let w=d.getAttribute(S);w&&w.split(",").forEach(g=>{let h=g.trim().split(/\s+/)[0];h&&o.add(h);});}let m=d.getAttribute("style");m&&l.add(m);}),{attrs:[...o],styles:[...l]}});for(let o of c.attrs)for(let a of Zs(o)){let l=U(e,a,r,s,"dom-attr");l&&T(e,l)&&i.add(l.toString());}for(let o of c.styles)for(let a of ve(e,r,o,s,"dom-style"))i.add(a);}let u=await t.content();for(let c of ve(e,r,u,s,"page-html"))i.add(c);return [...i]}async function qt(e,t,r,s,n){let i=J(e,t);await ye(i,r,"utf8");let u=await v.stat(i);n?.debug(`Saved page output ${t}`,{phase:"save-pages",url:t,outputPath:i,bytes:u.size}),s.stats.pagesSaved++;let c=Math.min(s.stats.pagesQueued,st(s)+1);n&&(s.stats.pagesSaved%10===0||s.stats.pagesSaved===1)&&n.progress(`Page progress: processed ${c}, rendered ${s.stats.pagesRendered}, saved ${s.stats.pagesSaved}, discovered ${s.stats.pagesQueued}.`,{donePages:c,claimedPages:s.donePages.size,pagesRendered:s.stats.pagesRendered,pagesSaved:s.stats.pagesSaved,pagesQueued:s.stats.pagesQueued,pageQueue:s.pageQueue.length,phase:"save-pages"});}function fn(e){let t=st(e);return t%5===0||t===1||t===e.stats.pagesQueued}function mn(e,t){let r=st(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 wn(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 yn(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 wn(s),s}async function Pn(e,t,r,s,n,i,u){let c=await chromium.launch({headless:true}),o=nr(c);o.pid!==null&&r.debug(`Launched crawl worker browser PID ${o.pid}`,{browserPid:o.pid});try{for(;t.pageQueue.length>0&&!(e.maxPages>0&&t.donePages.size>=e.maxPages);){let a=t.pageQueue.shift();if(!a)break;t.queuedPages.delete(a);let l=null,p=null;try{let d=re(a,r,"page","page-queue");if(!d)continue;let m=d.toString();if(a=m,t.queuedPages.delete(a),t.donePages.has(a))continue;t.donePages.add(a),i.enabled&&i.seenPages.add(a);let S=rt(e,a),w=gn(e,d.pathname);if(!se(d)||T(e,d)||pe(d)){if(T(e,d)){r.info(`Worker redirected non-page URL to asset queue: ${a}`,{url:a,source:"worker-guard"}),F(e,t,a,r,"worker-guard");continue}r.reject("page",a,"guard rejected non-page URL before rendering","worker");continue}let g=i.strictTargeted?i.manifest.pages[a]:void 0;if(g?.lastSeenRunId===i.runId&&await le(g.outputPath)){i.seenPages.add(a);for(let y of g.discoveredAssets||[])F(e,t,y,r,a);j(u,e,g.outputPath),ie(u,g.outputPath),r.info(`Resumed completed content-sync page ${a}`,{url:a,source:"content-sync-checkpoint"});continue}let h=await vs(e,n,t,i,a,r);if(i.enabled&&s!=="single-url"&&s!=="content-sync"){let y=i.manifest.pages[a];if(h.action==="reuse"&&y){for(let C of y.discoveredAssets)F(e,t,C,r,a);for(let C of y.discoveredPages)be(e,t,C,r,a);y.lastSeenRunId=i.runId,y.sitemapLastmod=Pe(t.sitemapLastmodByPage[a])??y.sitemapLastmod,h.changeToken?.supported&&(y.changeToken=h.changeToken.token,y.tokenSource=h.changeToken.tokenSource??y.tokenSource),r.info(`Incremental reuse skipped unchanged page ${a}`,{url:a,mode:"incremental",reason:h.changeToken?.supported===!0?"change-token-match":"sitemap-lastmod-match"});continue}}l=await $(`create page context ${a}`,z(e),()=>yn(c,e,w)),p=await $(`create page ${a}`,z(e),()=>l.newPage());let b=!1,L=new Set;await p.route("**/*",async y=>{let C=y.request();if(C.isNavigationRequest()&&C.frame()===p.mainFrame())try{let E=new URL(C.url()),q=new URL(m);if(E.hash="",q.hash="",E.href===q.href){if(b){r.warn(`Blocked same-page navigation/reload for ${a}`,{url:a,requestUrl:C.url()}),await y.abort("aborted");return}b=!0;}}catch{}await y.continue();}),p.on("response",y=>{try{let C=U(e,y.url(),e.sourceOrigin,r,"network-response");C&&T(e,C)&&(L.add(C.toString()),F(e,t,C.toString(),r,a));}catch{}}),r.page(`Rendering ${a}`,{url:a});let x=null,I=null;try{if(x=await p.goto(a,{waitUntil:"domcontentloaded",timeout:e.navigationTimeoutMs}),x&&x.ok())try{I=await $(`read response body ${a}`,z(e),()=>x.text());}catch{I=null;}}catch(y){r.warn(`Navigation issue for ${a}; saving current DOM if available`,{url:a,error:String(y)});}if(s==="content-sync"&&x){let y=re(x.url(),r,"content-sync-final-response",a)?.toString();if(y&&y!==m){if(i.deleteOnMissingUrls.has(a)){await Ye(e,i,u,a,i.deleteOnMissingUrls),r.info(`Removed stale content-sync archive route redirected to ${y}`,{url:a,finalResponseUrl:y,source:"content-sync-tombstone"});continue}throw new Error(`Required content-sync route redirected outside its planned URL: ${a} -> ${y}`)}}if(S){let y=x?.status()??null;if(y!==404){r.error(`Generated 404 request path returned unexpected status for ${a}`,{url:a,expectedStatus:404,status:y,requestPath:e.generated404RequestPath});continue}r.info(`Capturing rendered 404 page for ${a}`,{url:a,status:y,outputPath:J(e,a)});}else if(x&&!x.ok()){if(s==="content-sync"&&(x.status()===404||x.status()===410)&&i.deleteOnMissingUrls.has(a)){await Ye(e,i,u,a,i.deleteOnMissingUrls),r.info(`Removed stale content-sync archive page ${a}`,{url:a,status:x.status(),source:"content-sync-tombstone"}),await p.close();continue}if(s==="content-sync")throw new Error(`Required content-sync route returned HTTP ${x.status()}: ${a}`);r.skip("page",a,x.status(),t.pageDiscoverySources.get(a)),await p.close();continue}w?(r.info(`Rendering without JS execution for ${a}`,{url:a,mode:"no-js"}),await $(`wait for rendered page ${a}`,z(e),()=>pn(e,p))):await $(`wait for rendered page ${a}`,z(e),()=>dn(e,p)),t.stats.pagesRendered++;let R=await $(`extract rendered assets ${a}`,z(e),()=>hn(e,p,m,r,!w));for(let y of R)F(e,t,y,r,a);let O=[...new Set([...R,...L])],D=I??await $(`capture rendered html ${a}`,z(e),()=>p.content()),P=s!=="single-url"&&s!=="content-sync"&&!S?sn(e,a,D,r):[];if(s!=="single-url"&&s!=="content-sync"&&!S)for(let y of P)be(e,t,y,r,a);await qt(e,a,D,t,r);let A=J(e,a);if(j(u,e,A),ie(u,A),i.trackManifest){let y=x?.headers();i.manifest.pages[a]={url:a,outputPath:A,contentType:Ve(y),changeToken:h.changeToken?.supported?h.changeToken.token:null,tokenSource:h.changeToken?.supported?h.changeToken.tokenSource??null:null,sitemapLastmod:Pe(t.sitemapLastmodByPage[a])??null,discoveredPages:P,discoveredAssets:O,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!1},(i.enabled||i.strictTargeted)&&await te(e,i);}}catch(d){if(i.strictTargeted)throw r.error(`Failed required content-sync page ${a}`,{url:a,error:String(d)}),d;try{let m=p?await $(`capture partial html ${a}`,z(e),()=>p.content()):"";if(m&&m.trim()){await qt(e,a,m,t,r);let S=J(e,a);if(j(u,e,S),ie(u,S),i.trackManifest){let w=i.manifest.pages[a]??i.previousManifest.pages[a];i.manifest.pages[a]={url:a,outputPath:S,contentType:w?.contentType??null,changeToken:null,tokenSource:null,sitemapLastmod:Pe(t.sitemapLastmodByPage[a])??w?.sitemapLastmod??null,discoveredPages:w?.discoveredPages?[...w.discoveredPages]:[],discoveredAssets:w?.discoveredAssets?[...w.discoveredAssets]:[],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!1},(i.enabled||i.strictTargeted)&&await te(e,i);}r.warn(`Saved partial DOM for ${a}`,{url:a,error:String(d)});}}catch(m){r.error(`Could not save partial DOM for ${a}`,{url:a,error:String(m)});}r.error(`Failed page ${a}`,{url:a,error:String(d)});}finally{t.stats.pagesCompleted++,fn(t)&&mn(t,r),p&&await $(`close page ${a}`,$e(e),()=>p.close()).catch(d=>{r.warn(`Timed out while closing page ${a}`,{url:a,browserPid:o.pid,error:String(d)});}),l&&await $(`close page context ${a}`,$e(e),()=>l.close()).catch(d=>{r.warn(`Timed out while closing page context for ${a}`,{url:a,browserPid:o.pid,error:String(d)});});}}}finally{await $("close worker browser",$e(e),()=>c.close()).catch(a=>(r.warn("Timed out while closing crawl worker browser",{browserPid:o.pid,error:String(a)}),cn(c,r,"browser.close timeout")));}}async function Sn(e){try{let t=await v.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 Nt(e){let t=String(e||"").toLowerCase();return t.includes("timeout")||t.includes("timed out")||t.includes("navigation timeout")}function bn(e){let t=String(e?.job?.command||"").trim(),r=String(e?.job?.crawlMode||"full").trim();return t!=="publish"&&t!=="crawl"?false:r!=="incremental"}function vn(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 ir(e){try{let t=await v.readFile(e,"utf8"),r=JSON.parse(t);return r&&typeof r=="object"&&!Array.isArray(r)?r:null}catch{return null}}function Wt(e){let t=String(e.originalFileName||"").toLowerCase();return t.endsWith("errors.jsonl")?0:t.endsWith("errors.json")?1:2}function Cn(e,t){let r=Array.isArray(t?.artifacts)?t.artifacts.filter(s=>String(s?.role||"").trim()==="errors"&&String(s?.storedFileName||"").trim()!=="").sort((s,n)=>Wt(s)-Wt(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 _t(e){let t=await ir(f.join(e,"job.json"));for(let r of Cn(e,t)){let s=await Sn(r);if(s.length>0)return s}return []}async function Rn(e){let t=f.join(e.logDir,"archive"),r;try{r=await v.readdir(t);}catch{return ""}let s="",n=0;for(let i of r){let u=f.join(t,i);if(!(await v.stat(u).catch(()=>null))?.isDirectory())continue;let o=await ir(f.join(u,"job.json"));if(!bn(o))continue;let a=vn(o);a>=n&&(n=a,s=u);}return s}async function An(e){let t=await Rn(e),r=t!==""?await _t(t):await _t(e.logDir),s=new Set;for(let n of r)if(Nt(n.error)||Nt(n.message)){let i=n.url;typeof i=="string"&&i&&s.add(i);}return [...s]}async function kn(e){let t=[];for(let r of e)if(r.startsWith("@")){let s=r.slice(1),n=await v.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 xn(e){if(!e)throw new Error("Content-sync crawl requires an immutable impact plan.");let t=JSON.parse(await v.readFile(e,"utf8"));return pt(t),t}function Tn(e,t){let r;try{r=new URL(e);}catch{return false}return t.archiveFamilies.some(s=>{let n=new URL(s.url);if(r.origin!==n.origin)return false;if(r.toString()===n.toString())return true;if(r.searchParams.has("paged")&&r.pathname===n.pathname)return /^\d+$/.test(r.searchParams.get("paged")||"");let i=n.pathname.replace(/\/+$/,""),u=r.pathname.slice(i.length).replace(/^\/+/,""),c=String(s.paginationBase||"page").replace(/^\/+|\/+$/g,"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return r.pathname.startsWith(`${i}/`)&&new RegExp(`^${c}/\\d+/?$`).test(u)})}function Ie(e,t,r){let s=r==="page"?J(e,t):Ue(e,t).originalFilePath;return Z(e.outputDir,s)}async function Ye(e,t,r,s,n){let i=t.manifest.pages[s];if(!i)return;let u=Z(e.outputDir,i.outputPath);if(!u)throw new Error(`Manifest-owned page path escaped output root: ${s}`);let c=f.resolve(i.outputPath);Object.entries(t.manifest.pages).some(([a,l])=>a!==s&&!n.has(a)&&f.resolve(l.outputPath)===c)||(await v.rm(i.outputPath,{force:true}),r.deletedFiles.add(u)),delete t.manifest.pages[s];}function In(e,t){let r=new Set,s=[...t];for(;s.length>0;){let n=s.shift();if(r.has(n))continue;r.add(n);let i=e.assets[n];for(let u of i?.discoveredAssets??[])try{ge(new URL(u))&&s.push(u);}catch{}}return r}async function Mn(e,t,r,s,n){let i=In(r.previousManifest,n);for(let u of i){if(t.doneSitemaps.has(u))continue;let c=r.previousManifest.assets[u];if(!c)continue;let o=Z(e.outputDir,c.outputPath);if(!o)throw new Error(`Manifest-owned sitemap path escaped output root: ${u}`);await v.rm(c.outputPath,{force:true}),s.deletedFiles.add(o),delete r.manifest.assets[u];}await te(e,r);}async function $n(e){try{let t=await v.readFile(f.join(e.outputDir,"asset-map.json"),"utf8");return JSON.parse(t)}catch{return {}}}async function Ln(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 v.mkdir(e,{recursive:true}),await Promise.all(t.map(async r=>{try{await v.unlink(f.join(e,r));}catch(s){if(s.code!=="ENOENT")throw s}}));}function Bt(e,t,r,s,n){let i=U(e,r,e.sourceOrigin,s,"manual-url");i&&(ge(i)?De(e,t,i.toString(),s,n):T(e,i)?F(e,t,i.toString(),s,n):se(i)?be(e,t,i.toString(),s,n):s.reject("manual-url",i.toString(),"not page/sitemap/asset-like",n));}async function or(e=process.argv.slice(2)){let t=[],r=await Ce(void 0,{onRemotePublisherConfigDiagnostic:P=>{t.push(P);}}),s=t.at(-1)??null,n=ls(e),i=n.mode==="content-sync"?await xn(n.contentSyncPlanPath):null;if(n.resumeRewrite&&n.mode!=="full")throw new Error("--resume-rewrite is only supported for full crawl/publish jobs.");let u=[];n.mode==="retry-timeouts"&&(u=await An(r)),n.mode==="single-url"&&(u=await kn(n.urls)),i&&(u=[...i.directRenderUrls,...i.archiveFamilyUrls]);let c=n.crawlMode==="incremental"&&n.mode==="full",o=c&&typeof r.subscriptionType=="string"&&r.subscriptionType.trim()!=="";if(i&&r.subscriptionType!=="PROFESSIONAL"&&r.subscriptionType!=="AGENCY")throw new Error("Content-sync requires an active Professional or Agency subscription.");let a=(n.mode==="full"||n.mode==="single-url"||n.mode==="content-sync")&&!n.resumeRewrite,l=n.mode!=="full"||n.resumeRewrite||o,p=l?await $n(r):{},d=o||n.mode==="single-url"||n.mode==="content-sync"?await ms(r):Jt(),m=new Set(u),S=new Set;if(i){for(let P of i.archiveFamilies)if(P.foundPosts===0)for(let A of P.pageUrls)S.add(A);for(let P of Object.keys(d.pages))Tn(P,i)&&!m.has(P)&&(u.push(P),S.add(P));}let w={enabled:o,trackManifest:a,manifest:Ge(d),previousManifest:Ge(d),runId:i?.jobId??`${Date.now()}`,seenPages:new Set,changeTokenCache:new Map,manifestSaveChain:Promise.resolve(),strictTargeted:!!i,requiredUrls:m,deleteOnMissingUrls:S};await Ln(r.logDir);let g=new ue(r.logDir,r.logLevel);if(s){let P={status:s.status,virtualAssetBaseUrl:s.virtualAssetBaseUrl,subscriptionType:s.subscriptionType??null,error:s.error,requests:s.requests,source:"remote-publisher-config"};s.status==="loaded"&&s.subscriptionType?g.info("Loaded remote WP Suite publisher configuration.",P):g.warn("Remote WP Suite publisher configuration is unavailable or has no active subscription type.",P);}if(c&&!o){let P="Incremental crawl requires an active remote publisher subscription; refusing to fall back to a destructive full crawl.";throw g.error(P,{requestedMode:n.crawlMode,subscriptionType:r.subscriptionType??null,source:"incremental-subscription-guard"}),await g.flush(),new Error(P)}let h={pageQueue:[],queuedPages:new Set,donePages:new Set,pageDiscoverySources:new Map,assetQueue:[],queuedAssets:new Set,doneAssets:new Set,sitemapQueue:[],queuedSitemaps:new Set,doneSitemaps:new Set,sitemapIndexUrls:new Set,sitemapLeafUrls:new Set,sitemapLastmodByPage:{},assetMap:{...p},assetVariantDigestsByOriginalPath:new Map,stats:{pagesQueued:0,pagesRendered:0,pagesCompleted:0,assetsQueued:0,sitemapsQueued:0,assetsSaved:0,pagesSaved:0}},b=fs();if(await ct(r),await lt(r,{startedAt:new Date().toISOString(),outputDir:f.resolve(r.outputDir)}),l||await v.rm(r.outputDir,{recursive:true,force:true}),await v.mkdir(r.outputDir,{recursive:true}),i){let P=new Set([...i.deleteUrls,...w.deleteOnMissingUrls]);for(let A of i.deleteUrls)await Ye(r,w,b,A,P);}if(n.resumeRewrite)g.info("Resuming final rewrite from existing output.",{phase:"rewrite-text",mode:n.mode,crawlMode:n.crawlMode});else {let P=await request.newContext({ignoreHTTPSErrors:r.ignoreHttpsErrors});try{if(g.mark("discovery"),n.mode==="full"?(r.sitemapPaths.forEach(y=>De(r,h,y,g)),await jt(r,P,h,g,b,w),r.seedPaths.forEach(y=>Bt(r,h,y,g,"seed-path")),r.generated404RequestPath&&be(r,h,r.generated404RequestPath,g,"generated-404-request-path")):(u.forEach(y=>Bt(r,h,y,g,"cli")),i?.sitemapUrls.forEach(y=>De(r,h,y,g,"content-sync-impact")),await jt(r,P,h,g,b,w,n.mode==="content-sync"),i&&await Mn(r,h,w,b,i.sitemapUrls)),g.endMark("discovery",{pages:h.pageQueue.length,assets:h.assetQueue.length,sitemaps:h.sitemapQueue.length}),g.summary(`Queued ${h.pageQueue.length} pages, ${h.assetQueue.length} assets, ${h.sitemapQueue.length} sitemaps.`,{mode:n.mode,crawlMode:n.crawlMode,queuedPages:h.pageQueue.length,queuedAssets:h.assetQueue.length,queuedSitemaps:h.sitemapQueue.length}),n.mode==="retry-timeouts"&&h.pageQueue.length===0&&h.assetQueue.length===0&&h.sitemapQueue.length===0){g.summary("No timed-out URLs were queued. Skipping retry crawl.",{mode:n.mode,crawlMode:n.crawlMode,queuedPages:0,queuedAssets:0,queuedSitemaps:0}),await g.flush();return}g.mark("render-pages");let A=Array.from({length:Math.max(1,r.concurrency)},()=>Pn(r,h,g,n.mode,P,w,b));if(await Promise.all(A),g.endMark("render-pages",{pages:h.stats.pagesCompleted}),g.mark("download-assets"),g.progress("Asset download phase started.",{phase:"download-assets",doneAssets:h.doneAssets.size,assetsQueued:h.stats.assetsQueued,assetQueue:h.assetQueue.length}),await Ps(r,P,w,[...h.assetQueue],g),await on(r,P,h,g,w,b),g.endMark("download-assets",{assets:h.doneAssets.size}),w.enabled&&r.maxPages===0&&await Rs(r,h,w,g,b),n.mode==="full"){let y=await rn(r,h,g);for(let C of y)j(b,r,C);}}finally{await $("dispose crawl request context",$e(r),()=>P.dispose()).catch(A=>{g.warn("Timed out while disposing crawl request context",{error:String(A)});});}}w.trackManifest&&await te(r,w),await v.writeFile(f.join(r.outputDir,"asset-map.json"),JSON.stringify(h.assetMap,null,2),"utf8"),JSON.stringify(p,null,2)!==JSON.stringify(h.assetMap,null,2)&&j(b,r,f.join(r.outputDir,"asset-map.json"));let L=n.mode==="single-url"||n.mode==="content-sync"?Ds(r,h):w.enabled&&!n.resumeRewrite?As(r,w,b,p,h.assetMap):void 0;g.mark("rewrite-text");let x=n.mode==="single-url"||n.mode==="content-sync"?`Rewriting text files touched by URL crawl: 0/${L?.length??0}`:"Rewriting text files...";g.progress(x,{phase:"rewrite-text",index:0,totalFiles:L?.length,changedTextFiles:0}),await Et(x);let I=Date.now(),R=await Rt(r,h.assetMap,{files:L,previousAssetMap:p,onStart:({totalFiles:P,workerCount:A})=>{g.info(`Rewrite phase scanning ${P} text files.`,{phase:"rewrite-text",totalFiles:P,workerCount:A});},onProgress:async({index:P,totalFiles:A,changedTextFiles:y,file:C,changed:E})=>{E&&j(b,r,f.join(r.outputDir,C)),g.checkpoint(`Rewriting text file ${P}/${A}`,{phase:"rewrite-text",index:P,totalFiles:A,changedTextFiles:y,file:C}),g.debug(`${E?"Rewrote":"Checked unchanged"} text file ${P}/${A}: ${C}`,{phase:"rewrite-text",index:P,totalFiles:A,changedTextFiles:y,file:C,changed:E});let q=Date.now();if(!(P===1||P===A||P%50===0||q-I>=5e3))return;I=q;let V=`Rewriting text files: ${P}/${A}`;g.progress(V,{phase:"rewrite-text",index:P,totalFiles:A,changedTextFiles:y,file:C}),await Et(V);}});w.trackManifest&&(ks(w,L),await te(r,w)),g.endMark("rewrite-text",{changedTextFiles:R});let O=i?[...b.deletedFiles].sort():w.enabled&&!n.resumeRewrite?await Ts(r,h,w,b,g):[],D=[...new Set((L||[]).map(P=>Z(r.outputDir,f.isAbsolute(P)?P:f.join(r.outputDir,P))).filter(P=>P!==null))].sort();if(i){let P=[...b.changedFiles].sort(),A=new Set(P),y=new Set(i.directRenderUrls.map(k=>Ie(r,k,"page")).filter(k=>!!k&&A.has(k))),C=new Set(i.archiveFamilyUrls.map(k=>Ie(r,k,"page")).filter(k=>!!k&&A.has(k))),E=new Set([...h.sitemapLeafUrls].map(k=>Ie(r,k,"asset")).filter(k=>!!k&&A.has(k))),q=new Set([...h.sitemapIndexUrls].map(k=>Ie(r,k,"asset")).filter(k=>!!k&&A.has(k))),he=new Set([...y,...C,...E,...q]),V=P.filter(k=>!he.has(k)),ne=[...new Set([...i.directRenderUrls,...i.archiveFamilyUrls,...i.sitemapUrls,...h.sitemapLeafUrls,...h.sitemapIndexUrls,...i.deleteUrls].map(k=>{let oe=new URL(k);return `${oe.pathname}${oe.search}`}))].sort();await Fe(r,{schemaVersion:2,generatedAt:new Date().toISOString(),outputDir:f.resolve(r.outputDir),runMode:"content-sync",crawlMode:"incremental",fullSyncRequired:false,changedFiles:P,deletedFiles:O,rewriteTargets:D,consumerId:i.consumerId,fromSequence:i.fromSequence,toSequence:i.toSequence,impactHash:i.impactHash,uploadGroups:{assets:V,content:[...y].sort(),listings:[...C].sort(),sitemapLeaves:[...E].sort(),sitemapIndexes:[...q].reverse()},invalidationPaths:ne});}else await Fe(r,{schemaVersion:1,generatedAt:new Date().toISOString(),outputDir:f.resolve(r.outputDir),runMode:n.mode,crawlMode:n.crawlMode,fullSyncRequired:!(w.enabled&&!n.resumeRewrite),changedFiles:w.enabled&&!n.resumeRewrite?[...b.changedFiles].sort():[],deletedFiles:w.enabled&&!n.resumeRewrite?O:[],rewriteTargets:w.enabled&&!n.resumeRewrite?D:[]});await dt(r),g.summary(n.resumeRewrite?`Done. Resumed final rewrite over existing output and changed ${R} text files.`:`Done. Rendered ${h.stats.pagesRendered} pages, processed ${h.doneSitemaps.size} sitemaps and ${h.doneAssets.size} assets.`,{mode:n.mode,crawlMode:n.crawlMode,resumeRewrite:n.resumeRewrite,...h.stats,pagesRendered:h.stats.pagesRendered,donePages:h.stats.pagesCompleted,claimedPages:h.donePages.size,doneSitemaps:h.doneSitemaps.size,doneAssets:h.doneAssets.size,changedTextFiles:R}),await g.flush();}or().catch(async e=>{let t=H(e instanceof Error?e.message:String(e));console.error(t);try{let s=(await Ce().catch(()=>null))?.logDir??"logs",n=new ue(s,"debug");n.error(`Unhandled error: ${t}`,e instanceof Error&&e.stack?{stack:H(e.stack)}:void 0),await n.flush();}catch{}process.exit(1);});