@smart-cloud/publisher-exporter 1.1.61 → 1.1.62

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,12 +1,13 @@
1
- import {request,chromium}from'playwright';import A from'fs/promises';import y from'path';import {gunzipSync}from'zlib';import ns from'fast-glob';import jt,{createHash}from'crypto';import Qr from'http';import Hr from'https';import {availableParallelism}from'os';import {Worker}from'worker_threads';var Lr=".deploy-plan.json",Or="deploy-plan.json",Dr=".crawl-incomplete.json",Fr="crawl-incomplete.json";function bt(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?y.resolve(e):""}function vt(e){let t=String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").trim(),r=y.posix.normalize(t);return !t||!r||r==="."||/^[a-zA-Z]:/.test(r)||r.startsWith("../")||r===".."?null:r}function Er(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:`${y.posix.normalize(r.pathname)}${r.search}`}catch{return null}}function H(e){return [...new Set(e.map(vt).filter(t=>t!==null))]}function jr(e,t){let r={generatedAt:String(t.generatedAt||new Date().toISOString()),outputDir:y.resolve(e.outputDir),runMode:t.runMode,crawlMode:t.crawlMode,fullSyncRequired:!!t.fullSyncRequired,changedFiles:H(t.changedFiles||[]),deletedFiles:H(t.deletedFiles||[]),rewriteTargets:H(t.rewriteTargets||[]),revalidateFiles:H(t.revalidateFiles||[])};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(),resolvedSitemapUrls:[...new Set((t.resolvedSitemapUrls||[]).map(s=>String(s||"").trim()).filter(s=>{try{let n=new URL(s);return n.protocol==="http:"||n.protocol==="https:"}catch{return false}}))],uploadGroups:{assets:H(t.uploadGroups?.assets||[]),content:H(t.uploadGroups?.content||[]),listings:H(t.uploadGroups?.listings||[]),resources:H(t.uploadGroups?.resources||[]),sitemapLeaves:H(t.uploadGroups?.sitemapLeaves||[]),sitemapIndexes:H(t.uploadGroups?.sitemapIndexes||[])},invalidationPaths:[...new Set((t.invalidationPaths||[]).map(Er).filter(s=>s!==null))].sort()}:{schemaVersion:1,...r,runMode:t.runMode}}function Ct(e){let t=y.join(y.resolve(e.outputDir),Lr),r=bt();return r?[y.join(r,Or),t]:[t]}function Rt(e){let t=y.join(y.resolve(e.outputDir),Dr),r=bt();return r?[y.join(r,Fr),t]:[t]}function z(e,t){let r=y.resolve(e),s=y.resolve(t),n=y.relative(r,s).replace(/\\/g,"/");return vt(n)}async function Ve(e,t){let r=jr(e,t);for(let s of Ct(e)){await A.mkdir(y.dirname(s),{recursive:true});let n=`${s}.${process.pid}.${Date.now()}.tmp`;await A.writeFile(n,JSON.stringify(r,null,2),"utf8"),await A.rename(n,s);}}async function At(e){for(let t of Ct(e))try{await A.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}async function kt(e,t){let r={schemaVersion:1,startedAt:String(t.startedAt||new Date().toISOString()),outputDir:y.resolve(e.outputDir)};for(let s of Rt(e)){await A.mkdir(y.dirname(s),{recursive:true});let n=`${s}.${process.pid}.tmp`;await A.writeFile(n,JSON.stringify(r,null,2),"utf8"),await A.rename(n,s);}}async function xt(e){for(let t of Rt(e))try{await A.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}function Nr(e){return new URL(e).pathname.split("/").filter(Boolean).some(r=>{try{return decodeURIComponent(r).endsWith("__trashed")}catch{return r.endsWith("__trashed")}})}function Ge(e){return Array.isArray(e)?e.map(Ge):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).sort(([t],[r])=>t.localeCompare(r)).map(([t,r])=>[t,Ge(r)])):e}function Br(e){return JSON.stringify(Ge(e))}function Wr(e){return createHash("sha256").update(Br(e)).digest("hex")}function Tt(e){let{impactHash:t,...r}=e;if(e.schemaVersion!==1||!t)throw new Error("Invalid content-sync impact plan schema.");if(!Array.isArray(e.resourceRenderUrls)||!Array.isArray(e.resourceDeleteUrls))throw new Error("Invalid content-sync resource impact contract.");if(Wr(r)!==t)throw new Error("Content-sync impact plan hash mismatch.");for(let s of [...e.directRenderUrls,...e.deleteUrls,...e.resourceRenderUrls,...e.resourceDeleteUrls])if(Nr(s))throw new Error(`Content-sync impact contains a WordPress trash alias instead of the last public URL: ${s}`)}var Ke=["/sitemap_index.xml","/wp-sitemap.xml","/sitemap.xml"];function It(e){let t=new Set;for(let r of [...e,...Ke]){let s=String(r||"").trim();s&&t.add(s);}return [...t]}function Ze(e){let t=e.pathname.toLowerCase();return t.endsWith(".xml")&&(t.includes("sitemap")||t.endsWith("/sitemap.xml"))}function Mt(e){if(!e||!/^https?:\/\//i.test(e))return false;try{return Ze(new URL(e))}catch{return false}}function Ut(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function zr(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(o=>o.replace(/[^A-Za-z0-9._-]/g,"")).filter(o=>o.length>0&&o!=="."&&o!=="..");if(n.length===0)return "";let i=`/${n.join("/")}`;return s&&y.extname(i)===""&&(i+="/"),i==="/"?"":i}function Ye(e){return !e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).map(([t,r])=>[t.trim(),String(r??"")]).filter(([t])=>t.length>0))}function Jr(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,o={};if(typeof i.targetOrigin=="string"){let a=Ut(i.targetOrigin);a&&(o.targetOrigin=a);}let u=Ye(i.extraReplacements);if(Object.keys(u).length>0&&(o.extraReplacements=u),i.s3&&typeof i.s3=="object"){let a={},l=i.s3;typeof l.bucket=="string"&&(a.bucket=l.bucket.trim()),typeof l.prefix=="string"&&(a.prefix=l.prefix.trim()),typeof l.region=="string"&&(a.region=l.region.trim()),typeof l.htmlCacheControl=="string"&&(a.htmlCacheControl=l.htmlCacheControl.trim()),typeof l.assetCacheControl=="string"&&(a.assetCacheControl=l.assetCacheControl.trim()),Object.keys(a).length>0&&(o.s3=a);}if(i.cloudFront&&typeof i.cloudFront=="object"){let a={},l=i.cloudFront;typeof l.distributionId=="string"&&(a.distributionId=l.distributionId.trim()),Array.isArray(l.invalidationPaths)&&(a.invalidationPaths=l.invalidationPaths.map(d=>String(d??"").trim()).filter(d=>d.length>0)),Object.keys(a).length>0&&(o.cloudFront=a);}t[n]=o;}return t}function et(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function Vr(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 o=String(r.deploymentProfile??"").trim(),u=String(r.url??"").trim(),a=Array.isArray(r.postTypes)?[...new Set(r.postTypes.map(d=>String(d??"").trim().toLowerCase().replace(/[^a-z0-9_-]/g,"")).filter(Boolean))]:[],l=Array.isArray(r.listingPaths)?[...new Set(r.listingPaths.map(d=>String(d??"").trim()).filter(Boolean))]:[];return s==="content-sync"&&a.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")&&o?{deploymentProfile:o}:{},...u?{url:u}:{},...a.length>0?{postTypes:a}:{},...l.length>0?{listingPaths:l}:{},...typeof r.includeSubsites=="boolean"?{includeSubsites:r.includeSubsites}:{},...typeof r.includePostTypeArchives=="boolean"?{includePostTypeArchives:r.includePostTypeArchives}:{},...typeof r.includeTaxonomyArchives=="boolean"?{includeTaxonomyArchives:r.includeTaxonomyArchives}:{},...typeof r.includeAuthorArchives=="boolean"?{includeAuthorArchives:r.includeAuthorArchives}:{},...typeof r.includeDateArchives=="boolean"?{includeDateArchives:r.includeDateArchives}:{},...typeof r.includePostsPage=="boolean"?{includePostsPage:r.includePostsPage}:{},...typeof r.includeSitemapChain=="boolean"?{includeSitemapChain:r.includeSitemapChain}:{}}}function Lt(e){let t=e&&typeof e=="object"?e:{},r=Array.isArray(t.rules)?t.rules.map((s,n)=>Vr(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 tt(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),o={...i??{},...r?{accountId:i?.accountId??r}:{},...s?{siteId:i?.siteId??s}:{},...i?.subscriber===true||n?{subscriber:true}:{}},u={},a=String(t.apiBase??"").trim();a&&(u.apiBase=a);let l=String(t.runtimeToken??t.nonce??"").trim();l&&(u.runtimeToken=l);let d=String(t.virtualAssetBaseUrl??t.uploadUrl??"").trim();d&&(u.virtualAssetBaseUrl=d),Object.keys(o).length>0&&(u.siteSettings=o);let c=et(t.subscriptionType);return c&&(u.subscriptionType=c),u}function Kr(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function Ot(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function Zr(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 Dt(e,t,r=5){let s=new URL(Ot(e)),n=String(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase(),i=s.protocol==="http:"?Qr:Hr,o=Zr(e,t);return await new Promise((u,a)=>{let l=i.request(s,{method:n,headers:Object.fromEntries(o.entries()),...s.protocol==="https:"?{rejectUnauthorized:false}:{}},d=>{let c=[];d.on("data",p=>{c.push(Buffer.isBuffer(p)?p:Buffer.from(p));}),d.on("error",a),d.on("end",()=>{let p=d.statusCode??0,w=d.headers.location;if(r>0&&w&&[301,302,303,307,308].includes(p)){u(Dt(new URL(w,s),{method:p===303?"GET":n},r-1));return}let m=new Headers;for(let[b,g]of Object.entries(d.headers))Array.isArray(g)?m.set(b,g.join(", ")):typeof g=="string"&&m.set(b,g);u(new Response(Buffer.concat(c),{status:p,statusText:d.statusMessage??"",headers:m}));});});l.on("error",a),l.end();})}function Yr(e){let t=tt(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;Kr(e.sourceOrigin);let o=globalThis,a={...o.WpSuite??{},siteSettings:r,uploadUrl:i};return t.apiBase&&(a.apiBase=t.apiBase),o.WpSuite=a,true}async function Xr(e){let t=String(e.wpsuite?.virtualAssetBaseUrl??e.wpsuite?.uploadUrl??"").trim();if(!Yr(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(a,l)=>{let d=Ot(a);if(d.startsWith(t)){let c=(()=>{try{return new URL(d).pathname}catch{return d}})();try{let p=e.ignoreHttpsErrors&&d.startsWith("https://")?await Dt(a,l):await r(a,l);return s.push({path:c,status:p.status,ok:p.ok,error:null}),p}catch(p){throw s.push({path:c,status:null,ok:!1,error:p instanceof Error?p.message:String(p)}),p}}return r(a,l)}));let{getConfig:n}=await import('@smart-cloud/wpsuite-core'),i=await n("publisher"),o=i&&typeof i=="object"?i:null,u=et(o?.subscriptionType);return {remote:o,diagnostic:{status:o?"loaded":"unavailable",virtualAssetBaseUrl:t,subscriptionType:u??null,error:o?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 es(e,t){let r=Jr(t?.deploymentProfiles),s=String(t?.defaultDeploymentProfile??"").trim(),n=r[s]?s:"",i=et(t?.subscriptionType),o=tt(e.wpsuite);return {...e,scheduler:Lt(t?.scheduler),deploymentProfiles:r,defaultDeploymentProfile:n,...i?{subscriptionType:i}:{},wpsuite:{...o,...o.siteSettings||i?{siteSettings:{...o.siteSettings??{},...o.siteSettings?.subscriber===true||i==="PROFESSIONAL"||i==="AGENCY"?{subscriber:true}:{}}}:{},...i?{subscriptionType:i}:{}}}}function Xe(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 ts(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?y.resolve(e):""}function $t(e,t,r){let s=String(t||"").trim();return s&&y.isAbsolute(s)?y.resolve(s):y.resolve(e,Xe(s,r))}async function Le(e,t={}){let r=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",s=await A.readFile(r,"utf8"),n=JSON.parse(s);n.sourceOrigin=n.sourceOrigin.replace(/\/$/,""),n.targetOrigin=Ut(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=zr(n.generated404RequestPath),n.sitemapPaths||=[...Ke],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=Ye(n.extraReplacements),n.postCrawlCopyMap=Ye(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=tt(n.wpsuite),n.scheduler=Lt(void 0),n.deploymentProfiles={},n.defaultDeploymentProfile="",n.deploymentTargetOverride=String(n.deploymentTargetOverride??"").trim();let i=await Xr(n);t.onRemotePublisherConfigDiagnostic?.(i.diagnostic);let o=es(n,i.remote),u=ts(),a=u?y.resolve(u,".."):"";return a?(o.outputDir=$t(a,o.outputDir,"export"),o.logDir=$t(a,o.logDir,"logs")):(y.isAbsolute(o.outputDir)||(o.outputDir=Xe(o.outputDir,"export")),y.isAbsolute(o.logDir)||(o.logDir=Xe(o.logDir,"logs"))),o}function be(e,t=10){return jt.createHash("sha1").update(e).digest("hex").slice(0,t)}async function rs(e){await A.mkdir(y.dirname(e),{recursive:true});}async function ve(e,t,r){await rs(e);let s=y.join(y.dirname(e),`.${y.basename(e)}.${process.pid}.${Date.now()}.${jt.randomBytes(6).toString("hex")}.tmp`);try{typeof t=="string"?await A.writeFile(s,t,r??"utf8"):await A.writeFile(s,t),await A.rename(s,e);}catch(n){throw await A.unlink(s).catch(()=>{}),n}}function se(e){return [".html",".htm",".css",".js",".mjs",".json",".xml",".xsl",".txt",".svg",".map",".enc",".jws"].includes(y.extname(e).toLowerCase())}function Z(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 ce(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function Oe(e){return e.replace(/\//g,"\\/")}function Ft(e){return e.replace(/\//g,"\\\\/")}function ss(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 Et(e,t,r){if(!t)return;e[t]=r;let s=Oe(t),n=Oe(r);e[s]=n;let i=Ft(t),o=Ft(r);e[i]=o;let u=ce(t),a=ce(r);e[u]=a;let l=ce(s),d=ce(n);e[l]=d;let c=ce(i),p=ce(o);e[c]=p;}function De(e,t,r){Et(e,t,r);let s=ss(t);s&&s!==t&&Et(e,s,r);}function rt(e,t){let r=t.startsWith("/")?t:`/${t}`,s=(e||"").replace(/\/$/,"");return !s||s==="."||s==="/"?r:`${s}${r}`}function qt(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function Nt(e,t,r){if(!t)return r;let s=y.dirname(y.resolve(t)),n=y.resolve(e,r.replace(/^\/+/,"")),i=y.relative(s,n).replace(/\\/g,"/");return i?(i.startsWith(".")||(i=`./${i}`),i):"."}var us=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],ls=new Set([".html",".htm"]),Bt="WPSuite.io Static Publisher",cs=Bt.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function ds(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function ps(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function gs(e,t,r){return ps(t)?e.replace(new RegExp(`(?<!:)${ds(t)}`,"g"),r):e.split(t).join(r)}function fs(e,t,r){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let n=y.extname(r).toLowerCase();return ls.has(n)?/<head\b|<html\b|<!doctype html/i.test(t):false}function hs(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${cs}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${Bt}" />`;if(e.match(/(\r?\n)([ \t]*)<\/head>/i))return e.replace(/(\r?\n)([ \t]*)<\/head>/i,`$1$2${t}$1$2</head>`);let s=e.includes(`\r
1
+ import {request,chromium}from'playwright';import T,{readFile}from'fs/promises';import w from'path';import {gunzipSync}from'zlib';import Dn from'fast-glob';import er,{createHash}from'crypto';import Rn from'http';import vn from'https';import {availableParallelism}from'os';import {Worker}from'worker_threads';import {LambdaClient,InvokeCommand}from'@aws-sdk/client-lambda';import {S3Client,GetObjectCommand,PutObjectCommand}from'@aws-sdk/client-s3';import {fromTemporaryCredentials}from'@aws-sdk/credential-providers';var dn=".deploy-plan.json",pn="deploy-plan.json",gn=".crawl-incomplete.json",mn="crawl-incomplete.json";function Dt(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?w.resolve(e):""}function Ft(e){let t=String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").trim(),r=w.posix.normalize(t);return !t||!r||r==="."||/^[a-zA-Z]:/.test(r)||r.startsWith("../")||r===".."?null:r}function hn(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:`${w.posix.normalize(r.pathname)}${r.search}`}catch{return null}}function G(e){return [...new Set(e.map(Ft).filter(t=>t!==null))]}function fn(e,t){let r={generatedAt:String(t.generatedAt||new Date().toISOString()),outputDir:w.resolve(e.outputDir),runMode:t.runMode,crawlMode:t.crawlMode,fullSyncRequired:!!t.fullSyncRequired,changedFiles:G(t.changedFiles||[]),deletedFiles:G(t.deletedFiles||[]),rewriteTargets:G(t.rewriteTargets||[]),revalidateFiles:G(t.revalidateFiles||[])};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(),resolvedSitemapUrls:[...new Set((t.resolvedSitemapUrls||[]).map(n=>String(n||"").trim()).filter(n=>{try{let s=new URL(n);return s.protocol==="http:"||s.protocol==="https:"}catch{return false}}))],uploadGroups:{assets:G(t.uploadGroups?.assets||[]),content:G(t.uploadGroups?.content||[]),listings:G(t.uploadGroups?.listings||[]),resources:G(t.uploadGroups?.resources||[]),sitemapLeaves:G(t.uploadGroups?.sitemapLeaves||[]),sitemapIndexes:G(t.uploadGroups?.sitemapIndexes||[])},invalidationPaths:[...new Set((t.invalidationPaths||[]).map(hn).filter(n=>n!==null))].sort()}:{schemaVersion:1,...r,runMode:t.runMode}}function Wt(e){let t=w.join(w.resolve(e.outputDir),dn),r=Dt();return r?[w.join(r,pn),t]:[t]}function qt(e){let t=w.join(w.resolve(e.outputDir),gn),r=Dt();return r?[w.join(r,mn),t]:[t]}function Z(e,t){let r=w.resolve(e),n=w.resolve(t),s=w.relative(r,n).replace(/\\/g,"/");return Ft(s)}async function at(e,t){let r=fn(e,t);for(let n of Wt(e)){await T.mkdir(w.dirname(n),{recursive:true});let s=`${n}.${process.pid}.${Date.now()}.tmp`;await T.writeFile(s,JSON.stringify(r,null,2),"utf8"),await T.rename(s,n);}}async function Nt(e){for(let t of Wt(e))try{await T.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}async function _t(e,t){let r={schemaVersion:1,startedAt:String(t.startedAt||new Date().toISOString()),outputDir:w.resolve(e.outputDir)};for(let n of qt(e)){await T.mkdir(w.dirname(n),{recursive:true});let s=`${n}.${process.pid}.tmp`;await T.writeFile(s,JSON.stringify(r,null,2),"utf8"),await T.rename(s,n);}}async function Bt(e){for(let t of qt(e))try{await T.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}function yn(e){return new URL(e).pathname.split("/").filter(Boolean).some(r=>{try{return decodeURIComponent(r).endsWith("__trashed")}catch{return r.endsWith("__trashed")}})}function ut(e){return Array.isArray(e)?e.map(ut):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).sort(([t],[r])=>t.localeCompare(r)).map(([t,r])=>[t,ut(r)])):e}function bn(e){return JSON.stringify(ut(e))}function Sn(e){return createHash("sha256").update(bn(e)).digest("hex")}function Vt(e){let{impactHash:t,...r}=e;if(e.schemaVersion!==1||!t)throw new Error("Invalid content-sync impact plan schema.");if(!Array.isArray(e.resourceRenderUrls)||!Array.isArray(e.resourceDeleteUrls))throw new Error("Invalid content-sync resource impact contract.");if(Sn(r)!==t)throw new Error("Content-sync impact plan hash mismatch.");for(let n of [...e.directRenderUrls,...e.deleteUrls,...e.resourceRenderUrls,...e.resourceDeleteUrls])if(yn(n))throw new Error(`Content-sync impact contains a WordPress trash alias instead of the last public URL: ${n}`)}var ct=["/sitemap_index.xml","/wp-sitemap.xml","/sitemap.xml"];function zt(e){let t=new Set;for(let r of [...e,...ct]){let n=String(r||"").trim();n&&t.add(n);}return [...t]}function lt(e){let t=e.pathname.toLowerCase();return t.endsWith(".xml")&&(t.includes("sitemap")||t.endsWith("/sitemap.xml"))}function Qt(e){if(!e||!/^https?:\/\//i.test(e))return false;try{return lt(new URL(e))}catch{return false}}function Jt(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function kn(e){let t=String(e??"").trim();if(!t)return "";let r=t;if(/^https?:\/\//i.test(r))try{r=new URL(r).pathname;}catch{return ""}if(r=r.split(/[?#]/,1)[0]?.replace(/\\/g,"/").trim()??"",!r)return "";let n=r.endsWith("/"),s=r.replace(/^\/+/,"").split("/").map(i=>i.replace(/[^A-Za-z0-9._-]/g,"")).filter(i=>i.length>0&&i!=="."&&i!=="..");if(s.length===0)return "";let o=`/${s.join("/")}`;return n&&w.extname(o)===""&&(o+="/"),o==="/"?"":o}function dt(e){return !e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).map(([t,r])=>[t.trim(),String(r??"")]).filter(([t])=>t.length>0))}function Cn(e){if(!e||typeof e!="object")return {};let t={};for(let[r,n]of Object.entries(e)){let s=r.trim();if(!s||!n||typeof n!="object")continue;let o=n,i={};if(typeof o.targetOrigin=="string"){let a=Jt(o.targetOrigin);a&&(i.targetOrigin=a);}let c=dt(o.extraReplacements);if(Object.keys(c).length>0&&(i.extraReplacements=c),o.s3&&typeof o.s3=="object"){let a={},u=o.s3;typeof u.bucket=="string"&&(a.bucket=u.bucket.trim()),typeof u.prefix=="string"&&(a.prefix=u.prefix.trim()),typeof u.region=="string"&&(a.region=u.region.trim()),typeof u.htmlCacheControl=="string"&&(a.htmlCacheControl=u.htmlCacheControl.trim()),typeof u.assetCacheControl=="string"&&(a.assetCacheControl=u.assetCacheControl.trim()),Object.keys(a).length>0&&(i.s3=a);}if(o.cloudFront&&typeof o.cloudFront=="object"){let a={},u=o.cloudFront;typeof u.distributionId=="string"&&(a.distributionId=u.distributionId.trim()),Array.isArray(u.invalidationPaths)&&(a.invalidationPaths=u.invalidationPaths.map(d=>String(d??"").trim()).filter(d=>d.length>0)),Object.keys(a).length>0&&(i.cloudFront=a);}t[s]=i;}return t}function gt(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function xn(e,t){if(!e||typeof e!="object")return null;let r=e,n=r.command;if(n!=="publish"&&n!=="crawl"&&n!=="deploy"&&n!=="invalidate"&&n!=="retry-timeouts"&&n!=="url"&&n!=="content-sync")return null;let s=Number.parseInt(String(r.intervalMinutes??"0"),10);if(!Number.isFinite(s)||s<1)return null;let o=String(r.id??`${n}-${t+1}`).trim();if(!o)return null;let i=String(r.deploymentProfile??"").trim(),c=String(r.url??"").trim(),a=Array.isArray(r.postTypes)?[...new Set(r.postTypes.map(d=>String(d??"").trim().toLowerCase().replace(/[^a-z0-9_-]/g,"")).filter(Boolean))]:[],u=Array.isArray(r.listingPaths)?[...new Set(r.listingPaths.map(d=>String(d??"").trim()).filter(Boolean))]:[];return n==="content-sync"&&a.length===0?null:{id:o,enabled:r.enabled!==false,command:n,intervalMinutes:s,...n==="publish"||n==="crawl"?{crawlMode:r.crawlMode==="incremental"?"incremental":"full"}:{},...(n==="publish"||n==="deploy"||n==="invalidate"||n==="content-sync")&&i?{deploymentProfile:i}:{},...c?{url:c}:{},...a.length>0?{postTypes:a}:{},...u.length>0?{listingPaths:u}:{},...typeof r.includeSubsites=="boolean"?{includeSubsites:r.includeSubsites}:{},...typeof r.includePostTypeArchives=="boolean"?{includePostTypeArchives:r.includePostTypeArchives}:{},...typeof r.includeTaxonomyArchives=="boolean"?{includeTaxonomyArchives:r.includeTaxonomyArchives}:{},...typeof r.includeAuthorArchives=="boolean"?{includeAuthorArchives:r.includeAuthorArchives}:{},...typeof r.includeDateArchives=="boolean"?{includeDateArchives:r.includeDateArchives}:{},...typeof r.includePostsPage=="boolean"?{includePostsPage:r.includePostsPage}:{},...typeof r.includeSitemapChain=="boolean"?{includeSitemapChain:r.includeSitemapChain}:{}}}function Kt(e){let t=e&&typeof e=="object"?e:{},r=Array.isArray(t.rules)?t.rules.map((n,s)=>xn(n,s)).filter(n=>!!n):[];return {enabled:t.enabled===true,timezone:typeof t.timezone=="string"&&t.timezone.trim()!==""?t.timezone.trim():"UTC",rules:r}}function An(e){let t=e&&typeof e=="object"?e:{},r=t.render&&typeof t.render=="object"?t.render:{},n=Number(r.concurrency??0),s=Number(r.maxAttempts??0),o=t.rewrite&&typeof t.rewrite=="object"?t.rewrite:{},i=t.deploy&&typeof t.deploy=="object"?t.deploy:{},c=(a,u)=>({enabled:typeof a.enabled=="boolean"?a.enabled:r.enabled===true,concurrency:Math.min(100,Math.max(1,Number(a.concurrency||u.concurrency))),batchSize:Math.min(500,Math.max(1,Number(a.batchSize||u.batchSize))),maxAttempts:Math.min(5,Math.max(1,Number(a.maxAttempts||2)))});return {render:{enabled:r.enabled===true,...Number.isInteger(n)&&n>0?{concurrency:n}:{},...Number.isInteger(s)&&s>0?{maxAttempts:Math.min(5,s)}:{}},rewrite:c(o,{concurrency:8,batchSize:25}),deploy:c(i,{concurrency:8,batchSize:50})}}function Tn(e){if(!e||typeof e!="object")return;let t=e,r={};for(let s of ["accountId","siteId"]){let o=t[s];typeof o=="string"&&o.trim()!==""&&(r[s]=o.trim());}let n=Number(t.lastUpdate??0);return Number.isFinite(n)&&n>0&&(r.lastUpdate=Math.floor(n)),t.subscriber===true&&(r.subscriber=true),Object.keys(r).length>0?r:void 0}function mt(e){let t=e&&typeof e=="object"?e:{},r=String(t.accountId??"").trim(),n=String(t.siteId??"").trim(),s=t.subscriber===true,o=Tn(t.siteSettings),i={...o??{},...r?{accountId:o?.accountId??r}:{},...n?{siteId:o?.siteId??n}:{},...o?.subscriber===true||s?{subscriber:true}:{}},c={},a=String(t.apiBase??"").trim();a&&(c.apiBase=a);let u=String(t.runtimeToken??t.nonce??"").trim();u&&(c.runtimeToken=u);let d=String(t.virtualAssetBaseUrl??t.uploadUrl??"").trim();d&&(c.virtualAssetBaseUrl=d),Object.keys(i).length>0&&(c.siteSettings=i);let l=gt(t.subscriptionType);return l&&(c.subscriptionType=l),c}function In(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function Gt(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function En(e,t){let r=new Headers(e instanceof Request?e.headers:void 0);if(t?.headers)for(let[n,s]of new Headers(t.headers).entries())r.set(n,s);return r}async function Zt(e,t,r=5){let n=new URL(Gt(e)),s=String(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase(),o=n.protocol==="http:"?Rn:vn,i=En(e,t);return await new Promise((c,a)=>{let u=o.request(n,{method:s,headers:Object.fromEntries(i.entries()),...n.protocol==="https:"?{rejectUnauthorized:false}:{}},d=>{let l=[];d.on("data",g=>{l.push(Buffer.isBuffer(g)?g:Buffer.from(g));}),d.on("error",a),d.on("end",()=>{let g=d.statusCode??0,y=d.headers.location;if(r>0&&y&&[301,302,303,307,308].includes(g)){c(Zt(new URL(y,n),{method:g===303?"GET":s},r-1));return}let h=new Headers;for(let[R,m]of Object.entries(d.headers))Array.isArray(m)?h.set(R,m.join(", ")):typeof m=="string"&&h.set(R,m);c(new Response(Buffer.concat(l),{status:g,statusText:d.statusMessage??"",headers:h}));});});u.on("error",a),u.end();})}function On(e){let t=mt(e.wpsuite),r={...t.siteSettings??{},...t.siteSettings?.subscriber===true||t.subscriptionType==="PROFESSIONAL"||t.subscriptionType==="AGENCY"?{subscriber:true}:{}},n=String(r.accountId??"").trim(),s=String(r.siteId??"").trim(),o=String(t.virtualAssetBaseUrl??t.uploadUrl??"").trim();if(e.wpsuite={...t.apiBase?{apiBase:t.apiBase}:{},...t.runtimeToken?{runtimeToken:t.runtimeToken}:{},...o?{virtualAssetBaseUrl:o}:{},...Object.keys(r).length>0?{siteSettings:r}:{},...t.subscriptionType?{subscriptionType:t.subscriptionType}:{}},!n||!s||!o)return false;In(e.sourceOrigin);let i=globalThis,a={...i.WpSuite??{},siteSettings:r,uploadUrl:o};return t.apiBase&&(a.apiBase=t.apiBase),i.WpSuite=a,true}async function $n(e){let t=String(e.wpsuite?.virtualAssetBaseUrl??e.wpsuite?.uploadUrl??"").trim();if(!On(e)){let s=e.wpsuite?.siteSettings,o=[String(s?.accountId??"").trim()?"":"accountId",String(s?.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): ${o.join(", ")}.`,requests:[]}}}let r=globalThis.fetch,n=[];try{typeof r=="function"&&/^https?:\/\//i.test(t)&&(globalThis.fetch=(async(a,u)=>{let d=Gt(a);if(d.startsWith(t)){let l=(()=>{try{return new URL(d).pathname}catch{return d}})();try{let g=e.ignoreHttpsErrors&&d.startsWith("https://")?await Zt(a,u):await r(a,u);return n.push({path:l,status:g.status,ok:g.ok,error:null}),g}catch(g){throw n.push({path:l,status:null,ok:!1,error:g instanceof Error?g.message:String(g)}),g}}return r(a,u)}));let{getConfig:s}=await import('@smart-cloud/wpsuite-core'),o=await s("publisher"),i=o&&typeof o=="object"?o:null,c=gt(i?.subscriptionType);return {remote:i,diagnostic:{status:i?"loaded":"unavailable",virtualAssetBaseUrl:t,subscriptionType:c??null,error:i?null:"WP Suite publisher config loader returned no configuration.",requests:n}}}catch(s){return {remote:null,diagnostic:{status:"unavailable",virtualAssetBaseUrl:t,subscriptionType:null,error:s instanceof Error?s.message:String(s),requests:n}}}finally{typeof r=="function"&&(globalThis.fetch=r);}}function Mn(e,t){let r=Cn(t?.deploymentProfiles),n=String(t?.defaultDeploymentProfile??"").trim(),s=r[n]?n:"",o=gt(t?.subscriptionType),i=mt(e.wpsuite);return {...e,scheduler:Kt(t?.scheduler),deploymentProfiles:r,defaultDeploymentProfile:s,...o?{subscriptionType:o}:{},wpsuite:{...i,...i.siteSettings||o?{siteSettings:{...i.siteSettings??{},...i.siteSettings?.subscriber===true||o==="PROFESSIONAL"||o==="AGENCY"?{subscriber:true}:{}}}:{},...o?{subscriptionType:o}:{}}}}function pt(e,t){let n=String(e||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!n)return t;let s=n.split("/").map(o=>o.trim()).filter(o=>o.length>0&&o!=="."&&o!=="..");return s.length>0?s.join("/"):t}function Un(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?w.resolve(e):""}function Ht(e,t,r){let n=String(t||"").trim();return n&&w.isAbsolute(n)?w.resolve(n):w.resolve(e,pt(n,r))}async function _e(e,t={}){let r=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",n=await T.readFile(r,"utf8"),s=JSON.parse(n);s.sourceOrigin=s.sourceOrigin.replace(/\/$/,""),s.targetOrigin=Jt(s.targetOrigin),s.ignoreHttpsErrors??=false,s.outputDir=String(s.outputDir||"export").trim()||"export",s.urlRewriteMode||=s.targetOrigin==="."?"relative":"absolute",s.noJavaScriptRenderPathPrefixes||=[],s.seedPaths||=[],s.generated404RequestPath=kn(s.generated404RequestPath),s.sitemapPaths||=[...ct],s.allowedAssetHosts||=[],s.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],s.blockedPathPrefixes||=[],s.blockedSearchFragments||=[],s.concurrency||=1,s.maxPages||=0,s.extraReplacements=dt(s.extraReplacements),s.postCrawlCopyMap=dt(s.postCrawlCopyMap),s.logDir=String(s.logDir||"logs").trim()||"logs",s.verbose??=false,s.logLevel||=s.verbose?"debug":"info",s.s3SyncMode||="sdk-upload-delete",s.readiness||={waitForSelector:null,waitForFunction:null,timeoutMs:1500,fallbackWaitMs:1500},s.readiness.timeoutMs??=1500,s.readiness.fallbackWaitMs??=1500,s.viewport||={width:1440,height:1200},s.navigationTimeoutMs||=3e4,s.assetDownloadConcurrency=Number(s.assetDownloadConcurrency)>0?Number(s.assetDownloadConcurrency):s.concurrency,s.rewriteConcurrency=Number(s.rewriteConcurrency)>0?Number(s.rewriteConcurrency):s.assetDownloadConcurrency,s.wpsuite=mt(s.wpsuite),s.scheduler=Kt(void 0),s.remoteWorkers=An(s.remoteWorkers),s.deploymentProfiles={},s.defaultDeploymentProfile="",s.deploymentTargetOverride=String(s.deploymentTargetOverride??"").trim();let o=await $n(s);t.onRemotePublisherConfigDiagnostic?.(o.diagnostic);let i=Mn(s,o.remote),c=Un(),a=c?w.resolve(c,".."):"";return a?(i.outputDir=Ht(a,i.outputDir,"export"),i.logDir=Ht(a,i.logDir,"logs")):(w.isAbsolute(i.outputDir)||(i.outputDir=pt(i.outputDir,"export")),w.isAbsolute(i.logDir)||(i.logDir=pt(i.logDir,"logs"))),i}function we(e,t=10){return er.createHash("sha1").update(e).digest("hex").slice(0,t)}async function Ln(e){await T.mkdir(w.dirname(e),{recursive:true});}async function ye(e,t,r){await Ln(e);let n=w.join(w.dirname(e),`.${w.basename(e)}.${process.pid}.${Date.now()}.${er.randomBytes(6).toString("hex")}.tmp`);try{typeof t=="string"?await T.writeFile(n,t,r??"utf8"):await T.writeFile(n,t),await T.rename(n,e);}catch(s){throw await T.unlink(n).catch(()=>{}),s}}function ge(e){return [".html",".htm",".css",".js",".mjs",".json",".xml",".xsl",".txt",".svg",".map",".enc",".jws"].includes(w.extname(e).toLowerCase())}function se(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 ve(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 Yt(e){return e.replace(/\//g,"\\\\/")}function jn(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 Xt(e,t,r){if(!t)return;e[t]=r;let n=Be(t),s=Be(r);e[n]=s;let o=Yt(t),i=Yt(r);e[o]=i;let c=ve(t),a=ve(r);e[c]=a;let u=ve(n),d=ve(s);e[u]=d;let l=ve(o),g=ve(i);e[l]=g;}function Ve(e,t,r){Xt(e,t,r);let n=jn(t);n&&n!==t&&Xt(e,n,r);}function ht(e,t){let r=t.startsWith("/")?t:`/${t}`,n=(e||"").replace(/\/$/,"");return !n||n==="."||n==="/"?r:`${n}${r}`}function tr(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function rr(e,t,r){if(!t)return r;let n=w.dirname(w.resolve(t)),s=w.resolve(e,r.replace(/^\/+/,"")),o=w.relative(n,s).replace(/\\/g,"/");return o?(o.startsWith(".")||(o=`./${o}`),o):"."}async function yt(e,t){return (t?[...new Set(t)].map(n=>w.resolve(n)).filter(n=>n.startsWith(w.resolve(e.outputDir))).map(n=>w.relative(e.outputDir,n).replace(/\\/g,"/")).filter(n=>n.length>0):await Dn(["**/*"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(n=>n!=="asset-map.json"&&ge(n))}var Nn=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],_n=new Set([".html",".htm"]),nr="WPSuite.io Static Publisher",Bn=nr.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function Vn(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function zn(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function Qn(e,t,r){return zn(t)?e.replace(new RegExp(`(?<!:)${Vn(t)}`,"g"),r):e.split(t).join(r)}function Hn(e,t,r){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let s=w.extname(r).toLowerCase();return _n.has(s)?/<head\b|<html\b|<!doctype html/i.test(t):false}function Jn(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${Bn}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${nr}" />`;if(e.match(/(\r?\n)([ \t]*)<\/head>/i))return e.replace(/(\r?\n)([ \t]*)<\/head>/i,`$1$2${t}$1$2</head>`);let n=e.includes(`\r
2
2
  `)?`\r
3
3
  `:`
4
- `;return e.replace(/<head\b[^>]*>/i,n=>`${n}${s} ${t}`)}function ms(e){let t=Z(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function ws(e,t){let r=[...new Set(t)].filter(i=>i.includes("/")&&!/\\+\//.test(i)).map(i=>[i,Oe(i)]).filter(([i,o])=>i!==o).sort((i,o)=>o[0].length-i[0].length);if(!r.length)return e;let s=i=>{let o=i;for(let[u,a]of r)o=o.split(u).join(a);return o},n=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(i,o,u,a)=>`${o}${s(u)}${a}`);return n=n.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(i,o,u,a,l)=>ms(a)?`${o}${s(a)}${l}`:i),n}function ys(e,t){if(!t)return null;let r=y.dirname(y.resolve(t)),s=y.resolve(e.outputDir),n=y.relative(r,s).replace(/\\/g,"/");return n?(n.startsWith(".")||(n=`./${n}`),n.endsWith("/")?n:`${n}/`):"./"}function Ss(e,t,r){let s=ys(t,r);if(!s)return e;let n=e;for(let i of us){let o=i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),u=new RegExp(`(?:\\.{1,}/)+${o}`,"g"),a=new RegExp(`(?<!\\.)/${o}`,"g");n=n.replace(u,`${s}${i}`).replace(a,`${s}${i}`);let l=i.replace(/\//g,"\\/"),d=s.replace(/\//g,"\\/"),c=l.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),p=new RegExp(`(?:\\.{1,}\\\\/)+${c}`,"g"),w=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${c}`,"g"),m=new RegExp(`(?<![\\.\\\\])\\/${c}`,"g");n=n.replace(p,`${d}${l}`).replace(w,`${d}${l}`).replace(m,`${d}${l}`);}return n}function nt(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:qt(t,e.targetOrigin),i=s?`${s.search}${s.hash}`:"";return e.urlRewriteMode==="root-relative"?`${n}${i}`:`${Nt(e.outputDir,r,n)}${i}`}function st(e,t,r,s,n){De(e,r,nt(t,s,n));}function Ps(e,t,r,s,n){if(!r||r===s)return;De(e,r,s);let i=nt(t,r,n),o=nt(t,s,n);De(e,i,o);}function it(e,t,r,s,n={}){let i=e,o={};st(o,t,t.sourceOrigin,t.targetOrigin,s);for(let[a,l]of Object.entries(t.extraReplacements))st(o,t,a,l,s);for(let[a,l]of Object.entries(r))st(o,t,a,l,s);for(let[a,l]of Object.entries(n)){let d=r[a];!d||d===l||Ps(o,t,l,d,s);}let u=Object.entries(o).sort((a,l)=>l[0].length-a[0].length);for(let[a,l]of u)i=gs(i,a,l);return t.urlRewriteMode!=="absolute"&&(i=Ss(i,t,s)),i=ws(i,u.map(([,a])=>a)),fs(t,i,s)&&(i=hs(i)),i}async function bs(e,t,r,s){let n=y.join(e.outputDir,s),i=y.extname(n).toLowerCase(),o;try{o=await A.readFile(n,"utf8");}catch(l){if(l.code!=="ENOENT")throw l;return {changed:false}}let a=it(o,e,t,i===".js"||i===".mjs"?void 0:n,r);return a!==o?(await ve(n,a,"utf8"),{changed:true}):{changed:false}}async function vs(e,t){return await new Promise((r,s)=>{let n=a=>{if(u(),a?.error){s(new Error(a.error));return}r({changed:!!a?.changed});},i=a=>{u(),s(a);},o=a=>{u(),a!==0&&s(new Error(`Rewrite worker exited with code ${a}.`));},u=()=>{e.off("message",n),e.off("error",i),e.off("exit",o);};e.on("message",n),e.on("error",i),e.on("exit",o),e.postMessage({file:t});})}async function Wt(e,t,r={}){let n=(r.files?[...new Set(r.files)].map(p=>y.resolve(p)).filter(p=>p.startsWith(y.resolve(e.outputDir))).map(p=>y.relative(e.outputDir,p).replace(/\\/g,"/")).filter(p=>p.length>0):await ns(["**/*"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(p=>p!=="asset-map.json"&&se(p)),i=0;if(n.length===0)return 0;let o=Math.max(1,Number(e.rewriteConcurrency||e.assetDownloadConcurrency||1)),u=Math.max(1,Math.min(o,n.length,availableParallelism()));await r.onStart?.({totalFiles:n.length,workerCount:u});let a=0,l=0,d=null;if(u===1){for(let p of n){let w=await bs(e,t,r.previousAssetMap??{},p);w.changed&&(i+=1),l+=1,await r.onProgress?.({index:l,totalFiles:n.length,changedTextFiles:i,file:p,changed:w.changed});}return i}let c=Array.from({length:u},async()=>{let p=new Worker(new URL("./rewrite-worker.js",import.meta.url),{workerData:{config:e,assetMap:t,previousAssetMap:r.previousAssetMap??{}}});try{for(;!d;){let w=a;if(w>=n.length)return;a+=1;let m=n[w],b=await vs(p,m);b.changed&&(i+=1),l+=1,await r.onProgress?.({index:l,totalFiles:n.length,changedTextFiles:i,file:m,changed:b.changed});}}catch(w){throw d=w instanceof Error?w:new Error(String(w)),d}finally{await p.terminate().catch(()=>{});}});return await Promise.all(c),i}var ne={error:0,warn:1,info:2,debug:3},Cs=/^(?:authorization|proxyAuthorization|runtimeToken|siteKey|nonce|accessToken|refreshToken|accessKeyId|secretAccessKey|sessionToken|xStaticPublisherToken|xApiKey)$/i;function Y(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 Ee(e){return typeof e=="string"?Y(e):Array.isArray(e)?e.map(t=>Ee(t)):e instanceof Error?{name:e.name,message:Y(e.message),...e.stack?{stack:Y(e.stack)}:{}}:e&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,r])=>[t,Cs.test(t)?"[REDACTED]":Ee(r)])):e}function ot(e){return e?Ee(e):void 0}var _t=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",Fe=_t?y.join(_t,"current-progress.json"):"",Qt=Promise.resolve();function Ht(e){return e.includes("crawl")?"crawl":e.includes("deploy")?"deploy":e.includes("invalidate")?"invalidate":e}function Rs(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 o=r[n];if(typeof o=="number"&&typeof i=="number"&&s.has(n)){r[n]=Math.max(o,i);continue}r[n]=i;}return r}function As(e,t,r){Fe&&(Qt=Qt.then(async()=>{let s=new Date,n=s.toISOString();await A.mkdir(y.dirname(Fe),{recursive:true});let i=await A.readFile(Fe,"utf8").then(f=>JSON.parse(f)).catch(()=>null),o=i&&typeof i.details=="object"&&i.details?i.details:{},u=Ht(e),a=i?.currentStep||Ht(i?.source||""),l=i?.startedAt||n,d={...i?.stepDurationsSec??{}},c=i?.stepStartedAt||n;if(a&&a!==u&&i?.stepStartedAt){let f=Math.max(0,Math.round((s.getTime()-new Date(i.stepStartedAt).getTime())/1e3));d[a]=(d[a]??0)+f,c=n;}let p=Math.max(0,Math.round((s.getTime()-new Date(c).getTime())/1e3)),w=Math.max(0,Math.round((s.getTime()-new Date(l).getTime())/1e3)),m=Y(t),b=ot(r)??{},g={checkedAt:n,source:e,message:m,details:Rs(o,b),startedAt:l,currentStep:u,stepStartedAt:c,stepElapsedSec:p,totalElapsedSec:w,stepDurationsSec:d};await A.writeFile(Fe,JSON.stringify(g,null,2),"utf8");}).catch(()=>{}));}async function ks(e,t){await A.mkdir(y.dirname(e),{recursive:true}),await A.appendFile(e,`${JSON.stringify(Ee(t))}
5
- `,"utf8");}function xs(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 Ts(e,t,r){let s=ot(r);return {checkedAt:new Date().toISOString(),currentStep:xs(e,s),level:e,message:Y(t),details:s??{}}}var de=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 y.join(this.logDir,"crawl.log.jsonl")}get currentEventPath(){return y.join(this.logDir,"current-crawl-event.json")}get rejectedPath(){return y.join(this.logDir,"rejected.jsonl")}get ignoredPath(){return y.join(this.logDir,"ignored.jsonl")}get skippedPath(){return y.join(this.logDir,"skipped-http.jsonl")}get errorsPath(){return y.join(this.logDir,"errors.jsonl")}get timingsPath(){return y.join(this.logDir,"timings.jsonl")}ensureLogFileReady(){return this.initPromise||(this.initPromise=(async()=>{await A.mkdir(this.logDir,{recursive:true}),await A.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 A.appendFile(this.logPath,`${t}
6
- `,"utf8");});}enqueueJsonLine(t,r){this.enqueueTask(()=>ks(t,r));}updateCurrentEvent(t,r,s){let n=Ts(t,r,s);this.enqueueTask(async()=>{await A.mkdir(this.logDir,{recursive:true}),await A.writeFile(this.currentEventPath,JSON.stringify(n,null,2),"utf8");});}push(t,r,s){let n=Y(r),i=ot(s),o=JSON.stringify({time:new Date().toISOString(),level:t,message:n,...i||{}});this.enqueueLine(o),this.updateCurrentEvent(t,n,i),t==="error"?console.error(n,i||""):t==="warn"?console.warn(n,i||""):(ne[this.level]>=ne.debug||["summary","page","sitemap","asset","timing"].includes(t))&&console.log(n);}info(t,r){this.push("info",t,r);}debug(t,r){ne[this.level]<ne.debug||this.push("debug",t,r);}progress(t,r){As("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),ne[this.level]>=ne.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),ne[this.level]>=ne.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 zt="(?: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 Vt(e){let t=new RegExp(`(?:https?:)?//[^\\s'"<>\\);]+\\.${zt}(?:[?#][^\\s'"<>\\);]*)?(?=[\\s'"<>\\);]|$)|(?<![A-Za-z0-9._-])/[^\\s'"<>\\);]+\\.${zt}(?:[?#][^\\s'"<>\\);]*)?(?=[\\s'"<>\\);]|$)`,"gi");return [...e.matchAll(t)].map(r=>r[0])}function Jt(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 Gt(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]&&Jt(i[1])&&r.push({index:i.index??0,value:i[1]});for(let i of e.matchAll(n))i[1]&&Jt(i[1])&&r.push({index:i.index??0,value:i[1]});for(let i of r.sort((o,u)=>o.index-u.index))t.add(i.value);return [...t]}function Kt(e,t){let r=y.relative(t,e);return r===""||!r.startsWith("..")&&!y.isAbsolute(r)}function Zt(e,t,r,s){let n=y.resolve(e),i=y.resolve(t),o=y.extname(n).toLowerCase();return !Kt(n,i)||o!==".html"&&o!==".htm"||r.has(n)?false:!s.some(u=>Kt(n,y.resolve(u)))}function Yt(e,t){return typeof e=="string"&&e.length>0&&t?.supported===true&&typeof t.token=="string"&&t.token.length>0&&e===t.token}function Xt(e,t){try{let r=new URL(e),s=new URL(t,r);if(s.origin!==r.origin)return !1;let n=r.pathname.replace(/\/+$/,"");if(n&&s.pathname!==n&&!s.pathname.startsWith(`${n}/`))return !1;let i=n?s.pathname.slice(n.length)||"/":s.pathname;return ["/wp-includes/","/wp-content/plugins/","/wp-content/themes/","/wp-content/mu-plugins/"].some(o=>i.startsWith(o))}catch{return false}}function er(e){return e<1}function tr(e){let t=String(e??"").toLowerCase();return t==="strict"?"Strict":t==="lax"?"Lax":t==="none"?"None":"Unspecified"}function Ms(e){let t=e.pathname||"/";if(!t.startsWith("/")||t==="/")return "/";let r=t.lastIndexOf("/");return r<=0?"/":t.slice(0,r)}function Ce(e){return `${e.name.toLowerCase()}
4
+ `;return e.replace(/<head\b[^>]*>/i,s=>`${s}${n} ${t}`)}function Kn(e){let t=se(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function Gn(e,t){let r=[...new Set(t)].filter(o=>o.includes("/")&&!/\\+\//.test(o)).map(o=>[o,Be(o)]).filter(([o,i])=>o!==i).sort((o,i)=>i[0].length-o[0].length);if(!r.length)return e;let n=o=>{let i=o;for(let[c,a]of r)i=i.split(c).join(a);return i},s=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(o,i,c,a)=>`${i}${n(c)}${a}`);return s=s.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(o,i,c,a,u)=>Kn(a)?`${i}${n(a)}${u}`:o),s}function Zn(e,t){if(!t)return null;let r=w.dirname(w.resolve(t)),n=w.resolve(e.outputDir),s=w.relative(r,n).replace(/\\/g,"/");return s?(s.startsWith(".")||(s=`./${s}`),s.endsWith("/")?s:`${s}/`):"./"}function Yn(e,t,r){let n=Zn(t,r);if(!n)return e;let s=e;for(let o of Nn){let i=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),c=new RegExp(`(?:\\.{1,}/)+${i}`,"g"),a=new RegExp(`(?<!\\.)/${i}`,"g");s=s.replace(c,`${n}${o}`).replace(a,`${n}${o}`);let u=o.replace(/\//g,"\\/"),d=n.replace(/\//g,"\\/"),l=u.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),g=new RegExp(`(?:\\.{1,}\\\\/)+${l}`,"g"),y=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${l}`,"g"),h=new RegExp(`(?<![\\.\\\\])\\/${l}`,"g");s=s.replace(g,`${d}${u}`).replace(y,`${d}${u}`).replace(h,`${d}${u}`);}return s}function wt(e,t,r){if(e.urlRewriteMode==="absolute")return t;let n=(()=>{try{return new URL(t,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin)}catch{return null}})(),s=n?n.pathname:tr(t,e.targetOrigin),o=n?`${n.search}${n.hash}`:"";return e.urlRewriteMode==="root-relative"?`${s}${o}`:`${rr(e.outputDir,r,s)}${o}`}function ft(e,t,r,n,s){Ve(e,r,wt(t,n,s));}function Xn(e,t,r,n,s){if(!r||r===n)return;Ve(e,r,n);let o=wt(t,r,s),i=wt(t,n,s);Ve(e,o,i);}function bt(e,t,r,n,s={}){let o=e,i={};ft(i,t,t.sourceOrigin,t.targetOrigin,n);for(let[a,u]of Object.entries(t.extraReplacements))ft(i,t,a,u,n);for(let[a,u]of Object.entries(r))ft(i,t,a,u,n);for(let[a,u]of Object.entries(s)){let d=r[a];!d||d===u||Xn(i,t,u,d,n);}let c=Object.entries(i).sort((a,u)=>u[0].length-a[0].length);for(let[a,u]of c)o=Qn(o,a,u);return t.urlRewriteMode!=="absolute"&&(o=Yn(o,t,n)),o=Gn(o,c.map(([,a])=>a)),Hn(t,o,n)&&(o=Jn(o)),o}async function es(e,t,r,n){let s=w.join(e.outputDir,n),o=w.extname(s).toLowerCase(),i;try{i=await T.readFile(s,"utf8");}catch(u){if(u.code!=="ENOENT")throw u;return {changed:false}}let a=bt(i,e,t,o===".js"||o===".mjs"?void 0:s,r);return a!==i?(await ye(s,a,"utf8"),{changed:true}):{changed:false}}async function ts(e,t){return await new Promise((r,n)=>{let s=a=>{if(c(),a?.error){n(new Error(a.error));return}r({changed:!!a?.changed});},o=a=>{c(),n(a);},i=a=>{c(),a!==0&&n(new Error(`Rewrite worker exited with code ${a}.`));},c=()=>{e.off("message",s),e.off("error",o),e.off("exit",i);};e.on("message",s),e.on("error",o),e.on("exit",i),e.postMessage({file:t});})}async function sr(e,t,r={}){let n=await yt(e,r.files),s=0;if(n.length===0)return 0;let o=Math.max(1,Number(e.rewriteConcurrency||e.assetDownloadConcurrency||1)),i=Math.max(1,Math.min(o,n.length,availableParallelism()));await r.onStart?.({totalFiles:n.length,workerCount:i});let c=0,a=0,u=null;if(i===1){for(let l of n){let g=await es(e,t,r.previousAssetMap??{},l);g.changed&&(s+=1),a+=1,await r.onProgress?.({index:a,totalFiles:n.length,changedTextFiles:s,file:l,changed:g.changed});}return s}let d=Array.from({length:i},async()=>{let l=new Worker(new URL("./rewrite-worker.js",import.meta.url),{workerData:{config:e,assetMap:t,previousAssetMap:r.previousAssetMap??{}}});try{for(;!u;){let g=c;if(g>=n.length)return;c+=1;let y=n[g],h=await ts(l,y);h.changed&&(s+=1),a+=1,await r.onProgress?.({index:a,totalFiles:n.length,changedTextFiles:s,file:y,changed:h.changed});}}catch(g){throw u=g instanceof Error?g:new Error(String(g)),u}finally{await l.terminate().catch(()=>{});}});return await Promise.all(d),s}var me={error:0,warn:1,info:2,debug:3},rs=/^(?:authorization|proxyAuthorization|runtimeToken|siteKey|nonce|accessToken|refreshToken|accessKeyId|secretAccessKey|sessionToken|xStaticPublisherToken|xApiKey)$/i;function oe(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 Qe(e){return typeof e=="string"?oe(e):Array.isArray(e)?e.map(t=>Qe(t)):e instanceof Error?{name:e.name,message:oe(e.message),...e.stack?{stack:oe(e.stack)}:{}}:e&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,r])=>[t,rs.test(t)?"[REDACTED]":Qe(r)])):e}function St(e){return e?Qe(e):void 0}var or=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",ze=or?w.join(or,"current-progress.json"):"",ir=Promise.resolve();function ar(e){return e.includes("crawl")?"crawl":e.includes("deploy")?"deploy":e.includes("invalidate")?"invalidate":e}function ns(e,t){let r={...e},n=typeof e.phase=="string"?e.phase.trim():"",s=typeof t.phase=="string"?t.phase.trim():"";if(s!==""&&(s==="deploy"||s.startsWith("deploy-"))&&n!==s)for(let c of ["index","totalFiles","staged","uploaded","skipped","failed","deleted","workerCount","completedBatches","totalBatches"])delete r[c];let i=new Set(["pagesQueued","pagesRendered","assetsQueued","sitemapsQueued","pagesDiscovered","assetsDiscovered","sitemapsDiscovered","pagesSaved","assetsSaved","donePages","doneAssets","doneSitemaps","changedTextFiles","uploaded","failed","index","totalFiles","completedBatches","totalBatches","pageQueue","assetQueue","sitemapQueue"]);for(let[c,a]of Object.entries(t)){let u=r[c];if(typeof u=="number"&&typeof a=="number"&&i.has(c)){r[c]=Math.max(u,a);continue}r[c]=a;}return r}function ss(e,t,r){ze&&(ir=ir.then(async()=>{let n=new Date,s=n.toISOString();await T.mkdir(w.dirname(ze),{recursive:true});let o=await T.readFile(ze,"utf8").then(p=>JSON.parse(p)).catch(()=>null),i=o&&typeof o.details=="object"&&o.details?o.details:{},c=ar(e),a=o?.currentStep||ar(o?.source||""),u=o?.startedAt||s,d={...o?.stepDurationsSec??{}},l=o?.stepStartedAt||s;if(a&&a!==c&&o?.stepStartedAt){let p=Math.max(0,Math.round((n.getTime()-new Date(o.stepStartedAt).getTime())/1e3));d[a]=(d[a]??0)+p,l=s;}let g=Math.max(0,Math.round((n.getTime()-new Date(l).getTime())/1e3)),y=Math.max(0,Math.round((n.getTime()-new Date(u).getTime())/1e3)),h=oe(t),R=St(r)??{},m={checkedAt:s,source:e,message:h,details:ns(i,R),startedAt:u,currentStep:c,stepStartedAt:l,stepElapsedSec:g,totalElapsedSec:y,stepDurationsSec:d};await T.writeFile(ze,JSON.stringify(m,null,2),"utf8");}).catch(()=>{}));}async function os(e,t){await T.mkdir(w.dirname(e),{recursive:true}),await T.appendFile(e,`${JSON.stringify(Qe(t))}
5
+ `,"utf8");}function is(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 as(e,t,r){let n=St(r);return {checkedAt:new Date().toISOString(),currentStep:is(e,n),level:e,message:oe(t),details:n??{}}}var ke=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 w.join(this.logDir,"crawl.log.jsonl")}get currentEventPath(){return w.join(this.logDir,"current-crawl-event.json")}get rejectedPath(){return w.join(this.logDir,"rejected.jsonl")}get ignoredPath(){return w.join(this.logDir,"ignored.jsonl")}get skippedPath(){return w.join(this.logDir,"skipped-http.jsonl")}get errorsPath(){return w.join(this.logDir,"errors.jsonl")}get timingsPath(){return w.join(this.logDir,"timings.jsonl")}ensureLogFileReady(){return this.initPromise||(this.initPromise=(async()=>{await T.mkdir(this.logDir,{recursive:true}),await T.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 T.appendFile(this.logPath,`${t}
6
+ `,"utf8");});}enqueueJsonLine(t,r){this.enqueueTask(()=>os(t,r));}updateCurrentEvent(t,r,n){let s=as(t,r,n);this.enqueueTask(async()=>{await T.mkdir(this.logDir,{recursive:true}),await T.writeFile(this.currentEventPath,JSON.stringify(s,null,2),"utf8");});}push(t,r,n){let s=oe(r),o=St(n),i=JSON.stringify({time:new Date().toISOString(),level:t,message:s,...o||{}});this.enqueueLine(i),this.updateCurrentEvent(t,s,o),t==="error"?console.error(s,o||""):t==="warn"?console.warn(s,o||""):(me[this.level]>=me.debug||["summary","page","sitemap","asset","timing"].includes(t))&&console.log(s);}info(t,r){this.push("info",t,r);}debug(t,r){me[this.level]<me.debug||this.push("debug",t,r);}progress(t,r){ss("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 n=this.marks.get(t);if(!n)return;let s=Date.now()-n,o={name:t,ms:s,seconds:Number((s/1e3).toFixed(2)),...r||{}};this.enqueueJsonLine(this.timingsPath,o),this.push("timing",`Timing ${t}: ${o.seconds}s`,o);}reject(t,r,n,s){let o={kind:t,url:r,reason:n,source:s};this.enqueueJsonLine(this.rejectedPath,o),me[this.level]>=me.debug&&this.push("reject",`Rejected ${t} ${r}: ${n}`,o);}ignore(t,r,n,s){let o={kind:t,url:r,reason:n,source:s};this.enqueueJsonLine(this.ignoredPath,o),me[this.level]>=me.debug&&this.push("ignore",`Ignored ${t} ${r}: ${n}`,o);}skip(t,r,n,s){let o={kind:t,url:r,status:n,source:s};this.enqueueJsonLine(this.skippedPath,o),this.push("warn",`Skipped ${t} ${r}: HTTP ${n}`,o);}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 ur="(?: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 lr(e){let t=new RegExp(`(?:https?:)?//[^\\s'"<>\\);]+\\.${ur}(?:[?#][^\\s'"<>\\);]*)?(?=[\\s'"<>\\);]|$)|(?<![A-Za-z0-9._-])/[^\\s'"<>\\);]+\\.${ur}(?:[?#][^\\s'"<>\\);]*)?(?=[\\s'"<>\\);]|$)`,"gi");return [...e.matchAll(t)].map(r=>r[0])}function cr(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 dr(e){let t=new Set,r=[],n=/\bimport\s*\(\s*["'`]([^"'`\s<>\\]+)["'`]\s*\)/g,s=/\b(?:[A-Za-z_$][\w$]*\.)?u\s*=\s*(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>\s*["'`]([^"'`\s<>\\]+)["'`]/g;for(let o of e.matchAll(n))o[1]&&cr(o[1])&&r.push({index:o.index??0,value:o[1]});for(let o of e.matchAll(s))o[1]&&cr(o[1])&&r.push({index:o.index??0,value:o[1]});for(let o of r.sort((i,c)=>i.index-c.index))t.add(o.value);return [...t]}function pr(e,t){let r=w.relative(t,e);return r===""||!r.startsWith("..")&&!w.isAbsolute(r)}function gr(e,t,r,n){let s=w.resolve(e),o=w.resolve(t),i=w.extname(s).toLowerCase();return !pr(s,o)||i!==".html"&&i!==".htm"||r.has(s)?false:!n.some(c=>pr(s,w.resolve(c)))}function mr(e,t){return typeof e=="string"&&e.length>0&&t?.supported===true&&typeof t.token=="string"&&t.token.length>0&&e===t.token}function hr(e,t){try{let r=new URL(e),n=new URL(t,r);if(n.origin!==r.origin)return !1;let s=r.pathname.replace(/\/+$/,"");if(s&&n.pathname!==s&&!n.pathname.startsWith(`${s}/`))return !1;let o=s?n.pathname.slice(s.length)||"/":n.pathname;return ["/wp-includes/","/wp-content/plugins/","/wp-content/themes/","/wp-content/mu-plugins/"].some(i=>o.startsWith(i))}catch{return false}}function fr(e){return e<1}function wr(e){let t=String(e??"").toLowerCase();return t==="strict"?"Strict":t==="lax"?"Lax":t==="none"?"None":"Unspecified"}function cs(e){let t=e.pathname||"/";if(!t.startsWith("/")||t==="/")return "/";let r=t.lastIndexOf("/");return r<=0?"/":t.slice(0,r)}function $e(e){return `${e.name.toLowerCase()}
7
7
  ${e.domain.toLowerCase()}
8
- ${e.path}`}function rr(e,t){let r;try{r=new URL(t);}catch{return null}let s=e.split(";"),n=s.shift()?.trim()??"",i=n.indexOf("=");if(i<=0)return null;let o=n.slice(0,i).trim();if(!o||[...o].some(b=>b<=" "||"=;,".includes(b)))return null;let u=r.hostname.toLowerCase(),a=Ms(r),l=null,d=true,c=false,p=false,w="Unspecified",m=false;for(let b of s){let g=b.indexOf("="),f=(g<0?b:b.slice(0,g)).trim().toLowerCase(),h=g<0?"":b.slice(g+1).trim();if(f==="domain"&&h)u=h.toLowerCase();else if(f==="path"&&h.startsWith("/"))a=h;else if(f==="expires"){let v=Date.parse(h);Number.isFinite(v)&&(l=Math.floor(v/1e3),d=false);}else if(f==="max-age"&&/^-?\d+$/u.test(h)){let v=Number.parseInt(h,10);l=Math.floor(Date.now()/1e3)+v,d=false;}else f==="secure"?c=true:f==="httponly"?p=true:f==="samesite"?w=tr(h):f==="partitioned"&&(m=true);}return {name:o,domain:u,path:a,expires:l,session:d,secure:c,httpOnly:p,sameSite:w,partitioned:m}}function $s(e){let t=!Number.isFinite(e.expires)||e.expires<=0;return {name:e.name,domain:e.domain.toLowerCase(),path:e.path||"/",expires:t?null:e.expires,session:t,secure:e.secure,httpOnly:e.httpOnly,sameSite:tr(e.sameSite),partitioned:e.partitioned===true}}function sr(e,t){let r=new Map(e.map(s=>[Ce(s),s.value]));return t.filter(s=>r.get(Ce(s))!==s.value).map($s)}function Us(e,t){let r=e.session||t.session;return {...e,expires:r?null:Math.max(e.expires??0,t.expires??0)||null,session:r,secure:e.secure&&t.secure,httpOnly:e.httpOnly&&t.httpOnly,sameSite:e.sameSite===t.sameSite?e.sameSite:"Unspecified",partitioned:e.partitioned&&t.partitioned}}var je=class{#e=new Map;add(t){if(!t)return;let r={...t,domain:t.domain.toLowerCase(),path:t.path||"/"},s=Ce(r),n=this.#e.get(s);this.#e.set(s,n?Us(n,r):r);}addAll(t){for(let r of t)this.add(r);}artifact(){return {schemaVersion:1,observations:[...this.#e.values()].sort((t,r)=>Ce(t).localeCompare(Ce(r)))}}};async function qe(e,t){await A.mkdir(y.dirname(e),{recursive:true});let r=`${e}.${process.pid}.tmp`;await A.writeFile(r,`${JSON.stringify(t,null,2)}
9
- `,{encoding:"utf8",mode:384}),await A.rename(r,e);}function Re(e){let t=e;for(let s=0;s<3;s+=1){if(/%(?:2f|5c)/i.test(t))return null;try{let n=decodeURIComponent(t);if(n===t)break;t=n;}catch{return null}}return t.includes("\0")||t.includes("\\")||t.split("/").some(s=>s==="."||s==="..")?null:t}function Ae(e,t){let r=Re(t);if(r===null)throw new Error(`Unsafe output URL pathname: ${t}`);let s=y.resolve(e),n=y.resolve(s,r.replace(/^\/+/,""));if(n!==s&&!n.startsWith(`${s}${y.sep}`))throw new Error(`Output path escapes configured root: ${t}`);return n}var Fs=["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"],mr=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"]),wr=new Set(["",".html",".htm"]),Es=new Set([".css",".xml",".xsl",".svg",".json",".html",".htm",".txt",".enc",".jws"]),js=["/wp-content/","/wp-includes/","/wp-admin/","/static/","/assets/","/build/","/_next/"];function qs(e){let t=[],r="full",s="full",n=false,i=false,o="";for(let u=0;u<e.length;u++){let a=e[u];if(a==="--retry-timeouts")r="retry-timeouts",n=true;else if(a==="--resume")n=true;else if(a==="--resume-rewrite")n=true,i=true;else if(a==="--crawl-mode"){let l=e[++u];if(!l)throw new Error("--crawl-mode requires a value");s=l==="incremental"?"incremental":"full",n||=s==="incremental";}else if(a.startsWith("--crawl-mode="))s=a.slice(13)==="incremental"?"incremental":"full",n||=s==="incremental";else if(a==="--incremental")s="incremental",n=true;else if(a==="--url"){let l=e[++u];if(!l)throw new Error("--url requires a value");r="single-url",n=true,t.push(l);}else if(a.startsWith("--url="))r="single-url",n=true,t.push(a.slice(6));else if(a==="--urls"){let l=e[++u];if(!l)throw new Error("--urls requires a file path");r="single-url",n=true,t.push(`@${l}`);}else if(a==="--content-sync-plan"){let l=e[++u];if(!l)throw new Error("--content-sync-plan requires a file path");r="content-sync",s="incremental",n=true,o=y.resolve(l);}else a.startsWith("--content-sync-plan=")&&(r="content-sync",s="incremental",n=true,o=y.resolve(a.slice(20)));}return {mode:r,crawlMode:s,urls:t,preserveOutput:n,resumeRewrite:i,contentSyncPlanPath:o}}function ze(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?y.resolve(e):""}function Ns(){let e=ze();return e?y.join(e,"privacy","cookie-observations.json"):null}function Bs(){let e=ze();return e?y.resolve(e,".."):""}function Ws(){let e=process.env.STATIC_PUBLISHER_WP_ROOT||process.env.WPSUITE_STATIC_PUBLISHER_WP_ROOT||"";return e.trim()?y.resolve(e):""}function _s(e){let t=e.trim(),r=[{alias:"@storage-root",root:Bs(),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:Ws(),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?y.resolve(s.root,n):s.root,alias:s.alias}}return {resolvedPath:y.resolve(t)}}function yr(e){let t=String(process.env.STATIC_PUBLISHER_CRAWL_MANIFEST_PATH||"").trim();if(t)return y.resolve(t);let r=ze();return r?y.join(r,"crawl-manifest.json"):y.join(e.outputDir,".crawl-manifest.json")}function Sr(){return {schemaVersion:6,updatedAt:"",pages:{},assets:{}}}function ir(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 Qs(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,cacheControl:typeof e.cacheControl=="string"&&e.cacheControl?e.cacheControl:null,changeToken:typeof e.changeToken=="string"?e.changeToken:null,tokenSource:typeof e.tokenSource=="string"?e.tokenSource:null,discoveredAssets:Array.isArray(e.discoveredAssets)?e.discoveredAssets.map(r=>String(r)):[],lastCrawledAt:String(e.lastCrawledAt||""),lastSeenRunId:String(e.lastSeenRunId||""),unreferencedRuns:Math.max(0,Number(e.unreferencedRuns)||0),rewriteComplete:e.rewriteComplete===true||!t}}function ct(e){let t=e?.["content-type"]?.trim();return t||null}function dt(e){let t=e?.["cache-control"]?.trim();return t||null}function Hs(e){return e?e.split(",").map(t=>t.trim().toLowerCase()).some(t=>t==="no-cache"||t==="no-store"||/^max-age\s*=\s*0$/.test(t)):false}function zs(){return {rewriteTargets:new Set,changedFiles:new Set,deletedFiles:new Set,revalidateFiles:new Set}}function Ne(e,t,r,s){let n=z(t.outputDir,r);n&&(Hs(s)?e.revalidateFiles.add(n):e.revalidateFiles.delete(n));}function Q(e,t,r){let s=z(t.outputDir,r);s&&(e.changedFiles.add(s),e.deletedFiles.delete(s));}function pt(e,t,r){let s=z(t.outputDir,r);s&&(e.deletedFiles.add(s),e.changedFiles.delete(s),e.revalidateFiles.delete(s));}function ue(e,t){e.rewriteTargets.add(y.resolve(t));}async function Js(e){try{let t=await A.readFile(yr(e),"utf8"),r=JSON.parse(t);if(r&&typeof r=="object"&&r.pages&&typeof r.pages=="object"){if((r.schemaVersion===2||r.schemaVersion===3||r.schemaVersion===4||r.schemaVersion===5||r.schemaVersion===6)&&r.assets&&typeof r.assets=="object")return {schemaVersion:6,updatedAt:String(r.updatedAt||""),pages:Object.fromEntries(Object.entries(r.pages).map(([s,n])=>[s,ir(n)])),assets:Object.fromEntries(Object.entries(r.assets).map(([s,n])=>[s,Qs(n)]))};if(r.schemaVersion===1)return {schemaVersion:6,updatedAt:String(r.updatedAt||""),pages:Object.fromEntries(Object.entries(r.pages).map(([s,n])=>[s,ir(n)])),assets:{}}}}catch{}return Sr()}function gt(e){return JSON.parse(JSON.stringify(e))}async function Vs(e,t){let r=yr(e);await A.mkdir(y.dirname(r),{recursive:true}),await A.writeFile(r,JSON.stringify(t,null,2),"utf8");}async function ie(e,t){if(!t.trackManifest)return;let r=async()=>{let s=gt(t.manifest);s.updatedAt=new Date().toISOString(),t.manifest.updatedAt=s.updatedAt,await Vs(e,s);};t.manifestSaveChain=t.manifestSaveChain.then(r,r),await t.manifestSaveChain;}function Te(e){if(!e)return null;let t=e.trim();return t||null}function Gs(e,t){let r=new Set,s=new Set([...Object.keys(e),...Object.keys(t)]);for(let n of s){let i=e[n],o=t[n];!i||!o||i===o||r.add(n);}return r}async function Pr(e,t,r,s){let n=[...new Set(r.map(u=>u.trim()).filter(Boolean))],i=String(e.wpsuite?.runtimeToken||"").trim();if(n.length===0||!i)return new Map;let o=new URL("/wp-json/smartcloud-static-publisher/v1/change-tokens",e.sourceOrigin).toString();try{let u=await t.post(o,{timeout:3e4,failOnStatusCode:!1,headers:{"content-type":"application/json","x-static-publisher-token":i},data:JSON.stringify({urls:n})});if(!u.ok())return s.warn(`Change token lookup failed with HTTP ${u.status()}`,{endpoint:o,status:u.status()}),new Map;let a=await u.json().catch(()=>null);if(!a||!Array.isArray(a.items))return new Map;let l=new Map;for(let d of a.items)!d||typeof d.url!="string"||l.set(d.url,d);return l}catch(u){return s.warn("Change token lookup failed; falling back to sitemap metadata",{endpoint:o,error:u instanceof Error?`${u.name}: ${u.message.split(/\r?\n/u,1)[0]}`:"Unknown change-token request failure"}),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 o=(await Pr(e,t,[s],n)).get(s)??null;return St(e,s)&&(!o||o.supported!==true||!o.token)&&(o=await Ys(e,t,s,n)),o=br(e,o),r.changeTokenCache.set(s,o),o}async function Ks(e,t,r,s,n){if(!r.trackManifest)return;let i=[...new Set(s.map(o=>o.trim()).filter(Boolean))].filter(o=>!r.changeTokenCache.has(o));for(let o=0;o<i.length;o+=250){let u=i.slice(o,o+250),a=await Pr(e,t,u,n);for(let l of u)r.changeTokenCache.set(l,br(e,a.get(l)??null));}}function Zs(e){return `subscriber=${e.wpsuite?.siteSettings?.subscriber===true?"1":"0"}`}function br(e,t){if(!t?.supported||!t.token||t.tokenSource==="wp-media-file")return t;let r=Zs(e);return {...t,token:be(`${t.token}
10
- ${r}`,40),tokenSource:t.tokenSource?`${t.tokenSource}+site-subscriber`:"site-subscriber"}}async function Ys(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(()=>""),o=be(`${r}
8
+ ${e.path}`}function yr(e,t){let r;try{r=new URL(t);}catch{return null}let n=e.split(";"),s=n.shift()?.trim()??"",o=s.indexOf("=");if(o<=0)return null;let i=s.slice(0,o).trim();if(!i||[...i].some(R=>R<=" "||"=;,".includes(R)))return null;let c=r.hostname.toLowerCase(),a=cs(r),u=null,d=true,l=false,g=false,y="Unspecified",h=false;for(let R of n){let m=R.indexOf("="),p=(m<0?R:R.slice(0,m)).trim().toLowerCase(),v=m<0?"":R.slice(m+1).trim();if(p==="domain"&&v)c=v.toLowerCase();else if(p==="path"&&v.startsWith("/"))a=v;else if(p==="expires"){let A=Date.parse(v);Number.isFinite(A)&&(u=Math.floor(A/1e3),d=false);}else if(p==="max-age"&&/^-?\d+$/u.test(v)){let A=Number.parseInt(v,10);u=Math.floor(Date.now()/1e3)+A,d=false;}else p==="secure"?l=true:p==="httponly"?g=true:p==="samesite"?y=wr(v):p==="partitioned"&&(h=true);}return {name:i,domain:c,path:a,expires:u,session:d,secure:l,httpOnly:g,sameSite:y,partitioned:h}}function ls(e){let t=!Number.isFinite(e.expires)||e.expires<=0;return {name:e.name,domain:e.domain.toLowerCase(),path:e.path||"/",expires:t?null:e.expires,session:t,secure:e.secure,httpOnly:e.httpOnly,sameSite:wr(e.sameSite),partitioned:e.partitioned===true}}function br(e,t){let r=new Map(e.map(n=>[$e(n),n.value]));return t.filter(n=>r.get($e(n))!==n.value).map(ls)}function ds(e,t){let r=e.session||t.session;return {...e,expires:r?null:Math.max(e.expires??0,t.expires??0)||null,session:r,secure:e.secure&&t.secure,httpOnly:e.httpOnly&&t.httpOnly,sameSite:e.sameSite===t.sameSite?e.sameSite:"Unspecified",partitioned:e.partitioned&&t.partitioned}}var He=class{#e=new Map;add(t){if(!t)return;let r={...t,domain:t.domain.toLowerCase(),path:t.path||"/"},n=$e(r),s=this.#e.get(n);this.#e.set(n,s?ds(s,r):r);}addAll(t){for(let r of t)this.add(r);}artifact(){return {schemaVersion:1,observations:[...this.#e.values()].sort((t,r)=>$e(t).localeCompare($e(r)))}}};async function Je(e,t){await T.mkdir(w.dirname(e),{recursive:true});let r=`${e}.${process.pid}.tmp`;await T.writeFile(r,`${JSON.stringify(t,null,2)}
9
+ `,{encoding:"utf8",mode:384}),await T.rename(r,e);}function Me(e){let t=e;for(let n=0;n<3;n+=1){if(/%(?:2f|5c)/i.test(t))return null;try{let s=decodeURIComponent(t);if(s===t)break;t=s;}catch{return null}}return t.includes("\0")||t.includes("\\")||t.split("/").some(n=>n==="."||n==="..")?null:t}function Ue(e,t){let r=Me(t);if(r===null)throw new Error(`Unsafe output URL pathname: ${t}`);let n=w.resolve(e),s=w.resolve(n,r.replace(/^\/+/,""));if(s!==n&&!s.startsWith(`${n}${w.sep}`))throw new Error(`Output path escapes configured root: ${t}`);return s}var H=1,Sr=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;function xe(e,t){let r=String(e??"").trim();if(!Sr.test(r))throw new Error(`${t} must match ${Sr.source} and be at most 128 characters.`);return r}function Pr(e){let t=String(e??"").trim().replace(/^\/+|\/+$/g,"");if(!t)return "";let r=t.split("/").filter(Boolean);if(r.some(n=>n==="."||n===".."))throw new Error("S3 prefix contains an unsafe dot path segment.");return `${r.join("/")}/`}function Rr(e,...t){let r=Pr(e),n=t.map((s,o)=>{let i=String(s??"").replace(/^\/+|\/+$/g,"");if(!i||i.split("/").some(c=>c==="."||c===".."))throw new Error(`Unsafe S3 key segment at index ${o}.`);return i});return `${r}${n.join("/")}`}function he(e){return createHash("sha256").update(e).digest("hex")}function Ke(e,t){let r=String(e??"").replace(/^\/+/,""),n=Pr(t);if(!r||r.includes("\0"))throw new Error("S3 object key is empty or invalid.");if(n&&!r.startsWith(n))throw new Error(`S3 object key is outside the configured workspace prefix: ${r}`);if(r.split("/").some(s=>s===".."))throw new Error("S3 object key contains an unsafe parent segment.");return r}function J(e,t,{optional:r=false}={}){if(!(r&&(e==null||e===""))){if(typeof e!="string"||!e.trim())throw new Error(`${t} must be a non-empty string.`);return e.trim()}}function bs(e){if(!e||typeof e!="object")throw new Error("Remote worker config must be a JSON object.");let t=e;if(t.schemaVersion!==1)throw new Error(`Unsupported remote worker config version: ${String(t.schemaVersion)}.`);if(t.protocolVersion!==H)throw new Error(`Remote worker protocol mismatch: expected ${H}, received ${String(t.protocolVersion)}.`);let r=t.workspace,n=t.functions;if(!r||!n)throw new Error("Remote worker config requires workspace and functions objects.");return {schemaVersion:1,region:J(t.region,"region"),...J(t.roleArn,"roleArn",{optional:true})?{roleArn:J(t.roleArn,"roleArn")}:{},...J(t.roleSessionName,"roleSessionName",{optional:true})?{roleSessionName:J(t.roleSessionName,"roleSessionName")}:{},workspace:{bucket:J(r.bucket,"workspace.bucket"),prefix:String(r.prefix??"")},functions:{render:J(n.render,"functions.render"),rewrite:J(n.rewrite,"functions.rewrite"),"deploy-copy":J(n["deploy-copy"],"functions.deploy-copy")},targets:Array.isArray(t.targets)?t.targets.map((s,o)=>{if(!s||typeof s!="object")throw new Error(`targets[${o}] must be an object.`);let i=s;return {id:J(i.id,`targets[${o}].id`),bucketName:J(i.bucketName,`targets[${o}].bucketName`),prefix:String(i.prefix??""),region:J(i.region,`targets[${o}].region`)}}):[],protocolVersion:H}}async function Cr(e){let t=w.resolve(e);try{return bs(JSON.parse(await readFile(t,"utf8")))}catch(r){throw new Error(`Unable to load remote worker config ${t}: ${r instanceof Error?r.message:String(r)}`,{cause:r})}}var Ge=class{config;lambda;s3;constructor(t,r={}){this.config=t;let n=t.roleArn?fromTemporaryCredentials({params:{RoleArn:t.roleArn,RoleSessionName:t.roleSessionName??"publisher-exporter-remote-worker"},clientConfig:{region:t.region}}):void 0;this.lambda=new LambdaClient({region:t.region,...n?{credentials:n}:{},...r}),this.s3=new S3Client({region:t.region,...n?{credentials:n}:{}});}async invoke(t){let r=t.operation==="health"?this.config.functions.render:this.config.functions[t.operation],n=await this.lambda.send(new InvokeCommand({FunctionName:r,InvocationType:"RequestResponse",Payload:Buffer.from(JSON.stringify(t),"utf8")})),s=n.Payload?JSON.parse(new TextDecoder().decode(n.Payload)):null;if(n.FunctionError)throw new Error(`Remote ${t.operation} worker failed (${n.FunctionError}): ${JSON.stringify(s)}`);if(!s||typeof s!="object")throw new Error(`Remote ${t.operation} worker returned no JSON response.`);let o=s;if(o.schemaVersion!==H||o.operation!==t.operation||o.jobId!==t.jobId||o.taskId!==t.taskId)throw new Error(`Remote ${t.operation} worker returned a mismatched response.`);return o}async readResult(t){if(!t.resultKey)throw new Error(`Remote ${t.operation} response does not contain a resultKey.`);let r=Ke(t.resultKey,this.config.workspace.prefix),n=await this.s3.send(new GetObjectCommand({Bucket:this.config.workspace.bucket,Key:r}));if(!n.Body)throw new Error(`Remote worker result has no body: ${r}`);return JSON.parse(await n.Body.transformToString("utf8"))}async readObject(t){if(t.bucket!==this.config.workspace.bucket)throw new Error(`Remote worker object bucket mismatch: ${t.bucket}.`);let r=Ke(t.key,this.config.workspace.prefix),n=await this.s3.send(new GetObjectCommand({Bucket:this.config.workspace.bucket,Key:r,...t.versionId?{VersionId:t.versionId}:{}}));if(!n.Body)throw new Error(`Remote worker object has no body: ${r}`);let s=await n.Body.transformToByteArray();if(s.byteLength!==t.bytes)throw new Error(`Remote worker object length mismatch for ${r}: expected ${t.bytes}, received ${s.byteLength}.`);if(he(s)!==t.sha256)throw new Error(`Remote worker object checksum mismatch for ${r}.`);return s}async readObjectText(t){return new TextDecoder("utf8",{fatal:true}).decode(await this.readObject(t))}async health(t){let r=this.config.functions[t],n=`${t}-${Date.now()}`,s=await this.lambda.send(new InvokeCommand({FunctionName:r,InvocationType:"RequestResponse",Payload:Buffer.from(JSON.stringify({schemaVersion:H,operation:"health",jobId:"health",taskId:n}),"utf8")})),o=s.Payload?JSON.parse(new TextDecoder().decode(s.Payload)):null;if(s.FunctionError||!o||typeof o!="object")throw new Error(`Remote ${t} health check failed: ${JSON.stringify(o)}`);return o}async writeWorkspaceObject(t){let r=Ke(t.key,this.config.workspace.prefix),n=typeof t.body=="string"?Buffer.from(t.body,"utf8"):t.body,s=he(n),o=await this.s3.send(new PutObjectCommand({Bucket:this.config.workspace.bucket,Key:r,Body:n,ContentType:t.contentType,...t.cacheControl?{CacheControl:t.cacheControl}:{},Metadata:{sha256:s,...t.metadata??{}}}));return {bucket:this.config.workspace.bucket,key:r,sha256:s,bytes:n.byteLength,contentType:t.contentType,...o.ETag?{etag:o.ETag}:{},...o.VersionId?{versionId:o.VersionId}:{}}}};function Ss(e,t,r){if(!e||typeof e!="object")throw new Error("Remote render result must be a JSON object.");let n=e;if(n.schemaVersion!==H||!n.response||n.response.operation!=="render"||n.response.jobId!==t.jobId||n.response.taskId!==t.taskId||!n.detail||!Array.isArray(n.detail.pages)||n.detail.pages.length!==1)throw new Error("Remote render result has an invalid envelope.");let s=n.detail.pages[0];if(!s||s.requestedUrl!==r)throw new Error("Remote render result does not match the requested URL.");return n}var Ze=class{#e;#r;#t;#n;#s=0;constructor(t){this.#e=t.client,this.#r=xe(t.jobId,"jobId"),this.#t=Math.max(1,Math.min(5,t.maxAttempts??2)),this.#n=t.onRetry;}async render(t){let r=null;for(let n=1;n<=this.#t;n+=1){this.#s+=1;let s=xe(`render-${this.#s}-${he(t.url).slice(0,24)}-a${n}`,"taskId");try{let o=await this.#e.invoke({schemaVersion:H,operation:"render",jobId:this.#r,taskId:s,sourceOrigin:new URL(t.sourceOrigin).origin,urls:[t.url],options:t.options}),c=Ss(await this.#e.readResult(o),o,t.url).detail.pages[0];if(c.outcome==="failed"||c.outcome==="deferred")throw new Error(c.error||`Remote render ended with ${c.outcome}.`);if(!c.html)throw new Error("Remote render completed without an HTML object.");return {page:c,html:await this.#e.readObjectText(c.html),taskId:s,attempts:n}}catch(o){r=o,n<this.#t&&this.#n?.({url:t.url,attempt:n,maxAttempts:this.#t,reason:o instanceof Error?o.message:String(o)});}}throw new Error(`Remote render failed after ${this.#t} attempt(s) for ${t.url}: ${r instanceof Error?r.message:String(r)}`,{cause:r})}};function vs(e,t){let r=[];for(let n=0;n<e.length;n+=t)r.push(e.slice(n,n+t));return r}function ks(e){return {sourceOrigin:e.sourceOrigin,targetOrigin:e.targetOrigin,urlRewriteMode:e.urlRewriteMode,outputDir:"/workspace",extraReplacements:e.extraReplacements,wpsuite:{...e.wpsuite?.subscriptionType?{subscriptionType:e.wpsuite.subscriptionType}:{},...e.wpsuite?.siteSettings?{siteSettings:{subscriber:e.wpsuite.siteSettings.subscriber===true}}:{}}}}function Cs(e,t){if(!e||typeof e!="object")throw new Error("Remote rewrite result must be a JSON object.");let r=e;if(r.schemaVersion!==H||r.response?.operation!=="rewrite"||r.response.jobId!==t.jobId||r.response.taskId!==t.taskId||!r.detail||!Array.isArray(r.detail.objects))throw new Error("Remote rewrite result has an invalid envelope.");return r}async function xr(e,t,r){let n=r.options??{},s=await yt(e,n.files);if(s.length===0)return 0;let o=xe(r.jobId,"jobId"),i=Rr(r.client.config.workspace.prefix,"jobs",o,"rewrite-inputs"),c=`${i}/config.json`.replace(/\/+/g,"/"),a=`${i}/asset-map.json`.replace(/\/+/g,"/"),u=`${i}/previous-asset-map.json`.replace(/\/+/g,"/");await Promise.all([r.client.writeWorkspaceObject({key:c,body:JSON.stringify(ks(e)),contentType:"application/json; charset=utf-8"}),r.client.writeWorkspaceObject({key:a,body:JSON.stringify(t),contentType:"application/json; charset=utf-8"}),r.client.writeWorkspaceObject({key:u,body:JSON.stringify(n.previousAssetMap??{}),contentType:"application/json; charset=utf-8"})]);let d=Math.max(1,Math.min(500,r.batchSize)),l=Math.ceil(s.length/d),g=Math.max(1,Math.min(Math.max(1,r.concurrency),l));await n.onStart?.({totalFiles:s.length,workerCount:g});let y=[],h=0,R=0;await Promise.all(Array.from({length:Math.min(16,s.length)},async()=>{for(;;){let O=h;if(O>=s.length)return;h+=1;let I=s[O],P=w.join(e.outputDir,I),f=`${i}/files/${he(I)}.txt`.replace(/\/+/g,"/");await r.client.writeWorkspaceObject({key:f,body:await T.readFile(P),contentType:"text/plain; charset=utf-8"}),y[O]={relativePath:I,key:f,fullPath:P},R+=1,await r.onStageProgress?.({index:R,totalFiles:s.length,file:I});}}));let m=vs(y,d),p=0,v=0,A=0,x=Array.from({length:g},async()=>{for(;;){let O=p;if(O>=m.length)return;p+=1;let I=m[O],P=null,f=null;for(let S=1;S<=Math.max(1,Math.min(5,r.maxAttempts));S+=1){let k=xe(`rewrite-${O+1}-a${S}-${he(I.map(M=>M.relativePath).join(`
10
+ `)).slice(0,16)}`,"taskId"),F={schemaVersion:H,operation:"rewrite",jobId:o,taskId:k,configKey:c,assetMapKey:a,previousAssetMapKey:u,items:I.map(M=>({inputKey:M.key,outputKey:M.key,relativePath:M.relativePath}))};try{let M=await r.client.invoke(F);f=Cs(await r.client.readResult(M),M);break}catch(M){P=M;}}if(!f)throw new Error(`Remote rewrite batch ${O+1}/${m.length} failed: ${P instanceof Error?P.message:String(P)}`,{cause:P});for(let S of I){let k=f.detail.objects.find(F=>F.outputKey===S.key);if(!k)throw new Error(`Remote rewrite result omitted ${S.relativePath}.`);await ye(S.fullPath,Buffer.from(await r.client.readObject(k.output))),k.changed&&(A+=1),v+=1,await n.onProgress?.({index:v,totalFiles:s.length,changedTextFiles:A,file:S.relativePath,changed:k.changed});}}});return await Promise.all(x),A}var xs="remote-workers.json";function Ar(e={}){let t=String(e.explicitPath??"").trim();if(t)return w.resolve(t);let r=String(e.runtimeDir??process.env.STATIC_PUBLISHER_RUNTIME_DIR??process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR??"").trim();return r?w.join(w.resolve(r),xs):""}function Tr(e,t,r,n=250){let s=Math.max(1,Math.floor(n)),o=[],i=new Set;for(let c of [e,...t]){let a=c.trim();if(!(!a||i.has(a)||r(a))&&(i.add(a),o.push(a),o.length>=s))break}return o}var Es=["text/css","javascript","image/","font/","application/font","application/json","application/xml","text/xml","application/rss+xml","application/atom+xml","application/xslt+xml","text/xsl","image/svg+xml"],Wr=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"]),qr=new Set(["",".html",".htm"]),Os=new Set([".css",".xml",".xsl",".svg",".json",".html",".htm",".txt",".enc",".jws"]),$s=["/wp-content/","/wp-includes/","/wp-admin/","/static/","/assets/","/build/","/_next/"];function Ms(e){let t=[],r="full",n="full",s=false,o=false,i="",c=null,a="";for(let u=0;u<e.length;u++){let d=e[u];if(d==="--retry-timeouts")r="retry-timeouts",s=true;else if(d==="--resume")s=true;else if(d==="--resume-rewrite")s=true,o=true;else if(d==="--crawl-mode"){let l=e[++u];if(!l)throw new Error("--crawl-mode requires a value");n=l==="incremental"?"incremental":"full",s||=n==="incremental";}else if(d.startsWith("--crawl-mode="))n=d.slice(13)==="incremental"?"incremental":"full",s||=n==="incremental";else if(d==="--incremental")n="incremental",s=true;else if(d==="--url"){let l=e[++u];if(!l)throw new Error("--url requires a value");r="single-url",s=true,t.push(l);}else if(d.startsWith("--url="))r="single-url",s=true,t.push(d.slice(6));else if(d==="--urls"){let l=e[++u];if(!l)throw new Error("--urls requires a file path");r="single-url",s=true,t.push(`@${l}`);}else if(d==="--content-sync-plan"){let l=e[++u];if(!l)throw new Error("--content-sync-plan requires a file path");r="content-sync",n="incremental",s=true,i=w.resolve(l);}else if(d.startsWith("--content-sync-plan="))r="content-sync",n="incremental",s=true,i=w.resolve(d.slice(20));else if(d==="--remote-render")c=true;else if(d==="--local-render")c=false;else if(d==="--remote-worker-config"){let l=e[++u];if(!l)throw new Error("--remote-worker-config requires a file path");a=w.resolve(l);}else d.startsWith("--remote-worker-config=")&&(a=w.resolve(d.slice(23)));}return {mode:r,crawlMode:n,urls:t,preserveOutput:s,resumeRewrite:o,contentSyncPlanPath:i,remoteRender:c,remoteWorkerConfigPath:a}}function qe(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?w.resolve(e):""}function Us(){let e=qe();return e?w.join(e,"privacy","cookie-observations.json"):null}function Ls(){let e=qe();return e?w.resolve(e,".."):""}function js(){let e=process.env.STATIC_PUBLISHER_WP_ROOT||process.env.WPSUITE_STATIC_PUBLISHER_WP_ROOT||"";return e.trim()?w.resolve(e):""}function Ds(e){let t=e.trim(),r=[{alias:"@storage-root",root:Ls(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@runtime",root:qe(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@wp-root",root:js(),requiredEnv:"STATIC_PUBLISHER_WP_ROOT or WPSUITE_STATIC_PUBLISHER_WP_ROOT"}];for(let n of r){if(t!==n.alias&&!t.startsWith(`${n.alias}/`))continue;if(!n.root)return {resolvedPath:null,alias:n.alias,requiredEnv:n.requiredEnv};let s=t.slice(n.alias.length).replace(/^\/+/,"");return {resolvedPath:s?w.resolve(n.root,s):n.root,alias:n.alias}}return {resolvedPath:w.resolve(t)}}function Nr(e){let t=String(process.env.STATIC_PUBLISHER_CRAWL_MANIFEST_PATH||"").trim();if(t)return w.resolve(t);let r=qe();return r?w.join(r,"crawl-manifest.json"):w.join(e.outputDir,".crawl-manifest.json")}function _r(){return {schemaVersion:6,updatedAt:"",pages:{},assets:{}}}function Er(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 Fs(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,cacheControl:typeof e.cacheControl=="string"&&e.cacheControl?e.cacheControl:null,changeToken:typeof e.changeToken=="string"?e.changeToken:null,tokenSource:typeof e.tokenSource=="string"?e.tokenSource:null,discoveredAssets:Array.isArray(e.discoveredAssets)?e.discoveredAssets.map(r=>String(r)):[],lastCrawledAt:String(e.lastCrawledAt||""),lastSeenRunId:String(e.lastSeenRunId||""),unreferencedRuns:Math.max(0,Number(e.unreferencedRuns)||0),rewriteComplete:e.rewriteComplete===true||!t}}function xt(e){let t=e?.["content-type"]?.trim();return t||null}function At(e){let t=e?.["cache-control"]?.trim();return t||null}function Ws(e){return e?e.split(",").map(t=>t.trim().toLowerCase()).some(t=>t==="no-cache"||t==="no-store"||/^max-age\s*=\s*0$/.test(t)):false}function qs(){return {rewriteTargets:new Set,changedFiles:new Set,deletedFiles:new Set,revalidateFiles:new Set}}function Ye(e,t,r,n){let s=Z(t.outputDir,r);s&&(Ws(n)?e.revalidateFiles.add(s):e.revalidateFiles.delete(s));}function z(e,t,r){let n=Z(t.outputDir,r);n&&(e.changedFiles.add(n),e.deletedFiles.delete(n));}function Tt(e,t,r){let n=Z(t.outputDir,r);n&&(e.deletedFiles.add(n),e.changedFiles.delete(n),e.revalidateFiles.delete(n));}function ae(e,t){e.rewriteTargets.add(w.resolve(t));}async function Ns(e){try{let t=await T.readFile(Nr(e),"utf8"),r=JSON.parse(t);if(r&&typeof r=="object"&&r.pages&&typeof r.pages=="object"){if((r.schemaVersion===2||r.schemaVersion===3||r.schemaVersion===4||r.schemaVersion===5||r.schemaVersion===6)&&r.assets&&typeof r.assets=="object")return {schemaVersion:6,updatedAt:String(r.updatedAt||""),pages:Object.fromEntries(Object.entries(r.pages).map(([n,s])=>[n,Er(s)])),assets:Object.fromEntries(Object.entries(r.assets).map(([n,s])=>[n,Fs(s)]))};if(r.schemaVersion===1)return {schemaVersion:6,updatedAt:String(r.updatedAt||""),pages:Object.fromEntries(Object.entries(r.pages).map(([n,s])=>[n,Er(s)])),assets:{}}}}catch{}return _r()}function It(e){return JSON.parse(JSON.stringify(e))}async function _s(e,t){let r=Nr(e);await T.mkdir(w.dirname(r),{recursive:true}),await T.writeFile(r,JSON.stringify(t,null,2),"utf8");}async function ue(e,t){if(!t.trackManifest)return;let r=async()=>{let n=It(t.manifest);n.updatedAt=new Date().toISOString(),t.manifest.updatedAt=n.updatedAt,await _s(e,n);};t.manifestSaveChain=t.manifestSaveChain.then(r,r),await t.manifestSaveChain;}function be(e){if(!e)return null;let t=e.trim();return t||null}function Bs(e,t){let r=new Set,n=new Set([...Object.keys(e),...Object.keys(t)]);for(let s of n){let o=e[s],i=t[s];!o||!i||o===i||r.add(s);}return r}async function Br(e,t,r,n){let s=[...new Set(r.map(c=>c.trim()).filter(Boolean))],o=String(e.wpsuite?.runtimeToken||"").trim();if(s.length===0||!o)return new Map;let i=new URL("/wp-json/smartcloud-static-publisher/v1/change-tokens",e.sourceOrigin).toString();try{let c=await t.post(i,{timeout:3e4,failOnStatusCode:!1,headers:{"content-type":"application/json","x-static-publisher-token":o},data:JSON.stringify({urls:s})});if(!c.ok())return n.warn(`Change token lookup failed with HTTP ${c.status()}`,{endpoint:i,status:c.status()}),new Map;let a=await c.json().catch(()=>null);if(!a||!Array.isArray(a.items))return new Map;let u=new Map;for(let d of a.items)!d||typeof d.url!="string"||u.set(d.url,d);return u}catch(c){return n.warn("Change token lookup failed; falling back to sitemap metadata",{endpoint:i,error:c instanceof Error?`${c.name}: ${c.message.split(/\r?\n/u,1)[0]}`:"Unknown change-token request failure"}),new Map}}async function et(e,t,r,n,s){if(!r.enabled&&!r.trackManifest)return null;if(r.changeTokenCache.has(n))return r.changeTokenCache.get(n)??null;let i=(await Br(e,t,[n],s)).get(n)??null;return st(e,n)&&(!i||i.supported!==true||!i.token)&&(i=await Qs(e,t,n,s)),i=zr(e,i),r.changeTokenCache.set(n,i),i}async function Vr(e,t,r,n,s){if(!r.trackManifest)return;let o=[...new Set(n.map(i=>i.trim()).filter(Boolean))].filter(i=>!r.changeTokenCache.has(i));for(let i=0;i<o.length;i+=250){let c=o.slice(i,i+250),a=await Br(e,t,c,s);for(let u of c)r.changeTokenCache.set(u,zr(e,a.get(u)??null));}}async function Vs(e,t,r,n,s,o){if(!(!n.trackManifest||n.changeTokenCache.has(s)))for(;!n.changeTokenCache.has(s);){if(!n.pageChangeTokenPrimePromise){let i=Tr(s,r.pageQueue,a=>n.changeTokenCache.has(a));if(i.length===0)return;o.info(`Loading ${i.length} page change tokens in bulk.`,{phase:"prime-page-change-tokens",batchSize:i.length,remainingPages:r.pageQueue.length});let c=Vr(e,t,n,i,o).finally(()=>{n.pageChangeTokenPrimePromise===c&&(n.pageChangeTokenPrimePromise=null);});n.pageChangeTokenPrimePromise=c;}await n.pageChangeTokenPrimePromise;}}function zs(e){return `subscriber=${e.wpsuite?.siteSettings?.subscriber===true?"1":"0"}`}function zr(e,t){if(!t?.supported||!t.token||t.tokenSource==="wp-media-file")return t;let r=zs(e);return {...t,token:we(`${t.token}
11
+ ${r}`,40),tokenSource:t.tokenSource?`${t.tokenSource}+site-subscriber`:"site-subscriber"}}async function Qs(e,t,r,n){try{let s=await t.get(r,{timeout:Math.min(e.navigationTimeoutMs,15e3),failOnStatusCode:!1});if(s.status()!==404)return n.warn(`Generated 404 fallback token skipped for ${r}`,{url:r,status:s.status(),requestPath:e.generated404RequestPath,source:"generated-404-change-token-fallback"}),null;let o=await s.text().catch(()=>""),i=we(`${r}
11
12
  404
12
- ${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:o,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 Xs(e,t,r,s,n,i){let o=St(e,n);if(!s.enabled)return {action:"render",changeToken:s.trackManifest?await We(e,t,s,n,i):null};let u=s.manifest.pages[n];if(!u)return {action:"render",changeToken:await We(e,t,s,n,i)};let a=await We(e,t,s,n,i);if(a?.supported&&a.token)return u.changeToken===a.token?o&&!await en(e,t,n,i)?{action:"render",changeToken:a}:{action:"reuse",changeToken:a}:{action:"render",changeToken:a};let l=Te(r.sitemapLastmodByPage[n]);return l&&u.sitemapLastmod&&u.sitemapLastmod===l?{action:"reuse",changeToken:a}:{action:"render",changeToken:a}}async function en(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 tn(e,t,r,s,n){let i=or(r.previousManifest,void 0,s,"previous-manifest"),o=0;for(let[p,w]of Object.entries(r.manifest.pages))if(!r.seenPages.has(p)){pt(n,e,w.outputPath);try{await A.unlink(w.outputPath);}catch(m){(m.code||"")!=="ENOENT"&&s.warn(`Failed to remove stale incremental page output for ${p}`,{url:p,outputPath:w.outputPath,error:String(m)});}delete r.manifest.pages[p],o++;}let u=or(r.manifest,r.runId,s,"active-manifest"),a=new Set,l=new Set;for(let p of u){for(let b of Ie(e,p))a.add(b);let w=r.manifest.assets[p]?.outputPath;w&&l.add(w);let m=he(e,t.assetMap,p);m&&l.add(m);}for(let p of Object.keys(r.manifest.assets)){if(u.has(p)){r.manifest.assets[p].unreferencedRuns=0;continue}let w=r.manifest.assets[p];if(er(w.unreferencedRuns)){w.unreferencedRuns+=1,s.warn(`Deferred deletion of newly unreferenced incremental asset ${p}.`,{url:p,unreferencedRuns:w.unreferencedRuns,phase:"incremental-cleanup",source:"asset-deletion-grace"});continue}delete r.manifest.assets[p];}let d=0,c=0;for(let p of i){if(r.manifest.assets[p])continue;let w=new Set,m=r.previousManifest.assets[p]?.outputPath;m&&w.add(m);let b=he(e,t.assetMap,p);if(!u.has(p)&&b)w.add(b);else if(!u.has(p)){let g=Pn(e,p,s,"incremental-cleanup");g&&(w.add(g.originalFilePath),g.hashedFilePath&&w.add(g.hashedFilePath));}for(let g of w)if(!l.has(g)){pt(n,e,g);try{await A.unlink(g),d++;}catch(f){(f.code||"")!=="ENOENT"&&s.warn(`Failed to remove stale incremental asset output for ${p}`,{url:p,outputPath:g,error:String(f)});}}for(let g of Ie(e,p))a.has(g)||Object.prototype.hasOwnProperty.call(t.assetMap,g)&&(delete t.assetMap[g],c++);}(o>0||d>0||c>0)&&s.info(`Incremental cleanup removed ${o} stale pages, ${d} stale assets, ${c} stale asset mappings`,{removedPages:o,removedAssets:d,removedAssetMappings:c,phase:"incremental-cleanup"});}async function rn(e,t,r,s){let n=new Set([...Object.values(t.manifest.pages),...Object.values(t.manifest.assets)].map(a=>String(a.outputPath||"").trim()).filter(Boolean).map(a=>y.resolve(a))),i=Object.values(e.postCrawlCopyMap||{}).map(a=>_e(String(a||""))).filter(a=>!!a).map(a=>y.resolve(e.outputDir,a)),u=(await ns(["**/*.html","**/*.htm"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(a=>Zt(y.join(e.outputDir,a),e.outputDir,n,i));for(let a of u){let l=y.join(e.outputDir,a);pt(s,e,l),await A.unlink(l);}u.length>0&&r.info(`Removed ${u.length} orphaned HTML output file(s) that are absent from the current crawl manifest.`,{phase:"incremental-cleanup",source:"manifest-output-reconciliation",removedPages:u.length,samples:u.slice(0,20)});}function or(e,t,r,s){let n=new Set,i=o=>{let u=o.trim();if(u){if(r){let a=oe(u,r,"asset",s??"manifest");if(!a)return;n.add(a.toString());return}n.add(u);}};for(let o of Object.values(e.pages))for(let u of o.discoveredAssets||[])i(u);for(let[o,u]of Object.entries(e.assets||{}))t&&u.lastSeenRunId!==t||i(o);return n}function ar(e,t,r){for(let s of t)for(let n of Ie(e,s))if(r.has(n))return true;return false}function sn(e,t,r,s,n){let i=new Set(r.rewriteTargets);for(let u of r.changedFiles)i.add(y.resolve(e.outputDir,u));for(let u of Object.values(t.manifest.pages))u.rewriteComplete||i.add(y.resolve(u.outputPath));for(let u of Object.values(t.manifest.assets))u.isText&&!u.rewriteComplete&&i.add(y.resolve(u.outputPath));let o=Gs(s,n);if(o.size===0)return [...i];for(let u of Object.values(t.manifest.pages))ar(e,u.discoveredAssets,o)&&i.add(y.resolve(u.outputPath));for(let[u,a]of Object.entries(t.manifest.assets)){a.isText&&ar(e,a.discoveredAssets,o)&&i.add(y.resolve(a.outputPath));for(let l of Ie(e,u))if(o.has(l)){Q(r,e,a.outputPath),a.isText&&i.add(y.resolve(a.outputPath));break}}return [...i]}function nn(e,t){let r=t?new Set(Array.from(t,n=>y.resolve(n))):null,s=n=>r===null||r.has(y.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 on(e,t,r){let s=new Set,n=i=>{if(!i)return;let o=z(e.outputDir,i);o&&s.add(o);};for(let i of t.donePages)n(ee(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(he(e,t.assetMap,i));for(let i of Object.values(r.manifest.assets))i.lastSeenRunId===r.runId&&n(i.outputPath);return s}async function an(e,t,r,s,n){let i=[...s.deletedFiles].sort(),o=on(e,t,r),u=0;for(let d of [...o].sort()){try{if((await A.stat(y.join(e.outputDir,d))).isFile())continue}catch{}u++,n.warn(`Active output is missing after crawl: ${d}`,{phase:"deploy-plan",file:d,outputPath:y.join(e.outputDir,d)});}if(u>0&&n.warn(`Detected ${u} active output file(s) missing before deploy plan save.`,{phase:"deploy-plan",missingActiveOutputs:u}),i.length===0)return [];let a=[],l=0;for(let d of i){if(!o.has(d)){a.push(d);continue}l++;let c=y.join(e.outputDir,d),p;try{p=(await A.stat(c)).isFile();}catch{p=false;}n.warn(`Deploy plan protected active output from deletion: ${d}`,{phase:"deploy-plan",file:d,outputPath:c,exists:p});}return l>0&&n.info(`Deploy plan skipped ${l} active output deletion(s).`,{phase:"deploy-plan",protectedDeletes:l,deletedFiles:a.length}),a}function Ie(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 o of i)try{r.add(new URL(o).origin+s.pathname+s.search);}catch{}r.add(s.pathname+s.search),r.add(s.pathname);}catch{}return [...r]}function un(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 o of i)try{r.add(new URL(o).origin+s.pathname+s.search);}catch{}r.add(s.pathname+s.search);}catch{}return [...r]}function vr(e,t){let r=e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/"?e.targetOrigin:"https://relative.invalid/";try{let s=new URL(t,r);return Ae(e.outputDir,s.pathname)}catch{return null}}function ln(e,t,r){for(let s of un(e,r)){let n=t[s];if(!n)continue;let i=vr(e,n);if(i)return {outputPath:i,publicUrl:n}}return null}function cn(e,t,r){for(let s of Ie(e,r)){let n=t[s];if(!n)continue;let i=vr(e,n);if(i)return i}return null}function he(e,t,r){let s=cn(e,t,r);if(s)return s;try{return Je(e,r).originalFilePath}catch{return null}}function dn(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?y.join(y.resolve(e),"queue-runner-heartbeat.json"):""}async function ur(e){let t=dn();if(t)try{let r=await A.readFile(t,"utf8"),s=JSON.parse(r);if(!s||typeof s!="object")return;await A.writeFile(t,JSON.stringify({...s,checkedAt:new Date().toISOString(),status:"running",currentStep:"rewrite",message:e},null,2),"utf8");}catch{}}function pn(e,t){let r=new Set;for(let s of t.donePages)r.add(y.resolve(ee(e,s)));for(let s of t.doneAssets){let n=he(e,t.assetMap,s);!n||!se(n)||r.add(y.resolve(n));}for(let s of t.doneSitemaps){let n=he(e,t.assetMap,s);!n||!se(n)||r.add(y.resolve(n));}return [...r]}var Qe="re:",Be=new Map;function gn(e){if(!e.startsWith(Qe))return null;let t=Be.get(e);if(t!==void 0)return t||null;let r=e.slice(Qe.length).trim();if(!r)return Be.set(e,false),null;try{let s=new RegExp(r);return Be.set(e,s),s}catch{return console.warn(`[crawl] Ignoring invalid path matcher regex: ${e}`),Be.set(e,false),null}}function yt(e,t){let r=gn(t);return r?r.test(e):t.startsWith(Qe)?false:e.startsWith(t)}function fn(e,t){return t.find(r=>yt(e,r))}function Cr(e,t){let r=fn(t.pathname,e.blockedPathPrefixes);if(r)return r.startsWith(Qe)?`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 hn(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 mn(e,t){return hn(e).has(t.hostname)}function wn(e){let t=Z(e.trim()).replace(/\\\//g,"/").replace(/^['"]|['"]$/g,"").trim();return t=t.replace(/[)]+$/g,"").trim(),t=t.replace(/;.*$/g,"").trim(),t}function ft(e){let t=Z(e).replace(/\\\//g,"/");return /[{}]|\bwindow\.|\blocation\.|\bincludes\(|\?\?null|\+|%7B|%7D|%22|<|>|\s/.test(t)||/[()[\]'"]/.test(t)}function yn(e){let t=Z(e).replace(/\\\//g,"/").trim(),r=y.extname(t).toLowerCase();return mr.has(r)||wr.has(r)?false:/^(?:this|[A-Za-z_$][\w$]*)\.[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/.test(t)}function me(e){return js.some(t=>e.pathname.startsWith(t))}function N(e,t,r=e.sourceOrigin,s,n="url",i=false){let o=wn(t);if(!o||o.startsWith("data:")||o.startsWith("blob:")||o.startsWith("mailto:")||o.startsWith("tel:")||o.startsWith("#"))return s?.ignore(n,t,"empty or unsupported scheme",r),null;if(ft(o))return s?.ignore(n,t,"looks like JavaScript/code fragment",r),null;if(yn(o))return s?.ignore(n,t,"looks like JavaScript property access",r),null;try{let u=new URL(o,r);if(Rr(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(!mn(e,u))return s?.ignore(n,u.toString(),"host not allowed",r),null;let a=Cr(e,u);if(a&&!(i&&Ze(u)))return s?.reject(n,u.toString(),a,r),null;let l=new URL(e.sourceOrigin);return u.protocol=l.protocol,u.host=l.host,u.hash="",u}catch{return s?.reject(n,t,"invalid URL",r),null}}function Rr(e){try{return decodeURIComponent(e.pathname),decodeURIComponent(e.search),decodeURIComponent(e.hash),!1}catch{return true}}function oe(e,t,r,s){try{let n=new URL(e);return Rr(n)?(t.reject(r,e,"malformed URL encoding",s),null):Re(n.pathname)===null?(t.reject(r,e,"unsafe URL pathname",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 Ar(e){return mr.has(y.extname(e.pathname).toLowerCase())}function ae(e){return me(e)?false:wr.has(y.extname(e.pathname).toLowerCase())}function we(e){let t=e.pathname.toLowerCase();return t.endsWith(".xml")&&(t.includes("sitemap")||t.endsWith("/sitemap.xml"))}function O(e,t){return !!(we(t)||t.pathname==="/robots.txt"||t.pathname==="/llms.txt"||t.pathname.toLowerCase().endsWith(".xsl")||e.assetPathPrefixes.length>0&&e.assetPathPrefixes.some(r=>yt(t.pathname,r))||Ar(t)||!ae(t)&&!me(t))}function ee(e,t){let r=new URL(t),s=Re(r.pathname);if(s===null)throw new Error(`Unsafe page URL pathname: ${r.pathname}`);return s.endsWith("/")?s+="index.html":y.extname(s)||(s+="/index.html"),Ae(e.outputDir,s)}function Sn(e){if(!e.generated404RequestPath)return null;try{let t=new URL(e.generated404RequestPath,e.sourceOrigin);return !t.pathname.endsWith("/")&&y.extname(t.pathname)===""&&(t.pathname+="/"),t.hash="",t.toString()}catch{return null}}function St(e,t){let r=Sn(e);if(!r)return false;try{return new URL(t,e.sourceOrigin).toString()===r}catch{return false}}function Je(e,t){let r=new URL(t),s=Re(r.pathname);if(s===null)throw new Error(`Unsafe asset URL pathname: ${r.pathname}`);s.endsWith("/")&&(s+="index.html");let n=!!r.search,i=s,o=Ae(e.outputDir,i),u=rt(e.targetOrigin,i),a=`${u}${r.search}`;if(!n)return {originalPathname:i,originalFilePath:o,originalPublicUrl:u,originalPublicUrlWithSearch:a,preferQueryHashed:n};let l=y.extname(s),c=`${l?s.slice(0,-l.length):s}.${be(r.search)}${l||".bin"}`;return {originalPathname:i,originalFilePath:o,originalPublicUrl:u,originalPublicUrlWithSearch:a,preferQueryHashed:n,hashedPathname:c,hashedFilePath:Ae(e.outputDir,c),hashedPublicUrl:rt(e.targetOrigin,c)}}function Pn(e,t,r,s){let n=oe(t,r,"asset",s);return n?Je(e,n.toString()):null}function bn(e,t,r,s,n){t[r]=s;try{let i=new URL(r),u=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{u.push(new URL(e.targetOrigin).origin);}catch{}for(let a of u)try{let l=new URL(a);t[l.origin+i.pathname+i.search]=s;}catch{}try{let a=(()=>{let l=new URL(s,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin);return `${l.pathname}${l.search}`})();t[i.pathname+i.search]=a;}catch{}try{let a=new URL(s,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[i.pathname]=a;}catch{}try{let a=new URL(n,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[i.pathname]=a;}catch{}}catch{}}async function kr(e){try{return await A.readFile(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}async function fe(e){try{return await A.stat(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}function vn(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 xr(e){let t=String(e["last-modified"]||"").trim();if(!t)return null;let r=Date.parse(t);return Number.isFinite(r)?r:null}function Cn(e,t){let r=xr(t),s=vn(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 Rn(e,t){if(!t)return;let r=xr(t);if(r===null)return;let s=await fe(e);if(!s)return;let n=new Date(r);await A.utimes(e,s.atime,n).catch(()=>{});}function lr(e,t){let r=y.extname(e.pathname).toLowerCase(),s=t["content-type"]||"";return Es.has(r)||Fs.some(n=>s.includes(n))&&!s.startsWith("image/")&&!s.includes("font")}function An(e){try{let t=y.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 processing progress: processed ${e.doneAssets.size}, discovered ${e.stats.assetsQueued}.`,{doneAssets:e.doneAssets.size,assetsQueued:e.stats.assetsQueued,phase:"download-assets"});}function kn(e){return be(e.toString("base64"),40)}function xn(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 Tn(e,t,r){let s=e.assetVariantDigestsByOriginalPath.get(t);s||(s=new Set,e.assetVariantDigestsByOriginalPath.set(t,s)),s.add(r);}async function ht(e,t,r,s,n,i,o){let u=Je(e,r),a=kn(s),l=u.originalFilePath,d=u.originalPublicUrlWithSearch;if(u.preferQueryHashed&&u.hashedFilePath&&u.hashedPublicUrl&&xn(n,u.originalFilePath,a)){let m=ln(e,t,r);m?(l=m.outputPath,d=m.publicUrl):(l=u.hashedFilePath,d=u.hashedPublicUrl);}bn(e,t,r,d,u.originalPublicUrl);let c=se(l)?Buffer.from(it(s.toString("utf8"),e,t,l),"utf8"):s,p=await kr(l),w=false;return (p===null||!p.equals(c))&&(await ve(l,c),w=true),i?.debug(`${w?"Saved":"Skipped unchanged"} asset output ${r}`,{phase:"download-assets",url:r,outputPath:l,bytes:c.length,wroteFile:w}),Tn(n,u.originalFilePath,a),await Rn(l,o),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:l,publicUrl:d,wroteFile:w}}function Me(e,t,r,s,n){let i=()=>{let c=String(n??"").trim();if(!c)return {discoveredFrom:"",discoveredFromType:"unknown"};if(c==="seed-path"||c==="cli"||c==="generated-404-request-path")return {discoveredFrom:c,discoveredFromType:c};if(/^https?:\/\//i.test(c))try{let p=new URL(c);return we(p)?{discoveredFrom:c,discoveredFromType:"sitemap"}:O(e,p)?{discoveredFrom:c,discoveredFromType:"asset"}:ae(p)&&!me(p)?{discoveredFrom:c,discoveredFromType:"page"}:{discoveredFrom:c,discoveredFromType:"url"}}catch{return {discoveredFrom:c,discoveredFromType:"url"}}return {discoveredFrom:c,discoveredFromType:"url"}},o=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,u=N(e,r,o,s,"page");if(!u)return;if(!ae(u)||Ar(u)){if(O(e,u)){s.info(`Seeded/non-page URL queued as asset: ${u.toString()}`,{url:u.toString(),source:n}),q(e,t,u.toString(),s,n);return}s.reject("page",u.toString(),me(u)?"asset/internal path cannot be page":"not page-like",n);return}let a=u.toString(),{discoveredFrom:l,discoveredFromType:d}=i();l&&!t.pageDiscoverySources.has(a)&&t.pageDiscoverySources.set(a,l),!t.donePages.has(a)&&!t.queuedPages.has(a)&&(t.queuedPages.add(a),t.pageQueue.push(a),t.stats.pagesQueued++,s.debug(`Queued discovered page ${a}`,{phase:"discovery",url:a,discoveredFrom:l,discoveredFromType:d,outputPath:ee(e,a)}),(t.stats.pagesQueued%25===0||t.stats.pagesQueued===1)&&s.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,pageQueue:t.pageQueue.length,phase:"discovery"}));}function q(e,t,r,s,n){let i=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,o=N(e,r,i,s,"asset");if(!o)return;if(!O(e,o)){s.reject("asset",o.toString(),"not a safe asset path/prefix",n);return}let u=o.toString();!t.doneAssets.has(u)&&!t.queuedAssets.has(u)&&(t.queuedAssets.add(u),t.assetQueue.push(u),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 He(e,t,r,s,n){let i=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,o=N(e,r,i,s,"sitemap",Mt(n));if(!o)return;if(!we(o)){s.reject("sitemap",o.toString(),"not sitemap-like",n);return}let u=o.toString();!t.doneSitemaps.has(u)&&!t.queuedSitemaps.has(u)&&(t.queuedSitemaps.add(u),t.sitemapQueue.push(u),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 In(e){let t=Z(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:Te(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 Mn(e){return e.split(",").map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function $n(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 Un(e){return e.replace(/<script\b[^>]*>[\s\S]*?<\/script\s*>/gi,"")}function Ln(e,t){if(t==="dom-style")return true;let r=(()=>{try{return y.extname(new URL(e).pathname).toLowerCase()}catch{return ""}})();return !(r===".js"||r===".mjs"||r===".map"||t.includes("javascript"))}function _e(e){return e.trim().replace(/\\/g,"/").replace(/^https?:\/\/[^/]+/i,"").replace(/^\/+/,"")}async function Tr(e,t,r,s){let n=[];await A.mkdir(t,{recursive:true});let i=await A.readdir(e,{withFileTypes:true});for(let o of i){let u=y.join(e,o.name),a=y.join(t,o.name);if(o.isDirectory()){n.push(...await Tr(u,a,r,s));continue}await Ir(u,a,r,s)&&n.push(a);}return n}async function On(e,t){try{let[r,s]=await Promise.all([A.stat(e),A.stat(t)]);if(r.size!==s.size)return !1;let[n,i]=await Promise.all([A.readFile(e),A.readFile(t)]);return n.equals(i)}catch{return false}}async function Ir(e,t,r,s){let n=y.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 On(e,t)?(s.debug("Skipped unchanged post-crawl copy target",{phase:"copy-extra-paths",sourcePath:e,targetPath:t}),false):(await A.mkdir(y.dirname(t),{recursive:true}),await A.copyFile(e,t),true)}async function Dn(e,t,r){let s=Object.entries(e.postCrawlCopyMap||{}).map(([u,a])=>({sourcePath:u.trim(),prefix:String(a||"").trim()}));if(s.length===0)return [];let n=0,i=[],o=new Set([...t.donePages].map(u=>y.resolve(ee(e,u))));r.mark("copy-extra-paths");for(let u of s){let a=u.sourcePath,l=u.prefix;if(!a||!l){r.warn("Skipped post-crawl copy mapping with empty key/value",{sourcePath:a,prefixPath:l});continue}let d=_s(a);if(!d.resolvedPath){r.warn("Skipped post-crawl copy source because alias root is not configured",{sourcePath:a,alias:d.alias||"",requiredEnv:d.requiredEnv||"",prefixPath:l});continue}let c=d.resolvedPath,p=_e(l);if(!p){r.warn("Skipped post-crawl copy mapping with invalid export prefix",{sourcePath:a,prefixPath:l});continue}let w;try{w=await A.stat(c);}catch{r.warn("Skipped post-crawl copy source because it does not exist",{sourcePath:a,sourceAbs:c,prefixPath:l});continue}let m=y.resolve(e.outputDir,p);if(w.isDirectory()){let h=await Tr(c,m,o,r);i.push(...h),n+=h.length,h.length>0&&r.progress(`Copied static directory to export: ${c} -> /${p}`,{phase:"copy-extra-paths",sourcePath:c,targetPath:`/${p}`,copiedItems:n,changedFiles:h.length});continue}let b=y.basename(c),g=l.endsWith("/")?y.join(m,b):m;await Ir(c,g,o,r)&&(i.push(g),n++,r.progress(`Copied static file to export: ${c} -> /${_e(l.endsWith("/")?`${l}${b}`:l)}`,{phase:"copy-extra-paths",sourcePath:c,targetPath:`/${_e(l.endsWith("/")?`${l}${b}`:l)}`,copiedItems:n}));}return r.endMark("copy-extra-paths",{mappedSources:s.length,copiedItems:n}),i}function $e(e,t,r,s,n){let i=new Set,o=Z(r).replace(/\\\//g,"/"),u=n==="page-html"?Un(o):o,a=Ln(t,n);if(a){for(let l of $n(u)){let d=N(e,l,t,s,`${n}:css-url`);d&&O(e,d)&&i.add(d.toString());}for(let l of u.matchAll(/@import\s+(?:url\()?\s*['"]?([^'"\s;]+)['"]?\s*\)?/gi)){let d=N(e,l[1],t,s,`${n}:css-import`);d&&O(e,d)&&i.add(d.toString());}}if(a||n==="page-html")for(let l of u.matchAll(/<\?xml-stylesheet[^>]+href=["']([^"']+)["'][^>]*\?>/gi)){let d=N(e,l[1],t,s,`${n}:xml-stylesheet`);d&&O(e,d)&&i.add(d.toString());}if(n==="page-html")for(let l of Vt(o)){let d=l.startsWith("//")?`${new URL(e.sourceOrigin).protocol}${l}`:l;if(ft(d)){s.ignore(`${n}:serialized-url`,d,"looks like JavaScript/code fragment",t);continue}let c=N(e,d,t,s,`${n}:serialized-url`);c&&O(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"&&An(t))for(let l of Gt(o)){if(ft(l)||!/\.(?:js|mjs)(?:[?#]|$)/i.test(l))continue;let d=N(e,l,t,s,`${n}:relative-asset`);d&&O(e,d)&&i.add(d.toString());}return [...i]}function Fn(e,t,r,s){let n=new Set,i=Z(r);for(let o of i.matchAll(/href=["']([^"'#\s][^"']*?)["']/gi)){let u=o[1],a=N(e,u,t,s,"page-link");a&&(Cr(e,a)||ae(a)&&!me(a)&&!O(e,a)&&n.add(a.toString()));}return [...n]}async function cr(e,t,r,s,n,i,o=false,u=[]){let a=new Set(u),l=0,d=new Map,c=(p,w)=>{let m=[w],b=new Set;for(;m.length>0;){let g=m.pop();if(g===p)return true;b.has(g)||(b.add(g),m.push(...d.get(g)??[]));}return false};for(;r.sitemapQueue.length>0;){let p=r.sitemapQueue.shift();r.queuedSitemaps.delete(p);let w=oe(p,s,"sitemap","sitemap-queue");if(!w)continue;let m=w.toString();if(r.doneSitemaps.has(m))continue;r.doneSitemaps.add(m),s.sitemap(`Fetching sitemap ${m}`,{url:m});let b=true;try{let g=await t.get(m,{timeout:6e4});if(b=!1,!g.ok()){if(s.skip("sitemap",m,g.status()),o&&!a.has(m))throw new Error(`Required child content-sync sitemap returned HTTP ${g.status()}: ${m}`);continue}let f=await g.body(),h=g.url()||m,v=oe(h,s,"sitemap-response",m);if(!v)continue;let C=v.toString();r.successfulSitemaps.add(m),r.successfulSitemaps.add(C),a.has(m)&&(r.resolvedSitemapRoots.add(C),l+=1);let L=await ht(e,r.assetMap,C,f,r,s);Q(n,e,L.outputPath),ue(n,L.outputPath);let U=f.toString("utf8");/<sitemapindex(?:\s|>)/i.test(U)?r.sitemapIndexUrls.add(C):r.sitemapLeafUrls.add(C);let B=$e(e,C,U,s,"sitemap");for(let T of B)q(e,r,T,s,C);let D=[];for(let T of In(U)){let k=N(e,T.loc,C,s,"sitemap-loc",!0);if(!k){if(o)throw new Error(`Content-sync sitemap contains an inadmissible location: ${T.loc}`);continue}if(we(k)){if(c(C,k.toString()))throw new Error(`Sitemap index cycle detected: ${C} -> ${k.toString()}`);if(d.has(C)||d.set(C,new Set),d.get(C).add(k.toString()),D.push(k.toString()),o&&r.doneSitemaps.has(k.toString())&&!r.successfulSitemaps.has(k.toString()))throw new Error(`Required child content-sync sitemap was not resolved: ${k.toString()}`);He(e,r,k.toString(),s,C);}else if(o){if(ae(k)&&!O(e,k)){let _=i.requiredUrls.has(k.toString()),S=i.manifest.pages[k.toString()],R=!!S&&!!await fe(S.outputPath);if(!_&&!R)throw new Error(`Content-sync sitemap coverage is incomplete for ${k.toString()}.`)}s.ignore("sitemap-loc",k.toString(),"content-sync sitemap-only traversal does not enqueue urlset locations",C);}else O(e,k)?q(e,r,k.toString(),s,C):ae(k)?(T.lastmod&&(r.sitemapLastmodByPage[k.toString()]=T.lastmod),Me(e,r,k.toString(),s,C)):s.reject("sitemap-loc",k.toString(),"not page/sitemap/asset-like",C);}i.trackManifest&&(i.manifest.assets[C]={url:C,outputPath:L.outputPath,isText:!0,contentType:g.headers()["content-type"]??"application/xml",cacheControl:dt(g.headers()),changeToken:null,tokenSource:null,discoveredAssets:[...new Set([...B,...D])],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,unreferencedRuns:0,rewriteComplete:!1},await ie(e,i));}catch(g){s.error(`Failed sitemap ${m}`,{url:m,error:String(g)});let f=o&&a.has(m)&&b;if(o&&!f)throw g}}if(o&&a.size>0&&l===0)throw new Error(`None of the configured content-sync sitemap roots could be resolved: ${[...a].join(", ")}`)}async function En(e,t,r,s,n,i,o){let u=N(e,s,e.sourceOrigin,n,"asset-fetch");if(!u||!O(e,u))return;let a=u.toString();if(r.doneAssets.has(a))return;let l=i.enabled||i.strictTargeted?i.previousManifest.assets[a]:void 0,d=i.trackManifest?await We(e,t,i,a,n):null,c=d?.token??null,p=Yt(l?.changeToken,d),w=i.strictTargeted&&(!d?.supported||!d.token)&&Xt(e.sourceOrigin,a),m=i.strictTargeted?i.manifest.assets[a]:void 0;if(m?.lastSeenRunId===i.runId&&await fe(m.outputPath)){r.doneAssets.add(a);for(let g of m.discoveredAssets||[])q(e,r,g,n,a);Q(o,e,m.outputPath),Ne(o,e,m.outputPath,m.cacheControl),m.isText&&ue(o,m.outputPath),n.info(`Resumed completed content-sync asset ${a}`,{url:a,source:"content-sync-checkpoint"}),ge(r,n);return}if(l&&(p||w)&&await fe(l.outputPath)){i.manifest.assets[a]={...l,changeToken:c,tokenSource:d?.tokenSource??l.tokenSource,discoveredAssets:[...l.discoveredAssets||[]],lastSeenRunId:i.runId,unreferencedRuns:0},delete i.manifest.pages[a],r.doneAssets.add(a);for(let g of l.discoveredAssets||[])q(e,r,g,n,a);Ne(o,e,l.outputPath,l.cacheControl),n.info(`Reused unchanged trusted asset ${a}.`,{url:a,tokenSource:d?.tokenSource??"unknown",phase:"download-assets",source:p?"asset-change-token-match":"content-sync-release-fingerprint"}),ge(r,n);return}let b=(g,f={})=>{if(!l||i.strictTargeted)return false;i.manifest.assets[a]={...l,discoveredAssets:[...l.discoveredAssets||[]],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,unreferencedRuns:0},delete i.manifest.pages[a],r.doneAssets.add(a);for(let h of l.discoveredAssets||[])q(e,r,h,n,a);return n.warn(`Keeping previous incremental asset ${a} after fetch issue.`,{url:a,reason:g,preservedFromPreviousManifest:true,...f,phase:"download-assets"}),ge(r,n),true};n.asset(`Fetching asset ${a}`,{url:a});try{let g=he(e,r.assetMap,a),f=g?await fe(g):null;if(g&&f&&!i.strictTargeted)try{let S=await j(`fetch asset headers ${a}`,6e4,()=>t.head(a,{timeout:6e4})),R=S.headers();if(S.ok()&&Cn(f,R)){let I=await kr(g);if(I!==null){let F=S.url()||a,P=oe(F,n,"asset-response",a);if(!P)return;let $=P.toString(),M=await ht(e,r.assetMap,$,I,r,n,R);M.wroteFile&&(Q(o,e,M.outputPath),se(M.outputPath)&&ue(o,M.outputPath));let W=dt(R)||l?.cacheControl||null;Ne(o,e,M.outputPath,W),r.doneAssets.add(a),n.info(`Reused existing asset ${a} based on response headers.`,{url:a,filePath:g,lastModified:R["last-modified"]||"",contentLength:R["content-length"]||"",phase:"download-assets"}),ge(r,n);let le=lr(u,R),ye=l?.discoveredAssets?[...l.discoveredAssets]:[];if(le||l?.isText){let x=I.toString("utf8"),Se=$e(e,$,x,n,"asset:cached");(Se.length>0||!l)&&(ye=Se);for(let Ur of ye)q(e,r,Ur,n,$);}if(i.trackManifest){let x=le||!!l?.isText;i.manifest.assets[a]={url:a,outputPath:M.outputPath,isText:x,contentType:ct(R)||l?.contentType||null,cacheControl:W,changeToken:d?.supported?d.token:null,tokenSource:d?.supported?d.tokenSource??null:null,discoveredAssets:ye,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,unreferencedRuns:0,rewriteComplete:!x},delete i.manifest.pages[a],(i.enabled||i.strictTargeted)&&x&&await ie(e,i);}return}}}catch{}let h=await j(`fetch asset ${a}`,6e4,()=>t.get(a,{timeout:6e4}));if(!h.ok()){if(b(`http-${h.status()}`,{status:h.status()}))return;if(i.strictTargeted)throw new Error(`Required content-sync asset returned HTTP ${h.status()}: ${a}`);n.skip("asset",a,h.status());return}let v=await j(`read asset response ${a}`,6e4,()=>h.body()),C=h.url()||a,L=oe(C,n,"asset-response",a);if(!L)return;let U=L.toString(),B=h.headers(),D=await ht(e,r.assetMap,U,v,r,n,B);D.wroteFile&&(Q(o,e,D.outputPath),se(D.outputPath)&&ue(o,D.outputPath));let T=dt(B);Ne(o,e,D.outputPath,T),r.doneAssets.add(a),ge(r,n);let k=lr(u,B),_=[];if(k){let S=v.toString("utf8");_=$e(e,U,S,n,`asset:${y.extname(u.pathname).toLowerCase()||B["content-type"]||"unknown"}`);for(let R of _)q(e,r,R,n,U);}i.trackManifest&&(i.manifest.assets[a]={url:a,outputPath:D.outputPath,isText:k,contentType:ct(B),cacheControl:T,changeToken:d?.supported?d.token:null,tokenSource:d?.supported?d.tokenSource??null:null,discoveredAssets:_,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,unreferencedRuns:0,rewriteComplete:!k},delete i.manifest.pages[a],(i.enabled||i.strictTargeted)&&k&&await ie(e,i));}catch(g){if(b("fetch-error",{error:String(g)}))return;if(n.error(`Failed asset ${a}`,{url:a,error:String(g)}),i.strictTargeted)throw g}finally{r.doneAssets.has(a)||(r.doneAssets.add(a),ge(r,n));}}async function jn(e,t,r,s,n,i){let o=Math.max(1,Number(e.assetDownloadConcurrency||e.concurrency||1)),u=Array.from({length:o},async()=>{for(;r.assetQueue.length>0;){let a=r.assetQueue.shift();a&&(r.queuedAssets.delete(a),await En(e,t,r,a,s,n,i));}});await Promise.all(u);}function qn(e){let t=Math.ceil(e/1e3);return `${t} second${t===1?"":"s"}`}function X(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,X(e)))}function Nn(e){return Math.max(15e3,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+1e4)}function Pt(e){return e.stats.pagesCompleted}function mt(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 lt(e,t,r){let s=mt(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 j(e,t,r){let s;try{return await Promise.race([r(),new Promise((n,i)=>{s=globalThis.setTimeout(()=>{i(new Ue(e,t));},t);})])}finally{s!==void 0&&globalThis.clearTimeout(s);}}var Ue=class extends Error{constructor(r,s){super(`${r} timed out after ${qn(s)}.`);this.operation=r;this.timeoutMs=s;this.name="OperationTimeoutError";}operation;timeoutMs};async function Bn(e,t){let r=Nn(e);await t.evaluate(async s=>{await new Promise(n=>{let i=0,o=700,u=Date.now(),a=()=>{window.clearInterval(l),window.scrollTo(0,0),n();},l=window.setInterval(()=>{if(Date.now()-u>=s.maxDurationMs){a();return}window.scrollBy(0,o),i+=o;let d=document.body?.scrollHeight||0,c=document.documentElement?.scrollHeight||0,p=Math.max(d,c);i>=p+window.innerHeight&&a();},120);});},{maxDurationMs:r});}async function Wn(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 Bn(e,t),await t.waitForTimeout(e.readiness.fallbackWaitMs);}async function _n(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 Qn(e,t){return e.noJavaScriptRenderPathPrefixes.some(r=>yt(t,r))}async function Hn(e,t,r,s,n=true){let i=new Set;if(n){let u=await t.evaluate(()=>{let a=new Set,l=["href","src","poster","data-src","data-lazy-src","data-original","data-bg","data-background","data-href","data-resource-url"],d=new Set,c=["srcset","data-srcset","data-lazy-srcset"],p=w=>{w.querySelectorAll("*").forEach(m=>{for(let g of l){let f=m.getAttribute(g);f&&a.add(f);}for(let g of c){let f=m.getAttribute(g);f&&f.split(",").forEach(h=>{let v=h.trim().split(/\s+/)[0];v&&a.add(v);});}let b=m.getAttribute("style");b&&d.add(b),m.shadowRoot&&p(m.shadowRoot);});};return p(document),{attrs:[...a],styles:[...d]}});for(let a of u.attrs)for(let l of Mn(a)){let d=N(e,l,r,s,"dom-attr");d&&O(e,d)&&i.add(d.toString());}for(let a of u.styles)for(let l of $e(e,r,a,s,"dom-style"))i.add(l);}let o=await t.content();for(let u of $e(e,r,o,s,"page-html"))i.add(u);return [...i]}async function dr(e,t,r,s,n){let i=ee(e,t);await ve(i,r,"utf8");let o=await A.stat(i);n?.debug(`Saved page output ${t}`,{phase:"save-pages",url:t,outputPath:i,bytes:o.size}),s.stats.pagesSaved++;let u=Math.min(s.stats.pagesQueued,Pt(s)+1);n&&(s.stats.pagesSaved%10===0||s.stats.pagesSaved===1)&&n.progress(`Page progress: processed ${u}, rendered ${s.stats.pagesRendered}, saved ${s.stats.pagesSaved}, discovered ${s.stats.pagesQueued}.`,{donePages:u,claimedPages:s.donePages.size,pagesRendered:s.stats.pagesRendered,pagesSaved:s.stats.pagesSaved,pagesQueued:s.stats.pagesQueued,pageQueue:s.pageQueue.length,phase:"save-pages"});}function zn(e){let t=Pt(e);return t%5===0||t===1||t===e.stats.pagesQueued}function Jn(e,t){let r=Pt(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 Vn(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 Gn(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 Vn(s),s}async function Kn(e,t,r,s,n,i,o,u){let a=await chromium.launch({headless:true}),l=mt(a);l.pid!==null&&r.debug(`Launched crawl worker browser PID ${l.pid}`,{browserPid:l.pid});try{for(;t.pageQueue.length>0;){a||(a=await chromium.launch({headless:!0}),l=mt(a),l.pid!==null&&r.debug(`Relaunched crawl worker browser PID ${l.pid}`,{browserPid:l.pid}));let d=a;if(e.maxPages>0&&t.donePages.size>=e.maxPages)break;let c=t.pageQueue.shift();if(!c)break;t.queuedPages.delete(c);let p=null,w=null,m=!1,b=[],g=new Set;try{let f=oe(c,r,"page","page-queue");if(!f)continue;let h=f.toString();if(c=h,t.queuedPages.delete(c),t.donePages.has(c))continue;t.donePages.add(c),i.enabled&&i.seenPages.add(c);let v=St(e,c),C=Qn(e,f.pathname);if(!ae(f)||O(e,f)||me(f)){if(O(e,f)){r.info(`Worker redirected non-page URL to asset queue: ${c}`,{url:c,source:"worker-guard"}),q(e,t,c,r,"worker-guard");continue}r.reject("page",c,"guard rejected non-page URL before rendering","worker");continue}let L=i.strictTargeted?i.manifest.pages[c]:void 0;if(L?.lastSeenRunId===i.runId&&await fe(L.outputPath)){i.seenPages.add(c);for(let P of L.discoveredAssets||[])q(e,t,P,r,c);Q(o,e,L.outputPath),ue(o,L.outputPath),r.info(`Resumed completed content-sync page ${c}`,{url:c,source:"content-sync-checkpoint"});continue}let U=await Xs(e,n,t,i,c,r);if(i.enabled&&s!=="single-url"&&s!=="content-sync"){let P=i.manifest.pages[c];if(U.action==="reuse"&&P){for(let $ of P.discoveredAssets)q(e,t,$,r,c);for(let $ of P.discoveredPages)Me(e,t,$,r,c);P.lastSeenRunId=i.runId,P.sitemapLastmod=Te(t.sitemapLastmodByPage[c])??P.sitemapLastmod,U.changeToken?.supported&&(P.changeToken=U.changeToken.token,P.tokenSource=U.changeToken.tokenSource??P.tokenSource),r.info(`Incremental reuse skipped unchanged page ${c}`,{url:c,mode:"incremental",reason:U.changeToken?.supported===!0?"change-token-match":"sitemap-lastmod-match"});continue}}p=await j(`create page context ${c}`,X(e),()=>Gn(d,e,C)),w=await j(`create page ${c}`,X(e),()=>p.newPage()),b=await p.cookies();let B=!1,D=new Set;await w.route("**/*",async P=>{let $=P.request();try{let M=N(e,$.url(),e.sourceOrigin,r,"network-request");M&&O(e,M)&&(D.add(M.toString()),q(e,t,M.toString(),r,c));}catch{}if($.isNavigationRequest()&&$.frame()===w.mainFrame())try{let M=new URL($.url()),W=new URL(h);if(M.hash="",W.hash="",M.href===W.href){if(B){r.warn(`Blocked same-page navigation/reload for ${c}`,{url:c,requestUrl:$.url()});try{await P.abort("aborted");}catch(le){r.debug(`Ignored canceled route while blocking reload for ${c}`,{url:c,error:String(le)});}return}B=!0;}}catch{}try{await P.continue();}catch(M){r.debug(`Ignored canceled network route for ${c}`,{url:c,requestUrl:$.url(),error:String(M)});}}),w.on("response",P=>{try{let M=N(e,P.url(),e.sourceOrigin,r,"network-response");M&&O(e,M)&&(D.add(M.toString()),q(e,t,M.toString(),r,c));}catch{}let $=P.headerValues("set-cookie").then(M=>{for(let W of M)u.add(rr(W,P.url()));}).catch(()=>{}).then(()=>{});g.add($),$.finally(()=>g.delete($));}),r.page(`Rendering ${c}`,{url:c});let T=null,k=null;try{if(T=await w.goto(c,{waitUntil:"domcontentloaded",timeout:e.navigationTimeoutMs}),T&&T.ok())try{k=await j(`read response body ${c}`,X(e),()=>T.text());}catch{k=null;}}catch(P){r.warn(`Navigation issue for ${c}; saving current DOM if available`,{url:c,error:String(P)});}if(s==="content-sync"&&T){let P=oe(T.url(),r,"content-sync-final-response",c)?.toString();if(P&&P!==h){if(i.deleteOnMissingUrls.has(c)){await wt(e,i,o,c,i.deleteOnMissingUrls),r.info(`Removed stale content-sync archive route redirected to ${P}`,{url:c,finalResponseUrl:P,source:"content-sync-tombstone"});continue}throw new Error(`Required content-sync route redirected outside its planned URL: ${c} -> ${P}`)}}if(v){let P=T?.status()??null;if(P!==404){r.error(`Generated 404 request path returned unexpected status for ${c}`,{url:c,expectedStatus:404,status:P,requestPath:e.generated404RequestPath});continue}r.info(`Capturing rendered 404 page for ${c}`,{url:c,status:P,outputPath:ee(e,c)});}else if(T&&!T.ok()){if(s==="content-sync"&&(T.status()===404||T.status()===410)&&i.deleteOnMissingUrls.has(c)){await wt(e,i,o,c,i.deleteOnMissingUrls),r.info(`Removed stale content-sync archive page ${c}`,{url:c,status:T.status(),source:"content-sync-tombstone"}),await w.close();continue}if(s==="content-sync")throw new Error(`Required content-sync route returned HTTP ${T.status()}: ${c}`);r.skip("page",c,T.status(),t.pageDiscoverySources.get(c)),await w.close();continue}C?(r.info(`Rendering without JS execution for ${c}`,{url:c,mode:"no-js"}),await j(`wait for rendered page ${c}`,X(e),()=>_n(e,w))):await j(`wait for rendered page ${c}`,X(e),()=>Wn(e,w)),t.stats.pagesRendered++;let _=await j(`extract rendered assets ${c}`,X(e),()=>Hn(e,w,h,r,!C));for(let P of _)q(e,t,P,r,c);let S=[...new Set([..._,...D])],R=k??await j(`capture rendered html ${c}`,X(e),()=>w.content()),I=s!=="single-url"&&s!=="content-sync"&&!v?Fn(e,c,R,r):[];if(s!=="single-url"&&s!=="content-sync"&&!v)for(let P of I)Me(e,t,P,r,c);await dr(e,c,R,t,r);let F=ee(e,c);if(Q(o,e,F),ue(o,F),i.trackManifest){let P=T?.headers();i.manifest.pages[c]={url:c,outputPath:F,contentType:ct(P),changeToken:U.changeToken?.supported?U.changeToken.token:null,tokenSource:U.changeToken?.supported?U.changeToken.tokenSource??null:null,sitemapLastmod:Te(t.sitemapLastmodByPage[c])??null,discoveredPages:I,discoveredAssets:S,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!1},(i.enabled||i.strictTargeted)&&await ie(e,i);}}catch(f){if(m=f instanceof Ue,i.strictTargeted)throw r.error(`Failed required content-sync page ${c}`,{url:c,error:String(f)}),f;if(m)r.warn(`Skipped partial DOM for timed-out page ${c}`,{url:c,error:String(f),recovery:"recycle-worker-browser"});else try{let h=w?await j(`capture partial html ${c}`,X(e),()=>w.content()):"";if(h&&h.trim()){await dr(e,c,h,t,r);let v=ee(e,c);if(Q(o,e,v),ue(o,v),i.trackManifest){let C=i.manifest.pages[c]??i.previousManifest.pages[c];i.manifest.pages[c]={url:c,outputPath:v,contentType:C?.contentType??null,changeToken:null,tokenSource:null,sitemapLastmod:Te(t.sitemapLastmodByPage[c])??C?.sitemapLastmod??null,discoveredPages:C?.discoveredPages?[...C.discoveredPages]:[],discoveredAssets:C?.discoveredAssets?[...C.discoveredAssets]:[],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!1},(i.enabled||i.strictTargeted)&&await ie(e,i);}r.warn(`Saved partial DOM for ${c}`,{url:c,error:String(f)});}}catch(h){h instanceof Ue&&(m=!0),r.error(`Could not save partial DOM for ${c}`,{url:c,error:String(h)});}r.error(`Failed page ${c}`,{url:c,error:String(f)});}finally{if(!m&&w&&await j(`drain network routes ${c}`,xe(e),()=>w.unrouteAll({behavior:"wait"})).catch(f=>{m=!0,r.warn(`Could not drain network routes for ${c}`,{url:c,browserPid:l.pid,error:String(f),recovery:"recycle-worker-browser"});}),m&&(a=null,await lt(d,r,`page operation timeout for ${c}`),await d.close().catch(()=>{})),g.size>0&&await Promise.allSettled([...g]),!m&&p)try{let f=await p.cookies();u.addAll(sr(b,f));}catch{}t.stats.pagesCompleted++,zn(t)&&Jn(t,r),!m&&w&&await j(`close page ${c}`,xe(e),()=>w.close()).catch(f=>{m=!0,r.warn(`Timed out while closing page ${c}`,{url:c,browserPid:l.pid,error:String(f),recovery:"recycle-worker-browser"});}),!m&&p&&await j(`close page context ${c}`,xe(e),()=>p.close()).catch(f=>{m=!0,r.warn(`Timed out while closing page context for ${c}`,{url:c,browserPid:l.pid,error:String(f),recovery:"recycle-worker-browser"});}),m&&a===d&&(a=null,await lt(d,r,`page cleanup timeout for ${c}`),await d.close().catch(()=>{}));}}}finally{if(a){let d=a;await j("close worker browser",xe(e),()=>d.close()).catch(c=>(r.warn("Timed out while closing crawl worker browser",{browserPid:l.pid,error:String(c)}),lt(d,r,"browser.close timeout")));}}}async function Zn(e){try{let t=await A.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 pr(e){let t=String(e||"").toLowerCase();return t.includes("timeout")||t.includes("timed out")||t.includes("navigation timeout")}function Yn(e){let t=String(e?.job?.command||"").trim(),r=String(e?.job?.crawlMode||"full").trim();return t!=="publish"&&t!=="crawl"?false:r!=="incremental"}function Xn(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 Mr(e){try{let t=await A.readFile(e,"utf8"),r=JSON.parse(t);return r&&typeof r=="object"&&!Array.isArray(r)?r:null}catch{return null}}function gr(e){let t=String(e.originalFileName||"").toLowerCase();return t.endsWith("errors.jsonl")?0:t.endsWith("errors.json")?1:2}function ei(e,t){let r=Array.isArray(t?.artifacts)?t.artifacts.filter(s=>String(s?.role||"").trim()==="errors"&&String(s?.storedFileName||"").trim()!=="").sort((s,n)=>gr(s)-gr(n)).map(s=>y.join(e,String(s.storedFileName))):[];return [...new Set([...r,y.join(e,"errors.jsonl"),y.join(e,"errors.json"),y.join(e,"errors.jsonl.gz"),y.join(e,"errors.json.gz")])]}async function fr(e){let t=await Mr(y.join(e,"job.json"));for(let r of ei(e,t)){let s=await Zn(r);if(s.length>0)return s}return []}async function ti(e){let t=y.join(e.logDir,"archive"),r;try{r=await A.readdir(t);}catch{return ""}let s="",n=0;for(let i of r){let o=y.join(t,i);if(!(await A.stat(o).catch(()=>null))?.isDirectory())continue;let a=await Mr(y.join(o,"job.json"));if(!Yn(a))continue;let l=Xn(a);l>=n&&(n=l,s=o);}return s}async function ri(e){let t=await ti(e),r=t!==""?await fr(t):await fr(e.logDir),s=new Set;for(let n of r)if(pr(n.error)||pr(n.message)){let i=n.url;typeof i=="string"&&i&&s.add(i);}return [...s]}async function si(e){let t=[];for(let r of e)if(r.startsWith("@")){let s=r.slice(1),n=await A.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 ni(e){if(!e)throw new Error("Content-sync crawl requires an immutable impact plan.");let t=JSON.parse(await A.readFile(e,"utf8"));return Tt(t),t}function ii(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(/\/+$/,""),o=r.pathname.slice(i.length).replace(/^\/+/,""),u=String(s.paginationBase||"page").replace(/^\/+|\/+$/g,"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return r.pathname.startsWith(`${i}/`)&&new RegExp(`^${u}/\\d+/?$`).test(o)})}function ke(e,t,r){let s=r==="page"?ee(e,t):Je(e,t).originalFilePath;return z(e.outputDir,s)}async function wt(e,t,r,s,n){let i=t.manifest.pages[s];if(!i)return;let o=z(e.outputDir,i.outputPath);if(!o)throw new Error(`Manifest-owned page path escaped output root: ${s}`);let u=y.resolve(i.outputPath);Object.entries(t.manifest.pages).some(([l,d])=>l!==s&&!n.has(l)&&y.resolve(d.outputPath)===u)||(await A.rm(i.outputPath,{force:true}),r.deletedFiles.add(o),r.revalidateFiles.delete(o)),delete t.manifest.pages[s];}async function oi(e,t,r,s,n){let i=t.manifest.assets[s];if(!i)return;let o=z(e.outputDir,i.outputPath);if(!o)throw new Error(`Manifest-owned resource path escaped output root: ${s}`);let u=y.resolve(i.outputPath);Object.entries(t.manifest.assets).some(([l,d])=>l!==s&&!n.has(l)&&y.resolve(d.outputPath)===u)||(await A.rm(i.outputPath,{force:true}),r.deletedFiles.add(o)),delete t.manifest.assets[s];}function ai(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 o of i?.discoveredAssets??[])try{we(new URL(o))&&s.push(o);}catch{}}return r}async function ui(e,t,r,s,n){let i=ai(r.previousManifest,n);for(let o of i){if(t.successfulSitemaps.has(o))continue;let u=r.previousManifest.assets[o];if(!u)continue;let a=z(e.outputDir,u.outputPath);if(!a)throw new Error(`Manifest-owned sitemap path escaped output root: ${o}`);await A.rm(u.outputPath,{force:true}),s.deletedFiles.add(a),delete r.manifest.assets[o];}await ie(e,r);}async function li(e){try{let t=await A.readFile(y.join(e.outputDir,"asset-map.json"),"utf8");return JSON.parse(t)}catch{return {}}}async function ci(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 A.mkdir(e,{recursive:true}),await Promise.all(t.map(async r=>{try{await A.unlink(y.join(e,r));}catch(s){if(s.code!=="ENOENT")throw s}}));}function hr(e,t,r,s,n){let i=N(e,r,e.sourceOrigin,s,"manual-url");i&&(we(i)?He(e,t,i.toString(),s,n):O(e,i)?q(e,t,i.toString(),s,n):ae(i)?Me(e,t,i.toString(),s,n):s.reject("manual-url",i.toString(),"not page/sitemap/asset-like",n));}async function $r(e=process.argv.slice(2)){let t=[],r=await Le(void 0,{onRemotePublisherConfigDiagnostic:S=>{t.push(S);}}),s=It(r.sitemapPaths),n=t.at(-1)??null,i=qs(e),o=i.mode==="content-sync"?await ni(i.contentSyncPlanPath):null;if(i.resumeRewrite&&i.mode!=="full")throw new Error("--resume-rewrite is only supported for full crawl/publish jobs.");let u=[];i.mode==="retry-timeouts"&&(u=await ri(r)),i.mode==="single-url"&&(u=await si(i.urls)),o&&(u=[...o.directRenderUrls,...o.archiveFamilyUrls,...o.resourceRenderUrls]);let a=i.crawlMode==="incremental"&&i.mode==="full",l=a&&typeof r.subscriptionType=="string"&&r.subscriptionType.trim()!=="";if(o&&r.subscriptionType!=="PROFESSIONAL"&&r.subscriptionType!=="AGENCY")throw new Error("Content-sync requires an active Professional or Agency subscription.");let d=(i.mode==="full"||i.mode==="single-url"||i.mode==="content-sync")&&!i.resumeRewrite,c=i.mode!=="full"||i.resumeRewrite||l,p=c?await li(r):{},w=l||i.mode==="single-url"||i.mode==="content-sync"?await Js(r):Sr(),m=new Set(u),b=new Set;if(o){for(let S of o.archiveFamilies)if(S.foundPosts===0)for(let R of S.pageUrls)b.add(R);for(let S of Object.keys(w.pages))ii(S,o)&&!m.has(S)&&(u.push(S),b.add(S));}let g={enabled:l,trackManifest:d,manifest:gt(w),previousManifest:gt(w),runId:o?.jobId??`${Date.now()}`,seenPages:new Set,changeTokenCache:new Map,manifestSaveChain:Promise.resolve(),strictTargeted:!!o,requiredUrls:m,deleteOnMissingUrls:b};await ci(r.logDir);let f=new de(r.logDir,r.logLevel);if(n){let S={status:n.status,virtualAssetBaseUrl:n.virtualAssetBaseUrl,subscriptionType:n.subscriptionType??null,error:n.error,requests:n.requests,source:"remote-publisher-config"};n.status==="loaded"&&n.subscriptionType?f.info("Loaded remote WP Suite publisher configuration.",S):f.warn("Remote WP Suite publisher configuration is unavailable or has no active subscription type.",S);}if(a&&!l){let S="Incremental crawl requires an active remote publisher subscription; refusing to fall back to a destructive full crawl.";throw f.error(S,{requestedMode:i.crawlMode,subscriptionType:r.subscriptionType??null,source:"incremental-subscription-guard"}),await f.flush(),new Error(S)}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,successfulSitemaps:new Set,resolvedSitemapRoots:new Set,sitemapIndexUrls:new Set,sitemapLeafUrls:new Set,sitemapLastmodByPage:{},assetMap:{...p},assetVariantDigestsByOriginalPath:new Map,stats:{pagesQueued:0,pagesRendered:0,pagesCompleted:0,assetsQueued:0,sitemapsQueued:0,assetsSaved:0,pagesSaved:0}},v=zs(),C=new je,L=Ns();if(L&&!i.resumeRewrite&&await qe(L,C.artifact()),await At(r),await kt(r,{startedAt:new Date().toISOString(),outputDir:y.resolve(r.outputDir)}),c||await A.rm(r.outputDir,{recursive:true,force:true}),await A.mkdir(r.outputDir,{recursive:true}),o){let S=new Set([...o.deleteUrls,...g.deleteOnMissingUrls]);for(let I of o.deleteUrls)await wt(r,g,v,I,S);let R=new Set(o.resourceDeleteUrls);for(let I of o.resourceDeleteUrls)await oi(r,g,v,I,R);}if(i.resumeRewrite)f.info("Resuming final rewrite from existing output.",{phase:"rewrite-text",mode:i.mode,crawlMode:i.crawlMode});else {let S=await request.newContext({ignoreHTTPSErrors:r.ignoreHttpsErrors});try{if(f.mark("discovery"),i.mode==="full"?(s.forEach(I=>He(r,h,I,f)),await cr(r,S,h,f,v,g),r.seedPaths.forEach(I=>hr(r,h,I,f,"seed-path")),r.generated404RequestPath&&Me(r,h,r.generated404RequestPath,f,"generated-404-request-path")):(u.forEach(I=>hr(r,h,I,f,"cli")),o?.sitemapUrls.forEach(I=>He(r,h,I,f,"content-sync-impact")),await cr(r,S,h,f,v,g,i.mode==="content-sync",o?.sitemapUrls??[]),o&&await ui(r,h,g,v,o.sitemapUrls)),f.endMark("discovery",{pages:h.pageQueue.length,assets:h.assetQueue.length,sitemaps:h.sitemapQueue.length}),f.summary(`Queued ${h.pageQueue.length} pages, ${h.assetQueue.length} assets, ${h.sitemapQueue.length} sitemaps.`,{mode:i.mode,crawlMode:i.crawlMode,queuedPages:h.pageQueue.length,queuedAssets:h.assetQueue.length,queuedSitemaps:h.sitemapQueue.length}),i.mode==="retry-timeouts"&&h.pageQueue.length===0&&h.assetQueue.length===0&&h.sitemapQueue.length===0){f.summary("No timed-out URLs were queued. Skipping retry crawl.",{mode:i.mode,crawlMode:i.crawlMode,queuedPages:0,queuedAssets:0,queuedSitemaps:0}),await f.flush(),L&&await qe(L,C.artifact());return}f.mark("render-pages");let R=Array.from({length:Math.max(1,r.concurrency)},()=>Kn(r,h,f,i.mode,S,g,v,C));if(await Promise.all(R),L&&await qe(L,C.artifact()),f.endMark("render-pages",{pages:h.stats.pagesCompleted}),f.mark("download-assets"),f.progress("Asset download phase started.",{phase:"download-assets",doneAssets:h.doneAssets.size,assetsQueued:h.stats.assetsQueued,assetQueue:h.assetQueue.length}),await Ks(r,S,g,[...h.assetQueue],f),await jn(r,S,h,f,g,v),f.endMark("download-assets",{assets:h.doneAssets.size}),g.enabled&&r.maxPages===0&&(await tn(r,h,g,f,v),i.mode==="full"&&await rn(r,g,f,v)),i.mode==="full"){let I=await Dn(r,h,f);for(let F of I)Q(v,r,F);}}finally{await j("dispose crawl request context",xe(r),()=>S.dispose()).catch(R=>{f.warn("Timed out while disposing crawl request context",{error:String(R)});});}}g.trackManifest&&await ie(r,g),await A.writeFile(y.join(r.outputDir,"asset-map.json"),JSON.stringify(h.assetMap,null,2),"utf8"),JSON.stringify(p,null,2)!==JSON.stringify(h.assetMap,null,2)&&Q(v,r,y.join(r.outputDir,"asset-map.json"));let U=i.mode==="single-url"||i.mode==="content-sync"?pn(r,h):g.enabled&&!i.resumeRewrite?sn(r,g,v,p,h.assetMap):void 0;f.mark("rewrite-text");let B=i.mode==="single-url"||i.mode==="content-sync"?`Rewriting text files touched by URL crawl: 0/${U?.length??0}`:"Rewriting text files...";f.progress(B,{phase:"rewrite-text",index:0,totalFiles:U?.length,changedTextFiles:0}),await ur(B);let D=Date.now(),T=await Wt(r,h.assetMap,{files:U,previousAssetMap:p,onStart:({totalFiles:S,workerCount:R})=>{f.info(`Rewrite phase scanning ${S} text files.`,{phase:"rewrite-text",totalFiles:S,workerCount:R});},onProgress:async({index:S,totalFiles:R,changedTextFiles:I,file:F,changed:P})=>{P&&Q(v,r,y.join(r.outputDir,F)),f.checkpoint(`Rewriting text file ${S}/${R}`,{phase:"rewrite-text",index:S,totalFiles:R,changedTextFiles:I,file:F}),f.debug(`${P?"Rewrote":"Checked unchanged"} text file ${S}/${R}: ${F}`,{phase:"rewrite-text",index:S,totalFiles:R,changedTextFiles:I,file:F,changed:P});let $=Date.now();if(!(S===1||S===R||S%50===0||$-D>=5e3))return;D=$;let W=`Rewriting text files: ${S}/${R}`;f.progress(W,{phase:"rewrite-text",index:S,totalFiles:R,changedTextFiles:I,file:F}),await ur(W);}});g.trackManifest&&(nn(g,U),await ie(r,g)),f.endMark("rewrite-text",{changedTextFiles:T});let k=o?[...v.deletedFiles].sort():g.enabled&&!i.resumeRewrite?await an(r,h,g,v,f):[],_=[...new Set((U||[]).map(S=>z(r.outputDir,y.isAbsolute(S)?S:y.join(r.outputDir,S))).filter(S=>S!==null))].sort();if(o){let S=[...v.changedFiles].sort(),R=new Set(S),I=new Set(o.directRenderUrls.map(x=>ke(r,x,"page")).filter(x=>!!x&&R.has(x))),F=new Set(o.archiveFamilyUrls.map(x=>ke(r,x,"page")).filter(x=>!!x&&R.has(x))),P=new Set(o.resourceRenderUrls.map(x=>ke(r,x,"asset")).filter(x=>!!x&&R.has(x))),$=new Set([...h.sitemapLeafUrls].map(x=>ke(r,x,"asset")).filter(x=>!!x&&R.has(x))),M=new Set([...h.sitemapIndexUrls].map(x=>ke(r,x,"asset")).filter(x=>!!x&&R.has(x))),W=new Set([...I,...F,...P,...$,...M]),le=S.filter(x=>!W.has(x)),ye=[...new Set([...o.directRenderUrls,...o.archiveFamilyUrls,...h.resolvedSitemapRoots,...h.sitemapLeafUrls,...h.sitemapIndexUrls,...o.deleteUrls,...o.resourceRenderUrls,...o.resourceDeleteUrls].map(x=>{let Se=new URL(x);return `${Se.pathname}${Se.search}`}))].sort();await Ve(r,{schemaVersion:2,generatedAt:new Date().toISOString(),outputDir:y.resolve(r.outputDir),runMode:"content-sync",crawlMode:"incremental",fullSyncRequired:false,changedFiles:S,deletedFiles:k,rewriteTargets:_,revalidateFiles:[...v.revalidateFiles].sort(),consumerId:o.consumerId,fromSequence:o.fromSequence,toSequence:o.toSequence,impactHash:o.impactHash,resolvedSitemapUrls:[...h.resolvedSitemapRoots],uploadGroups:{assets:le,content:[...I].sort(),listings:[...F].sort(),resources:[...P].sort(),sitemapLeaves:[...$].sort(),sitemapIndexes:[...M].reverse()},invalidationPaths:ye});}else await Ve(r,{schemaVersion:1,generatedAt:new Date().toISOString(),outputDir:y.resolve(r.outputDir),runMode:i.mode,crawlMode:i.crawlMode,fullSyncRequired:!(g.enabled&&!i.resumeRewrite),changedFiles:g.enabled&&!i.resumeRewrite?[...v.changedFiles].sort():[],deletedFiles:g.enabled&&!i.resumeRewrite?k:[],rewriteTargets:g.enabled&&!i.resumeRewrite?_:[],revalidateFiles:[...v.revalidateFiles].sort()});await xt(r),f.summary(i.resumeRewrite?`Done. Resumed final rewrite over existing output and changed ${T} text files.`:`Done. Rendered ${h.stats.pagesRendered} pages, processed ${h.doneSitemaps.size} sitemaps and ${h.doneAssets.size} assets.`,{mode:i.mode,crawlMode:i.crawlMode,resumeRewrite:i.resumeRewrite,...h.stats,pagesRendered:h.stats.pagesRendered,donePages:h.stats.pagesCompleted,claimedPages:h.donePages.size,doneSitemaps:h.doneSitemaps.size,doneAssets:h.doneAssets.size,changedTextFiles:T}),await f.flush();}$r().catch(async e=>{let t=Y(e instanceof Error?e.message:String(e));console.error(t);try{let s=(await Le().catch(()=>null))?.logDir??"logs",n=new de(s,"debug");n.error(`Unhandled error: ${t}`,e instanceof Error&&e.stack?{stack:Y(e.stack)}:void 0),await n.flush();}catch{}process.exit(1);});
13
+ ${o}`,40);return n.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:i,tokenSource:"generated-404-response-hash",postId:null,dependencyPostIds:[],reason:null}}catch(s){return n.warn(`Generated 404 fallback token lookup failed for ${r}`,{url:r,error:String(s),requestPath:e.generated404RequestPath,source:"generated-404-change-token-fallback"}),null}}async function Qr(e,t,r,n,s,o){let i=st(e,s);if(await Vs(e,t,r,n,s,o),!n.enabled)return {action:"render",changeToken:n.trackManifest?await et(e,t,n,s,o):null};let c=n.manifest.pages[s];if(!c)return {action:"render",changeToken:await et(e,t,n,s,o)};let a=await et(e,t,n,s,o);if(a?.supported&&a.token)return c.changeToken===a.token?i&&!await Hs(e,t,s,o)?{action:"render",changeToken:a}:{action:"reuse",changeToken:a}:{action:"render",changeToken:a};let u=be(r.sitemapLastmodByPage[s]);return u&&c.sitemapLastmod&&c.sitemapLastmod===u?{action:"reuse",changeToken:a}:{action:"render",changeToken:a}}async function Hs(e,t,r,n){try{let o=(await t.get(r,{timeout:Math.min(e.navigationTimeoutMs,15e3),failOnStatusCode:!1})).status();return o===404?!0:(n.warn(`Generated 404 request path no longer returns 404 for ${r}`,{url:r,status:o,requestPath:e.generated404RequestPath,source:"generated-404-status-probe"}),!1)}catch(s){return n.warn(`Generated 404 status probe failed for ${r}`,{url:r,error:String(s),requestPath:e.generated404RequestPath,source:"generated-404-status-probe"}),false}}async function Js(e,t,r,n,s){let o=Or(r.previousManifest,void 0,n,"previous-manifest"),i=0;for(let[g,y]of Object.entries(r.manifest.pages))if(!r.seenPages.has(g)){Tt(s,e,y.outputPath);try{await T.unlink(y.outputPath);}catch(h){(h.code||"")!=="ENOENT"&&n.warn(`Failed to remove stale incremental page output for ${g}`,{url:g,outputPath:y.outputPath,error:String(h)});}delete r.manifest.pages[g],i++;}let c=Or(r.manifest,r.runId,n,"active-manifest"),a=new Set,u=new Set;for(let g of c){for(let R of De(e,g))a.add(R);let y=r.manifest.assets[g]?.outputPath;y&&u.add(y);let h=Te(e,t.assetMap,g);h&&u.add(h);}for(let g of Object.keys(r.manifest.assets)){if(c.has(g)){r.manifest.assets[g].unreferencedRuns=0;continue}let y=r.manifest.assets[g];if(fr(y.unreferencedRuns)){y.unreferencedRuns+=1,n.warn(`Deferred deletion of newly unreferenced incremental asset ${g}.`,{url:g,unreferencedRuns:y.unreferencedRuns,phase:"incremental-cleanup",source:"asset-deletion-grace"});continue}delete r.manifest.assets[g];}let d=0,l=0;for(let g of o){if(r.manifest.assets[g])continue;let y=new Set,h=r.previousManifest.assets[g]?.outputPath;h&&y.add(h);let R=Te(e,t.assetMap,g);if(!c.has(g)&&R)y.add(R);else if(!c.has(g)){let m=go(e,g,n,"incremental-cleanup");m&&(y.add(m.originalFilePath),m.hashedFilePath&&y.add(m.hashedFilePath));}for(let m of y)if(!u.has(m)){Tt(s,e,m);try{await T.unlink(m),d++;}catch(p){(p.code||"")!=="ENOENT"&&n.warn(`Failed to remove stale incremental asset output for ${g}`,{url:g,outputPath:m,error:String(p)});}}for(let m of De(e,g))a.has(m)||Object.prototype.hasOwnProperty.call(t.assetMap,m)&&(delete t.assetMap[m],l++);}(i>0||d>0||l>0)&&n.info(`Incremental cleanup removed ${i} stale pages, ${d} stale assets, ${l} stale asset mappings`,{removedPages:i,removedAssets:d,removedAssetMappings:l,phase:"incremental-cleanup"});}async function Ks(e,t,r,n){let s=new Set([...Object.values(t.manifest.pages),...Object.values(t.manifest.assets)].map(a=>String(a.outputPath||"").trim()).filter(Boolean).map(a=>w.resolve(a))),o=Object.values(e.postCrawlCopyMap||{}).map(a=>tt(String(a||""))).filter(a=>!!a).map(a=>w.resolve(e.outputDir,a)),c=(await Dn(["**/*.html","**/*.htm"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(a=>gr(w.join(e.outputDir,a),e.outputDir,s,o));for(let a of c){let u=w.join(e.outputDir,a);Tt(n,e,u),await T.unlink(u);}c.length>0&&r.info(`Removed ${c.length} orphaned HTML output file(s) that are absent from the current crawl manifest.`,{phase:"incremental-cleanup",source:"manifest-output-reconciliation",removedPages:c.length,samples:c.slice(0,20)});}function Or(e,t,r,n){let s=new Set,o=i=>{let c=i.trim();if(c){if(r){let a=re(c,r,"asset",n??"manifest");if(!a)return;s.add(a.toString());return}s.add(c);}};for(let i of Object.values(e.pages))for(let c of i.discoveredAssets||[])o(c);for(let[i,c]of Object.entries(e.assets||{}))t&&c.lastSeenRunId!==t||o(i);return s}function $r(e,t,r){for(let n of t)for(let s of De(e,n))if(r.has(s))return true;return false}function Gs(e,t,r,n,s){let o=new Set(r.rewriteTargets);for(let c of r.changedFiles)o.add(w.resolve(e.outputDir,c));for(let c of Object.values(t.manifest.pages))c.rewriteComplete||o.add(w.resolve(c.outputPath));for(let c of Object.values(t.manifest.assets))c.isText&&!c.rewriteComplete&&o.add(w.resolve(c.outputPath));let i=Bs(n,s);if(i.size===0)return [...o];for(let c of Object.values(t.manifest.pages))$r(e,c.discoveredAssets,i)&&o.add(w.resolve(c.outputPath));for(let[c,a]of Object.entries(t.manifest.assets)){a.isText&&$r(e,a.discoveredAssets,i)&&o.add(w.resolve(a.outputPath));for(let u of De(e,c))if(i.has(u)){z(r,e,a.outputPath),a.isText&&o.add(w.resolve(a.outputPath));break}}return [...o]}function Zs(e,t){let r=t?new Set(Array.from(t,s=>w.resolve(s))):null,n=s=>r===null||r.has(w.resolve(s));for(let s of Object.values(e.manifest.pages))n(s.outputPath)&&(s.rewriteComplete=true);for(let s of Object.values(e.manifest.assets)){if(!s.isText){s.rewriteComplete=true;continue}n(s.outputPath)&&(s.rewriteComplete=true);}}function Ys(e,t,r){let n=new Set,s=o=>{if(!o)return;let i=Z(e.outputDir,o);i&&n.add(i);};for(let o of t.donePages)s(te(e,o));for(let o of Object.values(r.manifest.pages))o.lastSeenRunId===r.runId&&s(o.outputPath);for(let o of t.doneAssets)s(Te(e,t.assetMap,o));for(let o of Object.values(r.manifest.assets))o.lastSeenRunId===r.runId&&s(o.outputPath);return n}async function Xs(e,t,r,n,s){let o=[...n.deletedFiles].sort(),i=Ys(e,t,r),c=0;for(let d of [...i].sort()){try{if((await T.stat(w.join(e.outputDir,d))).isFile())continue}catch{}c++,s.warn(`Active output is missing after crawl: ${d}`,{phase:"deploy-plan",file:d,outputPath:w.join(e.outputDir,d)});}if(c>0&&s.warn(`Detected ${c} active output file(s) missing before deploy plan save.`,{phase:"deploy-plan",missingActiveOutputs:c}),o.length===0)return [];let a=[],u=0;for(let d of o){if(!i.has(d)){a.push(d);continue}u++;let l=w.join(e.outputDir,d),g;try{g=(await T.stat(l)).isFile();}catch{g=false;}s.warn(`Deploy plan protected active output from deletion: ${d}`,{phase:"deploy-plan",file:d,outputPath:l,exists:g});}return u>0&&s.info(`Deploy plan skipped ${u} active output deletion(s).`,{phase:"deploy-plan",protectedDeletes:u,deletedFiles:a.length}),a}function De(e,t){let r=new Set([t]);try{let n=new URL(t),o=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{o.push(new URL(e.targetOrigin).origin);}catch{}for(let i of o)try{r.add(new URL(i).origin+n.pathname+n.search);}catch{}r.add(n.pathname+n.search),r.add(n.pathname);}catch{}return [...r]}function eo(e,t){let r=new Set([t]);try{let n=new URL(t),o=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{o.push(new URL(e.targetOrigin).origin);}catch{}for(let i of o)try{r.add(new URL(i).origin+n.pathname+n.search);}catch{}r.add(n.pathname+n.search);}catch{}return [...r]}function Hr(e,t){let r=e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/"?e.targetOrigin:"https://relative.invalid/";try{let n=new URL(t,r);return Ue(e.outputDir,n.pathname)}catch{return null}}function to(e,t,r){for(let n of eo(e,r)){let s=t[n];if(!s)continue;let o=Hr(e,s);if(o)return {outputPath:o,publicUrl:s}}return null}function ro(e,t,r){for(let n of De(e,r)){let s=t[n];if(!s)continue;let o=Hr(e,s);if(o)return o}return null}function Te(e,t,r){let n=ro(e,t,r);if(n)return n;try{return ot(e,r).originalFilePath}catch{return null}}function no(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?w.join(w.resolve(e),"queue-runner-heartbeat.json"):""}async function kt(e){let t=no();if(t)try{let r=await T.readFile(t,"utf8"),n=JSON.parse(r);if(!n||typeof n!="object")return;await T.writeFile(t,JSON.stringify({...n,checkedAt:new Date().toISOString(),status:"running",currentStep:"rewrite",message:e},null,2),"utf8");}catch{}}function so(e,t){let r=new Set;for(let n of t.donePages)r.add(w.resolve(te(e,n)));for(let n of t.doneAssets){let s=Te(e,t.assetMap,n);!s||!ge(s)||r.add(w.resolve(s));}for(let n of t.doneSitemaps){let s=Te(e,t.assetMap,n);!s||!ge(s)||r.add(w.resolve(s));}return [...r]}var rt="re:",Xe=new Map;function oo(e){if(!e.startsWith(rt))return null;let t=Xe.get(e);if(t!==void 0)return t||null;let r=e.slice(rt.length).trim();if(!r)return Xe.set(e,false),null;try{let n=new RegExp(r);return Xe.set(e,n),n}catch{return console.warn(`[crawl] Ignoring invalid path matcher regex: ${e}`),Xe.set(e,false),null}}function Ut(e,t){let r=oo(t);return r?r.test(e):t.startsWith(rt)?false:e.startsWith(t)}function io(e,t){return t.find(r=>Ut(e,r))}function Jr(e,t){let r=io(t.pathname,e.blockedPathPrefixes);if(r)return r.startsWith(rt)?`blocked path regex: ${r}`:`blocked path prefix: ${r}`;let n=e.blockedSearchFragments.find(s=>t.search.includes(s));return n?`blocked search fragment: ${n}`:null}function ao(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 n of Object.keys(e.extraReplacements||{}))try{r.add(new URL(n).hostname);}catch{}return r}function uo(e,t){return ao(e).has(t.hostname)}function co(e){let t=se(e.trim()).replace(/\\\//g,"/").replace(/^['"]|['"]$/g,"").trim();return t=t.replace(/[)]+$/g,"").trim(),t=t.replace(/;.*$/g,"").trim(),t}function Et(e){let t=se(e).replace(/\\\//g,"/");return /[{}]|\bwindow\.|\blocation\.|\bincludes\(|\?\?null|\+|%7B|%7D|%22|<|>|\s/.test(t)||/[()[\]'"]/.test(t)}function lo(e){let t=se(e).replace(/\\\//g,"/").trim(),r=w.extname(t).toLowerCase();return Wr.has(r)||qr.has(r)?false:/^(?:this|[A-Za-z_$][\w$]*)\.[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/.test(t)}function Pe(e){return $s.some(t=>e.pathname.startsWith(t))}function V(e,t,r=e.sourceOrigin,n,s="url",o=false){let i=co(t);if(!i||i.startsWith("data:")||i.startsWith("blob:")||i.startsWith("mailto:")||i.startsWith("tel:")||i.startsWith("#"))return n?.ignore(s,t,"empty or unsupported scheme",r),null;if(Et(i))return n?.ignore(s,t,"looks like JavaScript/code fragment",r),null;if(lo(i))return n?.ignore(s,t,"looks like JavaScript property access",r),null;try{let c=new URL(i,r);if(Kr(c))return n?.reject(s,t,"malformed URL encoding",r),null;if(!["http:","https:"].includes(c.protocol))return n?.ignore(s,t,"unsupported protocol: ",r),null;if(!uo(e,c))return n?.ignore(s,c.toString(),"host not allowed",r),null;let a=Jr(e,c);if(a&&!(o&&lt(c)))return n?.reject(s,c.toString(),a,r),null;let u=new URL(e.sourceOrigin);return c.protocol=u.protocol,c.host=u.host,c.hash="",c}catch{return n?.reject(s,t,"invalid URL",r),null}}function Kr(e){try{return decodeURIComponent(e.pathname),decodeURIComponent(e.search),decodeURIComponent(e.hash),!1}catch{return true}}function re(e,t,r,n){try{let s=new URL(e);return Kr(s)?(t.reject(r,e,"malformed URL encoding",n),null):Me(s.pathname)===null?(t.reject(r,e,"unsafe URL pathname",n),null):s.protocol!=="http:"&&s.protocol!=="https:"?(t.reject(r,e,`unsupported protocol: ${s.protocol}`,n),null):s}catch{return t.reject(r,e,"invalid URL",n),null}}function Gr(e){return Wr.has(w.extname(e.pathname).toLowerCase())}function ce(e){return Pe(e)?false:qr.has(w.extname(e.pathname).toLowerCase())}function Ee(e){let t=e.pathname.toLowerCase();return t.endsWith(".xml")&&(t.includes("sitemap")||t.endsWith("/sitemap.xml"))}function D(e,t){return !!(Ee(t)||t.pathname==="/robots.txt"||t.pathname==="/llms.txt"||t.pathname.toLowerCase().endsWith(".xsl")||e.assetPathPrefixes.length>0&&e.assetPathPrefixes.some(r=>Ut(t.pathname,r))||Gr(t)||!ce(t)&&!Pe(t))}function te(e,t){let r=new URL(t),n=Me(r.pathname);if(n===null)throw new Error(`Unsafe page URL pathname: ${r.pathname}`);return n.endsWith("/")?n+="index.html":w.extname(n)||(n+="/index.html"),Ue(e.outputDir,n)}function po(e){if(!e.generated404RequestPath)return null;try{let t=new URL(e.generated404RequestPath,e.sourceOrigin);return !t.pathname.endsWith("/")&&w.extname(t.pathname)===""&&(t.pathname+="/"),t.hash="",t.toString()}catch{return null}}function st(e,t){let r=po(e);if(!r)return false;try{return new URL(t,e.sourceOrigin).toString()===r}catch{return false}}function ot(e,t){let r=new URL(t),n=Me(r.pathname);if(n===null)throw new Error(`Unsafe asset URL pathname: ${r.pathname}`);n.endsWith("/")&&(n+="index.html");let s=!!r.search,o=n,i=Ue(e.outputDir,o),c=ht(e.targetOrigin,o),a=`${c}${r.search}`;if(!s)return {originalPathname:o,originalFilePath:i,originalPublicUrl:c,originalPublicUrlWithSearch:a,preferQueryHashed:s};let u=w.extname(n),l=`${u?n.slice(0,-u.length):n}.${we(r.search)}${u||".bin"}`;return {originalPathname:o,originalFilePath:i,originalPublicUrl:c,originalPublicUrlWithSearch:a,preferQueryHashed:s,hashedPathname:l,hashedFilePath:Ue(e.outputDir,l),hashedPublicUrl:ht(e.targetOrigin,l)}}function go(e,t,r,n){let s=re(t,r,"asset",n);return s?ot(e,s.toString()):null}function mo(e,t,r,n,s){t[r]=n;try{let o=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 a of c)try{let u=new URL(a);t[u.origin+o.pathname+o.search]=n;}catch{}try{let a=(()=>{let u=new URL(n,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin);return `${u.pathname}${u.search}`})();t[o.pathname+o.search]=a;}catch{}try{let a=new URL(n,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[o.pathname]=a;}catch{}try{let a=new URL(s,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[o.pathname]=a;}catch{}}catch{}}async function Zr(e){try{return await T.readFile(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}async function Se(e){try{return await T.stat(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}function ho(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 Yr(e){let t=String(e["last-modified"]||"").trim();if(!t)return null;let r=Date.parse(t);return Number.isFinite(r)?r:null}function fo(e,t){let r=Yr(t),n=ho(t),s=e?.mtime.getTime();return r!==null&&Math.abs((s??0)-r)>=1e3||n!==null&&e?.size!==n?false:r!==null||n!==null}async function wo(e,t){if(!t)return;let r=Yr(t);if(r===null)return;let n=await Se(e);if(!n)return;let s=new Date(r);await T.utimes(e,n.atime,s).catch(()=>{});}function Mr(e,t){let r=w.extname(e.pathname).toLowerCase(),n=t["content-type"]||"";return Os.has(r)||Es.some(s=>n.includes(s))&&!n.startsWith("image/")&&!n.includes("font")}function yo(e){try{let t=w.extname(new URL(e).pathname).toLowerCase();return t===".js"||t===".mjs"}catch{return false}}function Ae(e,t){(e.doneAssets.size%25===0||e.doneAssets.size===1||e.doneAssets.size===e.stats.assetsQueued)&&t.progress(`Asset processing progress: processed ${e.doneAssets.size}, discovered ${e.stats.assetsQueued}.`,{doneAssets:e.doneAssets.size,assetsQueued:e.stats.assetsQueued,phase:"download-assets"});}function bo(e){return we(e.toString("base64"),40)}function So(e,t,r){let n=e.assetVariantDigestsByOriginalPath.get(t);if(!n||n.size===0)return false;for(let s of n)if(s!==r)return true;return false}function Po(e,t,r){let n=e.assetVariantDigestsByOriginalPath.get(t);n||(n=new Set,e.assetVariantDigestsByOriginalPath.set(t,n)),n.add(r);}async function Ot(e,t,r,n,s,o,i){let c=ot(e,r),a=bo(n),u=c.originalFilePath,d=c.originalPublicUrlWithSearch;if(c.preferQueryHashed&&c.hashedFilePath&&c.hashedPublicUrl&&So(s,c.originalFilePath,a)){let h=to(e,t,r);h?(u=h.outputPath,d=h.publicUrl):(u=c.hashedFilePath,d=c.hashedPublicUrl);}mo(e,t,r,d,c.originalPublicUrl);let l=ge(u)?Buffer.from(bt(n.toString("utf8"),e,t,u),"utf8"):n,g=await Zr(u),y=false;return (g===null||!g.equals(l))&&(await ye(u,l),y=true),o?.debug(`${y?"Saved":"Skipped unchanged"} asset output ${r}`,{phase:"download-assets",url:r,outputPath:u,bytes:l.length,wroteFile:y}),Po(s,c.originalFilePath,a),await wo(u,i),s.stats.assetsSaved++,o&&(s.stats.assetsSaved%50===0||s.stats.assetsSaved===1)&&o.progress(`Asset progress: saved ${s.stats.assetsSaved}, discovered ${s.stats.assetsQueued}, pending ${s.assetQueue.length}.`,{assetsSaved:s.stats.assetsSaved,assetsQueued:s.stats.assetsQueued,assetQueue:s.assetQueue.length,phase:"download-assets"}),{outputPath:u,publicUrl:d,wroteFile:y}}function Re(e,t,r,n,s){let o=()=>{let l=String(s??"").trim();if(!l)return {discoveredFrom:"",discoveredFromType:"unknown"};if(l==="seed-path"||l==="cli"||l==="generated-404-request-path")return {discoveredFrom:l,discoveredFromType:l};if(/^https?:\/\//i.test(l))try{let g=new URL(l);return Ee(g)?{discoveredFrom:l,discoveredFromType:"sitemap"}:D(e,g)?{discoveredFrom:l,discoveredFromType:"asset"}:ce(g)&&!Pe(g)?{discoveredFrom:l,discoveredFromType:"page"}:{discoveredFrom:l,discoveredFromType:"url"}}catch{return {discoveredFrom:l,discoveredFromType:"url"}}return {discoveredFrom:l,discoveredFromType:"url"}},i=s&&/^https?:\/\//i.test(s)?s:e.sourceOrigin,c=V(e,r,i,n,"page");if(!c)return;if(!ce(c)||Gr(c)){if(D(e,c)){n.info(`Seeded/non-page URL queued as asset: ${c.toString()}`,{url:c.toString(),source:s}),q(e,t,c.toString(),n,s);return}n.reject("page",c.toString(),Pe(c)?"asset/internal path cannot be page":"not page-like",s);return}let a=c.toString(),{discoveredFrom:u,discoveredFromType:d}=o();u&&!t.pageDiscoverySources.has(a)&&t.pageDiscoverySources.set(a,u),!t.donePages.has(a)&&!t.queuedPages.has(a)&&(t.queuedPages.add(a),t.pageQueue.push(a),t.stats.pagesQueued++,n.debug(`Queued discovered page ${a}`,{phase:"discovery",url:a,discoveredFrom:u,discoveredFromType:d,outputPath:te(e,a)}),(t.stats.pagesQueued%25===0||t.stats.pagesQueued===1)&&n.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 q(e,t,r,n,s){let o=s&&/^https?:\/\//i.test(s)?s:e.sourceOrigin,i=V(e,r,o,n,"asset");if(!i)return;if(!D(e,i)){n.reject("asset",i.toString(),"not a safe asset path/prefix",s);return}let c=i.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)&&n.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 nt(e,t,r,n,s){let o=s&&/^https?:\/\//i.test(s)?s:e.sourceOrigin,i=V(e,r,o,n,"sitemap",Qt(s));if(!i)return;if(!Ee(i)){n.reject("sitemap",i.toString(),"not sitemap-like",s);return}let c=i.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)&&n.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 Ro(e){let t=se(e),r=[...t.matchAll(/<url>\s*([\s\S]*?)\s*<\/url>/gi)].map(n=>n[1]);return r.length>0?r.map(n=>{let s=n.match(/<loc>\s*([^<]+?)\s*<\/loc>/i);if(!s?.[1])return null;let o=n.match(/<lastmod>\s*([^<]+?)\s*<\/lastmod>/i);return {loc:s[1].trim(),lastmod:be(o?.[1]??null)}}).filter(n=>!!n):[...t.matchAll(/<loc>\s*([^<]+?)\s*<\/loc>/gi)].map(n=>({loc:n[1].trim(),lastmod:null})).filter(n=>n.loc)}function vo(e){return e.split(",").map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function ko(e){let t=[],r=/url\(\s*(?:"([^"]+)"|'([^']+)'|([^)]*?))\s*\)/gi;for(let n of e.matchAll(r)){let s=e.slice(Math.max(0,n.index-8),n.index);if(/\bnew\s+$/i.test(s))continue;let o=(n[1]||n[2]||n[3]||"").trim();o&&t.push(o);}return t}function Co(e){return e.replace(/<script\b[^>]*>[\s\S]*?<\/script\s*>/gi,"")}function xo(e,t){if(t==="dom-style")return true;let r=(()=>{try{return w.extname(new URL(e).pathname).toLowerCase()}catch{return ""}})();return !(r===".js"||r===".mjs"||r===".map"||t.includes("javascript"))}function tt(e){return e.trim().replace(/\\/g,"/").replace(/^https?:\/\/[^/]+/i,"").replace(/^\/+/,"")}async function Xr(e,t,r,n){let s=[];await T.mkdir(t,{recursive:true});let o=await T.readdir(e,{withFileTypes:true});for(let i of o){let c=w.join(e,i.name),a=w.join(t,i.name);if(i.isDirectory()){s.push(...await Xr(c,a,r,n));continue}await en(c,a,r,n)&&s.push(a);}return s}async function Ao(e,t){try{let[r,n]=await Promise.all([T.stat(e),T.stat(t)]);if(r.size!==n.size)return !1;let[s,o]=await Promise.all([T.readFile(e),T.readFile(t)]);return s.equals(o)}catch{return false}}async function en(e,t,r,n){let s=w.resolve(t);return r.has(s)?(n.debug("Skipped post-crawl copy over crawled page output",{phase:"copy-extra-paths",sourcePath:e,targetPath:t}),false):await Ao(e,t)?(n.debug("Skipped unchanged post-crawl copy target",{phase:"copy-extra-paths",sourcePath:e,targetPath:t}),false):(await T.mkdir(w.dirname(t),{recursive:true}),await T.copyFile(e,t),true)}async function To(e,t,r){let n=Object.entries(e.postCrawlCopyMap||{}).map(([c,a])=>({sourcePath:c.trim(),prefix:String(a||"").trim()}));if(n.length===0)return [];let s=0,o=[],i=new Set([...t.donePages].map(c=>w.resolve(te(e,c))));r.mark("copy-extra-paths");for(let c of n){let a=c.sourcePath,u=c.prefix;if(!a||!u){r.warn("Skipped post-crawl copy mapping with empty key/value",{sourcePath:a,prefixPath:u});continue}let d=Ds(a);if(!d.resolvedPath){r.warn("Skipped post-crawl copy source because alias root is not configured",{sourcePath:a,alias:d.alias||"",requiredEnv:d.requiredEnv||"",prefixPath:u});continue}let l=d.resolvedPath,g=tt(u);if(!g){r.warn("Skipped post-crawl copy mapping with invalid export prefix",{sourcePath:a,prefixPath:u});continue}let y;try{y=await T.stat(l);}catch{r.warn("Skipped post-crawl copy source because it does not exist",{sourcePath:a,sourceAbs:l,prefixPath:u});continue}let h=w.resolve(e.outputDir,g);if(y.isDirectory()){let v=await Xr(l,h,i,r);o.push(...v),s+=v.length,v.length>0&&r.progress(`Copied static directory to export: ${l} -> /${g}`,{phase:"copy-extra-paths",sourcePath:l,targetPath:`/${g}`,copiedItems:s,changedFiles:v.length});continue}let R=w.basename(l),m=u.endsWith("/")?w.join(h,R):h;await en(l,m,i,r)&&(o.push(m),s++,r.progress(`Copied static file to export: ${l} -> /${tt(u.endsWith("/")?`${u}${R}`:u)}`,{phase:"copy-extra-paths",sourcePath:l,targetPath:`/${tt(u.endsWith("/")?`${u}${R}`:u)}`,copiedItems:s}));}return r.endMark("copy-extra-paths",{mappedSources:n.length,copiedItems:s}),o}function Ie(e,t,r,n,s){let o=new Set,i=se(r).replace(/\\\//g,"/"),c=s==="page-html"?Co(i):i,a=xo(t,s);if(a){for(let u of ko(c)){let d=V(e,u,t,n,`${s}:css-url`);d&&D(e,d)&&o.add(d.toString());}for(let u of c.matchAll(/@import\s+(?:url\()?\s*['"]?([^'"\s;]+)['"]?\s*\)?/gi)){let d=V(e,u[1],t,n,`${s}:css-import`);d&&D(e,d)&&o.add(d.toString());}}if(a||s==="page-html")for(let u of c.matchAll(/<\?xml-stylesheet[^>]+href=["']([^"']+)["'][^>]*\?>/gi)){let d=V(e,u[1],t,n,`${s}:xml-stylesheet`);d&&D(e,d)&&o.add(d.toString());}if(s==="page-html")for(let u of lr(i)){let d=u.startsWith("//")?`${new URL(e.sourceOrigin).protocol}${u}`:u;if(Et(d)){n.ignore(`${s}:serialized-url`,d,"looks like JavaScript/code fragment",t);continue}let l=V(e,d,t,n,`${s}:serialized-url`);l&&D(e,l)?o.add(l.toString()):l&&n.ignore("asset",l.toString(),"serialized URL did not pass safe asset path filter",t);}if(s!=="page-html"&&yo(t))for(let u of dr(i)){if(Et(u)||!/\.(?:js|mjs)(?:[?#]|$)/i.test(u))continue;let d=V(e,u,t,n,`${s}:relative-asset`);d&&D(e,d)&&o.add(d.toString());}return [...o]}function tn(e,t,r,n){let s=new Set,o=se(r);for(let i of o.matchAll(/href=["']([^"'#\s][^"']*?)["']/gi)){let c=i[1],a=V(e,c,t,n,"page-link");a&&(Jr(e,a)||ce(a)&&!Pe(a)&&!D(e,a)&&s.add(a.toString()));}return [...s]}async function Ur(e,t,r,n,s,o,i=false,c=[]){let a=new Set(c),u=0,d=new Map,l=(g,y)=>{let h=[y],R=new Set;for(;h.length>0;){let m=h.pop();if(m===g)return true;R.has(m)||(R.add(m),h.push(...d.get(m)??[]));}return false};for(;r.sitemapQueue.length>0;){let g=r.sitemapQueue.shift();r.queuedSitemaps.delete(g);let y=re(g,n,"sitemap","sitemap-queue");if(!y)continue;let h=y.toString();if(r.doneSitemaps.has(h))continue;r.doneSitemaps.add(h),n.sitemap(`Fetching sitemap ${h}`,{url:h});let R=true;try{let m=await t.get(h,{timeout:6e4});if(R=!1,!m.ok()){if(n.skip("sitemap",h,m.status()),i&&!a.has(h))throw new Error(`Required child content-sync sitemap returned HTTP ${m.status()}: ${h}`);continue}let p=await m.body(),v=m.url()||h,A=re(v,n,"sitemap-response",h);if(!A)continue;let x=A.toString();r.successfulSitemaps.add(h),r.successfulSitemaps.add(x),a.has(h)&&(r.resolvedSitemapRoots.add(x),u+=1);let O=await Ot(e,r.assetMap,x,p,r,n);z(s,e,O.outputPath),ae(s,O.outputPath);let I=p.toString("utf8");/<sitemapindex(?:\s|>)/i.test(I)?r.sitemapIndexUrls.add(x):r.sitemapLeafUrls.add(x);let P=Ie(e,x,I,n,"sitemap");for(let S of P)q(e,r,S,n,x);let f=[];for(let S of Ro(I)){let k=V(e,S.loc,x,n,"sitemap-loc",!0);if(!k){if(i)throw new Error(`Content-sync sitemap contains an inadmissible location: ${S.loc}`);continue}if(Ee(k)){if(l(x,k.toString()))throw new Error(`Sitemap index cycle detected: ${x} -> ${k.toString()}`);if(d.has(x)||d.set(x,new Set),d.get(x).add(k.toString()),f.push(k.toString()),i&&r.doneSitemaps.has(k.toString())&&!r.successfulSitemaps.has(k.toString()))throw new Error(`Required child content-sync sitemap was not resolved: ${k.toString()}`);nt(e,r,k.toString(),n,x);}else if(i){if(ce(k)&&!D(e,k)){let F=o.requiredUrls.has(k.toString()),M=o.manifest.pages[k.toString()],N=!!M&&!!await Se(M.outputPath);if(!F&&!N)throw new Error(`Content-sync sitemap coverage is incomplete for ${k.toString()}.`)}n.ignore("sitemap-loc",k.toString(),"content-sync sitemap-only traversal does not enqueue urlset locations",x);}else D(e,k)?q(e,r,k.toString(),n,x):ce(k)?(S.lastmod&&(r.sitemapLastmodByPage[k.toString()]=S.lastmod),Re(e,r,k.toString(),n,x)):n.reject("sitemap-loc",k.toString(),"not page/sitemap/asset-like",x);}o.trackManifest&&(o.manifest.assets[x]={url:x,outputPath:O.outputPath,isText:!0,contentType:m.headers()["content-type"]??"application/xml",cacheControl:At(m.headers()),changeToken:null,tokenSource:null,discoveredAssets:[...new Set([...P,...f])],lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,unreferencedRuns:0,rewriteComplete:!1},await ue(e,o));}catch(m){n.error(`Failed sitemap ${h}`,{url:h,error:String(m)});let p=i&&a.has(h)&&R;if(i&&!p)throw m}}if(i&&a.size>0&&u===0)throw new Error(`None of the configured content-sync sitemap roots could be resolved: ${[...a].join(", ")}`)}async function Io(e,t,r,n,s,o,i){let c=V(e,n,e.sourceOrigin,s,"asset-fetch");if(!c||!D(e,c))return;let a=c.toString();if(r.doneAssets.has(a))return;let u=o.enabled||o.strictTargeted?o.previousManifest.assets[a]:void 0,d=o.trackManifest?await et(e,t,o,a,s):null,l=d?.token??null,g=mr(u?.changeToken,d),y=o.strictTargeted&&(!d?.supported||!d.token)&&hr(e.sourceOrigin,a),h=o.strictTargeted?o.manifest.assets[a]:void 0;if(h?.lastSeenRunId===o.runId&&await Se(h.outputPath)){r.doneAssets.add(a);for(let m of h.discoveredAssets||[])q(e,r,m,s,a);z(i,e,h.outputPath),Ye(i,e,h.outputPath,h.cacheControl),h.isText&&ae(i,h.outputPath),s.info(`Resumed completed content-sync asset ${a}`,{url:a,source:"content-sync-checkpoint"}),Ae(r,s);return}if(u&&(g||y)&&await Se(u.outputPath)){o.manifest.assets[a]={...u,changeToken:l,tokenSource:d?.tokenSource??u.tokenSource,discoveredAssets:[...u.discoveredAssets||[]],lastSeenRunId:o.runId,unreferencedRuns:0},delete o.manifest.pages[a],r.doneAssets.add(a);for(let m of u.discoveredAssets||[])q(e,r,m,s,a);Ye(i,e,u.outputPath,u.cacheControl),s.info(`Reused unchanged trusted asset ${a}.`,{url:a,tokenSource:d?.tokenSource??"unknown",phase:"download-assets",source:g?"asset-change-token-match":"content-sync-release-fingerprint"}),Ae(r,s);return}let R=(m,p={})=>{if(!u||o.strictTargeted)return false;o.manifest.assets[a]={...u,discoveredAssets:[...u.discoveredAssets||[]],lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,unreferencedRuns:0},delete o.manifest.pages[a],r.doneAssets.add(a);for(let v of u.discoveredAssets||[])q(e,r,v,s,a);return s.warn(`Keeping previous incremental asset ${a} after fetch issue.`,{url:a,reason:m,preservedFromPreviousManifest:true,...p,phase:"download-assets"}),Ae(r,s),true};s.asset(`Fetching asset ${a}`,{url:a});try{let m=Te(e,r.assetMap,a),p=m?await Se(m):null;if(m&&p&&!o.strictTargeted)try{let M=await B(`fetch asset headers ${a}`,6e4,()=>t.head(a,{timeout:6e4})),N=M.headers();if(M.ok()&&fo(p,N)){let K=await Zr(m);if(K!==null){let le=M.url()||a,C=re(le,s,"asset-response",a);if(!C)return;let j=C.toString(),U=await Ot(e,r.assetMap,j,K,r,s,N);U.wroteFile&&(z(i,e,U.outputPath),ge(U.outputPath)&&ae(i,U.outputPath));let b=At(N)||u?.cacheControl||null;Ye(i,e,U.outputPath,b),r.doneAssets.add(a),s.info(`Reused existing asset ${a} based on response headers.`,{url:a,filePath:m,lastModified:N["last-modified"]||"",contentLength:N["content-length"]||"",phase:"download-assets"}),Ae(r,s);let E=Mr(c,N),L=u?.discoveredAssets?[...u.discoveredAssets]:[];if(E||u?.isText){let W=K.toString("utf8"),Q=Ie(e,j,W,s,"asset:cached");(Q.length>0||!u)&&(L=Q);for(let fe of L)q(e,r,fe,s,j);}if(o.trackManifest){let W=E||!!u?.isText;o.manifest.assets[a]={url:a,outputPath:U.outputPath,isText:W,contentType:xt(N)||u?.contentType||null,cacheControl:b,changeToken:d?.supported?d.token:null,tokenSource:d?.supported?d.tokenSource??null:null,discoveredAssets:L,lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,unreferencedRuns:0,rewriteComplete:!W},delete o.manifest.pages[a],(o.enabled||o.strictTargeted)&&W&&await ue(e,o);}return}}}catch{}let v=await B(`fetch asset ${a}`,6e4,()=>t.get(a,{timeout:6e4}));if(!v.ok()){if(R(`http-${v.status()}`,{status:v.status()}))return;if(o.strictTargeted)throw new Error(`Required content-sync asset returned HTTP ${v.status()}: ${a}`);s.skip("asset",a,v.status());return}let A=await B(`read asset response ${a}`,6e4,()=>v.body()),x=v.url()||a,O=re(x,s,"asset-response",a);if(!O)return;let I=O.toString(),P=v.headers(),f=await Ot(e,r.assetMap,I,A,r,s,P);f.wroteFile&&(z(i,e,f.outputPath),ge(f.outputPath)&&ae(i,f.outputPath));let S=At(P);Ye(i,e,f.outputPath,S),r.doneAssets.add(a),Ae(r,s);let k=Mr(c,P),F=[];if(k){let M=A.toString("utf8");F=Ie(e,I,M,s,`asset:${w.extname(c.pathname).toLowerCase()||P["content-type"]||"unknown"}`);for(let N of F)q(e,r,N,s,I);}o.trackManifest&&(o.manifest.assets[a]={url:a,outputPath:f.outputPath,isText:k,contentType:xt(P),cacheControl:S,changeToken:d?.supported?d.token:null,tokenSource:d?.supported?d.tokenSource??null:null,discoveredAssets:F,lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,unreferencedRuns:0,rewriteComplete:!k},delete o.manifest.pages[a],(o.enabled||o.strictTargeted)&&k&&await ue(e,o));}catch(m){if(R("fetch-error",{error:String(m)}))return;if(s.error(`Failed asset ${a}`,{url:a,error:String(m)}),o.strictTargeted)throw m}finally{r.doneAssets.has(a)||(r.doneAssets.add(a),Ae(r,s));}}async function Eo(e,t,r,n,s,o){let i=Math.max(1,Number(e.assetDownloadConcurrency||e.concurrency||1)),c=Array.from({length:i},async()=>{for(;r.assetQueue.length>0;){let a=r.assetQueue.shift();a&&(r.queuedAssets.delete(a),await Io(e,t,r,a,n,s,o));}});await Promise.all(c);}function Oo(e){let t=Math.ceil(e/1e3);return `${t} second${t===1?"":"s"}`}function ie(e){return Math.max(6e4,e.navigationTimeoutMs*2,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+15e3)}function je(e){return Math.max(15e3,Math.min(6e4,ie(e)))}function rn(e){return Math.max(15e3,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+1e4)}function Lt(e){return e.stats.pagesCompleted}function $t(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 Ct(e,t,r){let n=$t(e);try{if(n.kill){await n.kill(),t.warn(`Force-killed crawl worker browser after ${r}`,{browserPid:n.pid,reason:r});return}if(n.pid!==null){process.kill(n.pid,"SIGKILL"),t.warn(`Sent SIGKILL to crawl worker browser after ${r}`,{browserPid:n.pid,reason:r});return}t.warn(`Could not resolve crawl worker browser PID after ${r}`,{reason:r});}catch(s){t.error(`Failed to force-kill crawl worker browser after ${r}`,{browserPid:n.pid,reason:r,error:String(s)});}}async function B(e,t,r){let n;try{return await Promise.race([r(),new Promise((s,o)=>{n=globalThis.setTimeout(()=>{o(new Fe(e,t));},t);})])}finally{n!==void 0&&globalThis.clearTimeout(n);}}var Fe=class extends Error{constructor(r,n){super(`${r} timed out after ${Oo(n)}.`);this.operation=r;this.timeoutMs=n;this.name="OperationTimeoutError";}operation;timeoutMs};async function $o(e,t){let r=rn(e);await t.evaluate(async n=>{await new Promise(s=>{let o=0,i=700,c=Date.now(),a=()=>{window.clearInterval(u),window.scrollTo(0,0),s();},u=window.setInterval(()=>{if(Date.now()-c>=n.maxDurationMs){a();return}window.scrollBy(0,i),o+=i;let d=document.body?.scrollHeight||0,l=document.documentElement?.scrollHeight||0,g=Math.max(d,l);o>=g+window.innerHeight&&a();},120);});},{maxDurationMs:r});}async function Mo(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 $o(e,t),await t.waitForTimeout(e.readiness.fallbackWaitMs);}async function Uo(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 nn(e,t){return e.noJavaScriptRenderPathPrefixes.some(r=>Ut(t,r))}async function Lo(e,t,r,n,s=true){let o=new Set;if(s){let c=await t.evaluate(()=>{let a=new Set,u=["href","src","poster","data-src","data-lazy-src","data-original","data-bg","data-background","data-href","data-resource-url"],d=new Set,l=["srcset","data-srcset","data-lazy-srcset"],g=y=>{y.querySelectorAll("*").forEach(h=>{for(let m of u){let p=h.getAttribute(m);p&&a.add(p);}for(let m of l){let p=h.getAttribute(m);p&&p.split(",").forEach(v=>{let A=v.trim().split(/\s+/)[0];A&&a.add(A);});}let R=h.getAttribute("style");R&&d.add(R),h.shadowRoot&&g(h.shadowRoot);});};return g(document),{attrs:[...a],styles:[...d]}});for(let a of c.attrs)for(let u of vo(a)){let d=V(e,u,r,n,"dom-attr");d&&D(e,d)&&o.add(d.toString());}for(let a of c.styles)for(let u of Ie(e,r,a,n,"dom-style"))o.add(u);}let i=await t.content();for(let c of Ie(e,r,i,n,"page-html"))o.add(c);return [...o]}async function Mt(e,t,r,n,s){let o=te(e,t);await ye(o,r,"utf8");let i=await T.stat(o);s?.debug(`Saved page output ${t}`,{phase:"save-pages",url:t,outputPath:o,bytes:i.size}),n.stats.pagesSaved++;let c=Math.min(n.stats.pagesQueued,Lt(n)+1);s&&(n.stats.pagesSaved%10===0||n.stats.pagesSaved===1)&&s.progress(`Page progress: processed ${c}, rendered ${n.stats.pagesRendered}, saved ${n.stats.pagesSaved}, discovered ${n.stats.pagesQueued}.`,{donePages:c,claimedPages:n.donePages.size,pagesRendered:n.stats.pagesRendered,pagesSaved:n.stats.pagesSaved,pagesQueued:n.stats.pagesQueued,pageQueue:n.pageQueue.length,phase:"save-pages"});}function sn(e){let t=Lt(e);return t%5===0||t===1||t===e.stats.pagesQueued}function on(e,t){let r=Lt(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 jo(e){await e.addInitScript(()=>{Object.defineProperty(window,"__WPSUITE_STATIC_EXPORT__",{value:true,writable:false,configurable:true});let t=r=>{if(r==null||String(r)==="")return true;try{let n=new URL(String(r),window.location.href),s=new URL(window.location.href);return n.hash="",s.hash="",n.href===s.href}catch{return false}};try{let r=window.location.assign.bind(window.location),n=window.location.replace.bind(window.location),s=window.location.reload.bind(window.location);Object.defineProperty(window.location,"assign",{configurable:!0,value:o=>{if(t(o)){console.warn("[smartcloud-static-publisher] blocked same-page location.assign",o??"");return}return r(o)}}),Object.defineProperty(window.location,"replace",{configurable:!0,value:o=>{if(t(o)){console.warn("[smartcloud-static-publisher] blocked same-page location.replace",o??"");return}return n(o)}}),Object.defineProperty(window.location,"reload",{configurable:!0,value:()=>{console.warn("[smartcloud-static-publisher] blocked location.reload");}});}catch{}});}async function Do(e,t,r){let n=await e.newContext({viewport:t.viewport,userAgent:"WPSuiteStaticPublisher/0.8 Playwright SitemapOnly",ignoreHTTPSErrors:t.ignoreHttpsErrors,...r?{javaScriptEnabled:false}:{}});return r||await jo(n),n}async function Fo(e,t,r,n,s,o,i,c,a){for(;t.pageQueue.length>0&&!(e.maxPages>0&&t.donePages.size>=e.maxPages);){let u=t.pageQueue.shift();if(!u)break;t.queuedPages.delete(u);try{let d=re(u,r,"page","page-queue");if(!d)continue;let l=d.toString();if(u=l,t.queuedPages.delete(u),t.donePages.has(u))continue;t.donePages.add(u),o.enabled&&o.seenPages.add(u);let g=st(e,u),y=nn(e,d.pathname);if(!ce(d)||D(e,d)||Pe(d)){if(D(e,d)){r.info(`Remote worker redirected non-page URL to asset queue: ${u}`,{url:u,source:"remote-worker-guard"}),q(e,t,u,r,"remote-worker-guard");continue}r.reject("page",u,"guard rejected non-page URL before remote rendering","remote-worker");continue}let h=o.strictTargeted?o.manifest.pages[u]:void 0;if(h?.lastSeenRunId===o.runId&&await Se(h.outputPath)){o.seenPages.add(u);for(let P of h.discoveredAssets||[])q(e,t,P,r,u);z(i,e,h.outputPath),ae(i,h.outputPath),r.info(`Resumed completed content-sync page ${u}`,{url:u,source:"content-sync-checkpoint"});continue}let R=await Qr(e,s,t,o,u,r);if(o.enabled&&n!=="single-url"&&n!=="content-sync"){let P=o.manifest.pages[u];if(R.action==="reuse"&&P){for(let f of P.discoveredAssets)q(e,t,f,r,u);for(let f of P.discoveredPages)Re(e,t,f,r,u);P.lastSeenRunId=o.runId,P.sitemapLastmod=be(t.sitemapLastmodByPage[u])??P.sitemapLastmod,R.changeToken?.supported&&(P.changeToken=R.changeToken.token,P.tokenSource=R.changeToken.tokenSource??P.tokenSource),r.info(`Incremental reuse skipped unchanged page ${u}`,{url:u,mode:"incremental",reason:R.changeToken?.supported===!0?"change-token-match":"sitemap-lastmod-match"});continue}}r.page(`Rendering remotely ${u}`,{url:u,execution:"lambda"});let m=await a.render({sourceOrigin:e.sourceOrigin,url:u,options:{ignoreHttpsErrors:e.ignoreHttpsErrors,javaScriptEnabled:!y,viewport:e.viewport,navigationTimeoutMs:e.navigationTimeoutMs,autoScrollTimeoutMs:rn(e),readiness:e.readiness}}),p=m.page,v=p.finalUrl?re(p.finalUrl,r,"remote-final-response",u)?.toString():void 0;if(n==="content-sync"&&v&&v!==l){if(o.deleteOnMissingUrls.has(u)){await We(e,o,i,u,o.deleteOnMissingUrls),r.info(`Removed stale content-sync archive route redirected to ${v}`,{url:u,finalResponseUrl:v,source:"content-sync-tombstone"});continue}throw new Error(`Required content-sync route redirected outside its planned URL: ${u} -> ${v}`)}let A=p.httpStatus;if(g){if(A!==404){r.error(`Generated 404 request path returned unexpected status for ${u}`,{url:u,expectedStatus:404,status:A,requestPath:e.generated404RequestPath,execution:"lambda"});continue}}else if(A!==null&&A>=400){if(n==="content-sync"&&(A===404||A===410)&&o.deleteOnMissingUrls.has(u)){await We(e,o,i,u,o.deleteOnMissingUrls),r.info(`Removed stale content-sync archive page ${u}`,{url:u,status:A,source:"content-sync-tombstone"});continue}if(n==="content-sync")throw new Error(`Required content-sync route returned HTTP ${A}: ${u}`);r.skip("page",u,A,t.pageDiscoverySources.get(u));continue}t.stats.pagesRendered++;let x=new Set(Ie(e,l,m.html,r,"remote-page-html"));for(let P of [...p.discoveredAssets,...p.networkUrls]){let f=V(e,P,l,r,"remote-render");f&&D(e,f)&&x.add(f.toString());}for(let P of x)q(e,t,P,r,u);let O=n!=="single-url"&&n!=="content-sync"&&!g?[...new Set([...tn(e,u,m.html,r),...p.discoveredPages])]:[];for(let P of O)Re(e,t,P,r,u);for(let P of p.cookies){let f=P.sameSite==="Strict"||P.sameSite==="Lax"||P.sameSite==="None"?P.sameSite:"Unspecified",S=!Number.isFinite(P.expires)||P.expires<=0;c.add({name:P.name,domain:P.domain,path:P.path||"/",expires:S?null:P.expires,session:S,secure:P.secure,httpOnly:P.httpOnly,sameSite:f,partitioned:P.partitioned===!0});}await Mt(e,u,m.html,t,r);let I=te(e,u);z(i,e,I),ae(i,I),o.trackManifest&&(o.manifest.pages[u]={url:u,outputPath:I,contentType:p.contentType?.trim()||null,changeToken:R.changeToken?.supported?R.changeToken.token:null,tokenSource:R.changeToken?.supported?R.changeToken.tokenSource??null:null,sitemapLastmod:be(t.sitemapLastmodByPage[u])??null,discoveredPages:O,discoveredAssets:[...x],lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,rewriteComplete:!1},(o.enabled||o.strictTargeted)&&await ue(e,o)),r.debug(`Remote render completed ${u}`,{url:u,taskId:m.taskId,attempts:m.attempts,execution:"lambda"});}catch(d){if(r.error(`Failed remote page ${u}`,{url:u,error:String(d),execution:"lambda"}),o.strictTargeted)throw d}finally{t.stats.pagesCompleted++,sn(t)&&on(t,r);}}}async function Wo(e,t,r,n,s,o,i,c){let a=await chromium.launch({headless:true}),u=$t(a);u.pid!==null&&r.debug(`Launched crawl worker browser PID ${u.pid}`,{browserPid:u.pid});try{for(;t.pageQueue.length>0;){a||(a=await chromium.launch({headless:!0}),u=$t(a),u.pid!==null&&r.debug(`Relaunched crawl worker browser PID ${u.pid}`,{browserPid:u.pid}));let d=a;if(e.maxPages>0&&t.donePages.size>=e.maxPages)break;let l=t.pageQueue.shift();if(!l)break;t.queuedPages.delete(l);let g=null,y=null,h=!1,R=[],m=new Set;try{let p=re(l,r,"page","page-queue");if(!p)continue;let v=p.toString();if(l=v,t.queuedPages.delete(l),t.donePages.has(l))continue;t.donePages.add(l),o.enabled&&o.seenPages.add(l);let A=st(e,l),x=nn(e,p.pathname);if(!ce(p)||D(e,p)||Pe(p)){if(D(e,p)){r.info(`Worker redirected non-page URL to asset queue: ${l}`,{url:l,source:"worker-guard"}),q(e,t,l,r,"worker-guard");continue}r.reject("page",l,"guard rejected non-page URL before rendering","worker");continue}let O=o.strictTargeted?o.manifest.pages[l]:void 0;if(O?.lastSeenRunId===o.runId&&await Se(O.outputPath)){o.seenPages.add(l);for(let C of O.discoveredAssets||[])q(e,t,C,r,l);z(i,e,O.outputPath),ae(i,O.outputPath),r.info(`Resumed completed content-sync page ${l}`,{url:l,source:"content-sync-checkpoint"});continue}let I=await Qr(e,s,t,o,l,r);if(o.enabled&&n!=="single-url"&&n!=="content-sync"){let C=o.manifest.pages[l];if(I.action==="reuse"&&C){for(let j of C.discoveredAssets)q(e,t,j,r,l);for(let j of C.discoveredPages)Re(e,t,j,r,l);C.lastSeenRunId=o.runId,C.sitemapLastmod=be(t.sitemapLastmodByPage[l])??C.sitemapLastmod,I.changeToken?.supported&&(C.changeToken=I.changeToken.token,C.tokenSource=I.changeToken.tokenSource??C.tokenSource),r.info(`Incremental reuse skipped unchanged page ${l}`,{url:l,mode:"incremental",reason:I.changeToken?.supported===!0?"change-token-match":"sitemap-lastmod-match"});continue}}g=await B(`create page context ${l}`,ie(e),()=>Do(d,e,x)),y=await B(`create page ${l}`,ie(e),()=>g.newPage()),R=await g.cookies();let P=!1,f=new Set;await y.route("**/*",async C=>{let j=C.request();try{let U=V(e,j.url(),e.sourceOrigin,r,"network-request");U&&D(e,U)&&(f.add(U.toString()),q(e,t,U.toString(),r,l));}catch{}if(j.isNavigationRequest()&&j.frame()===y.mainFrame())try{let U=new URL(j.url()),b=new URL(v);if(U.hash="",b.hash="",U.href===b.href){if(P){r.warn(`Blocked same-page navigation/reload for ${l}`,{url:l,requestUrl:j.url()});try{await C.abort("aborted");}catch(E){r.debug(`Ignored canceled route while blocking reload for ${l}`,{url:l,error:String(E)});}return}P=!0;}}catch{}try{await C.continue();}catch(U){r.debug(`Ignored canceled network route for ${l}`,{url:l,requestUrl:j.url(),error:String(U)});}}),y.on("response",C=>{try{let U=V(e,C.url(),e.sourceOrigin,r,"network-response");U&&D(e,U)&&(f.add(U.toString()),q(e,t,U.toString(),r,l));}catch{}let j=C.headerValues("set-cookie").then(U=>{for(let b of U)c.add(yr(b,C.url()));}).catch(()=>{}).then(()=>{});m.add(j),j.finally(()=>m.delete(j));}),r.page(`Rendering ${l}`,{url:l});let S=null,k=null;try{if(S=await y.goto(l,{waitUntil:"domcontentloaded",timeout:e.navigationTimeoutMs}),S&&S.ok())try{k=await B(`read response body ${l}`,ie(e),()=>S.text());}catch{k=null;}}catch(C){r.warn(`Navigation issue for ${l}; saving current DOM if available`,{url:l,error:String(C)});}if(n==="content-sync"&&S){let C=re(S.url(),r,"content-sync-final-response",l)?.toString();if(C&&C!==v){if(o.deleteOnMissingUrls.has(l)){await We(e,o,i,l,o.deleteOnMissingUrls),r.info(`Removed stale content-sync archive route redirected to ${C}`,{url:l,finalResponseUrl:C,source:"content-sync-tombstone"});continue}throw new Error(`Required content-sync route redirected outside its planned URL: ${l} -> ${C}`)}}if(A){let C=S?.status()??null;if(C!==404){r.error(`Generated 404 request path returned unexpected status for ${l}`,{url:l,expectedStatus:404,status:C,requestPath:e.generated404RequestPath});continue}r.info(`Capturing rendered 404 page for ${l}`,{url:l,status:C,outputPath:te(e,l)});}else if(S&&!S.ok()){if(n==="content-sync"&&(S.status()===404||S.status()===410)&&o.deleteOnMissingUrls.has(l)){await We(e,o,i,l,o.deleteOnMissingUrls),r.info(`Removed stale content-sync archive page ${l}`,{url:l,status:S.status(),source:"content-sync-tombstone"}),await y.close();continue}if(n==="content-sync")throw new Error(`Required content-sync route returned HTTP ${S.status()}: ${l}`);r.skip("page",l,S.status(),t.pageDiscoverySources.get(l)),await y.close();continue}x?(r.info(`Rendering without JS execution for ${l}`,{url:l,mode:"no-js"}),await B(`wait for rendered page ${l}`,ie(e),()=>Uo(e,y))):await B(`wait for rendered page ${l}`,ie(e),()=>Mo(e,y)),t.stats.pagesRendered++;let F=await B(`extract rendered assets ${l}`,ie(e),()=>Lo(e,y,v,r,!x));for(let C of F)q(e,t,C,r,l);let M=[...new Set([...F,...f])],N=k??await B(`capture rendered html ${l}`,ie(e),()=>y.content()),K=n!=="single-url"&&n!=="content-sync"&&!A?tn(e,l,N,r):[];if(n!=="single-url"&&n!=="content-sync"&&!A)for(let C of K)Re(e,t,C,r,l);await Mt(e,l,N,t,r);let le=te(e,l);if(z(i,e,le),ae(i,le),o.trackManifest){let C=S?.headers();o.manifest.pages[l]={url:l,outputPath:le,contentType:xt(C),changeToken:I.changeToken?.supported?I.changeToken.token:null,tokenSource:I.changeToken?.supported?I.changeToken.tokenSource??null:null,sitemapLastmod:be(t.sitemapLastmodByPage[l])??null,discoveredPages:K,discoveredAssets:M,lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,rewriteComplete:!1},(o.enabled||o.strictTargeted)&&await ue(e,o);}}catch(p){if(h=p instanceof Fe,o.strictTargeted)throw r.error(`Failed required content-sync page ${l}`,{url:l,error:String(p)}),p;if(h)r.warn(`Skipped partial DOM for timed-out page ${l}`,{url:l,error:String(p),recovery:"recycle-worker-browser"});else try{let v=y?await B(`capture partial html ${l}`,ie(e),()=>y.content()):"";if(v&&v.trim()){await Mt(e,l,v,t,r);let A=te(e,l);if(z(i,e,A),ae(i,A),o.trackManifest){let x=o.manifest.pages[l]??o.previousManifest.pages[l];o.manifest.pages[l]={url:l,outputPath:A,contentType:x?.contentType??null,changeToken:null,tokenSource:null,sitemapLastmod:be(t.sitemapLastmodByPage[l])??x?.sitemapLastmod??null,discoveredPages:x?.discoveredPages?[...x.discoveredPages]:[],discoveredAssets:x?.discoveredAssets?[...x.discoveredAssets]:[],lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,rewriteComplete:!1},(o.enabled||o.strictTargeted)&&await ue(e,o);}r.warn(`Saved partial DOM for ${l}`,{url:l,error:String(p)});}}catch(v){v instanceof Fe&&(h=!0),r.error(`Could not save partial DOM for ${l}`,{url:l,error:String(v)});}r.error(`Failed page ${l}`,{url:l,error:String(p)});}finally{if(!h&&y&&await B(`drain network routes ${l}`,je(e),()=>y.unrouteAll({behavior:"wait"})).catch(p=>{h=!0,r.warn(`Could not drain network routes for ${l}`,{url:l,browserPid:u.pid,error:String(p),recovery:"recycle-worker-browser"});}),h&&(a=null,await Ct(d,r,`page operation timeout for ${l}`),await d.close().catch(()=>{})),m.size>0&&await Promise.allSettled([...m]),!h&&g)try{let p=await g.cookies();c.addAll(br(R,p));}catch{}t.stats.pagesCompleted++,sn(t)&&on(t,r),!h&&y&&await B(`close page ${l}`,je(e),()=>y.close()).catch(p=>{h=!0,r.warn(`Timed out while closing page ${l}`,{url:l,browserPid:u.pid,error:String(p),recovery:"recycle-worker-browser"});}),!h&&g&&await B(`close page context ${l}`,je(e),()=>g.close()).catch(p=>{h=!0,r.warn(`Timed out while closing page context for ${l}`,{url:l,browserPid:u.pid,error:String(p),recovery:"recycle-worker-browser"});}),h&&a===d&&(a=null,await Ct(d,r,`page cleanup timeout for ${l}`),await d.close().catch(()=>{}));}}}finally{if(a){let d=a;await B("close worker browser",je(e),()=>d.close()).catch(l=>(r.warn("Timed out while closing crawl worker browser",{browserPid:u.pid,error:String(l)}),Ct(d,r,"browser.close timeout")));}}}async function qo(e){try{let t=await T.readFile(e),n=(e.endsWith(".gz")?gunzipSync(t):t).toString("utf8").trim();if(!n)return [];try{let s=JSON.parse(n);if(Array.isArray(s))return s;if(s&&typeof s=="object")return [s]}catch{return n.split(/\r?\n/).map(s=>s.trim()).filter(Boolean).map(s=>{try{let o=JSON.parse(s);return o&&typeof o=="object"?o:null}catch{return null}}).filter(s=>s!==null)}return []}catch{return []}}function Lr(e){let t=String(e||"").toLowerCase();return t.includes("timeout")||t.includes("timed out")||t.includes("navigation timeout")}function No(e){let t=String(e?.job?.command||"").trim(),r=String(e?.job?.crawlMode||"full").trim();return t!=="publish"&&t!=="crawl"?false:r!=="incremental"}function _o(e){let t=[e?.archivedAt,e?.job?.endedAt,e?.job?.startedAt];for(let r of t){let n=Date.parse(String(r||""));if(Number.isFinite(n))return n}return 0}async function an(e){try{let t=await T.readFile(e,"utf8"),r=JSON.parse(t);return r&&typeof r=="object"&&!Array.isArray(r)?r:null}catch{return null}}function jr(e){let t=String(e.originalFileName||"").toLowerCase();return t.endsWith("errors.jsonl")?0:t.endsWith("errors.json")?1:2}function Bo(e,t){let r=Array.isArray(t?.artifacts)?t.artifacts.filter(n=>String(n?.role||"").trim()==="errors"&&String(n?.storedFileName||"").trim()!=="").sort((n,s)=>jr(n)-jr(s)).map(n=>w.join(e,String(n.storedFileName))):[];return [...new Set([...r,w.join(e,"errors.jsonl"),w.join(e,"errors.json"),w.join(e,"errors.jsonl.gz"),w.join(e,"errors.json.gz")])]}async function Dr(e){let t=await an(w.join(e,"job.json"));for(let r of Bo(e,t)){let n=await qo(r);if(n.length>0)return n}return []}async function Vo(e){let t=w.join(e.logDir,"archive"),r;try{r=await T.readdir(t);}catch{return ""}let n="",s=0;for(let o of r){let i=w.join(t,o);if(!(await T.stat(i).catch(()=>null))?.isDirectory())continue;let a=await an(w.join(i,"job.json"));if(!No(a))continue;let u=_o(a);u>=s&&(s=u,n=i);}return n}async function zo(e){let t=await Vo(e),r=t!==""?await Dr(t):await Dr(e.logDir),n=new Set;for(let s of r)if(Lr(s.error)||Lr(s.message)){let o=s.url;typeof o=="string"&&o&&n.add(o);}return [...n]}async function Qo(e){let t=[];for(let r of e)if(r.startsWith("@")){let n=r.slice(1),s=await T.readFile(n,"utf8");t.push(...s.split(/\r?\n/).map(o=>o.trim()).filter(o=>o&&!o.startsWith("#")));}else t.push(r);return t}async function Ho(e){if(!e)throw new Error("Content-sync crawl requires an immutable impact plan.");let t=JSON.parse(await T.readFile(e,"utf8"));return Vt(t),t}function Jo(e,t){let r;try{r=new URL(e);}catch{return false}return t.archiveFamilies.some(n=>{let s=new URL(n.url);if(r.origin!==s.origin)return false;if(r.toString()===s.toString())return true;if(r.searchParams.has("paged")&&r.pathname===s.pathname)return /^\d+$/.test(r.searchParams.get("paged")||"");let o=s.pathname.replace(/\/+$/,""),i=r.pathname.slice(o.length).replace(/^\/+/,""),c=String(n.paginationBase||"page").replace(/^\/+|\/+$/g,"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return r.pathname.startsWith(`${o}/`)&&new RegExp(`^${c}/\\d+/?$`).test(i)})}function Le(e,t,r){let n=r==="page"?te(e,t):ot(e,t).originalFilePath;return Z(e.outputDir,n)}async function We(e,t,r,n,s){let o=t.manifest.pages[n];if(!o)return;let i=Z(e.outputDir,o.outputPath);if(!i)throw new Error(`Manifest-owned page path escaped output root: ${n}`);let c=w.resolve(o.outputPath);Object.entries(t.manifest.pages).some(([u,d])=>u!==n&&!s.has(u)&&w.resolve(d.outputPath)===c)||(await T.rm(o.outputPath,{force:true}),r.deletedFiles.add(i),r.revalidateFiles.delete(i)),delete t.manifest.pages[n];}async function Ko(e,t,r,n,s){let o=t.manifest.assets[n];if(!o)return;let i=Z(e.outputDir,o.outputPath);if(!i)throw new Error(`Manifest-owned resource path escaped output root: ${n}`);let c=w.resolve(o.outputPath);Object.entries(t.manifest.assets).some(([u,d])=>u!==n&&!s.has(u)&&w.resolve(d.outputPath)===c)||(await T.rm(o.outputPath,{force:true}),r.deletedFiles.add(i)),delete t.manifest.assets[n];}function Go(e,t){let r=new Set,n=[...t];for(;n.length>0;){let s=n.shift();if(r.has(s))continue;r.add(s);let o=e.assets[s];for(let i of o?.discoveredAssets??[])try{Ee(new URL(i))&&n.push(i);}catch{}}return r}async function Zo(e,t,r,n,s){let o=Go(r.previousManifest,s);for(let i of o){if(t.successfulSitemaps.has(i))continue;let c=r.previousManifest.assets[i];if(!c)continue;let a=Z(e.outputDir,c.outputPath);if(!a)throw new Error(`Manifest-owned sitemap path escaped output root: ${i}`);await T.rm(c.outputPath,{force:true}),n.deletedFiles.add(a),delete r.manifest.assets[i];}await ue(e,r);}async function Yo(e){try{let t=await T.readFile(w.join(e.outputDir,"asset-map.json"),"utf8");return JSON.parse(t)}catch{return {}}}async function Xo(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 T.mkdir(e,{recursive:true}),await Promise.all(t.map(async r=>{try{await T.unlink(w.join(e,r));}catch(n){if(n.code!=="ENOENT")throw n}}));}function Fr(e,t,r,n,s){let o=V(e,r,e.sourceOrigin,n,"manual-url");o&&(Ee(o)?nt(e,t,o.toString(),n,s):D(e,o)?q(e,t,o.toString(),n,s):ce(o)?Re(e,t,o.toString(),n,s):n.reject("manual-url",o.toString(),"not page/sitemap/asset-like",s));}async function un(e=process.argv.slice(2)){let t=[],r=await _e(void 0,{onRemotePublisherConfigDiagnostic:b=>{t.push(b);}}),n=zt(r.sitemapPaths),s=t.at(-1)??null,o=Ms(e),i=o.mode==="content-sync"?await Ho(o.contentSyncPlanPath):null;if(o.resumeRewrite&&o.mode!=="full")throw new Error("--resume-rewrite is only supported for full crawl/publish jobs.");let c=[];o.mode==="retry-timeouts"&&(c=await zo(r)),o.mode==="single-url"&&(c=await Qo(o.urls)),i&&(c=[...i.directRenderUrls,...i.archiveFamilyUrls,...i.resourceRenderUrls]);let a=o.crawlMode==="incremental"&&o.mode==="full",u=a&&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 d=(o.mode==="full"||o.mode==="single-url"||o.mode==="content-sync")&&!o.resumeRewrite,l=o.mode!=="full"||o.resumeRewrite||u,g=l?await Yo(r):{},y=u||o.mode==="single-url"||o.mode==="content-sync"?await Ns(r):_r(),h=new Set(c),R=new Set;if(i){for(let b of i.archiveFamilies)if(b.foundPosts===0)for(let E of b.pageUrls)R.add(E);for(let b of Object.keys(y.pages))Jo(b,i)&&!h.has(b)&&(c.push(b),R.add(b));}let m={enabled:u,trackManifest:d,manifest:It(y),previousManifest:It(y),runId:i?.jobId??`${Date.now()}`,seenPages:new Set,changeTokenCache:new Map,pageChangeTokenPrimePromise:null,manifestSaveChain:Promise.resolve(),strictTargeted:!!i,requiredUrls:h,deleteOnMissingUrls:R};await Xo(r.logDir);let p=new ke(r.logDir,r.logLevel),v=o.remoteRender??r.remoteWorkers?.render?.enabled===true,A=Ar({explicitPath:o.remoteWorkerConfigPath,runtimeDir:qe()}),x=null,O=null,I=Math.max(1,r.concurrency),P=r.remoteWorkers?.rewrite?.enabled===true;if(v&&!o.resumeRewrite||P){if(!A)throw new Error("Remote Lambda workers are enabled, but the runtime directory is unknown. Run through queue-runner with --runtime-dir, set STATIC_PUBLISHER_RUNTIME_DIR, or use --remote-worker-config for a diagnostic run.");let b=await Cr(A);O=new Ge(b);}if(v&&!o.resumeRewrite){if(!O)throw new Error("Remote render worker client was not initialized.");x=new Ze({client:O,jobId:`crawl-${we(m.runId,40)}`,maxAttempts:r.remoteWorkers?.render?.maxAttempts??2,onRetry:b=>{p.warn(`Retrying remote render for ${b.url}`,{url:b.url,attempt:b.attempt,maxAttempts:b.maxAttempts,reason:b.reason,execution:"lambda"});}}),I=Math.max(1,Math.min(100,r.remoteWorkers?.render?.concurrency??r.concurrency)),p.info("Lambda page rendering is enabled.",{remoteWorkerConfigPath:w.resolve(A),concurrency:I,maxAttempts:r.remoteWorkers?.render?.maxAttempts??2,batchSize:1,execution:"lambda"});}if(s){let b={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?p.info("Loaded remote WP Suite publisher configuration.",b):p.warn("Remote WP Suite publisher configuration is unavailable or has no active subscription type.",b);}if(a&&!u){let b="Incremental crawl requires an active remote publisher subscription; refusing to fall back to a destructive full crawl.";throw p.error(b,{requestedMode:o.crawlMode,subscriptionType:r.subscriptionType??null,source:"incremental-subscription-guard"}),await p.flush(),new Error(b)}let f={pageQueue:[],queuedPages:new Set,donePages:new Set,pageDiscoverySources:new Map,assetQueue:[],queuedAssets:new Set,doneAssets:new Set,sitemapQueue:[],queuedSitemaps:new Set,doneSitemaps:new Set,successfulSitemaps:new Set,resolvedSitemapRoots:new Set,sitemapIndexUrls:new Set,sitemapLeafUrls:new Set,sitemapLastmodByPage:{},assetMap:{...g},assetVariantDigestsByOriginalPath:new Map,stats:{pagesQueued:0,pagesRendered:0,pagesCompleted:0,assetsQueued:0,sitemapsQueued:0,assetsSaved:0,pagesSaved:0}},S=qs(),k=new He,F=Us();if(F&&!o.resumeRewrite&&await Je(F,k.artifact()),await Nt(r),await _t(r,{startedAt:new Date().toISOString(),outputDir:w.resolve(r.outputDir)}),l||await T.rm(r.outputDir,{recursive:true,force:true}),await T.mkdir(r.outputDir,{recursive:true}),i){let b=new Set([...i.deleteUrls,...m.deleteOnMissingUrls]);for(let L of i.deleteUrls)await We(r,m,S,L,b);let E=new Set(i.resourceDeleteUrls);for(let L of i.resourceDeleteUrls)await Ko(r,m,S,L,E);}if(o.resumeRewrite)p.info("Resuming final rewrite from existing output.",{phase:"rewrite-text",mode:o.mode,crawlMode:o.crawlMode});else {let b=await request.newContext({ignoreHTTPSErrors:r.ignoreHttpsErrors});try{if(p.mark("discovery"),o.mode==="full"?(n.forEach(L=>nt(r,f,L,p)),await Ur(r,b,f,p,S,m),r.seedPaths.forEach(L=>Fr(r,f,L,p,"seed-path")),r.generated404RequestPath&&Re(r,f,r.generated404RequestPath,p,"generated-404-request-path")):(c.forEach(L=>Fr(r,f,L,p,"cli")),i?.sitemapUrls.forEach(L=>nt(r,f,L,p,"content-sync-impact")),await Ur(r,b,f,p,S,m,o.mode==="content-sync",i?.sitemapUrls??[]),i&&await Zo(r,f,m,S,i.sitemapUrls)),p.endMark("discovery",{pages:f.pageQueue.length,assets:f.assetQueue.length,sitemaps:f.sitemapQueue.length}),p.summary(`Queued ${f.pageQueue.length} pages, ${f.assetQueue.length} assets, ${f.sitemapQueue.length} sitemaps.`,{mode:o.mode,crawlMode:o.crawlMode,queuedPages:f.pageQueue.length,queuedAssets:f.assetQueue.length,queuedSitemaps:f.sitemapQueue.length}),o.mode==="retry-timeouts"&&f.pageQueue.length===0&&f.assetQueue.length===0&&f.sitemapQueue.length===0){p.summary("No timed-out URLs were queued. Skipping retry crawl.",{mode:o.mode,crawlMode:o.crawlMode,queuedPages:0,queuedAssets:0,queuedSitemaps:0}),await p.flush(),F&&await Je(F,k.artifact());return}p.mark("render-pages");let E=Array.from({length:I},()=>x?Fo(r,f,p,o.mode,b,m,S,k,x):Wo(r,f,p,o.mode,b,m,S,k));if(await Promise.all(E),F&&await Je(F,k.artifact()),p.endMark("render-pages",{pages:f.stats.pagesCompleted}),p.mark("download-assets"),p.progress("Asset download phase started.",{phase:"download-assets",doneAssets:f.doneAssets.size,assetsQueued:f.stats.assetsQueued,assetQueue:f.assetQueue.length}),await Vr(r,b,m,[...f.assetQueue],p),await Eo(r,b,f,p,m,S),p.endMark("download-assets",{assets:f.doneAssets.size}),m.enabled&&r.maxPages===0&&(await Js(r,f,m,p,S),o.mode==="full"&&await Ks(r,m,p,S)),o.mode==="full"){let L=await To(r,f,p);for(let W of L)z(S,r,W);}}finally{await B("dispose crawl request context",je(r),()=>b.dispose()).catch(E=>{p.warn("Timed out while disposing crawl request context",{error:String(E)});});}}m.trackManifest&&await ue(r,m),await T.writeFile(w.join(r.outputDir,"asset-map.json"),JSON.stringify(f.assetMap,null,2),"utf8"),JSON.stringify(g,null,2)!==JSON.stringify(f.assetMap,null,2)&&z(S,r,w.join(r.outputDir,"asset-map.json"));let M=o.mode==="single-url"||o.mode==="content-sync"?so(r,f):m.enabled&&!o.resumeRewrite?Gs(r,m,S,g,f.assetMap):void 0;p.mark("rewrite-text");let N=o.mode==="single-url"||o.mode==="content-sync"?`Rewriting text files touched by URL crawl: 0/${M?.length??0}`:"Rewriting text files...";p.progress(N,{phase:"rewrite-text",index:0,totalFiles:M?.length,changedTextFiles:0}),await kt(N);let K=Date.now(),le={files:M,previousAssetMap:g,onStart:({totalFiles:b,workerCount:E})=>{p.info(`Rewrite phase scanning ${b} text files.`,{phase:"rewrite-text",totalFiles:b,workerCount:E});},onProgress:async({index:b,totalFiles:E,changedTextFiles:L,file:W,changed:Q})=>{Q&&z(S,r,w.join(r.outputDir,W)),p.checkpoint(`Rewriting text file ${b}/${E}`,{phase:"rewrite-text",index:b,totalFiles:E,changedTextFiles:L,file:W}),p.debug(`${Q?"Rewrote":"Checked unchanged"} text file ${b}/${E}: ${W}`,{phase:"rewrite-text",index:b,totalFiles:E,changedTextFiles:L,file:W,changed:Q});let fe=Date.now();if(!(b===1||b===E||b%50===0||fe-K>=5e3))return;K=fe;let Ne=`Rewriting text files: ${b}/${E}`;p.progress(Ne,{phase:"rewrite-text",index:b,totalFiles:E,changedTextFiles:L,file:W}),await kt(Ne);}},C=P&&O?await xr(r,f.assetMap,{client:O,jobId:`crawl-${we(m.runId,40)}`,concurrency:r.remoteWorkers?.rewrite?.concurrency??r.rewriteConcurrency,batchSize:r.remoteWorkers?.rewrite?.batchSize??25,maxAttempts:r.remoteWorkers?.rewrite?.maxAttempts??2,onStageProgress:async({index:b,totalFiles:E,file:L})=>{let W=Date.now();if(b!==1&&b!==E&&b%25!==0&&W-K<5e3)return;K=W;let Q=`Staging text files for Lambda rewrite: ${b}/${E}`;p.progress(Q,{phase:"rewrite-stage",index:b,totalFiles:E,file:L,execution:"lambda"}),await kt(Q);},options:le}):await sr(r,f.assetMap,le);m.trackManifest&&(Zs(m,M),await ue(r,m)),p.endMark("rewrite-text",{changedTextFiles:C});let j=i?[...S.deletedFiles].sort():m.enabled&&!o.resumeRewrite?await Xs(r,f,m,S,p):[],U=[...new Set((M||[]).map(b=>Z(r.outputDir,w.isAbsolute(b)?b:w.join(r.outputDir,b))).filter(b=>b!==null))].sort();if(i){let b=[...S.changedFiles].sort(),E=new Set(b),L=new Set(i.directRenderUrls.map($=>Le(r,$,"page")).filter($=>!!$&&E.has($))),W=new Set(i.archiveFamilyUrls.map($=>Le(r,$,"page")).filter($=>!!$&&E.has($))),Q=new Set(i.resourceRenderUrls.map($=>Le(r,$,"asset")).filter($=>!!$&&E.has($))),fe=new Set([...f.sitemapLeafUrls].map($=>Le(r,$,"asset")).filter($=>!!$&&E.has($))),it=new Set([...f.sitemapIndexUrls].map($=>Le(r,$,"asset")).filter($=>!!$&&E.has($))),Ne=new Set([...L,...W,...Q,...fe,...it]),cn=b.filter($=>!Ne.has($)),ln=[...new Set([...i.directRenderUrls,...i.archiveFamilyUrls,...f.resolvedSitemapRoots,...f.sitemapLeafUrls,...f.sitemapIndexUrls,...i.deleteUrls,...i.resourceRenderUrls,...i.resourceDeleteUrls].map($=>{let jt=new URL($);return `${jt.pathname}${jt.search}`}))].sort();await at(r,{schemaVersion:2,generatedAt:new Date().toISOString(),outputDir:w.resolve(r.outputDir),runMode:"content-sync",crawlMode:"incremental",fullSyncRequired:false,changedFiles:b,deletedFiles:j,rewriteTargets:U,revalidateFiles:[...S.revalidateFiles].sort(),consumerId:i.consumerId,fromSequence:i.fromSequence,toSequence:i.toSequence,impactHash:i.impactHash,resolvedSitemapUrls:[...f.resolvedSitemapRoots],uploadGroups:{assets:cn,content:[...L].sort(),listings:[...W].sort(),resources:[...Q].sort(),sitemapLeaves:[...fe].sort(),sitemapIndexes:[...it].reverse()},invalidationPaths:ln});}else await at(r,{schemaVersion:1,generatedAt:new Date().toISOString(),outputDir:w.resolve(r.outputDir),runMode:o.mode,crawlMode:o.crawlMode,fullSyncRequired:!(m.enabled&&!o.resumeRewrite),changedFiles:m.enabled&&!o.resumeRewrite?[...S.changedFiles].sort():[],deletedFiles:m.enabled&&!o.resumeRewrite?j:[],rewriteTargets:m.enabled&&!o.resumeRewrite?U:[],revalidateFiles:[...S.revalidateFiles].sort()});await Bt(r),p.summary(o.resumeRewrite?`Done. Resumed final rewrite over existing output and changed ${C} text files.`:`Done. Rendered ${f.stats.pagesRendered} pages, processed ${f.doneSitemaps.size} sitemaps and ${f.doneAssets.size} assets.`,{mode:o.mode,crawlMode:o.crawlMode,resumeRewrite:o.resumeRewrite,...f.stats,pagesRendered:f.stats.pagesRendered,donePages:f.stats.pagesCompleted,claimedPages:f.donePages.size,doneSitemaps:f.doneSitemaps.size,doneAssets:f.doneAssets.size,changedTextFiles:C}),await p.flush();}un().catch(async e=>{let t=oe(e instanceof Error?e.message:String(e));console.error(t);try{let n=(await _e().catch(()=>null))?.logDir??"logs",s=new ke(n,"debug");s.error(`Unhandled error: ${t}`,e instanceof Error&&e.stack?{stack:oe(e.stack)}:void 0),await s.flush();}catch{}process.exit(1);});