@smart-cloud/publisher-exporter 1.1.39 → 1.1.41

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