@smart-cloud/publisher-exporter 1.1.78 → 1.1.80

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,17 +1,17 @@
1
- import {request,chromium}from'playwright';import $,{readFile}from'fs/promises';import P from'path';import {gunzipSync}from'zlib';import {setTimeout as setTimeout$1}from'timers/promises';import ks from'fast-glob';import Yr from'mime-types';import Ar,{createHash}from'crypto';import cs from'http';import ls from'https';import {availableParallelism}from'os';import {Worker}from'worker_threads';import {LambdaClient,InvokeCommand}from'@aws-sdk/client-lambda';import {DynamoDBClient,GetItemCommand}from'@aws-sdk/client-dynamodb';import {S3Client,GetObjectCommand,PutObjectCommand,CopyObjectCommand}from'@aws-sdk/client-s3';import {fromTemporaryCredentials}from'@aws-sdk/credential-providers';async function dr(e){await e.addInitScript(()=>{let t=window,r=[],n=new WeakSet,s=new WeakSet;Object.defineProperty(t,"__WPSUITE_STATIC_SERIALIZATION_STATE__",{value:{snapshots:r,runtimeCreatedElements:s},configurable:true});let o=Document.prototype.createElement;Document.prototype.createElement=function(m,h){let f=o.call(this,m,h);return s.add(f),f};let i=u=>{!(u instanceof Element)||n.has(u)||(n.add(u),r.push({host:u,pristine:u.cloneNode(true),sourceOwned:!s.has(u)}));},c=Element.prototype.attachShadow;Element.prototype.attachShadow=function(m){return i(this),c.call(this,m)};let a=new WeakSet,l=u=>{if(typeof u!="object"&&typeof u!="function"||u===null||a.has(u))return u;let m=u;if(typeof m.createRoot!="function")return u;let h=m.createRoot,f=function(b,...p){return i(b),Reflect.apply(h,this,[b,...p])};try{Object.defineProperty(m,"createRoot",{...Object.getOwnPropertyDescriptor(m,"createRoot"),value:f}),a.add(u);}catch{}return u},d=u=>{let m=l(t[u]);try{Object.defineProperty(t,u,{configurable:!0,enumerable:!0,get:()=>m,set:h=>{m=l(h);}});}catch{l(t[u]);}};d("ReactDOM"),d("ReactDOMClient");});}async function Tt(e){return e.evaluate(()=>{let t=window.__WPSUITE_STATIC_SERIALIZATION_STATE__,r=/^data-(?:[a-z0-9]+-)*(?:bound|initialized|mounted|hydrated)$/i;document.querySelectorAll("*").forEach(s=>{for(let o of [...s.attributes])r.test(o.name)&&s.removeAttribute(o.name);}),document.querySelectorAll("script, style, link, iframe").forEach(s=>{t?.runtimeCreatedElements.has(s)&&s.remove();});for(let s of t?.snapshots??[])s.host.isConnected&&(s.sourceOwned?s.host.replaceWith(s.pristine.cloneNode(true)):s.host.remove());return document.querySelectorAll("#wpsuite-consent-root, .grecaptcha-badge, iframe[src*='/recaptcha/']").forEach(s=>s.remove()),document.documentElement.classList.remove("wpsuite-consent-scroll-locked"),document.body.classList.remove("wpsuite-consent-scroll-locked"),`${document.doctype?new XMLSerializer().serializeToString(document.doctype):""}${document.documentElement.outerHTML}`})}var Yn=".deploy-plan.json",Xn="deploy-plan.json",es=".crawl-incomplete.json",ts="crawl-incomplete.json";function pr(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?P.resolve(e):""}function mr(e){let t=String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").trim(),r=P.posix.normalize(t);return !t||!r||r==="."||/^[a-zA-Z]:/.test(r)||r.startsWith("../")||r===".."?null:r}function rs(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:`${P.posix.normalize(r.pathname)}${r.search}`}catch{return null}}function ue(e){return [...new Set(e.map(mr).filter(t=>t!==null))]}function ns(e,t){let r={generatedAt:String(t.generatedAt||new Date().toISOString()),outputDir:P.resolve(e.outputDir),runMode:t.runMode,crawlMode:t.crawlMode,fullSyncRequired:!!t.fullSyncRequired,changedFiles:ue(t.changedFiles||[]),deletedFiles:ue(t.deletedFiles||[]),rewriteTargets:ue(t.rewriteTargets||[]),revalidateFiles:ue(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:ue(t.uploadGroups?.assets||[]),content:ue(t.uploadGroups?.content||[]),listings:ue(t.uploadGroups?.listings||[]),resources:ue(t.uploadGroups?.resources||[]),sitemapLeaves:ue(t.uploadGroups?.sitemapLeaves||[]),sitemapIndexes:ue(t.uploadGroups?.sitemapIndexes||[])},invalidationPaths:[...new Set((t.invalidationPaths||[]).map(rs).filter(n=>n!==null))].sort()}:{schemaVersion:1,...r,runMode:t.runMode}}function gr(e){let t=P.join(P.resolve(e.outputDir),Yn),r=pr();return r?[P.join(r,Xn),t]:[t]}function hr(e){let t=P.join(P.resolve(e.outputDir),es),r=pr();return r?[P.join(r,ts),t]:[t]}function X(e,t){let r=P.resolve(e),n=P.resolve(t),s=P.relative(r,n).replace(/\\/g,"/");return mr(s)}async function At(e,t){let r=ns(e,t);for(let n of gr(e)){await $.mkdir(P.dirname(n),{recursive:true});let s=`${n}.${process.pid}.${Date.now()}.tmp`;await $.writeFile(s,JSON.stringify(r,null,2),"utf8"),await $.rename(s,n);}}async function fr(e){for(let t of gr(e))try{await $.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}async function It(e,t){let r={schemaVersion:1,startedAt:String(t.startedAt||new Date().toISOString()),outputDir:P.resolve(e.outputDir)};for(let n of hr(e)){await $.mkdir(P.dirname(n),{recursive:true});let s=`${n}.${process.pid}.tmp`;await $.writeFile(s,JSON.stringify(r,null,2),"utf8"),await $.rename(s,n);}}async function wr(e){for(let t of hr(e))try{await $.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}function os(e){return new URL(e).pathname.split("/").filter(Boolean).some(r=>{try{return decodeURIComponent(r).endsWith("__trashed")}catch{return r.endsWith("__trashed")}})}function Et(e){return Array.isArray(e)?e.map(Et):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).sort(([t],[r])=>t.localeCompare(r)).map(([t,r])=>[t,Et(r)])):e}function is(e){return JSON.stringify(Et(e))}function as(e){return createHash("sha256").update(is(e)).digest("hex")}function yr(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(as(r)!==t)throw new Error("Content-sync impact plan hash mismatch.");for(let n of [...e.directRenderUrls,...e.deleteUrls,...e.resourceRenderUrls,...e.resourceDeleteUrls])if(os(n))throw new Error(`Content-sync impact contains a WordPress trash alias instead of the last public URL: ${n}`)}var Ot=["/sitemap_index.xml","/wp-sitemap.xml","/sitemap.xml"];function br(e){let t=new Set;for(let r of [...e,...Ot]){let n=String(r||"").trim();n&&t.add(n);}return [...t]}function Mt(e){let t=e.pathname.toLowerCase();return t.endsWith(".xml")&&(t.includes("sitemap")||t.endsWith("/sitemap.xml"))}function Sr(e){if(!e||!/^https?:\/\//i.test(e))return false;try{return Mt(new URL(e))}catch{return false}}function Rr(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function ds(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&&P.extname(o)===""&&(o+="/"),o==="/"?"":o}function $t(e){return !e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).map(([t,r])=>[t.trim(),String(r??"")]).filter(([t])=>t.length>0))}function ps(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=Rr(o.targetOrigin);a&&(i.targetOrigin=a);}let c=$t(o.extraReplacements);if(Object.keys(c).length>0&&(i.extraReplacements=c),o.s3&&typeof o.s3=="object"){let a={},l=o.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&&(i.s3=a);}if(o.cloudFront&&typeof o.cloudFront=="object"){let a={},l=o.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&&(i.cloudFront=a);}t[s]=i;}return t}function Ut(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function ms(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))]:[],l=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}:{},...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 vr(e){let t=e&&typeof e=="object"?e:{},r=Array.isArray(t.rules)?t.rules.map((n,s)=>ms(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 gs(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.batchSize??0),o=Number(r.maxAttempts??0),i=t.rewrite&&typeof t.rewrite=="object"?t.rewrite:{},c=t.deploy&&typeof t.deploy=="object"?t.deploy:{},a=(l,d)=>({enabled:typeof l.enabled=="boolean"?l.enabled:r.enabled===true,concurrency:Math.min(100,Math.max(1,Number(l.concurrency||d.concurrency))),batchSize:Math.min(500,Math.max(1,Number(l.batchSize||d.batchSize))),maxAttempts:Math.min(5,Math.max(1,Number(l.maxAttempts||2)))});return {render:{enabled:r.enabled===true,...Number.isInteger(n)&&n>0?{concurrency:n}:{},batchSize:Number.isInteger(s)&&s>0?Math.min(20,s):5,...Number.isInteger(o)&&o>0?{maxAttempts:Math.min(5,o)}:{}},rewrite:a(i,{concurrency:8,batchSize:25}),deploy:a(c,{concurrency:8,batchSize:50})}}function hs(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 Lt(e){let t=e&&typeof e=="object"?e:{},r=String(t.accountId??"").trim(),n=String(t.siteId??"").trim(),s=t.subscriber===true,o=hs(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 l=String(t.runtimeToken??t.nonce??"").trim();l&&(c.runtimeToken=l);let d=String(t.virtualAssetBaseUrl??t.uploadUrl??"").trim();d&&(c.virtualAssetBaseUrl=d),Object.keys(i).length>0&&(c.siteSettings=i);let u=Ut(t.subscriptionType);return u&&(c.subscriptionType=u),c}function fs(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function kr(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function ws(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 Cr(e,t,r=5){let n=new URL(kr(e)),s=String(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase(),o=n.protocol==="http:"?cs:ls,i=ws(e,t);return await new Promise((c,a)=>{let l=o.request(n,{method:s,headers:Object.fromEntries(i.entries()),...n.protocol==="https:"?{rejectUnauthorized:false}:{}},d=>{let u=[];d.on("data",m=>{u.push(Buffer.isBuffer(m)?m:Buffer.from(m));}),d.on("error",a),d.on("end",()=>{let m=d.statusCode??0,h=d.headers.location;if(r>0&&h&&[301,302,303,307,308].includes(m)){c(Cr(new URL(h,n),{method:m===303?"GET":s},r-1));return}let f=new Headers;for(let[b,p]of Object.entries(d.headers))Array.isArray(p)?f.set(b,p.join(", ")):typeof p=="string"&&f.set(b,p);c(new Response(Buffer.concat(u),{status:m,statusText:d.statusMessage??"",headers:f}));});});l.on("error",a),l.end();})}function ys(e){let t=Lt(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;fs(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 bs(e){let t=String(e.wpsuite?.virtualAssetBaseUrl??e.wpsuite?.uploadUrl??"").trim();if(!ys(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,l)=>{let d=kr(a);if(d.startsWith(t)){let u=(()=>{try{return new URL(d).pathname}catch{return d}})();try{let m=e.ignoreHttpsErrors&&d.startsWith("https://")?await Cr(a,l):await r(a,l);return n.push({path:u,status:m.status,ok:m.ok,error:null}),m}catch(m){throw n.push({path:u,status:null,ok:!1,error:m instanceof Error?m.message:String(m)}),m}}return r(a,l)}));let{getConfig:s}=await import('@smart-cloud/wpsuite-core'),o=await s("publisher"),i=o&&typeof o=="object"?o:null,c=Ut(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 Ss(e,t){let r=ps(t?.deploymentProfiles),n=String(t?.defaultDeploymentProfile??"").trim(),s=r[n]?n:"",o=Ut(t?.subscriptionType),i=Lt(e.wpsuite);return {...e,scheduler:vr(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 jt(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 Ps(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?P.resolve(e):""}function Pr(e,t,r){let n=String(t||"").trim();return n&&P.isAbsolute(n)?P.resolve(n):P.resolve(e,jt(n,r))}async function st(e,t={}){let r=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",n=await $.readFile(r,"utf8"),s=JSON.parse(n);s.sourceOrigin=s.sourceOrigin.replace(/\/$/,""),s.targetOrigin=Rr(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=ds(s.generated404RequestPath),s.sitemapPaths||=[...Ot],s.allowedAssetHosts||=[],s.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],s.blockedPathPrefixes||=[],s.blockedSearchFragments||=[],s.pageCache={purgeBeforeCrawl:s.pageCache?.purgeBeforeCrawl===true};let o=Number(s.processingConcurrency)>0?Math.min(100,Math.max(1,Number(s.processingConcurrency))):null;s.concurrency=o??s.concurrency??1,s.maxPages||=0,s.extraReplacements=$t(s.extraReplacements),s.postCrawlCopyMap=$t(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=o??(Number(s.assetDownloadConcurrency)>0?Number(s.assetDownloadConcurrency):s.concurrency),s.rewriteConcurrency=o??(Number(s.rewriteConcurrency)>0?Number(s.rewriteConcurrency):s.assetDownloadConcurrency),s.wpsuite=Lt(s.wpsuite),s.scheduler=vr(void 0),s.remoteWorkers=gs(s.remoteWorkers),typeof s.lambdaDelegationEnabled=="boolean"&&(s.remoteWorkers.render??={},s.remoteWorkers.rewrite??={},s.remoteWorkers.deploy??={},s.remoteWorkers.render.enabled=s.lambdaDelegationEnabled,s.remoteWorkers.rewrite.enabled=s.lambdaDelegationEnabled,s.remoteWorkers.deploy.enabled=s.lambdaDelegationEnabled),o!==null&&(s.processingConcurrency=o,s.remoteWorkers.render??={},s.remoteWorkers.rewrite??={},s.remoteWorkers.deploy??={},s.remoteWorkers.render.concurrency=o,s.remoteWorkers.rewrite.concurrency=o,s.remoteWorkers.deploy.concurrency=o),s.deploymentProfiles={},s.defaultDeploymentProfile="",s.deploymentTargetOverride=String(s.deploymentTargetOverride??"").trim();let i=await bs(s);t.onRemotePublisherConfigDiagnostic?.(i.diagnostic);let c=Ss(s,i.remote),a=Ps(),l=a?P.resolve(a,".."):"";return l?(c.outputDir=Pr(l,c.outputDir,"export"),c.logDir=Pr(l,c.logDir,"logs")):(P.isAbsolute(c.outputDir)||(c.outputDir=jt(c.outputDir,"export")),P.isAbsolute(c.logDir)||(c.logDir=jt(c.logDir,"logs"))),c}function ce(e,t=10){return Ar.createHash("sha1").update(e).digest("hex").slice(0,t)}async function Rs(e){await $.mkdir(P.dirname(e),{recursive:true});}async function be(e,t,r){await Rs(e);let n=P.join(P.dirname(e),`.${P.basename(e)}.${process.pid}.${Date.now()}.${Ar.randomBytes(6).toString("hex")}.tmp`);try{typeof t=="string"?await $.writeFile(n,t,r??"utf8"):await $.writeFile(n,t),await $.rename(n,e);}catch(s){throw await $.unlink(n).catch(()=>{}),s}}function le(e){return [".html",".htm",".css",".js",".mjs",".json",".xml",".xsl",".txt",".svg",".map",".enc",".jws"].includes(P.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 je(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function ot(e){return e.replace(/\//g,"\\/")}function xr(e){return e.replace(/\//g,"\\\\/")}function vs(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 Tr(e,t,r){if(!t)return;e[t]=r;let n=ot(t),s=ot(r);e[n]=s;let o=xr(t),i=xr(r);e[o]=i;let c=je(t),a=je(r);e[c]=a;let l=je(n),d=je(s);e[l]=d;let u=je(o),m=je(i);e[u]=m;}function it(e,t,r){Tr(e,t,r);let n=vs(t);n&&n!==t&&Tr(e,n,r);}function Dt(e,t){let r=t.startsWith("/")?t:`/${t}`,n=(e||"").replace(/\/$/,"");return !n||n==="."||n==="/"?r:`${n}${r}`}function Ir(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function Er(e,t,r){if(!t)return r;let n=P.dirname(P.resolve(t)),s=P.resolve(e,r.replace(/^\/+/,"")),o=P.relative(n,s).replace(/\\/g,"/");return o?(o.startsWith(".")||(o=`./${o}`),o):"."}async function qt(e,t){return (t?[...new Set(t)].map(n=>P.resolve(n)).filter(n=>n.startsWith(P.resolve(e.outputDir))).map(n=>P.relative(e.outputDir,n).replace(/\\/g,"/")).filter(n=>n.length>0):await ks(["**/*"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(n=>n!=="asset-map.json"&&le(n))}var As=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],Is=new Set([".html",".htm"]),Or="WPSuite.io Static Publisher",Es=Or.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function Os(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ms(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function $s(e,t,r){return Ms(t)?e.replace(new RegExp(`(?<!:)${Os(t)}`,"g"),r):e.split(t).join(r)}function js(e,t,r){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let s=P.extname(r).toLowerCase();return Is.has(s)?/<head\b|<html\b|<!doctype html/i.test(t):false}function Us(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${Es}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${Or}" />`;if(e.match(/(\r?\n)([ \t]*)<\/head>/i))return e.replace(/(\r?\n)([ \t]*)<\/head>/i,`$1$2${t}$1$2</head>`);let n=e.includes(`\r
1
+ import {request,chromium}from'playwright';import $,{readFile}from'fs/promises';import S from'path';import {gunzipSync}from'zlib';import {setTimeout as setTimeout$1}from'timers/promises';import ks from'fast-glob';import Yr from'mime-types';import Ar,{createHash}from'crypto';import cs from'http';import ls from'https';import {availableParallelism}from'os';import {Worker}from'worker_threads';import {LambdaClient,InvokeCommand}from'@aws-sdk/client-lambda';import {DynamoDBClient,GetItemCommand}from'@aws-sdk/client-dynamodb';import {S3Client,GetObjectCommand,PutObjectCommand,CopyObjectCommand}from'@aws-sdk/client-s3';import {fromTemporaryCredentials}from'@aws-sdk/credential-providers';async function dr(e){await e.addInitScript(()=>{let t=window,r=[],n=new WeakSet,s=new WeakSet;Object.defineProperty(t,"__WPSUITE_STATIC_SERIALIZATION_STATE__",{value:{snapshots:r,runtimeCreatedElements:s},configurable:true});let o=Document.prototype.createElement;Document.prototype.createElement=function(m,h){let f=o.call(this,m,h);return s.add(f),f};let i=u=>{!(u instanceof Element)||n.has(u)||(n.add(u),r.push({host:u,pristine:u.cloneNode(true),sourceOwned:!s.has(u)}));},c=Element.prototype.attachShadow;Element.prototype.attachShadow=function(m){return i(this),c.call(this,m)};let a=new WeakSet,l=u=>{if(typeof u!="object"&&typeof u!="function"||u===null||a.has(u))return u;let m=u;if(typeof m.createRoot!="function")return u;let h=m.createRoot,f=function(b,...p){return i(b),Reflect.apply(h,this,[b,...p])};try{Object.defineProperty(m,"createRoot",{...Object.getOwnPropertyDescriptor(m,"createRoot"),value:f}),a.add(u);}catch{}return u},d=u=>{let m=l(t[u]);try{Object.defineProperty(t,u,{configurable:!0,enumerable:!0,get:()=>m,set:h=>{m=l(h);}});}catch{l(t[u]);}};d("ReactDOM"),d("ReactDOMClient");});}async function Tt(e){return e.evaluate(()=>{let t=window.__WPSUITE_STATIC_SERIALIZATION_STATE__,r=/^data-(?:[a-z0-9]+-)*(?:bound|initialized|mounted|hydrated)$/i;document.querySelectorAll("*").forEach(s=>{for(let o of [...s.attributes])r.test(o.name)&&s.removeAttribute(o.name);}),document.querySelectorAll("script, style, link, iframe").forEach(s=>{t?.runtimeCreatedElements.has(s)&&s.remove();});for(let s of t?.snapshots??[])s.host.isConnected&&(s.sourceOwned?s.host.replaceWith(s.pristine.cloneNode(true)):s.host.remove());for(let s of [document.head,document.body])for(let o of [...s.children])t?.runtimeCreatedElements.has(o)&&o.remove();return document.querySelectorAll("#wpsuite-consent-root, .grecaptcha-badge, iframe[src*='/recaptcha/']").forEach(s=>s.remove()),document.documentElement.classList.remove("wpsuite-consent-scroll-locked"),document.body.classList.remove("wpsuite-consent-scroll-locked"),`${document.doctype?new XMLSerializer().serializeToString(document.doctype):""}${document.documentElement.outerHTML}`})}var Yn=".deploy-plan.json",Xn="deploy-plan.json",es=".crawl-incomplete.json",ts="crawl-incomplete.json";function pr(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?S.resolve(e):""}function mr(e){let t=String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").trim(),r=S.posix.normalize(t);return !t||!r||r==="."||/^[a-zA-Z]:/.test(r)||r.startsWith("../")||r===".."?null:r}function rs(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:`${S.posix.normalize(r.pathname)}${r.search}`}catch{return null}}function ue(e){return [...new Set(e.map(mr).filter(t=>t!==null))]}function ns(e,t){let r={generatedAt:String(t.generatedAt||new Date().toISOString()),outputDir:S.resolve(e.outputDir),runMode:t.runMode,crawlMode:t.crawlMode,fullSyncRequired:!!t.fullSyncRequired,changedFiles:ue(t.changedFiles||[]),deletedFiles:ue(t.deletedFiles||[]),rewriteTargets:ue(t.rewriteTargets||[]),revalidateFiles:ue(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:ue(t.uploadGroups?.assets||[]),content:ue(t.uploadGroups?.content||[]),listings:ue(t.uploadGroups?.listings||[]),resources:ue(t.uploadGroups?.resources||[]),sitemapLeaves:ue(t.uploadGroups?.sitemapLeaves||[]),sitemapIndexes:ue(t.uploadGroups?.sitemapIndexes||[])},invalidationPaths:[...new Set((t.invalidationPaths||[]).map(rs).filter(n=>n!==null))].sort()}:{schemaVersion:1,...r,runMode:t.runMode}}function gr(e){let t=S.join(S.resolve(e.outputDir),Yn),r=pr();return r?[S.join(r,Xn),t]:[t]}function hr(e){let t=S.join(S.resolve(e.outputDir),es),r=pr();return r?[S.join(r,ts),t]:[t]}function X(e,t){let r=S.resolve(e),n=S.resolve(t),s=S.relative(r,n).replace(/\\/g,"/");return mr(s)}async function At(e,t){let r=ns(e,t);for(let n of gr(e)){await $.mkdir(S.dirname(n),{recursive:true});let s=`${n}.${process.pid}.${Date.now()}.tmp`;await $.writeFile(s,JSON.stringify(r,null,2),"utf8"),await $.rename(s,n);}}async function fr(e){for(let t of gr(e))try{await $.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}async function It(e,t){let r={schemaVersion:1,startedAt:String(t.startedAt||new Date().toISOString()),outputDir:S.resolve(e.outputDir)};for(let n of hr(e)){await $.mkdir(S.dirname(n),{recursive:true});let s=`${n}.${process.pid}.tmp`;await $.writeFile(s,JSON.stringify(r,null,2),"utf8"),await $.rename(s,n);}}async function wr(e){for(let t of hr(e))try{await $.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}function os(e){return new URL(e).pathname.split("/").filter(Boolean).some(r=>{try{return decodeURIComponent(r).endsWith("__trashed")}catch{return r.endsWith("__trashed")}})}function Et(e){return Array.isArray(e)?e.map(Et):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).sort(([t],[r])=>t.localeCompare(r)).map(([t,r])=>[t,Et(r)])):e}function is(e){return JSON.stringify(Et(e))}function as(e){return createHash("sha256").update(is(e)).digest("hex")}function yr(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(as(r)!==t)throw new Error("Content-sync impact plan hash mismatch.");for(let n of [...e.directRenderUrls,...e.deleteUrls,...e.resourceRenderUrls,...e.resourceDeleteUrls])if(os(n))throw new Error(`Content-sync impact contains a WordPress trash alias instead of the last public URL: ${n}`)}var Ot=["/sitemap_index.xml","/wp-sitemap.xml","/sitemap.xml"];function br(e){let t=new Set;for(let r of [...e,...Ot]){let n=String(r||"").trim();n&&t.add(n);}return [...t]}function Mt(e){let t=e.pathname.toLowerCase();return t.endsWith(".xml")&&(t.includes("sitemap")||t.endsWith("/sitemap.xml"))}function Sr(e){if(!e||!/^https?:\/\//i.test(e))return false;try{return Mt(new URL(e))}catch{return false}}function Rr(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function ds(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&&S.extname(o)===""&&(o+="/"),o==="/"?"":o}function $t(e){return !e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).map(([t,r])=>[t.trim(),String(r??"")]).filter(([t])=>t.length>0))}function ps(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=Rr(o.targetOrigin);a&&(i.targetOrigin=a);}let c=$t(o.extraReplacements);if(Object.keys(c).length>0&&(i.extraReplacements=c),o.s3&&typeof o.s3=="object"){let a={},l=o.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&&(i.s3=a);}if(o.cloudFront&&typeof o.cloudFront=="object"){let a={},l=o.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&&(i.cloudFront=a);}t[s]=i;}return t}function Ut(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function ms(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))]:[],l=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}:{},...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 vr(e){let t=e&&typeof e=="object"?e:{},r=Array.isArray(t.rules)?t.rules.map((n,s)=>ms(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 gs(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.batchSize??0),o=Number(r.maxAttempts??0),i=t.rewrite&&typeof t.rewrite=="object"?t.rewrite:{},c=t.deploy&&typeof t.deploy=="object"?t.deploy:{},a=(l,d)=>({enabled:typeof l.enabled=="boolean"?l.enabled:r.enabled===true,concurrency:Math.min(100,Math.max(1,Number(l.concurrency||d.concurrency))),batchSize:Math.min(500,Math.max(1,Number(l.batchSize||d.batchSize))),maxAttempts:Math.min(5,Math.max(1,Number(l.maxAttempts||2)))});return {render:{enabled:r.enabled===true,...Number.isInteger(n)&&n>0?{concurrency:n}:{},batchSize:Number.isInteger(s)&&s>0?Math.min(20,s):5,...Number.isInteger(o)&&o>0?{maxAttempts:Math.min(5,o)}:{}},rewrite:a(i,{concurrency:8,batchSize:25}),deploy:a(c,{concurrency:8,batchSize:50})}}function hs(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 Lt(e){let t=e&&typeof e=="object"?e:{},r=String(t.accountId??"").trim(),n=String(t.siteId??"").trim(),s=t.subscriber===true,o=hs(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 l=String(t.runtimeToken??t.nonce??"").trim();l&&(c.runtimeToken=l);let d=String(t.virtualAssetBaseUrl??t.uploadUrl??"").trim();d&&(c.virtualAssetBaseUrl=d),Object.keys(i).length>0&&(c.siteSettings=i);let u=Ut(t.subscriptionType);return u&&(c.subscriptionType=u),c}function fs(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function kr(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function ws(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 Cr(e,t,r=5){let n=new URL(kr(e)),s=String(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase(),o=n.protocol==="http:"?cs:ls,i=ws(e,t);return await new Promise((c,a)=>{let l=o.request(n,{method:s,headers:Object.fromEntries(i.entries()),...n.protocol==="https:"?{rejectUnauthorized:false}:{}},d=>{let u=[];d.on("data",m=>{u.push(Buffer.isBuffer(m)?m:Buffer.from(m));}),d.on("error",a),d.on("end",()=>{let m=d.statusCode??0,h=d.headers.location;if(r>0&&h&&[301,302,303,307,308].includes(m)){c(Cr(new URL(h,n),{method:m===303?"GET":s},r-1));return}let f=new Headers;for(let[b,p]of Object.entries(d.headers))Array.isArray(p)?f.set(b,p.join(", ")):typeof p=="string"&&f.set(b,p);c(new Response(Buffer.concat(u),{status:m,statusText:d.statusMessage??"",headers:f}));});});l.on("error",a),l.end();})}function ys(e){let t=Lt(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;fs(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 bs(e){let t=String(e.wpsuite?.virtualAssetBaseUrl??e.wpsuite?.uploadUrl??"").trim();if(!ys(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,l)=>{let d=kr(a);if(d.startsWith(t)){let u=(()=>{try{return new URL(d).pathname}catch{return d}})();try{let m=e.ignoreHttpsErrors&&d.startsWith("https://")?await Cr(a,l):await r(a,l);return n.push({path:u,status:m.status,ok:m.ok,error:null}),m}catch(m){throw n.push({path:u,status:null,ok:!1,error:m instanceof Error?m.message:String(m)}),m}}return r(a,l)}));let{getConfig:s}=await import('@smart-cloud/wpsuite-core'),o=await s("publisher"),i=o&&typeof o=="object"?o:null,c=Ut(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 Ss(e,t){let r=ps(t?.deploymentProfiles),n=String(t?.defaultDeploymentProfile??"").trim(),s=r[n]?n:"",o=Ut(t?.subscriptionType),i=Lt(e.wpsuite);return {...e,scheduler:vr(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 jt(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 Ps(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?S.resolve(e):""}function Pr(e,t,r){let n=String(t||"").trim();return n&&S.isAbsolute(n)?S.resolve(n):S.resolve(e,jt(n,r))}async function st(e,t={}){let r=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",n=await $.readFile(r,"utf8"),s=JSON.parse(n);s.sourceOrigin=s.sourceOrigin.replace(/\/$/,""),s.targetOrigin=Rr(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=ds(s.generated404RequestPath),s.sitemapPaths||=[...Ot],s.allowedAssetHosts||=[],s.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],s.blockedPathPrefixes||=[],s.blockedSearchFragments||=[],s.pageCache={purgeBeforeCrawl:s.pageCache?.purgeBeforeCrawl===true};let o=Number(s.processingConcurrency)>0?Math.min(100,Math.max(1,Number(s.processingConcurrency))):null;s.concurrency=o??s.concurrency??1,s.maxPages||=0,s.extraReplacements=$t(s.extraReplacements),s.postCrawlCopyMap=$t(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=o??(Number(s.assetDownloadConcurrency)>0?Number(s.assetDownloadConcurrency):s.concurrency),s.rewriteConcurrency=o??(Number(s.rewriteConcurrency)>0?Number(s.rewriteConcurrency):s.assetDownloadConcurrency),s.wpsuite=Lt(s.wpsuite),s.scheduler=vr(void 0),s.remoteWorkers=gs(s.remoteWorkers),typeof s.lambdaDelegationEnabled=="boolean"&&(s.remoteWorkers.render??={},s.remoteWorkers.rewrite??={},s.remoteWorkers.deploy??={},s.remoteWorkers.render.enabled=s.lambdaDelegationEnabled,s.remoteWorkers.rewrite.enabled=s.lambdaDelegationEnabled,s.remoteWorkers.deploy.enabled=s.lambdaDelegationEnabled),o!==null&&(s.processingConcurrency=o,s.remoteWorkers.render??={},s.remoteWorkers.rewrite??={},s.remoteWorkers.deploy??={},s.remoteWorkers.render.concurrency=o,s.remoteWorkers.rewrite.concurrency=o,s.remoteWorkers.deploy.concurrency=o),s.deploymentProfiles={},s.defaultDeploymentProfile="",s.deploymentTargetOverride=String(s.deploymentTargetOverride??"").trim();let i=await bs(s);t.onRemotePublisherConfigDiagnostic?.(i.diagnostic);let c=Ss(s,i.remote),a=Ps(),l=a?S.resolve(a,".."):"";return l?(c.outputDir=Pr(l,c.outputDir,"export"),c.logDir=Pr(l,c.logDir,"logs")):(S.isAbsolute(c.outputDir)||(c.outputDir=jt(c.outputDir,"export")),S.isAbsolute(c.logDir)||(c.logDir=jt(c.logDir,"logs"))),c}function ce(e,t=10){return Ar.createHash("sha1").update(e).digest("hex").slice(0,t)}async function Rs(e){await $.mkdir(S.dirname(e),{recursive:true});}async function be(e,t,r){await Rs(e);let n=S.join(S.dirname(e),`.${S.basename(e)}.${process.pid}.${Date.now()}.${Ar.randomBytes(6).toString("hex")}.tmp`);try{typeof t=="string"?await $.writeFile(n,t,r??"utf8"):await $.writeFile(n,t),await $.rename(n,e);}catch(s){throw await $.unlink(n).catch(()=>{}),s}}function le(e){return [".html",".htm",".css",".js",".mjs",".json",".xml",".xsl",".txt",".svg",".map",".enc",".jws"].includes(S.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 je(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function ot(e){return e.replace(/\//g,"\\/")}function xr(e){return e.replace(/\//g,"\\\\/")}function vs(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 Tr(e,t,r){if(!t)return;e[t]=r;let n=ot(t),s=ot(r);e[n]=s;let o=xr(t),i=xr(r);e[o]=i;let c=je(t),a=je(r);e[c]=a;let l=je(n),d=je(s);e[l]=d;let u=je(o),m=je(i);e[u]=m;}function it(e,t,r){Tr(e,t,r);let n=vs(t);n&&n!==t&&Tr(e,n,r);}function Dt(e,t){let r=t.startsWith("/")?t:`/${t}`,n=(e||"").replace(/\/$/,"");return !n||n==="."||n==="/"?r:`${n}${r}`}function Ir(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function Er(e,t,r){if(!t)return r;let n=S.dirname(S.resolve(t)),s=S.resolve(e,r.replace(/^\/+/,"")),o=S.relative(n,s).replace(/\\/g,"/");return o?(o.startsWith(".")||(o=`./${o}`),o):"."}async function qt(e,t){return (t?[...new Set(t)].map(n=>S.resolve(n)).filter(n=>n.startsWith(S.resolve(e.outputDir))).map(n=>S.relative(e.outputDir,n).replace(/\\/g,"/")).filter(n=>n.length>0):await ks(["**/*"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(n=>n!=="asset-map.json"&&le(n))}var As=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],Is=new Set([".html",".htm"]),Or="WPSuite.io Static Publisher",Es=Or.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function Os(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ms(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function $s(e,t,r){return Ms(t)?e.replace(new RegExp(`(?<!:)${Os(t)}`,"g"),r):e.split(t).join(r)}function js(e,t,r){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let s=S.extname(r).toLowerCase();return Is.has(s)?/<head\b|<html\b|<!doctype html/i.test(t):false}function Us(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${Es}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${Or}" />`;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,s=>`${s}${n} ${t}`)}function Ls(e){let t=Se(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function Ds(e,t){let r=[...new Set(t)].filter(o=>o.includes("/")&&!/\\+\//.test(o)).map(o=>[o,ot(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,l)=>Ls(a)?`${i}${n(a)}${l}`:o),s}function Fs(e,t){if(!t)return null;let r=P.dirname(P.resolve(t)),n=P.resolve(e.outputDir),s=P.relative(r,n).replace(/\\/g,"/");return s?(s.startsWith(".")||(s=`./${s}`),s.endsWith("/")?s:`${s}/`):"./"}function Ws(e,t,r){let n=Fs(t,r);if(!n)return e;let s=e;for(let o of As){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 l=o.replace(/\//g,"\\/"),d=n.replace(/\//g,"\\/"),u=l.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),m=new RegExp(`(?:\\.{1,}\\\\/)+${u}`,"g"),h=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${u}`,"g"),f=new RegExp(`(?<![\\.\\\\])\\/${u}`,"g");s=s.replace(m,`${d}${l}`).replace(h,`${d}${l}`).replace(f,`${d}${l}`);}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:Ir(t,e.targetOrigin),o=n?`${n.search}${n.hash}`:"";return e.urlRewriteMode==="root-relative"?`${s}${o}`:`${Er(e.outputDir,r,s)}${o}`}function Ft(e,t,r,n,s){it(e,r,Wt(t,n,s));}function qs(e,t,r,n,s){if(!r||r===n)return;it(e,r,n);let o=Wt(t,r,s),i=Wt(t,n,s);it(e,o,i);}function Nt(e,t,r,n,s={}){let o=e,i={};Ft(i,t,t.sourceOrigin,t.targetOrigin,n);for(let[a,l]of Object.entries(t.extraReplacements))Ft(i,t,a,l,n);for(let[a,l]of Object.entries(r))Ft(i,t,a,l,n);for(let[a,l]of Object.entries(s)){let d=r[a];!d||d===l||qs(i,t,l,d,n);}let c=Object.entries(i).sort((a,l)=>l[0].length-a[0].length);for(let[a,l]of c)o=$s(o,a,l);return t.urlRewriteMode!=="absolute"&&(o=Ws(o,t,n)),o=Ds(o,c.map(([,a])=>a)),js(t,o,n)&&(o=Us(o)),o}async function Ns(e,t,r,n){let s=P.join(e.outputDir,n),o=P.extname(s).toLowerCase(),i;try{i=await $.readFile(s,"utf8");}catch(l){if(l.code!=="ENOENT")throw l;return {changed:false}}let a=Nt(i,e,t,o===".js"||o===".mjs"?void 0:s,r);return a!==i?(await be(s,a,"utf8"),{changed:true}):{changed:false}}async function _s(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 Mr(e,t,r={}){let n=await qt(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,l=null;if(i===1){for(let u of n){let m=await Ns(e,t,r.previousAssetMap??{},u);m.changed&&(s+=1),a+=1,await r.onProgress?.({index:a,totalFiles:n.length,changedTextFiles:s,file:u,changed:m.changed});}return s}let d=Array.from({length:i},async()=>{let u=new Worker(new URL("./rewrite-worker.js",import.meta.url),{workerData:{config:e,assetMap:t,previousAssetMap:r.previousAssetMap??{}}});try{for(;!l;){let m=c;if(m>=n.length)return;c+=1;let h=n[m],f=await _s(u,h);f.changed&&(s+=1),a+=1,await r.onProgress?.({index:a,totalFiles:n.length,changedTextFiles:s,file:h,changed:f.changed});}}catch(m){throw l=m instanceof Error?m:new Error(String(m)),l}finally{await u.terminate().catch(()=>{});}});return await Promise.all(d),s}var Ae={error:0,warn:1,info:2,debug:3},Hs=/^(?:authorization|proxyAuthorization|runtimeToken|siteKey|nonce|accessToken|refreshToken|accessKeyId|secretAccessKey|sessionToken|xStaticPublisherToken|xApiKey)$/i;function Pe(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 ut(e){return typeof e=="string"?Pe(e):Array.isArray(e)?e.map(t=>ut(t)):e instanceof Error?{name:e.name,message:Pe(e.message),...e.stack?{stack:Pe(e.stack)}:{}}:e&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,r])=>[t,Hs.test(t)?"[REDACTED]":ut(r)])):e}function _t(e){return e?ut(e):void 0}var $r=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",at=$r?P.join($r,"current-progress.json"):"",jr=Promise.resolve();function Ur(e){return e.includes("crawl")?"crawl":e.includes("deploy")?"deploy":e.includes("invalidate")?"invalidate":e}function Bs(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 l=r[c];if(typeof l=="number"&&typeof a=="number"&&i.has(c)){r[c]=Math.max(l,a);continue}r[c]=a;}return r}function Vs(e,t,r){at&&(jr=jr.then(async()=>{let n=new Date,s=n.toISOString();await $.mkdir(P.dirname(at),{recursive:true});let o=await $.readFile(at,"utf8").then(g=>JSON.parse(g)).catch(()=>null),i=o&&typeof o.details=="object"&&o.details?o.details:{},c=Ur(e),a=o?.currentStep||Ur(o?.source||""),l=o?.startedAt||s,d={...o?.stepDurationsSec??{}},u=o?.stepStartedAt||s;if(a&&a!==c&&o?.stepStartedAt){let g=Math.max(0,Math.round((n.getTime()-new Date(o.stepStartedAt).getTime())/1e3));d[a]=(d[a]??0)+g,u=s;}let m=Math.max(0,Math.round((n.getTime()-new Date(u).getTime())/1e3)),h=Math.max(0,Math.round((n.getTime()-new Date(l).getTime())/1e3)),f=Pe(t),b=_t(r)??{},p={checkedAt:s,source:e,message:f,details:Bs(i,b),startedAt:l,currentStep:c,stepStartedAt:u,stepElapsedSec:m,totalElapsedSec:h,stepDurationsSec:d};await $.writeFile(at,JSON.stringify(p,null,2),"utf8");}).catch(()=>{}));}async function zs(e,t){await $.mkdir(P.dirname(e),{recursive:true}),await $.appendFile(e,`${JSON.stringify(ut(t))}
5
- `,"utf8");}function Qs(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 Ks(e,t,r){let n=_t(r);return {checkedAt:new Date().toISOString(),currentStep:Qs(e,n),level:e,message:Pe(t),details:n??{}}}var Ue=class{constructor(t,r="info"){this.logDir=t;this.level=typeof r=="boolean"?r?"debug":"info":r,this.ensureLogFileReady();}logDir;startedAt=Date.now();marks=new Map;initPromise=null;writeQueue=Promise.resolve();writeError=null;level;get logPath(){return P.join(this.logDir,"crawl.log.jsonl")}get currentEventPath(){return P.join(this.logDir,"current-crawl-event.json")}get rejectedPath(){return P.join(this.logDir,"rejected.jsonl")}get ignoredPath(){return P.join(this.logDir,"ignored.jsonl")}get skippedPath(){return P.join(this.logDir,"skipped-http.jsonl")}get errorsPath(){return P.join(this.logDir,"errors.jsonl")}get timingsPath(){return P.join(this.logDir,"timings.jsonl")}ensureLogFileReady(){return this.initPromise||(this.initPromise=(async()=>{await $.mkdir(this.logDir,{recursive:true}),await $.writeFile(this.logPath,"","utf8");})()),this.initPromise}enqueueTask(t){this.writeQueue=this.writeQueue.then(t).catch(r=>{this.writeError=r instanceof Error?r:new Error(String(r));});}enqueueLine(t){this.enqueueTask(async()=>{await this.ensureLogFileReady(),await $.appendFile(this.logPath,`${t}
6
- `,"utf8");});}enqueueJsonLine(t,r){this.enqueueTask(()=>zs(t,r));}updateCurrentEvent(t,r,n){let s=Ks(t,r,n);this.enqueueTask(async()=>{await $.mkdir(this.logDir,{recursive:true}),await $.writeFile(this.currentEventPath,JSON.stringify(s,null,2),"utf8");});}push(t,r,n){let s=Pe(r),o=_t(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||""):(Ae[this.level]>=Ae.debug||["summary","page","sitemap","asset","timing"].includes(t))&&console.log(s);}info(t,r){this.push("info",t,r);}debug(t,r){Ae[this.level]<Ae.debug||this.push("debug",t,r);}progress(t,r){Vs("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),Ae[this.level]>=Ae.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),Ae[this.level]>=Ae.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 Lr="(?: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 Fr(e){let t=new RegExp(`(?:https?:)?//[^\\s'"<>\\);]+\\.${Lr}(?:[?#][^\\s'"<>\\);]*)?(?=[\\s'"<>\\);]|$)|(?<![A-Za-z0-9._-])/[^\\s'"<>\\);]+\\.${Lr}(?:[?#][^\\s'"<>\\);]*)?(?=[\\s'"<>\\);]|$)`,"gi");return [...e.matchAll(t)].map(r=>r[0])}function Dr(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 Wr(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]&&Dr(o[1])&&r.push({index:o.index??0,value:o[1]});for(let o of e.matchAll(s))o[1]&&Dr(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 qr(e,t){let r=P.relative(t,e);return r===""||!r.startsWith("..")&&!P.isAbsolute(r)}function Nr(e,t,r,n){let s=P.resolve(e),o=P.resolve(t),i=P.extname(s).toLowerCase();return !qr(s,o)||i!==".html"&&i!==".htm"||r.has(s)?false:!n.some(c=>qr(s,P.resolve(c)))}function Ht(e,t){return typeof e=="string"&&e.length>0&&t?.supported===true&&typeof t.token=="string"&&t.token.length>0&&e===t.token}function Bt(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 _r(e){return e<1}function Hr(e){let t=String(e??"").toLowerCase();return t==="strict"?"Strict":t==="lax"?"Lax":t==="none"?"None":"Unspecified"}function Gs(e){let t=e.pathname||"/";if(!t.startsWith("/")||t==="/")return "/";let r=t.lastIndexOf("/");return r<=0?"/":t.slice(0,r)}function Be(e){return `${e.name.toLowerCase()}
4
+ `;return e.replace(/<head\b[^>]*>/i,s=>`${s}${n} ${t}`)}function Ls(e){let t=Se(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function Ds(e,t){let r=[...new Set(t)].filter(o=>o.includes("/")&&!/\\+\//.test(o)).map(o=>[o,ot(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,l)=>Ls(a)?`${i}${n(a)}${l}`:o),s}function Fs(e,t){if(!t)return null;let r=S.dirname(S.resolve(t)),n=S.resolve(e.outputDir),s=S.relative(r,n).replace(/\\/g,"/");return s?(s.startsWith(".")||(s=`./${s}`),s.endsWith("/")?s:`${s}/`):"./"}function Ws(e,t,r){let n=Fs(t,r);if(!n)return e;let s=e;for(let o of As){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 l=o.replace(/\//g,"\\/"),d=n.replace(/\//g,"\\/"),u=l.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),m=new RegExp(`(?:\\.{1,}\\\\/)+${u}`,"g"),h=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${u}`,"g"),f=new RegExp(`(?<![\\.\\\\])\\/${u}`,"g");s=s.replace(m,`${d}${l}`).replace(h,`${d}${l}`).replace(f,`${d}${l}`);}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:Ir(t,e.targetOrigin),o=n?`${n.search}${n.hash}`:"";return e.urlRewriteMode==="root-relative"?`${s}${o}`:`${Er(e.outputDir,r,s)}${o}`}function Ft(e,t,r,n,s){it(e,r,Wt(t,n,s));}function qs(e,t,r,n,s){if(!r||r===n)return;it(e,r,n);let o=Wt(t,r,s),i=Wt(t,n,s);it(e,o,i);}function Nt(e,t,r,n,s={}){let o=e,i={};Ft(i,t,t.sourceOrigin,t.targetOrigin,n);for(let[a,l]of Object.entries(t.extraReplacements))Ft(i,t,a,l,n);for(let[a,l]of Object.entries(r))Ft(i,t,a,l,n);for(let[a,l]of Object.entries(s)){let d=r[a];!d||d===l||qs(i,t,l,d,n);}let c=Object.entries(i).sort((a,l)=>l[0].length-a[0].length);for(let[a,l]of c)o=$s(o,a,l);return t.urlRewriteMode!=="absolute"&&(o=Ws(o,t,n)),o=Ds(o,c.map(([,a])=>a)),js(t,o,n)&&(o=Us(o)),o}async function Ns(e,t,r,n){let s=S.join(e.outputDir,n),o=S.extname(s).toLowerCase(),i;try{i=await $.readFile(s,"utf8");}catch(l){if(l.code!=="ENOENT")throw l;return {changed:false}}let a=Nt(i,e,t,o===".js"||o===".mjs"?void 0:s,r);return a!==i?(await be(s,a,"utf8"),{changed:true}):{changed:false}}async function _s(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 Mr(e,t,r={}){let n=await qt(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,l=null;if(i===1){for(let u of n){let m=await Ns(e,t,r.previousAssetMap??{},u);m.changed&&(s+=1),a+=1,await r.onProgress?.({index:a,totalFiles:n.length,changedTextFiles:s,file:u,changed:m.changed});}return s}let d=Array.from({length:i},async()=>{let u=new Worker(new URL("./rewrite-worker.js",import.meta.url),{workerData:{config:e,assetMap:t,previousAssetMap:r.previousAssetMap??{}}});try{for(;!l;){let m=c;if(m>=n.length)return;c+=1;let h=n[m],f=await _s(u,h);f.changed&&(s+=1),a+=1,await r.onProgress?.({index:a,totalFiles:n.length,changedTextFiles:s,file:h,changed:f.changed});}}catch(m){throw l=m instanceof Error?m:new Error(String(m)),l}finally{await u.terminate().catch(()=>{});}});return await Promise.all(d),s}var Ae={error:0,warn:1,info:2,debug:3},Hs=/^(?:authorization|proxyAuthorization|runtimeToken|siteKey|nonce|accessToken|refreshToken|accessKeyId|secretAccessKey|sessionToken|xStaticPublisherToken|xApiKey)$/i;function Pe(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 ut(e){return typeof e=="string"?Pe(e):Array.isArray(e)?e.map(t=>ut(t)):e instanceof Error?{name:e.name,message:Pe(e.message),...e.stack?{stack:Pe(e.stack)}:{}}:e&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,r])=>[t,Hs.test(t)?"[REDACTED]":ut(r)])):e}function _t(e){return e?ut(e):void 0}var $r=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",at=$r?S.join($r,"current-progress.json"):"",jr=Promise.resolve();function Ur(e){return e.includes("crawl")?"crawl":e.includes("deploy")?"deploy":e.includes("invalidate")?"invalidate":e}function Bs(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 l=r[c];if(typeof l=="number"&&typeof a=="number"&&i.has(c)){r[c]=Math.max(l,a);continue}r[c]=a;}return r}function Vs(e,t,r){at&&(jr=jr.then(async()=>{let n=new Date,s=n.toISOString();await $.mkdir(S.dirname(at),{recursive:true});let o=await $.readFile(at,"utf8").then(g=>JSON.parse(g)).catch(()=>null),i=o&&typeof o.details=="object"&&o.details?o.details:{},c=Ur(e),a=o?.currentStep||Ur(o?.source||""),l=o?.startedAt||s,d={...o?.stepDurationsSec??{}},u=o?.stepStartedAt||s;if(a&&a!==c&&o?.stepStartedAt){let g=Math.max(0,Math.round((n.getTime()-new Date(o.stepStartedAt).getTime())/1e3));d[a]=(d[a]??0)+g,u=s;}let m=Math.max(0,Math.round((n.getTime()-new Date(u).getTime())/1e3)),h=Math.max(0,Math.round((n.getTime()-new Date(l).getTime())/1e3)),f=Pe(t),b=_t(r)??{},p={checkedAt:s,source:e,message:f,details:Bs(i,b),startedAt:l,currentStep:c,stepStartedAt:u,stepElapsedSec:m,totalElapsedSec:h,stepDurationsSec:d};await $.writeFile(at,JSON.stringify(p,null,2),"utf8");}).catch(()=>{}));}async function zs(e,t){await $.mkdir(S.dirname(e),{recursive:true}),await $.appendFile(e,`${JSON.stringify(ut(t))}
5
+ `,"utf8");}function Qs(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 Ks(e,t,r){let n=_t(r);return {checkedAt:new Date().toISOString(),currentStep:Qs(e,n),level:e,message:Pe(t),details:n??{}}}var Ue=class{constructor(t,r="info"){this.logDir=t;this.level=typeof r=="boolean"?r?"debug":"info":r,this.ensureLogFileReady();}logDir;startedAt=Date.now();marks=new Map;initPromise=null;writeQueue=Promise.resolve();writeError=null;level;get logPath(){return S.join(this.logDir,"crawl.log.jsonl")}get currentEventPath(){return S.join(this.logDir,"current-crawl-event.json")}get rejectedPath(){return S.join(this.logDir,"rejected.jsonl")}get ignoredPath(){return S.join(this.logDir,"ignored.jsonl")}get skippedPath(){return S.join(this.logDir,"skipped-http.jsonl")}get errorsPath(){return S.join(this.logDir,"errors.jsonl")}get timingsPath(){return S.join(this.logDir,"timings.jsonl")}ensureLogFileReady(){return this.initPromise||(this.initPromise=(async()=>{await $.mkdir(this.logDir,{recursive:true}),await $.writeFile(this.logPath,"","utf8");})()),this.initPromise}enqueueTask(t){this.writeQueue=this.writeQueue.then(t).catch(r=>{this.writeError=r instanceof Error?r:new Error(String(r));});}enqueueLine(t){this.enqueueTask(async()=>{await this.ensureLogFileReady(),await $.appendFile(this.logPath,`${t}
6
+ `,"utf8");});}enqueueJsonLine(t,r){this.enqueueTask(()=>zs(t,r));}updateCurrentEvent(t,r,n){let s=Ks(t,r,n);this.enqueueTask(async()=>{await $.mkdir(this.logDir,{recursive:true}),await $.writeFile(this.currentEventPath,JSON.stringify(s,null,2),"utf8");});}push(t,r,n){let s=Pe(r),o=_t(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||""):(Ae[this.level]>=Ae.debug||["summary","page","sitemap","asset","timing"].includes(t))&&console.log(s);}info(t,r){this.push("info",t,r);}debug(t,r){Ae[this.level]<Ae.debug||this.push("debug",t,r);}progress(t,r){Vs("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),Ae[this.level]>=Ae.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),Ae[this.level]>=Ae.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 Lr="(?: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 Fr(e){let t=new RegExp(`(?:https?:)?//[^\\s'"<>\\);]+\\.${Lr}(?:[?#][^\\s'"<>\\);]*)?(?=[\\s'"<>\\);]|$)|(?<![A-Za-z0-9._-])/[^\\s'"<>\\);]+\\.${Lr}(?:[?#][^\\s'"<>\\);]*)?(?=[\\s'"<>\\);]|$)`,"gi");return [...e.matchAll(t)].map(r=>r[0])}function Dr(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 Wr(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]&&Dr(o[1])&&r.push({index:o.index??0,value:o[1]});for(let o of e.matchAll(s))o[1]&&Dr(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 qr(e,t){let r=S.relative(t,e);return r===""||!r.startsWith("..")&&!S.isAbsolute(r)}function Nr(e,t,r,n){let s=S.resolve(e),o=S.resolve(t),i=S.extname(s).toLowerCase();return !qr(s,o)||i!==".html"&&i!==".htm"||r.has(s)?false:!n.some(c=>qr(s,S.resolve(c)))}function Ht(e,t){return typeof e=="string"&&e.length>0&&t?.supported===true&&typeof t.token=="string"&&t.token.length>0&&e===t.token}function Bt(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 _r(e){return e<1}function Hr(e){let t=String(e??"").toLowerCase();return t==="strict"?"Strict":t==="lax"?"Lax":t==="none"?"None":"Unspecified"}function Gs(e){let t=e.pathname||"/";if(!t.startsWith("/")||t==="/")return "/";let r=t.lastIndexOf("/");return r<=0?"/":t.slice(0,r)}function Be(e){return `${e.name.toLowerCase()}
7
7
  ${e.domain.toLowerCase()}
8
- ${e.path}`}function Br(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(b=>b<=" "||"=;,".includes(b)))return null;let c=r.hostname.toLowerCase(),a=Gs(r),l=null,d=true,u=false,m=false,h="Unspecified",f=false;for(let b of n){let p=b.indexOf("="),g=(p<0?b:b.slice(0,p)).trim().toLowerCase(),w=p<0?"":b.slice(p+1).trim();if(g==="domain"&&w)c=w.toLowerCase();else if(g==="path"&&w.startsWith("/"))a=w;else if(g==="expires"){let x=Date.parse(w);Number.isFinite(x)&&(l=Math.floor(x/1e3),d=false);}else if(g==="max-age"&&/^-?\d+$/u.test(w)){let x=Number.parseInt(w,10);l=Math.floor(Date.now()/1e3)+x,d=false;}else g==="secure"?u=true:g==="httponly"?m=true:g==="samesite"?h=Hr(w):g==="partitioned"&&(f=true);}return {name:i,domain:c,path:a,expires:l,session:d,secure:u,httpOnly:m,sameSite:h,partitioned:f}}function Zs(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:Hr(e.sameSite),partitioned:e.partitioned===true}}function Vr(e,t){let r=new Map(e.map(n=>[Be(n),n.value]));return t.filter(n=>r.get(Be(n))!==n.value).map(Zs)}function Ys(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 ct=class{#e=new Map;add(t){if(!t)return;let r={...t,domain:t.domain.toLowerCase(),path:t.path||"/"},n=Be(r),s=this.#e.get(n);this.#e.set(n,s?Ys(s,r):r);}addAll(t){for(let r of t)this.add(r);}artifact(){return {schemaVersion:1,observations:[...this.#e.values()].sort((t,r)=>Be(t).localeCompare(Be(r)))}}};async function lt(e,t){await $.mkdir(P.dirname(e),{recursive:true});let r=`${e}.${process.pid}.tmp`;await $.writeFile(r,`${JSON.stringify(t,null,2)}
9
- `,{encoding:"utf8",mode:384}),await $.rename(r,e);}function Ve(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 ze(e,t){let r=Ve(t);if(r===null)throw new Error(`Unsafe output URL pathname: ${t}`);let n=P.resolve(e),s=P.resolve(n,r.replace(/^\/+/,""));if(s!==n&&!s.startsWith(`${n}${P.sep}`))throw new Error(`Output path escapes configured root: ${t}`);return s}var V=1,zr=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;function ee(e,t){let r=String(e??"").trim();if(!zr.test(r))throw new Error(`${t} must match ${zr.source} and be at most 128 characters.`);return r}function Qr(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 Qe(e,...t){let r=Qr(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 ne(e){return createHash("sha256").update(e).digest("hex")}function ge(e,t){let r=String(e??"").replace(/^\/+/,""),n=Qr(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 K(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 co(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!==V)throw new Error(`Remote worker protocol mismatch: expected ${V}, 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:K(t.region,"region"),...K(t.roleArn,"roleArn",{optional:true})?{roleArn:K(t.roleArn,"roleArn")}:{},...K(t.roleSessionName,"roleSessionName",{optional:true})?{roleSessionName:K(t.roleSessionName,"roleSessionName")}:{},workspace:{bucket:K(r.bucket,"workspace.bucket"),prefix:String(r.prefix??"")},...t.status&&typeof t.status=="object"?{status:{tableName:K(t.status.tableName,"status.tableName")}}:{},functions:{render:K(n.render,"functions.render"),...K(n.asset,"functions.asset",{optional:true})?{asset:K(n.asset,"functions.asset")}:{},rewrite:K(n.rewrite,"functions.rewrite"),"deploy-copy":K(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:K(i.id,`targets[${o}].id`),bucketName:K(i.bucketName,`targets[${o}].bucketName`),prefix:String(i.prefix??""),region:K(i.region,`targets[${o}].region`)}}):[],protocolVersion:V}}async function Gr(e){let t=P.resolve(e);try{return co(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 dt=class{config;lambda;s3;dynamodb;#e;constructor(t,r={},n={}){this.config=t;let s=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,...s?{credentials:s}:{},...r}),this.s3=new S3Client({region:t.region,...s?{credentials:s}:{}}),this.dynamodb=t.status?new DynamoDBClient({region:t.region,...s?{credentials:s}:{}}):null,this.#e=n;}async#n(t){if(!this.dynamodb||!this.config.status)return null;let n=(await this.dynamodb.send(new GetItemCommand({TableName:this.config.status.tableName,ConsistentRead:true,Key:{jobId:{S:t.jobId},taskId:{S:t.taskId}}}))).Item;if(!n)return null;let s=n.operation?.S,o=n.status?.S;return !s||!["render","asset","rewrite","deploy-copy"].includes(s)||!o||!["running","succeeded","partial","failed"].includes(o)?null:{jobId:n.jobId?.S??t.jobId,taskId:n.taskId?.S??t.taskId,operation:s,status:o,completedItems:Number(n.completedItems?.N??0),failedItems:Number(n.failedItems?.N??0),totalItems:Number(n.totalItems?.N??0),sequence:Number(n.sequence?.N??0),updatedAt:n.updatedAt?.S??new Date(0).toISOString(),requestId:n.requestId?.S??null}}async#t(t,r){let n=this.lambda.send(new InvokeCommand({FunctionName:r,InvocationType:"RequestResponse",Payload:Buffer.from(JSON.stringify(t),"utf8")}));if(t.operation==="health"||!this.dynamodb||!this.#e.onProgress)return await n;let s=false,o=n.finally(()=>{s=true;}),i=Math.max(500,Math.min(3e4,this.#e.progressPollIntervalMs??2e3)),c=-1;for(;!s;){await Promise.race([o.then(()=>{},()=>{}),new Promise(a=>setTimeout(a,i))]);try{let a=await this.#n(t);a&&a.sequence>c&&(c=a.sequence,await this.#e.onProgress(a));}catch(a){await this.#e.onProgressError?.(a instanceof Error?a:new Error(String(a)));}}return await o}async invoke(t){let r=t.operation==="health"?this.config.functions.render:this.config.functions[t.operation];if(!r)throw new Error(`Remote worker configuration does not provide a ${t.operation} function. Redeploy the Lambda workers and reinstall remote-workers.json.`);let n=await this.#t(t,r),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!==V||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=ge(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=ge(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(ne(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];if(!r)throw new Error(`Remote worker configuration does not provide a ${t} function.`);let n=`${t}-${Date.now()}`,s=await this.lambda.send(new InvokeCommand({FunctionName:r,InvocationType:"RequestResponse",Payload:Buffer.from(JSON.stringify({schemaVersion:V,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=ge(t.key,this.config.workspace.prefix),n=typeof t.body=="string"?Buffer.from(t.body,"utf8"):t.body,s=ne(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}:{}}}async copyWorkspaceObject(t,r){if(t.bucket!==this.config.workspace.bucket)throw new Error(`Remote worker object bucket mismatch: ${t.bucket}.`);let n=ge(t.key,this.config.workspace.prefix),s=ge(r,this.config.workspace.prefix),o=`${t.bucket}/${n.split("/").map(c=>encodeURIComponent(c)).join("/")}`,i=await this.s3.send(new CopyObjectCommand({Bucket:t.bucket,Key:s,CopySource:o,MetadataDirective:"COPY"}));return {...t,key:s,...i.CopyObjectResult?.ETag?{etag:i.CopyObjectResult.ETag}:{},...i.VersionId?{versionId:i.VersionId}:{}}}};function pt(e){return Number.isInteger(e)&&e>=500&&e<=599}var Qt=3;function mt(e){return Math.min(3e4,5e3*2**Math.max(0,e-1))}var re=class extends Error{constructor(r,n,s,o){let i=`Page failed after ${s} attempt(s), last server response HTTP ${n}: ${r}`;super(i+(o&&o!==i?`; ${o}`:""));this.url=r;this.status=n;this.attempts=s;this.name="PageHttpError";}url;status;attempts};function Zr(e){if(e.size===0)return;let t=[...e.values()].slice(0,5).map(r=>`HTTP ${r.status}: ${r.url}`).join("; ");throw new Error(`Crawl incomplete: ${e.size} page(s) failed after HTTP 5xx retries. Deployment is blocked; no complete deploy plan was produced. ${t}`)}function po(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!==V||!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!==r.length)throw new Error("Remote render result has an invalid envelope.");for(let[s,o]of r.entries())if(n.detail.pages[s]?.requestedUrl!==o)throw new Error("Remote render result does not match the requested URLs.");return n}function Kt(e){return e instanceof Error?e.message:String(e)}var gt=class{#e;#n;#t;#s;#u;#c;#l;#r=[];#d=0;#o=0;#i=false;constructor(t){this.#e=t.client,this.#n=ee(t.jobId,"jobId"),this.#t=Math.max(1,Math.min(5,t.maxAttempts??2)),this.#s=t.onRetry,this.#l=t.sleep??setTimeout$1,this.#u=Math.max(1,Math.min(20,t.batchSize??1)),this.#c=Math.max(1,Math.min(100,t.maxConcurrentBatches??1));}async renderBatch(t){let r=[...new Set(t.urls)];if(r.length<1||r.length>20)throw new Error("Remote render batches require between 1 and 20 unique URLs.");let n=new Map,s=new Map,o=new Map,i=new Map,c=r;for(let a=1;a<=this.#t&&c.length>0;a+=1){this.#d+=1;let l=ee(`render-${this.#d}-${ne(c.join(`
8
+ ${e.path}`}function Br(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(b=>b<=" "||"=;,".includes(b)))return null;let c=r.hostname.toLowerCase(),a=Gs(r),l=null,d=true,u=false,m=false,h="Unspecified",f=false;for(let b of n){let p=b.indexOf("="),g=(p<0?b:b.slice(0,p)).trim().toLowerCase(),w=p<0?"":b.slice(p+1).trim();if(g==="domain"&&w)c=w.toLowerCase();else if(g==="path"&&w.startsWith("/"))a=w;else if(g==="expires"){let x=Date.parse(w);Number.isFinite(x)&&(l=Math.floor(x/1e3),d=false);}else if(g==="max-age"&&/^-?\d+$/u.test(w)){let x=Number.parseInt(w,10);l=Math.floor(Date.now()/1e3)+x,d=false;}else g==="secure"?u=true:g==="httponly"?m=true:g==="samesite"?h=Hr(w):g==="partitioned"&&(f=true);}return {name:i,domain:c,path:a,expires:l,session:d,secure:u,httpOnly:m,sameSite:h,partitioned:f}}function Zs(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:Hr(e.sameSite),partitioned:e.partitioned===true}}function Vr(e,t){let r=new Map(e.map(n=>[Be(n),n.value]));return t.filter(n=>r.get(Be(n))!==n.value).map(Zs)}function Ys(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 ct=class{#e=new Map;add(t){if(!t)return;let r={...t,domain:t.domain.toLowerCase(),path:t.path||"/"},n=Be(r),s=this.#e.get(n);this.#e.set(n,s?Ys(s,r):r);}addAll(t){for(let r of t)this.add(r);}artifact(){return {schemaVersion:1,observations:[...this.#e.values()].sort((t,r)=>Be(t).localeCompare(Be(r)))}}};async function lt(e,t){await $.mkdir(S.dirname(e),{recursive:true});let r=`${e}.${process.pid}.tmp`;await $.writeFile(r,`${JSON.stringify(t,null,2)}
9
+ `,{encoding:"utf8",mode:384}),await $.rename(r,e);}function Ve(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 ze(e,t){let r=Ve(t);if(r===null)throw new Error(`Unsafe output URL pathname: ${t}`);let n=S.resolve(e),s=S.resolve(n,r.replace(/^\/+/,""));if(s!==n&&!s.startsWith(`${n}${S.sep}`))throw new Error(`Output path escapes configured root: ${t}`);return s}var V=1,zr=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;function ee(e,t){let r=String(e??"").trim();if(!zr.test(r))throw new Error(`${t} must match ${zr.source} and be at most 128 characters.`);return r}function Qr(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 Qe(e,...t){let r=Qr(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 ne(e){return createHash("sha256").update(e).digest("hex")}function ge(e,t){let r=String(e??"").replace(/^\/+/,""),n=Qr(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 K(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 co(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!==V)throw new Error(`Remote worker protocol mismatch: expected ${V}, 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:K(t.region,"region"),...K(t.roleArn,"roleArn",{optional:true})?{roleArn:K(t.roleArn,"roleArn")}:{},...K(t.roleSessionName,"roleSessionName",{optional:true})?{roleSessionName:K(t.roleSessionName,"roleSessionName")}:{},workspace:{bucket:K(r.bucket,"workspace.bucket"),prefix:String(r.prefix??"")},...t.status&&typeof t.status=="object"?{status:{tableName:K(t.status.tableName,"status.tableName")}}:{},functions:{render:K(n.render,"functions.render"),...K(n.asset,"functions.asset",{optional:true})?{asset:K(n.asset,"functions.asset")}:{},rewrite:K(n.rewrite,"functions.rewrite"),"deploy-copy":K(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:K(i.id,`targets[${o}].id`),bucketName:K(i.bucketName,`targets[${o}].bucketName`),prefix:String(i.prefix??""),region:K(i.region,`targets[${o}].region`)}}):[],protocolVersion:V}}async function Gr(e){let t=S.resolve(e);try{return co(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 dt=class{config;lambda;s3;dynamodb;#e;constructor(t,r={},n={}){this.config=t;let s=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,...s?{credentials:s}:{},...r}),this.s3=new S3Client({region:t.region,...s?{credentials:s}:{}}),this.dynamodb=t.status?new DynamoDBClient({region:t.region,...s?{credentials:s}:{}}):null,this.#e=n;}async#n(t){if(!this.dynamodb||!this.config.status)return null;let n=(await this.dynamodb.send(new GetItemCommand({TableName:this.config.status.tableName,ConsistentRead:true,Key:{jobId:{S:t.jobId},taskId:{S:t.taskId}}}))).Item;if(!n)return null;let s=n.operation?.S,o=n.status?.S;return !s||!["render","asset","rewrite","deploy-copy"].includes(s)||!o||!["running","succeeded","partial","failed"].includes(o)?null:{jobId:n.jobId?.S??t.jobId,taskId:n.taskId?.S??t.taskId,operation:s,status:o,completedItems:Number(n.completedItems?.N??0),failedItems:Number(n.failedItems?.N??0),totalItems:Number(n.totalItems?.N??0),sequence:Number(n.sequence?.N??0),updatedAt:n.updatedAt?.S??new Date(0).toISOString(),requestId:n.requestId?.S??null}}async#t(t,r){let n=this.lambda.send(new InvokeCommand({FunctionName:r,InvocationType:"RequestResponse",Payload:Buffer.from(JSON.stringify(t),"utf8")}));if(t.operation==="health"||!this.dynamodb||!this.#e.onProgress)return await n;let s=false,o=n.finally(()=>{s=true;}),i=Math.max(500,Math.min(3e4,this.#e.progressPollIntervalMs??2e3)),c=-1;for(;!s;){await Promise.race([o.then(()=>{},()=>{}),new Promise(a=>setTimeout(a,i))]);try{let a=await this.#n(t);a&&a.sequence>c&&(c=a.sequence,await this.#e.onProgress(a));}catch(a){await this.#e.onProgressError?.(a instanceof Error?a:new Error(String(a)));}}return await o}async invoke(t){let r=t.operation==="health"?this.config.functions.render:this.config.functions[t.operation];if(!r)throw new Error(`Remote worker configuration does not provide a ${t.operation} function. Redeploy the Lambda workers and reinstall remote-workers.json.`);let n=await this.#t(t,r),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!==V||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=ge(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=ge(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(ne(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];if(!r)throw new Error(`Remote worker configuration does not provide a ${t} function.`);let n=`${t}-${Date.now()}`,s=await this.lambda.send(new InvokeCommand({FunctionName:r,InvocationType:"RequestResponse",Payload:Buffer.from(JSON.stringify({schemaVersion:V,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=ge(t.key,this.config.workspace.prefix),n=typeof t.body=="string"?Buffer.from(t.body,"utf8"):t.body,s=ne(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}:{}}}async copyWorkspaceObject(t,r){if(t.bucket!==this.config.workspace.bucket)throw new Error(`Remote worker object bucket mismatch: ${t.bucket}.`);let n=ge(t.key,this.config.workspace.prefix),s=ge(r,this.config.workspace.prefix),o=`${t.bucket}/${n.split("/").map(c=>encodeURIComponent(c)).join("/")}`,i=await this.s3.send(new CopyObjectCommand({Bucket:t.bucket,Key:s,CopySource:o,MetadataDirective:"COPY"}));return {...t,key:s,...i.CopyObjectResult?.ETag?{etag:i.CopyObjectResult.ETag}:{},...i.VersionId?{versionId:i.VersionId}:{}}}};function pt(e){return Number.isInteger(e)&&e>=500&&e<=599}var Qt=3;function mt(e){return Math.min(3e4,5e3*2**Math.max(0,e-1))}var re=class extends Error{constructor(r,n,s,o){let i=`Page failed after ${s} attempt(s), last server response HTTP ${n}: ${r}`;super(i+(o&&o!==i?`; ${o}`:""));this.url=r;this.status=n;this.attempts=s;this.name="PageHttpError";}url;status;attempts};function Zr(e){if(e.size===0)return;let t=[...e.values()].slice(0,5).map(r=>`HTTP ${r.status}: ${r.url}`).join("; ");throw new Error(`Crawl incomplete: ${e.size} page(s) failed after HTTP 5xx retries. Deployment is blocked; no complete deploy plan was produced. ${t}`)}function po(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!==V||!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!==r.length)throw new Error("Remote render result has an invalid envelope.");for(let[s,o]of r.entries())if(n.detail.pages[s]?.requestedUrl!==o)throw new Error("Remote render result does not match the requested URLs.");return n}function Kt(e){return e instanceof Error?e.message:String(e)}var gt=class{#e;#n;#t;#s;#u;#c;#l;#r=[];#d=0;#o=0;#i=false;constructor(t){this.#e=t.client,this.#n=ee(t.jobId,"jobId"),this.#t=Math.max(1,Math.min(5,t.maxAttempts??2)),this.#s=t.onRetry,this.#l=t.sleep??setTimeout$1,this.#u=Math.max(1,Math.min(20,t.batchSize??1)),this.#c=Math.max(1,Math.min(100,t.maxConcurrentBatches??1));}async renderBatch(t){let r=[...new Set(t.urls)];if(r.length<1||r.length>20)throw new Error("Remote render batches require between 1 and 20 unique URLs.");let n=new Map,s=new Map,o=new Map,i=new Map,c=r;for(let a=1;a<=this.#t&&c.length>0;a+=1){this.#d+=1;let l=ee(`render-${this.#d}-${ne(c.join(`
10
10
  `)).slice(0,24)}-a${a}`,"taskId"),d=[];try{let u=await this.#e.invoke({schemaVersion:V,operation:"render",jobId:this.#n,taskId:l,sourceOrigin:new URL(t.sourceOrigin).origin,urls:c,options:t.options}),m=po(await this.#e.readResult(u),u,c);for(let h of m.detail.pages){if(o.delete(h.requestedUrl),pt(h.httpStatus)){let f=h.httpStatus;o.set(h.requestedUrl,f),i.set(h.requestedUrl,f),s.set(h.requestedUrl,new re(h.requestedUrl,f,a).message),d.push(h.requestedUrl);continue}if(h.httpStatus!==null&&h.httpStatus!==void 0)i.delete(h.requestedUrl);else if(i.has(h.requestedUrl)){s.set(h.requestedUrl,h.error||"Remote render returned no HTTP status after a server error."),d.push(h.requestedUrl);continue}if(h.outcome==="failed"||h.outcome==="deferred"||!h.html){let f=h.error||`Remote render ended with ${h.outcome}.`;s.set(h.requestedUrl,f),d.push(h.requestedUrl);continue}try{n.set(h.requestedUrl,{page:h,html:t.downloadHtml===!1?null:await this.#e.readObjectText(h.html),taskId:l,attempts:a}),s.delete(h.requestedUrl);}catch(f){s.set(h.requestedUrl,Kt(f)),d.push(h.requestedUrl);}}}catch(u){let m=Kt(u);for(let h of c)o.delete(h),s.set(h,m),d.push(h);}if(a<this.#t){let u=d.some(m=>o.has(m))?mt(a):0;for(let m of d){let h=o.get(m);this.#s?.({url:m,attempt:a,maxAttempts:this.#t,reason:s.get(m)??"Remote render failed.",...h===void 0?{}:{status:h,delayMs:u}});}u>0&&await this.#l(u);}c=d;}return {pages:r.flatMap(a=>{let l=n.get(a);return l?[l]:[]}),failures:c.map(a=>({url:a,attempts:this.#t,error:s.get(a)??"Remote render failed.",...i.has(a)?{httpStatus:i.get(a)}:{}}))}}async render(t){let r=JSON.stringify({sourceOrigin:new URL(t.sourceOrigin).origin,options:t.options,downloadHtml:t.downloadHtml!==false});return await new Promise((n,s)=>{this.#r.push({input:t,key:r,resolve:n,reject:s}),this.#a();})}#a(){this.#i||this.#r.length===0||(this.#i=true,setTimeout(()=>{this.#i=false,this.#p();},0));}#p(){for(;this.#o<this.#c&&this.#r.length>0;){let t=this.#r.shift();if(!t)break;let r=[t];for(let n=0;n<this.#r.length&&r.length<this.#u;){let s=this.#r[n];s?.key===t.key?(r.push(s),this.#r.splice(n,1)):n+=1;}this.#o+=1,this.renderBatch({sourceOrigin:t.input.sourceOrigin,urls:r.map(n=>n.input.url),options:t.input.options,...t.input.downloadHtml===void 0?{}:{downloadHtml:t.input.downloadHtml}}).then(n=>{let s=new Map(n.pages.map(i=>[i.page.requestedUrl,i])),o=new Map(n.failures.map(i=>[i.url,i]));for(let i of r){let c=s.get(i.input.url);if(c){i.resolve(c);continue}let a=o.get(i.input.url);i.reject(a?.httpStatus===void 0?new Error(`Remote render failed after ${a?.attempts??this.#t} attempt(s) for ${i.input.url}: ${a?.error??"Unknown remote render failure."}`):new re(i.input.url,a.httpStatus,a.attempts,a.error));}}).catch(n=>{let s=Kt(n);for(let o of r)o.reject(new Error(s,{cause:n}));}).finally(()=>{this.#o-=1,this.#a();});}this.#r.length>0&&this.#a();}};function mo(e,t,r){if(!e||typeof e!="object")throw new Error("Remote asset result must be a JSON object.");let n=e;if(n.schemaVersion!==V||n.response?.operation!=="asset"||n.response.jobId!==t.jobId||n.response.taskId!==t.taskId||!n.detail||!Array.isArray(n.detail.assets)||n.detail.assets.length!==r.length)throw new Error("Remote asset result has an invalid envelope.");for(let s=0;s<r.length;s+=1)if(n.detail.assets[s]?.requestedUrl!==r[s])throw new Error("Remote asset result does not match the requested URLs.");return n}var ht=class{#e;#n;#t;#s=0;constructor(t){this.#e=t.client,this.#n=ee(t.jobId,"jobId"),this.#t=Math.max(1,Math.min(5,t.maxAttempts??2));}async fetch(t){let r=[...t.urls];if(r.length<1||r.length>20)throw new Error("Remote asset batches require between 1 and 20 URLs.");let n=null;for(let s=1;s<=this.#t;s+=1){this.#s+=1;let o=ee(`asset-${this.#s}-${ne(r.join(`
11
- `)).slice(0,24)}-a${s}`,"taskId");try{let i=await this.#e.invoke({schemaVersion:V,operation:"asset",jobId:this.#n,taskId:o,urls:r,options:{ignoreHttpsErrors:t.ignoreHttpsErrors,timeoutMs:Math.max(1e3,Math.min(12e4,t.timeoutMs??6e4))}});return {assets:mo(await this.#e.readResult(i),i,r).detail.assets,taskId:o,attempts:s}}catch(i){n=i;}}throw new Error(`Remote asset batch failed after ${this.#t} attempt(s): ${n instanceof Error?n.message:String(n)}`,{cause:n})}};function Xr(e,t){let r=[];for(let n=0;n<e.length;n+=t)r.push(e.slice(n,n+t));return r}function en(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 tn(e,t){if(!e||typeof e!="object")throw new Error("Remote rewrite result must be a JSON object.");let r=e;if(r.schemaVersion!==V||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 rn(e,t,r){let n=r.options??{},s=await qt(e,n.files);if(s.length===0)return 0;let o=ee(r.jobId,"jobId"),i=Qe(r.client.config.workspace.prefix,"jobs",o,"rewrite-inputs"),c=`${i}/config.json`.replace(/\/+/g,"/"),a=`${i}/asset-map.json`.replace(/\/+/g,"/"),l=`${i}/previous-asset-map.json`.replace(/\/+/g,"/");await Promise.all([r.client.writeWorkspaceObject({key:c,body:JSON.stringify(en(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:l,body:JSON.stringify(n.previousAssetMap??{}),contentType:"application/json; charset=utf-8"})]);let d=Math.max(1,Math.min(500,r.batchSize)),u=Math.ceil(s.length/d),m=Math.max(1,Math.min(Math.max(1,r.concurrency),u));await n.onStart?.({totalFiles:s.length,workerCount:m});let h=[],f=0,b=0;await Promise.all(Array.from({length:Math.min(16,s.length)},async()=>{for(;;){let I=f;if(I>=s.length)return;f+=1;let v=s[I],R=P.join(e.outputDir,v),O=Yr.lookup(v),C=O?Yr.contentType(O)||O:"text/plain; charset=utf-8",W=`${i}/files/${ne(v)}.txt`.replace(/\/+/g,"/");await r.client.writeWorkspaceObject({key:W,body:await $.readFile(R),contentType:C}),h[I]={relativePath:v,key:W,fullPath:R,contentType:C},b+=1,await r.onStageProgress?.({index:b,totalFiles:s.length,file:v});}}));let p=Xr(h,d),g=0,w=0,x=0,k=0,M=Array.from({length:m},async()=>{for(;;){let I=g;if(I>=p.length)return;g+=1;let v=p[I],R=null,O=null;for(let C=1;C<=Math.max(1,Math.min(5,r.maxAttempts));C+=1){let W=ee(`rewrite-${I+1}-a${C}-${ne(v.map(S=>S.relativePath).join(`
12
- `)).slice(0,16)}`,"taskId"),_={schemaVersion:V,operation:"rewrite",jobId:o,taskId:W,configKey:c,assetMapKey:a,previousAssetMapKey:l,items:v.map(S=>({inputKey:S.key,outputKey:S.key,relativePath:S.relativePath,contentType:S.contentType}))};try{let S=await r.client.invoke(_);O=tn(await r.client.readResult(S),S);break}catch(S){R=S;}}if(!O)throw new Error(`Remote rewrite batch ${I+1}/${p.length} failed: ${R instanceof Error?R.message:String(R)}`,{cause:R});for(let C of v){let W=O.detail.objects.find(_=>_.outputKey===C.key);if(!W)throw new Error(`Remote rewrite result omitted ${C.relativePath}.`);await be(C.fullPath,Buffer.from(await r.client.readObject(W.output))),W.changed&&(k+=1),w+=1,await n.onProgress?.({index:w,totalFiles:s.length,changedTextFiles:k,file:C.relativePath,changed:W.changed});}x+=1,await r.onBatchProgress?.({completedItems:w,totalItems:s.length,completedBatches:x,totalBatches:p.length,changedTextFiles:k});}});return await Promise.all(M),k}async function nn(e,t,r,n){let s=n.relativePaths?new Set([...n.relativePaths].map(g=>g.replace(/\\/g,"/"))):null,o=Object.values(t.objects).filter(g=>g.isText&&(!s||s.has(g.relativePath))).sort((g,w)=>g.relativePath.localeCompare(w.relativePath));if(o.length===0)return 0;let i=ee(n.jobId,"jobId"),c=Qe(n.client.config.workspace.prefix,"jobs",i,"rewrite-config"),a=`${c}/config.json`.replace(/\/+/g,"/"),l=`${c}/asset-map.json`.replace(/\/+/g,"/");await Promise.all([n.client.writeWorkspaceObject({key:a,body:JSON.stringify(en(e)),contentType:"application/json; charset=utf-8"}),n.client.writeWorkspaceObject({key:l,body:JSON.stringify(r),contentType:"application/json; charset=utf-8"})]);let d=Math.max(1,Math.min(500,n.batchSize)),u=Xr(o,d),m=Math.max(1,Math.min(Math.max(1,n.concurrency),u.length)),h=0,f=0,b=0,p=0;return await Promise.all(Array.from({length:m},async()=>{for(;;){let g=h;if(g>=u.length)return;h+=1;let w=u[g],x=null,k=null;for(let M=1;M<=Math.max(1,Math.min(5,n.maxAttempts));M+=1){let I=ee(`rewrite-object-${g+1}-a${M}-${ne(w.map(v=>v.relativePath).join(`
13
- `)).slice(0,16)}`,"taskId");try{let v=await n.client.invoke({schemaVersion:V,operation:"rewrite",jobId:i,taskId:I,configKey:a,assetMapKey:l,items:w.map(R=>({inputKey:R.object.key,outputKey:R.object.key,relativePath:R.relativePath,contentType:R.contentType||R.object.contentType}))});x=tn(await n.client.readResult(v),v);break}catch(v){k=v;}}if(!x)throw new Error(`Remote object rewrite batch ${g+1}/${u.length} failed: ${k instanceof Error?k.message:String(k)}`,{cause:k});for(let M of w){let I=x.detail.objects.find(v=>v.outputKey===M.object.key);if(!I)throw new Error(`Remote rewrite result omitted ${M.relativePath}.`);M.object=I.output,I.changed&&(p+=1),f+=1,await n.onProgress?.({index:f,totalFiles:o.length,changedTextFiles:p,file:M.relativePath,changed:I.changed});}b+=1,await n.onBatchProgress?.({completedItems:f,totalItems:o.length,completedBatches:b,totalBatches:u.length,changedTextFiles:p});}})),t.assetMap={...r},t.generatedAt=new Date().toISOString(),p}var fo="remote-workers.json";function sn(e={}){let t=String(e.explicitPath??"").trim();if(t)return P.resolve(t);let r=String(e.runtimeDir??process.env.STATIC_PUBLISHER_RUNTIME_DIR??process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR??"").trim();return r?P.join(P.resolve(r),fo):""}function on(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}async function an(e,t){let r=String(e.wpsuite?.runtimeToken||"").trim();if(!r)throw new Error("Page-cache purge is enabled, but the WordPress runtime token is missing.");let n=new URL("/wp-json/smartcloud-static-publisher/v1/page-cache/purge",e.sourceOrigin).toString(),s=await t.post(n,{timeout:3e4,failOnStatusCode:false,maxRedirects:0,headers:{"content-type":"application/json","x-static-publisher-token":r},data:JSON.stringify({scope:"all"})});try{let o=await s.text();if(o.length>65536)throw new Error("WordPress page-cache purge response was too large.");let i=null;try{i=JSON.parse(o);}catch{throw new Error(`WordPress page-cache purge returned invalid JSON (HTTP ${s.status()}).`)}if(!s.ok()){let c=i&&typeof i=="object"&&"message"in i?String(i.message||""):"";throw new Error(`WordPress page-cache purge failed with HTTP ${s.status()}${c?`: ${c}`:""}`)}if(!i||typeof i!="object"||i.purged!==!0)throw new Error("WordPress page-cache provider did not confirm a complete purge.");return {purged:!0,provider:String(i.provider||"custom"),scope:"all",...typeof i.purgedAt=="string"?{purgedAt:i.purgedAt}:{}}}finally{await s.dispose().catch(()=>{});}}function wo(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?P.resolve(e):""}function ft(e){let t=String(process.env.STATIC_PUBLISHER_REMOTE_EXPORT_MANIFEST_PATH||"").trim();if(t)return P.resolve(t);let r=wo();if(r)return P.join(r,"remote-export-manifest.json");let n=P.resolve(e.outputDir);return P.join(P.dirname(n),`.${P.basename(n)}-remote-export-manifest.json`)}function wt(e){let t=P.posix.normalize(String(e||"").replace(/\\/g,"/").replace(/^\/+/,""));if(!t||t==="."||t===".."||t.startsWith("../")||/^[A-Za-z]:/.test(t))throw new Error(`Invalid remote export relative path: ${e}`);return t}function cn(e,t,r){let n=r?.workspace.bucket===t.workspace.bucket&&r.workspace.prefix===t.workspace.prefix;return {schemaVersion:1,generatedAt:new Date().toISOString(),jobId:e,workspace:{...t.workspace},objects:n?{...r.objects}:{},assetMap:n?{...r.assetMap}:{}}}function ln(e,t){let r=e.objects[wt(t)];if(!r)return true;let n=`${Qe(e.workspace.prefix,"jobs",ee(e.jobId,"jobId"))}/`;return !ge(r.object.key,e.workspace.prefix).startsWith(n)}function De(e,t){let r=wt(t.relativePath);if(t.object.bucket!==e.workspace.bucket)throw new Error(`Remote export object bucket mismatch for ${r}.`);ge(t.object.key,e.workspace.prefix),e.objects[r]={...t,relativePath:r},e.generatedAt=new Date().toISOString();}function dn(e,t){delete e.objects[wt(t)],e.generatedAt=new Date().toISOString();}async function pn(e,t){t.generatedAt=new Date().toISOString();let r=ft(e);await $.mkdir(P.dirname(r),{recursive:true}),await be(r,`${JSON.stringify(t,null,2)}
14
- `,"utf8");}async function mn(e){try{let t=JSON.parse(await $.readFile(ft(e),"utf8"));if(t.schemaVersion!==1||typeof t.jobId!="string"||!t.workspace||typeof t.workspace.bucket!="string"||typeof t.workspace.prefix!="string"||!t.objects||typeof t.objects!="object"||!t.assetMap||typeof t.assetMap!="object")return null;let r=t;for(let[n,s]of Object.entries(r.objects)){if(wt(n),!s||s.relativePath!==n||s.object?.bucket!==r.workspace.bucket)return null;ge(s.object.key,r.workspace.prefix);}return r}catch{return null}}var Po=["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"],xn=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"]),Tn=new Set(["",".html",".htm"]),Ro=new Set([".css",".xml",".xsl",".svg",".json",".html",".htm",".txt",".enc",".jws"]),vo=["/wp-content/","/wp-includes/","/wp-admin/","/static/","/assets/","/build/","/_next/"];function ko(e){let t=[],r="full",n="full",s=false,o=false,i="",c=null,a="";for(let l=0;l<e.length;l++){let d=e[l];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 u=e[++l];if(!u)throw new Error("--crawl-mode requires a value");n=u==="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 u=e[++l];if(!u)throw new Error("--url requires a value");r="single-url",s=true,t.push(u);}else if(d.startsWith("--url="))r="single-url",s=true,t.push(d.slice(6));else if(d==="--urls"){let u=e[++l];if(!u)throw new Error("--urls requires a file path");r="single-url",s=true,t.push(`@${u}`);}else if(d==="--content-sync-plan"){let u=e[++l];if(!u)throw new Error("--content-sync-plan requires a file path");r="content-sync",n="incremental",s=true,i=P.resolve(u);}else if(d.startsWith("--content-sync-plan="))r="content-sync",n="incremental",s=true,i=P.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 u=e[++l];if(!u)throw new Error("--remote-worker-config requires a file path");a=P.resolve(u);}else d.startsWith("--remote-worker-config=")&&(a=P.resolve(d.slice(23)));}return {mode:r,crawlMode:n,urls:t,preserveOutput:s,resumeRewrite:o,contentSyncPlanPath:i,remoteRender:c,remoteWorkerConfigPath:a}}function et(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?P.resolve(e):""}function Co(){let e=et();return e?P.join(e,"privacy","cookie-observations.json"):null}function xo(){let e=et();return e?P.resolve(e,".."):""}function To(){let e=process.env.STATIC_PUBLISHER_WP_ROOT||process.env.WPSUITE_STATIC_PUBLISHER_WP_ROOT||"";return e.trim()?P.resolve(e):""}function Ao(e){let t=e.trim(),r=[{alias:"@storage-root",root:xo(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@runtime",root:et(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@wp-root",root:To(),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?P.resolve(n.root,s):n.root,alias:n.alias}}return {resolvedPath:P.resolve(t)}}function An(e){let t=String(process.env.STATIC_PUBLISHER_CRAWL_MANIFEST_PATH||"").trim();if(t)return P.resolve(t);let r=et();return r?P.join(r,"crawl-manifest.json"):P.join(e.outputDir,".crawl-manifest.json")}function In(){return {schemaVersion:6,updatedAt:"",pages:{},assets:{}}}function fn(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 Io(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 Zt(e){let t=e?.["content-type"]?.trim();return t||null}function Yt(e){let t=e?.["cache-control"]?.trim();return t||null}function Eo(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 Oo(){return {rewriteTargets:new Set,changedFiles:new Set,deletedFiles:new Set,revalidateFiles:new Set}}function Fe(e,t,r,n){let s=X(t.outputDir,r);s&&(Eo(n)?e.revalidateFiles.add(s):e.revalidateFiles.delete(s));}function G(e,t,r){let n=X(t.outputDir,r);n&&(e.changedFiles.add(n),e.deletedFiles.delete(n));}function Xt(e,t,r){let n=X(t.outputDir,r);n&&(e.deletedFiles.add(n),e.changedFiles.delete(n),e.revalidateFiles.delete(n));}function se(e,t){e.rewriteTargets.add(P.resolve(t));}async function Mo(e){try{let t=await $.readFile(An(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,fn(s)])),assets:Object.fromEntries(Object.entries(r.assets).map(([n,s])=>[n,Io(s)]))};if(r.schemaVersion===1)return {schemaVersion:6,updatedAt:String(r.updatedAt||""),pages:Object.fromEntries(Object.entries(r.pages).map(([n,s])=>[n,fn(s)])),assets:{}}}}catch{}return In()}function er(e){return JSON.parse(JSON.stringify(e))}async function $o(e,t){let r=An(e);await $.mkdir(P.dirname(r),{recursive:true}),await $.writeFile(r,JSON.stringify(t,null,2),"utf8");}async function ke(e,t,r=false){if(!t.trackManifest)return;t.manifestPendingChanges+=1;let n=Date.now();if(!r&&t.manifestPendingChanges<25&&n-t.lastManifestSavedAt<5e3)return;t.manifestPendingChanges=0,t.lastManifestSavedAt=n;let s=async()=>{let o=er(t.manifest);o.updatedAt=new Date().toISOString(),t.manifest.updatedAt=o.updatedAt,await $o(e,o);};t.manifestSaveChain=t.manifestSaveChain.then(s,s),await t.manifestSaveChain;}function Oe(e){if(!e)return null;let t=e.trim();return t||null}function jo(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 En(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 l=new Map;for(let d of a.items)!d||typeof d.url!="string"||l.set(d.url,d);return l}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 bt(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 En(e,t,[n],s)).get(n)??null;return xt(e,n)&&(!i||i.supported!==true||!i.token)&&(i=await Do(e,t,n,s)),i=On(e,i),r.changeTokenCache.set(n,i),i}async function ar(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 En(e,t,c,s);for(let l of c)r.changeTokenCache.set(l,On(e,a.get(l)??null));}}async function Uo(e,t,r,n,s,o){if(!(!n.trackManifest||n.changeTokenCache.has(s)))for(;!n.changeTokenCache.has(s);){if(!n.pageChangeTokenPrimePromise){let i=on(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=ar(e,t,n,i,o).finally(()=>{n.pageChangeTokenPrimePromise===c&&(n.pageChangeTokenPrimePromise=null);});n.pageChangeTokenPrimePromise=c;}await n.pageChangeTokenPrimePromise;}}function Lo(e){return `subscriber=${e.wpsuite?.siteSettings?.subscriber===true?"1":"0"}`}function On(e,t){if(!t?.supported||!t.token||t.tokenSource==="wp-media-file")return t;let r=Lo(e);return {...t,token:ce(`${t.token}
11
+ `)).slice(0,24)}-a${s}`,"taskId");try{let i=await this.#e.invoke({schemaVersion:V,operation:"asset",jobId:this.#n,taskId:o,urls:r,options:{ignoreHttpsErrors:t.ignoreHttpsErrors,timeoutMs:Math.max(1e3,Math.min(12e4,t.timeoutMs??6e4))}});return {assets:mo(await this.#e.readResult(i),i,r).detail.assets,taskId:o,attempts:s}}catch(i){n=i;}}throw new Error(`Remote asset batch failed after ${this.#t} attempt(s): ${n instanceof Error?n.message:String(n)}`,{cause:n})}};function Xr(e,t){let r=[];for(let n=0;n<e.length;n+=t)r.push(e.slice(n,n+t));return r}function en(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 tn(e,t){if(!e||typeof e!="object")throw new Error("Remote rewrite result must be a JSON object.");let r=e;if(r.schemaVersion!==V||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 rn(e,t,r){let n=r.options??{},s=await qt(e,n.files);if(s.length===0)return 0;let o=ee(r.jobId,"jobId"),i=Qe(r.client.config.workspace.prefix,"jobs",o,"rewrite-inputs"),c=`${i}/config.json`.replace(/\/+/g,"/"),a=`${i}/asset-map.json`.replace(/\/+/g,"/"),l=`${i}/previous-asset-map.json`.replace(/\/+/g,"/");await Promise.all([r.client.writeWorkspaceObject({key:c,body:JSON.stringify(en(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:l,body:JSON.stringify(n.previousAssetMap??{}),contentType:"application/json; charset=utf-8"})]);let d=Math.max(1,Math.min(500,r.batchSize)),u=Math.ceil(s.length/d),m=Math.max(1,Math.min(Math.max(1,r.concurrency),u));await n.onStart?.({totalFiles:s.length,workerCount:m});let h=[],f=0,b=0;await Promise.all(Array.from({length:Math.min(16,s.length)},async()=>{for(;;){let I=f;if(I>=s.length)return;f+=1;let v=s[I],R=S.join(e.outputDir,v),O=Yr.lookup(v),C=O?Yr.contentType(O)||O:"text/plain; charset=utf-8",W=`${i}/files/${ne(v)}.txt`.replace(/\/+/g,"/");await r.client.writeWorkspaceObject({key:W,body:await $.readFile(R),contentType:C}),h[I]={relativePath:v,key:W,fullPath:R,contentType:C},b+=1,await r.onStageProgress?.({index:b,totalFiles:s.length,file:v});}}));let p=Xr(h,d),g=0,w=0,x=0,k=0,M=Array.from({length:m},async()=>{for(;;){let I=g;if(I>=p.length)return;g+=1;let v=p[I],R=null,O=null;for(let C=1;C<=Math.max(1,Math.min(5,r.maxAttempts));C+=1){let W=ee(`rewrite-${I+1}-a${C}-${ne(v.map(P=>P.relativePath).join(`
12
+ `)).slice(0,16)}`,"taskId"),H={schemaVersion:V,operation:"rewrite",jobId:o,taskId:W,configKey:c,assetMapKey:a,previousAssetMapKey:l,items:v.map(P=>({inputKey:P.key,outputKey:P.key,relativePath:P.relativePath,contentType:P.contentType}))};try{let P=await r.client.invoke(H);O=tn(await r.client.readResult(P),P);break}catch(P){R=P;}}if(!O)throw new Error(`Remote rewrite batch ${I+1}/${p.length} failed: ${R instanceof Error?R.message:String(R)}`,{cause:R});for(let C of v){let W=O.detail.objects.find(H=>H.outputKey===C.key);if(!W)throw new Error(`Remote rewrite result omitted ${C.relativePath}.`);await be(C.fullPath,Buffer.from(await r.client.readObject(W.output))),W.changed&&(k+=1),w+=1,await n.onProgress?.({index:w,totalFiles:s.length,changedTextFiles:k,file:C.relativePath,changed:W.changed});}x+=1,await r.onBatchProgress?.({completedItems:w,totalItems:s.length,completedBatches:x,totalBatches:p.length,changedTextFiles:k});}});return await Promise.all(M),k}async function nn(e,t,r,n){let s=n.relativePaths?new Set([...n.relativePaths].map(g=>g.replace(/\\/g,"/"))):null,o=Object.values(t.objects).filter(g=>g.isText&&(!s||s.has(g.relativePath))).sort((g,w)=>g.relativePath.localeCompare(w.relativePath));if(o.length===0)return 0;let i=ee(n.jobId,"jobId"),c=Qe(n.client.config.workspace.prefix,"jobs",i,"rewrite-config"),a=`${c}/config.json`.replace(/\/+/g,"/"),l=`${c}/asset-map.json`.replace(/\/+/g,"/");await Promise.all([n.client.writeWorkspaceObject({key:a,body:JSON.stringify(en(e)),contentType:"application/json; charset=utf-8"}),n.client.writeWorkspaceObject({key:l,body:JSON.stringify(r),contentType:"application/json; charset=utf-8"})]);let d=Math.max(1,Math.min(500,n.batchSize)),u=Xr(o,d),m=Math.max(1,Math.min(Math.max(1,n.concurrency),u.length)),h=0,f=0,b=0,p=0;return await Promise.all(Array.from({length:m},async()=>{for(;;){let g=h;if(g>=u.length)return;h+=1;let w=u[g],x=null,k=null;for(let M=1;M<=Math.max(1,Math.min(5,n.maxAttempts));M+=1){let I=ee(`rewrite-object-${g+1}-a${M}-${ne(w.map(v=>v.relativePath).join(`
13
+ `)).slice(0,16)}`,"taskId");try{let v=await n.client.invoke({schemaVersion:V,operation:"rewrite",jobId:i,taskId:I,configKey:a,assetMapKey:l,items:w.map(R=>({inputKey:R.object.key,outputKey:R.object.key,relativePath:R.relativePath,contentType:R.contentType||R.object.contentType}))});x=tn(await n.client.readResult(v),v);break}catch(v){k=v;}}if(!x)throw new Error(`Remote object rewrite batch ${g+1}/${u.length} failed: ${k instanceof Error?k.message:String(k)}`,{cause:k});for(let M of w){let I=x.detail.objects.find(v=>v.outputKey===M.object.key);if(!I)throw new Error(`Remote rewrite result omitted ${M.relativePath}.`);M.object=I.output,I.changed&&(p+=1),f+=1,await n.onProgress?.({index:f,totalFiles:o.length,changedTextFiles:p,file:M.relativePath,changed:I.changed});}b+=1,await n.onBatchProgress?.({completedItems:f,totalItems:o.length,completedBatches:b,totalBatches:u.length,changedTextFiles:p});}})),t.assetMap={...r},t.generatedAt=new Date().toISOString(),p}var fo="remote-workers.json";function sn(e={}){let t=String(e.explicitPath??"").trim();if(t)return S.resolve(t);let r=String(e.runtimeDir??process.env.STATIC_PUBLISHER_RUNTIME_DIR??process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR??"").trim();return r?S.join(S.resolve(r),fo):""}function on(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}async function an(e,t){let r=String(e.wpsuite?.runtimeToken||"").trim();if(!r)throw new Error("Page-cache purge is enabled, but the WordPress runtime token is missing.");let n=new URL("/wp-json/smartcloud-static-publisher/v1/page-cache/purge",e.sourceOrigin).toString(),s=await t.post(n,{timeout:3e4,failOnStatusCode:false,maxRedirects:0,headers:{"content-type":"application/json","x-static-publisher-token":r},data:JSON.stringify({scope:"all"})});try{let o=await s.text();if(o.length>65536)throw new Error("WordPress page-cache purge response was too large.");let i=null;try{i=JSON.parse(o);}catch{throw new Error(`WordPress page-cache purge returned invalid JSON (HTTP ${s.status()}).`)}if(!s.ok()){let c=i&&typeof i=="object"&&"message"in i?String(i.message||""):"";throw new Error(`WordPress page-cache purge failed with HTTP ${s.status()}${c?`: ${c}`:""}`)}if(!i||typeof i!="object"||i.purged!==!0)throw new Error("WordPress page-cache provider did not confirm a complete purge.");return {purged:!0,provider:String(i.provider||"custom"),scope:"all",...typeof i.purgedAt=="string"?{purgedAt:i.purgedAt}:{}}}finally{await s.dispose().catch(()=>{});}}function wo(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?S.resolve(e):""}function ft(e){let t=String(process.env.STATIC_PUBLISHER_REMOTE_EXPORT_MANIFEST_PATH||"").trim();if(t)return S.resolve(t);let r=wo();if(r)return S.join(r,"remote-export-manifest.json");let n=S.resolve(e.outputDir);return S.join(S.dirname(n),`.${S.basename(n)}-remote-export-manifest.json`)}function wt(e){let t=S.posix.normalize(String(e||"").replace(/\\/g,"/").replace(/^\/+/,""));if(!t||t==="."||t===".."||t.startsWith("../")||/^[A-Za-z]:/.test(t))throw new Error(`Invalid remote export relative path: ${e}`);return t}function cn(e,t,r){let n=r?.workspace.bucket===t.workspace.bucket&&r.workspace.prefix===t.workspace.prefix;return {schemaVersion:1,generatedAt:new Date().toISOString(),jobId:e,workspace:{...t.workspace},objects:n?{...r.objects}:{},assetMap:n?{...r.assetMap}:{}}}function ln(e,t){let r=e.objects[wt(t)];if(!r)return true;let n=`${Qe(e.workspace.prefix,"jobs",ee(e.jobId,"jobId"))}/`;return !ge(r.object.key,e.workspace.prefix).startsWith(n)}function De(e,t){let r=wt(t.relativePath);if(t.object.bucket!==e.workspace.bucket)throw new Error(`Remote export object bucket mismatch for ${r}.`);ge(t.object.key,e.workspace.prefix),e.objects[r]={...t,relativePath:r},e.generatedAt=new Date().toISOString();}function dn(e,t){delete e.objects[wt(t)],e.generatedAt=new Date().toISOString();}async function pn(e,t){t.generatedAt=new Date().toISOString();let r=ft(e);await $.mkdir(S.dirname(r),{recursive:true}),await be(r,`${JSON.stringify(t,null,2)}
14
+ `,"utf8");}async function mn(e){try{let t=JSON.parse(await $.readFile(ft(e),"utf8"));if(t.schemaVersion!==1||typeof t.jobId!="string"||!t.workspace||typeof t.workspace.bucket!="string"||typeof t.workspace.prefix!="string"||!t.objects||typeof t.objects!="object"||!t.assetMap||typeof t.assetMap!="object")return null;let r=t;for(let[n,s]of Object.entries(r.objects)){if(wt(n),!s||s.relativePath!==n||s.object?.bucket!==r.workspace.bucket)return null;ge(s.object.key,r.workspace.prefix);}return r}catch{return null}}var Po=["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"],xn=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"]),Tn=new Set(["",".html",".htm"]),Ro=new Set([".css",".xml",".xsl",".svg",".json",".html",".htm",".txt",".enc",".jws"]),vo=["/wp-content/","/wp-includes/","/wp-admin/","/static/","/assets/","/build/","/_next/"];function ko(e){let t=[],r="full",n="full",s=false,o=false,i="",c=null,a="";for(let l=0;l<e.length;l++){let d=e[l];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 u=e[++l];if(!u)throw new Error("--crawl-mode requires a value");n=u==="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 u=e[++l];if(!u)throw new Error("--url requires a value");r="single-url",s=true,t.push(u);}else if(d.startsWith("--url="))r="single-url",s=true,t.push(d.slice(6));else if(d==="--urls"){let u=e[++l];if(!u)throw new Error("--urls requires a file path");r="single-url",s=true,t.push(`@${u}`);}else if(d==="--content-sync-plan"){let u=e[++l];if(!u)throw new Error("--content-sync-plan requires a file path");r="content-sync",n="incremental",s=true,i=S.resolve(u);}else if(d.startsWith("--content-sync-plan="))r="content-sync",n="incremental",s=true,i=S.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 u=e[++l];if(!u)throw new Error("--remote-worker-config requires a file path");a=S.resolve(u);}else d.startsWith("--remote-worker-config=")&&(a=S.resolve(d.slice(23)));}return {mode:r,crawlMode:n,urls:t,preserveOutput:s,resumeRewrite:o,contentSyncPlanPath:i,remoteRender:c,remoteWorkerConfigPath:a}}function et(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?S.resolve(e):""}function Co(){let e=et();return e?S.join(e,"privacy","cookie-observations.json"):null}function xo(){let e=et();return e?S.resolve(e,".."):""}function To(){let e=process.env.STATIC_PUBLISHER_WP_ROOT||process.env.WPSUITE_STATIC_PUBLISHER_WP_ROOT||"";return e.trim()?S.resolve(e):""}function Ao(e){let t=e.trim(),r=[{alias:"@storage-root",root:xo(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@runtime",root:et(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@wp-root",root:To(),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?S.resolve(n.root,s):n.root,alias:n.alias}}return {resolvedPath:S.resolve(t)}}function An(e){let t=String(process.env.STATIC_PUBLISHER_CRAWL_MANIFEST_PATH||"").trim();if(t)return S.resolve(t);let r=et();return r?S.join(r,"crawl-manifest.json"):S.join(e.outputDir,".crawl-manifest.json")}function In(){return {schemaVersion:6,updatedAt:"",pages:{},assets:{}}}function fn(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 Io(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 Zt(e){let t=e?.["content-type"]?.trim();return t||null}function Yt(e){let t=e?.["cache-control"]?.trim();return t||null}function Eo(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 Oo(){return {rewriteTargets:new Set,changedFiles:new Set,deletedFiles:new Set,revalidateFiles:new Set}}function Fe(e,t,r,n){let s=X(t.outputDir,r);s&&(Eo(n)?e.revalidateFiles.add(s):e.revalidateFiles.delete(s));}function G(e,t,r){let n=X(t.outputDir,r);n&&(e.changedFiles.add(n),e.deletedFiles.delete(n));}function Xt(e,t,r){let n=X(t.outputDir,r);n&&(e.deletedFiles.add(n),e.changedFiles.delete(n),e.revalidateFiles.delete(n));}function se(e,t){e.rewriteTargets.add(S.resolve(t));}async function Mo(e){try{let t=await $.readFile(An(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,fn(s)])),assets:Object.fromEntries(Object.entries(r.assets).map(([n,s])=>[n,Io(s)]))};if(r.schemaVersion===1)return {schemaVersion:6,updatedAt:String(r.updatedAt||""),pages:Object.fromEntries(Object.entries(r.pages).map(([n,s])=>[n,fn(s)])),assets:{}}}}catch{}return In()}function er(e){return JSON.parse(JSON.stringify(e))}async function $o(e,t){let r=An(e);await $.mkdir(S.dirname(r),{recursive:true}),await $.writeFile(r,JSON.stringify(t,null,2),"utf8");}async function ke(e,t,r=false){if(!t.trackManifest)return;t.manifestPendingChanges+=1;let n=Date.now();if(!r&&t.manifestPendingChanges<25&&n-t.lastManifestSavedAt<5e3)return;t.manifestPendingChanges=0,t.lastManifestSavedAt=n;let s=async()=>{let o=er(t.manifest);o.updatedAt=new Date().toISOString(),t.manifest.updatedAt=o.updatedAt,await $o(e,o);};t.manifestSaveChain=t.manifestSaveChain.then(s,s),await t.manifestSaveChain;}function Ee(e){if(!e)return null;let t=e.trim();return t||null}function jo(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 En(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 l=new Map;for(let d of a.items)!d||typeof d.url!="string"||l.set(d.url,d);return l}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 bt(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 En(e,t,[n],s)).get(n)??null;return xt(e,n)&&(!i||i.supported!==true||!i.token)&&(i=await Do(e,t,n,s)),i=On(e,i),r.changeTokenCache.set(n,i),i}async function ar(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 En(e,t,c,s);for(let l of c)r.changeTokenCache.set(l,On(e,a.get(l)??null));}}async function Uo(e,t,r,n,s,o){if(!(!n.trackManifest||n.changeTokenCache.has(s)))for(;!n.changeTokenCache.has(s);){if(!n.pageChangeTokenPrimePromise){let i=on(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=ar(e,t,n,i,o).finally(()=>{n.pageChangeTokenPrimePromise===c&&(n.pageChangeTokenPrimePromise=null);});n.pageChangeTokenPrimePromise=c;}await n.pageChangeTokenPrimePromise;}}function Lo(e){return `subscriber=${e.wpsuite?.siteSettings?.subscriber===true?"1":"0"}`}function On(e,t){if(!t?.supported||!t.token||t.tokenSource==="wp-media-file")return t;let r=Lo(e);return {...t,token:ce(`${t.token}
15
15
  ${r}`,40),tokenSource:t.tokenSource?`${t.tokenSource}+site-subscriber`:"site-subscriber"}}async function Do(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=ce(`${r}
16
16
  404
17
- ${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 Mn(e,t,r,n,s,o){let i=xt(e,s);if(await Uo(e,t,r,n,s,o),!n.enabled)return {action:"render",changeToken:n.trackManifest?await bt(e,t,n,s,o):null};let c=n.manifest.pages[s];if(!c)return {action:"render",changeToken:await bt(e,t,n,s,o)};let a=await bt(e,t,n,s,o);if(a?.supported&&a.token)return c.changeToken===a.token?i&&!await Fo(e,t,s,o)?{action:"render",changeToken:a}:{action:"reuse",changeToken:a}:{action:"render",changeToken:a};let l=Oe(r.sitemapLastmodByPage[s]);return l&&c.sitemapLastmod&&c.sitemapLastmod===l?{action:"reuse",changeToken:a}:{action:"render",changeToken:a}}async function Fo(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 Wo(e,t,r,n,s){let o=wn(r.previousManifest,void 0,n,"previous-manifest"),i=0;for(let[m,h]of Object.entries(r.manifest.pages))if(!r.seenPages.has(m)){Xt(s,e,h.outputPath);try{await $.unlink(h.outputPath);}catch(f){(f.code||"")!=="ENOENT"&&n.warn(`Failed to remove stale incremental page output for ${m}`,{url:m,outputPath:h.outputPath,error:String(f)});}delete r.manifest.pages[m],i++;}let c=wn(r.manifest,r.runId,n,"active-manifest"),a=new Set,l=new Set;for(let m of c){for(let b of Ze(e,m))a.add(b);let h=r.manifest.assets[m]?.outputPath;h&&l.add(h);let f=We(e,t.assetMap,m);f&&l.add(f);}for(let m of Object.keys(r.manifest.assets)){if(c.has(m)){r.manifest.assets[m].unreferencedRuns=0;continue}let h=r.manifest.assets[m];if(_r(h.unreferencedRuns)){h.unreferencedRuns+=1,n.warn(`Deferred deletion of newly unreferenced incremental asset ${m}.`,{url:m,unreferencedRuns:h.unreferencedRuns,phase:"incremental-cleanup",source:"asset-deletion-grace"});continue}delete r.manifest.assets[m];}let d=0,u=0;for(let m of o){if(r.manifest.assets[m])continue;let h=new Set,f=r.previousManifest.assets[m]?.outputPath;f&&h.add(f);let b=We(e,t.assetMap,m);if(!c.has(m)&&b)h.add(b);else if(!c.has(m)){let p=ri(e,m,n,"incremental-cleanup");p&&(h.add(p.originalFilePath),p.hashedFilePath&&h.add(p.hashedFilePath));}for(let p of h)if(!l.has(p)){Xt(s,e,p);try{await $.unlink(p),d++;}catch(g){(g.code||"")!=="ENOENT"&&n.warn(`Failed to remove stale incremental asset output for ${m}`,{url:m,outputPath:p,error:String(g)});}}for(let p of Ze(e,m))a.has(p)||Object.prototype.hasOwnProperty.call(t.assetMap,p)&&(delete t.assetMap[p],u++);}(i>0||d>0||u>0)&&n.info(`Incremental cleanup removed ${i} stale pages, ${d} stale assets, ${u} stale asset mappings`,{removedPages:i,removedAssets:d,removedAssetMappings:u,phase:"incremental-cleanup"});}async function qo(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=>P.resolve(a))),o=Object.values(e.postCrawlCopyMap||{}).map(a=>St(String(a||""))).filter(a=>!!a).map(a=>P.resolve(e.outputDir,a)),c=(await ks(["**/*.html","**/*.htm"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(a=>Nr(P.join(e.outputDir,a),e.outputDir,s,o));for(let a of c){let l=P.join(e.outputDir,a);Xt(n,e,l),await $.unlink(l);}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 wn(e,t,r,n){let s=new Set,o=i=>{let c=i.trim();if(c){if(r){let a=oe(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 yn(e,t,r){for(let n of t)for(let s of Ze(e,n))if(r.has(s))return true;return false}function No(e,t,r,n,s){let o=new Set(r.rewriteTargets);for(let c of r.changedFiles)o.add(P.resolve(e.outputDir,c));for(let c of Object.values(t.manifest.pages))c.rewriteComplete||o.add(P.resolve(c.outputPath));for(let c of Object.values(t.manifest.assets))c.isText&&!c.rewriteComplete&&o.add(P.resolve(c.outputPath));let i=jo(n,s);if(i.size===0)return [...o];for(let c of Object.values(t.manifest.pages))yn(e,c.discoveredAssets,i)&&o.add(P.resolve(c.outputPath));for(let[c,a]of Object.entries(t.manifest.assets)){a.isText&&yn(e,a.discoveredAssets,i)&&o.add(P.resolve(a.outputPath));for(let l of Ze(e,c))if(i.has(l)){G(r,e,a.outputPath),a.isText&&o.add(P.resolve(a.outputPath));break}}return [...o]}function _o(e,t){let r=t?new Set(Array.from(t,s=>P.resolve(s))):null,n=s=>r===null||r.has(P.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 Ho(e,t,r){let n=new Set,s=o=>{if(!o)return;let i=X(e.outputDir,o);i&&n.add(i);};for(let o of t.donePages)s(he(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(We(e,t.assetMap,o));for(let o of Object.values(r.manifest.assets))o.lastSeenRunId===r.runId&&s(o.outputPath);return n}async function Bo(e,t,r,n,s,o){let i=[...n.deletedFiles].sort(),c=Ho(e,t,r),a=0;for(let u of [...c].sort())if(!o?.objects[u]){try{if((await $.stat(P.join(e.outputDir,u))).isFile())continue}catch{}a++,s.warn(`Active output is missing after crawl: ${u}`,{phase:"deploy-plan",file:u,outputPath:P.join(e.outputDir,u)});}if(a>0&&s.warn(`Detected ${a} active output file(s) missing before deploy plan save.`,{phase:"deploy-plan",missingActiveOutputs:a}),i.length===0)return [];let l=[],d=0;for(let u of i){if(!c.has(u)){l.push(u);continue}d++;let m=P.join(e.outputDir,u),h;try{h=(await $.stat(m)).isFile();}catch{h=false;}s.warn(`Deploy plan protected active output from deletion: ${u}`,{phase:"deploy-plan",file:u,outputPath:m,exists:h});}return d>0&&s.info(`Deploy plan skipped ${d} active output deletion(s).`,{phase:"deploy-plan",protectedDeletes:d,deletedFiles:l.length}),l}function Ze(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 Vo(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 $n(e,t){let r=e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/"?e.targetOrigin:"https://relative.invalid/";try{let n=new URL(t,r);return ze(e.outputDir,n.pathname)}catch{return null}}function jn(e,t,r){for(let n of Vo(e,r)){let s=t[n];if(!s)continue;let o=$n(e,s);if(o)return {outputPath:o,publicUrl:s}}return null}function zo(e,t,r){for(let n of Ze(e,r)){let s=t[n];if(!s)continue;let o=$n(e,s);if(o)return o}return null}function We(e,t,r){let n=zo(e,t,r);if(n)return n;try{return tt(e,r).originalFilePath}catch{return null}}function Qo(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?P.join(P.resolve(e),"queue-runner-heartbeat.json"):""}async function Ke(e){let t=Qo();if(t)try{let r=await $.readFile(t,"utf8"),n=JSON.parse(r);if(!n||typeof n!="object")return;await $.writeFile(t,JSON.stringify({...n,checkedAt:new Date().toISOString(),status:"running",currentStep:"rewrite",message:e},null,2),"utf8");}catch{}}function Ko(e,t){let r=new Set;for(let n of t.donePages)r.add(P.resolve(he(e,n)));for(let n of t.doneAssets){let s=We(e,t.assetMap,n);!s||!le(s)||r.add(P.resolve(s));}for(let n of t.doneSitemaps){let s=We(e,t.assetMap,n);!s||!le(s)||r.add(P.resolve(s));}return [...r]}var Pt="re:",yt=new Map;function Jo(e){if(!e.startsWith(Pt))return null;let t=yt.get(e);if(t!==void 0)return t||null;let r=e.slice(Pt.length).trim();if(!r)return yt.set(e,false),null;try{let n=new RegExp(r);return yt.set(e,n),n}catch{return console.warn(`[crawl] Ignoring invalid path matcher regex: ${e}`),yt.set(e,false),null}}function ur(e,t){let r=Jo(t);return r?r.test(e):t.startsWith(Pt)?false:e.startsWith(t)}function Go(e,t){return t.find(r=>ur(e,r))}function Un(e,t){let r=Go(t.pathname,e.blockedPathPrefixes);if(r)return r.startsWith(Pt)?`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 Zo(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 Yo(e,t){return Zo(e).has(t.hostname)}function Xo(e){let t=Se(e.trim()).replace(/\\\//g,"/").replace(/^['"]|['"]$/g,"").trim();return t=t.replace(/[)]+$/g,"").trim(),t=t.replace(/;.*$/g,"").trim(),t}function tr(e){let t=Se(e).replace(/\\\//g,"/");return /[{}]|\bwindow\.|\blocation\.|\bincludes\(|\?\?null|\+|%7B|%7D|%22|<|>|\s/.test(t)||/[()[\]'"]/.test(t)}function ei(e){let t=Se(e).replace(/\\\//g,"/").trim(),r=P.extname(t).toLowerCase();return xn.has(r)||Tn.has(r)?false:/^(?:this|[A-Za-z_$][\w$]*)\.[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/.test(t)}function Me(e){return vo.some(t=>e.pathname.startsWith(t))}function Q(e,t,r=e.sourceOrigin,n,s="url",o=false){let i=Xo(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(tr(i))return n?.ignore(s,t,"looks like JavaScript/code fragment",r),null;if(ei(i))return n?.ignore(s,t,"looks like JavaScript property access",r),null;try{let c=new URL(i,r);if(Ln(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(!Yo(e,c))return n?.ignore(s,c.toString(),"host not allowed",r),null;let a=Un(e,c);if(a&&!(o&&Mt(c)))return n?.reject(s,c.toString(),a,r),null;let l=new URL(e.sourceOrigin);return c.protocol=l.protocol,c.host=l.host,c.hash="",c}catch{return n?.reject(s,t,"invalid URL",r),null}}function Ln(e){try{return decodeURIComponent(e.pathname),decodeURIComponent(e.search),decodeURIComponent(e.hash),!1}catch{return true}}function oe(e,t,r,n){try{let s=new URL(e);return Ln(s)?(t.reject(r,e,"malformed URL encoding",n),null):Ve(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 Dn(e){return xn.has(P.extname(e.pathname).toLowerCase())}function Ce(e){return Me(e)?false:Tn.has(P.extname(e.pathname).toLowerCase())}function Ne(e){let t=e.pathname.toLowerCase();return t.endsWith(".xml")&&(t.includes("sitemap")||t.endsWith("/sitemap.xml"))}function N(e,t){return !!(Ne(t)||t.pathname==="/robots.txt"||t.pathname==="/llms.txt"||t.pathname.toLowerCase().endsWith(".xsl")||e.assetPathPrefixes.length>0&&e.assetPathPrefixes.some(r=>ur(t.pathname,r))||Dn(t)||!Ce(t)&&!Me(t))}function he(e,t){let r=new URL(t),n=Ve(r.pathname);if(n===null)throw new Error(`Unsafe page URL pathname: ${r.pathname}`);return n.endsWith("/")?n+="index.html":P.extname(n)||(n+="/index.html"),ze(e.outputDir,n)}function ti(e){if(!e.generated404RequestPath)return null;try{let t=new URL(e.generated404RequestPath,e.sourceOrigin);return !t.pathname.endsWith("/")&&P.extname(t.pathname)===""&&(t.pathname+="/"),t.hash="",t.toString()}catch{return null}}function xt(e,t){let r=ti(e);if(!r)return false;try{return new URL(t,e.sourceOrigin).toString()===r}catch{return false}}function tt(e,t){let r=new URL(t),n=Ve(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=ze(e.outputDir,o),c=Dt(e.targetOrigin,o),a=`${c}${r.search}`;if(!s)return {originalPathname:o,originalFilePath:i,originalPublicUrl:c,originalPublicUrlWithSearch:a,preferQueryHashed:s};let l=P.extname(n),u=`${l?n.slice(0,-l.length):n}.${ce(r.search)}${l||".bin"}`;return {originalPathname:o,originalFilePath:i,originalPublicUrl:c,originalPublicUrlWithSearch:a,preferQueryHashed:s,hashedPathname:u,hashedFilePath:ze(e.outputDir,u),hashedPublicUrl:Dt(e.targetOrigin,u)}}function ri(e,t,r,n){let s=oe(t,r,"asset",n);return s?tt(e,s.toString()):null}function rr(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 l=new URL(a);t[l.origin+o.pathname+o.search]=n;}catch{}try{let a=(()=>{let l=new URL(n,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin);return `${l.pathname}${l.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 Fn(e){try{return await $.readFile(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}async function Ee(e){try{return await $.stat(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}function ni(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 Wn(e){let t=String(e["last-modified"]||"").trim();if(!t)return null;let r=Date.parse(t);return Number.isFinite(r)?r:null}function si(e,t){let r=Wn(t),n=ni(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 oi(e,t){if(!t)return;let r=Wn(t);if(r===null)return;let n=await Ee(e);if(!n)return;let s=new Date(r);await $.utimes(e,n.atime,s).catch(()=>{});}function nr(e,t){let r=P.extname(e.pathname).toLowerCase(),n=t["content-type"]||"";return Ro.has(r)||Po.some(s=>n.includes(s))&&!n.startsWith("image/")&&!n.includes("font")}function ii(e){try{let t=P.extname(new URL(e).pathname).toLowerCase();return t===".js"||t===".mjs"}catch{return false}}function Ie(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 ai(e){return ce(e.toString("base64"),40)}function qn(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 Nn(e,t,r){let n=e.assetVariantDigestsByOriginalPath.get(t);n||(n=new Set,e.assetVariantDigestsByOriginalPath.set(t,n)),n.add(r);}async function sr(e,t,r,n,s,o,i){let c=tt(e,r),a=ai(n),l=c.originalFilePath,d=c.originalPublicUrlWithSearch;if(c.preferQueryHashed&&c.hashedFilePath&&c.hashedPublicUrl&&qn(s,c.originalFilePath,a)){let f=jn(e,t,r);f?(l=f.outputPath,d=f.publicUrl):(l=c.hashedFilePath,d=c.hashedPublicUrl);}rr(e,t,r,d,c.originalPublicUrl);let u=le(l)?Buffer.from(Nt(n.toString("utf8"),e,t,l),"utf8"):n,m=await Fn(l),h=false;return (m===null||!m.equals(u))&&(await be(l,u),h=true),o?.debug(`${h?"Saved":"Skipped unchanged"} asset output ${r}`,{phase:"download-assets",url:r,outputPath:l,bytes:u.length,wroteFile:h}),Nn(s,c.originalFilePath,a),await oi(l,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:l,publicUrl:d,wroteFile:h}}function $e(e,t,r,n,s){let o=()=>{let u=String(s??"").trim();if(!u)return {discoveredFrom:"",discoveredFromType:"unknown"};if(u==="seed-path"||u==="cli"||u==="generated-404-request-path")return {discoveredFrom:u,discoveredFromType:u};if(/^https?:\/\//i.test(u))try{let m=new URL(u);return Ne(m)?{discoveredFrom:u,discoveredFromType:"sitemap"}:N(e,m)?{discoveredFrom:u,discoveredFromType:"asset"}:Ce(m)&&!Me(m)?{discoveredFrom:u,discoveredFromType:"page"}:{discoveredFrom:u,discoveredFromType:"url"}}catch{return {discoveredFrom:u,discoveredFromType:"url"}}return {discoveredFrom:u,discoveredFromType:"url"}},i=s&&/^https?:\/\//i.test(s)?s:e.sourceOrigin,c=Q(e,r,i,n,"page");if(!c)return;if(!Ce(c)||Dn(c)){if(N(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(),Me(c)?"asset/internal path cannot be page":"not page-like",s);return}let a=c.toString(),{discoveredFrom:l,discoveredFromType:d}=o();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++,n.debug(`Queued discovered page ${a}`,{phase:"discovery",url:a,discoveredFrom:l,discoveredFromType:d,outputPath:he(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=Q(e,r,o,n,"asset");if(!i)return;if(!N(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 Rt(e,t,r,n,s){let o=s&&/^https?:\/\//i.test(s)?s:e.sourceOrigin,i=Q(e,r,o,n,"sitemap",Sr(s));if(!i)return;if(!Ne(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 ui(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:Oe(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 ci(e){return e.split(",").map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function li(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 di(e){return e.replace(/<script\b[^>]*>[\s\S]*?<\/script\s*>/gi,"")}function pi(e,t){if(t==="dom-style")return true;let r=(()=>{try{return P.extname(new URL(e).pathname).toLowerCase()}catch{return ""}})();return !(r===".js"||r===".mjs"||r===".map"||t.includes("javascript"))}function St(e){return e.trim().replace(/\\/g,"/").replace(/^https?:\/\/[^/]+/i,"").replace(/^\/+/,"")}async function _n(e,t,r,n){let s=[];await $.mkdir(t,{recursive:true});let o=await $.readdir(e,{withFileTypes:true});for(let i of o){let c=P.join(e,i.name),a=P.join(t,i.name);if(i.isDirectory()){s.push(...await _n(c,a,r,n));continue}await Hn(c,a,r,n)&&s.push(a);}return s}async function mi(e,t){try{let[r,n]=await Promise.all([$.stat(e),$.stat(t)]);if(r.size!==n.size)return !1;let[s,o]=await Promise.all([$.readFile(e),$.readFile(t)]);return s.equals(o)}catch{return false}}async function Hn(e,t,r,n){let s=P.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 mi(e,t)?(n.debug("Skipped unchanged post-crawl copy target",{phase:"copy-extra-paths",sourcePath:e,targetPath:t}),false):(await $.mkdir(P.dirname(t),{recursive:true}),await $.copyFile(e,t),true)}async function gi(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=>P.resolve(he(e,c))));r.mark("copy-extra-paths");for(let c of n){let a=c.sourcePath,l=c.prefix;if(!a||!l){r.warn("Skipped post-crawl copy mapping with empty key/value",{sourcePath:a,prefixPath:l});continue}let d=Ao(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 u=d.resolvedPath,m=St(l);if(!m){r.warn("Skipped post-crawl copy mapping with invalid export prefix",{sourcePath:a,prefixPath:l});continue}let h;try{h=await $.stat(u);}catch{r.warn("Skipped post-crawl copy source because it does not exist",{sourcePath:a,sourceAbs:u,prefixPath:l});continue}let f=P.resolve(e.outputDir,m);if(h.isDirectory()){let w=await _n(u,f,i,r);o.push(...w),s+=w.length,w.length>0&&r.progress(`Copied static directory to export: ${u} -> /${m}`,{phase:"copy-extra-paths",sourcePath:u,targetPath:`/${m}`,copiedItems:s,changedFiles:w.length});continue}let b=P.basename(u),p=l.endsWith("/")?P.join(f,b):f;await Hn(u,p,i,r)&&(o.push(p),s++,r.progress(`Copied static file to export: ${u} -> /${St(l.endsWith("/")?`${l}${b}`:l)}`,{phase:"copy-extra-paths",sourcePath:u,targetPath:`/${St(l.endsWith("/")?`${l}${b}`:l)}`,copiedItems:s}));}return r.endMark("copy-extra-paths",{mappedSources:n.length,copiedItems:s}),o}function qe(e,t,r,n,s){let o=new Set,i=Se(r).replace(/\\\//g,"/"),c=s==="page-html"?di(i):i,a=pi(t,s);if(a){for(let l of li(c)){let d=Q(e,l,t,n,`${s}:css-url`);d&&N(e,d)&&o.add(d.toString());}for(let l of c.matchAll(/@import\s+(?:url\()?\s*['"]?([^'"\s;]+)['"]?\s*\)?/gi)){let d=Q(e,l[1],t,n,`${s}:css-import`);d&&N(e,d)&&o.add(d.toString());}}if(a||s==="page-html")for(let l of c.matchAll(/<\?xml-stylesheet[^>]+href=["']([^"']+)["'][^>]*\?>/gi)){let d=Q(e,l[1],t,n,`${s}:xml-stylesheet`);d&&N(e,d)&&o.add(d.toString());}if(s==="page-html")for(let l of Fr(i)){let d=l.startsWith("//")?`${new URL(e.sourceOrigin).protocol}${l}`:l;if(tr(d)){n.ignore(`${s}:serialized-url`,d,"looks like JavaScript/code fragment",t);continue}let u=Q(e,d,t,n,`${s}:serialized-url`);u&&N(e,u)?o.add(u.toString()):u&&n.ignore("asset",u.toString(),"serialized URL did not pass safe asset path filter",t);}if(s!=="page-html"&&ii(t))for(let l of Wr(i)){if(tr(l)||!/\.(?:js|mjs)(?:[?#]|$)/i.test(l))continue;let d=Q(e,l,t,n,`${s}:relative-asset`);d&&N(e,d)&&o.add(d.toString());}return [...o]}function Bn(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=Q(e,c,t,n,"page-link");a&&(Un(e,a)||Ce(a)&&!Me(a)&&!N(e,a)&&s.add(a.toString()));}return [...s]}async function bn(e,t,r,n,s,o,i=false,c=[]){let a=new Set(c),l=0,d=new Map,u=(m,h)=>{let f=[h],b=new Set;for(;f.length>0;){let p=f.pop();if(p===m)return true;b.has(p)||(b.add(p),f.push(...d.get(p)??[]));}return false};for(;r.sitemapQueue.length>0;){let m=r.sitemapQueue.shift();r.queuedSitemaps.delete(m);let h=oe(m,n,"sitemap","sitemap-queue");if(!h)continue;let f=h.toString();if(r.doneSitemaps.has(f))continue;r.doneSitemaps.add(f),n.sitemap(`Fetching sitemap ${f}`,{url:f});let b=true;try{let p=await t.get(f,{timeout:6e4});if(b=!1,!p.ok()){if(n.skip("sitemap",f,p.status()),i&&!a.has(f))throw new Error(`Required child content-sync sitemap returned HTTP ${p.status()}: ${f}`);continue}let g=await p.body(),w=p.url()||f,x=oe(w,n,"sitemap-response",f);if(!x)continue;let k=x.toString();r.successfulSitemaps.add(f),r.successfulSitemaps.add(k),a.has(f)&&(r.resolvedSitemapRoots.add(k),l+=1);let M=await sr(e,r.assetMap,k,g,r,n);G(s,e,M.outputPath),se(s,M.outputPath);let I=g.toString("utf8");/<sitemapindex(?:\s|>)/i.test(I)?r.sitemapIndexUrls.add(k):r.sitemapLeafUrls.add(k);let v=qe(e,k,I,n,"sitemap");for(let O of v)q(e,r,O,n,k);let R=[];for(let O of ui(I)){let C=Q(e,O.loc,k,n,"sitemap-loc",!0);if(!C){if(i)throw new Error(`Content-sync sitemap contains an inadmissible location: ${O.loc}`);continue}if(Ne(C)){if(u(k,C.toString()))throw new Error(`Sitemap index cycle detected: ${k} -> ${C.toString()}`);if(d.has(k)||d.set(k,new Set),d.get(k).add(C.toString()),R.push(C.toString()),i&&r.doneSitemaps.has(C.toString())&&!r.successfulSitemaps.has(C.toString()))throw new Error(`Required child content-sync sitemap was not resolved: ${C.toString()}`);Rt(e,r,C.toString(),n,k);}else if(i){if(Ce(C)&&!N(e,C)){let W=o.requiredUrls.has(C.toString()),_=o.manifest.pages[C.toString()],S=!!_&&!!await Ee(_.outputPath);if(!W&&!S)throw new Error(`Content-sync sitemap coverage is incomplete for ${C.toString()}.`)}n.ignore("sitemap-loc",C.toString(),"content-sync sitemap-only traversal does not enqueue urlset locations",k);}else N(e,C)?q(e,r,C.toString(),n,k):Ce(C)?(O.lastmod&&(r.sitemapLastmodByPage[C.toString()]=O.lastmod),$e(e,r,C.toString(),n,k)):n.reject("sitemap-loc",C.toString(),"not page/sitemap/asset-like",k);}o.trackManifest&&(o.manifest.assets[k]={url:k,outputPath:M.outputPath,isText:!0,contentType:p.headers()["content-type"]??"application/xml",cacheControl:Yt(p.headers()),changeToken:null,tokenSource:null,discoveredAssets:[...new Set([...v,...R])],lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,unreferencedRuns:0,rewriteComplete:!1},await ke(e,o));}catch(p){n.error(`Failed sitemap ${f}`,{url:f,error:String(p)});let g=i&&a.has(f)&&b;if(i&&!g)throw p}}if(i&&a.size>0&&l===0)throw new Error(`None of the configured content-sync sitemap roots could be resolved: ${[...a].join(", ")}`)}async function hi(e,t,r,n,s,o,i){let c=Q(e,n,e.sourceOrigin,s,"asset-fetch");if(!c||!N(e,c))return;let a=c.toString();if(r.doneAssets.has(a))return;let l=o.enabled||o.strictTargeted?o.previousManifest.assets[a]:void 0,d=o.trackManifest?await bt(e,t,o,a,s):null,u=d?.token??null,m=Ht(l?.changeToken,d),h=o.strictTargeted&&(!d?.supported||!d.token)&&Bt(e.sourceOrigin,a),f=o.strictTargeted?o.manifest.assets[a]:void 0;if(f?.lastSeenRunId===o.runId&&await Ee(f.outputPath)){r.doneAssets.add(a);for(let p of f.discoveredAssets||[])q(e,r,p,s,a);G(i,e,f.outputPath),Fe(i,e,f.outputPath,f.cacheControl),f.isText&&se(i,f.outputPath),s.info(`Resumed completed content-sync asset ${a}`,{url:a,source:"content-sync-checkpoint"}),Ie(r,s);return}if(l&&(m||h)&&await Ee(l.outputPath)){o.manifest.assets[a]={...l,changeToken:u,tokenSource:d?.tokenSource??l.tokenSource,discoveredAssets:[...l.discoveredAssets||[]],lastSeenRunId:o.runId,unreferencedRuns:0},delete o.manifest.pages[a],r.doneAssets.add(a);for(let p of l.discoveredAssets||[])q(e,r,p,s,a);Fe(i,e,l.outputPath,l.cacheControl),s.info(`Reused unchanged trusted asset ${a}.`,{url:a,tokenSource:d?.tokenSource??"unknown",phase:"download-assets",source:m?"asset-change-token-match":"content-sync-release-fingerprint"}),Ie(r,s);return}let b=(p,g={})=>{if(!l||o.strictTargeted)return false;o.manifest.assets[a]={...l,discoveredAssets:[...l.discoveredAssets||[]],lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,unreferencedRuns:0},delete o.manifest.pages[a],r.doneAssets.add(a);for(let w of l.discoveredAssets||[])q(e,r,w,s,a);return s.warn(`Keeping previous incremental asset ${a} after fetch issue.`,{url:a,reason:p,preservedFromPreviousManifest:true,...g,phase:"download-assets"}),Ie(r,s),true};s.asset(`Fetching asset ${a}`,{url:a});try{let p=We(e,r.assetMap,a),g=p?await Ee(p):null;if(p&&g&&!o.strictTargeted)try{let _=await z(`fetch asset headers ${a}`,6e4,()=>t.head(a,{timeout:6e4})),S=_.headers();if(_.ok()&&si(g,S)){let j=await Fn(p);if(j!==null){let ie=_.url()||a,te=oe(ie,s,"asset-response",a);if(!te)return;let ae=te.toString(),A=await sr(e,r.assetMap,ae,j,r,s,S);A.wroteFile&&(G(i,e,A.outputPath),le(A.outputPath)&&se(i,A.outputPath));let D=Yt(S)||l?.cacheControl||null;Fe(i,e,A.outputPath,D),r.doneAssets.add(a),s.info(`Reused existing asset ${a} based on response headers.`,{url:a,filePath:p,lastModified:S["last-modified"]||"",contentLength:S["content-length"]||"",phase:"download-assets"}),Ie(r,s);let L=nr(c,S),Z=l?.discoveredAssets?[...l.discoveredAssets]:[];if(L||l?.isText){let J=j.toString("utf8"),_e=qe(e,ae,J,s,"asset:cached");(_e.length>0||!l)&&(Z=_e);for(let rt of Z)q(e,r,rt,s,ae);}if(o.trackManifest){let J=L||!!l?.isText;o.manifest.assets[a]={url:a,outputPath:A.outputPath,isText:J,contentType:Zt(S)||l?.contentType||null,cacheControl:D,changeToken:d?.supported?d.token:null,tokenSource:d?.supported?d.tokenSource??null:null,discoveredAssets:Z,lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,unreferencedRuns:0,rewriteComplete:!J},delete o.manifest.pages[a],(o.enabled||o.strictTargeted)&&J&&await ke(e,o);}return}}}catch{}let w=await z(`fetch asset ${a}`,6e4,()=>t.get(a,{timeout:6e4}));if(!w.ok()){if(b(`http-${w.status()}`,{status:w.status()}))return;if(o.strictTargeted)throw new Error(`Required content-sync asset returned HTTP ${w.status()}: ${a}`);s.skip("asset",a,w.status());return}let x=await z(`read asset response ${a}`,6e4,()=>w.body()),k=w.url()||a,M=oe(k,s,"asset-response",a);if(!M)return;let I=M.toString(),v=w.headers(),R=await sr(e,r.assetMap,I,x,r,s,v);R.wroteFile&&(G(i,e,R.outputPath),le(R.outputPath)&&se(i,R.outputPath));let O=Yt(v);Fe(i,e,R.outputPath,O),r.doneAssets.add(a),Ie(r,s);let C=nr(c,v),W=[];if(C){let _=x.toString("utf8");W=qe(e,I,_,s,`asset:${P.extname(c.pathname).toLowerCase()||v["content-type"]||"unknown"}`);for(let S of W)q(e,r,S,s,I);}o.trackManifest&&(o.manifest.assets[a]={url:a,outputPath:R.outputPath,isText:C,contentType:Zt(v),cacheControl:O,changeToken:d?.supported?d.token:null,tokenSource:d?.supported?d.tokenSource??null:null,discoveredAssets:W,lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,unreferencedRuns:0,rewriteComplete:!C},delete o.manifest.pages[a],(o.enabled||o.strictTargeted)&&C&&await ke(e,o));}catch(p){if(b("fetch-error",{error:String(p)}))return;if(s.error(`Failed asset ${a}`,{url:a,error:String(p)}),o.strictTargeted)throw p}finally{r.doneAssets.has(a)||(r.doneAssets.add(a),Ie(r,s));}}async function fi(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 hi(e,t,r,a,n,s,o));}});await Promise.all(c);}function vt(e,t){let r=X(e.outputDir,t);if(!r)throw new Error(`Remote export output is outside outputDir: ${t}`);return r}function wi(e,t){return nr(e,{"content-type":t})}function Sn(e){return /(?:^|\/)index\.html?$|\.html?$/i.test(e)}async function yi(e,t,r,n,s,o,i,c,a){let l=Math.max(1,Math.min(100,a)),d=20;for(;r.assetQueue.length>0;){let u=r.assetQueue.splice(0,l*d);for(let b of u)r.queuedAssets.delete(b);await ar(e,t,s,u,n);let m=[];for(let b of u){let p=s.manifest.assets[b],g=p?X(e.outputDir,p.outputPath):null,w=g?i.objects[g]:void 0,x=s.changeTokenCache.get(b)??null;if(!(s.enabled&&p&&w?.kind==="asset"&&w.sourceUrl===b&&(Ht(p.changeToken,x)||(!x?.supported||!x.token)&&Bt(e.sourceOrigin,b)))||!p||!g||!w){m.push(b);continue}s.manifest.assets[b]={...p,changeToken:x?.token??null,tokenSource:x?.tokenSource??p.tokenSource,lastSeenRunId:s.runId,unreferencedRuns:0};for(let M of p.discoveredAssets||[])q(e,r,M,n,b);r.doneAssets.add(b),Fe(o,e,p.outputPath,p.cacheControl),n.info(`Reused unchanged S3-native asset ${b}.`,{url:b,relativePath:g,tokenSource:x?.tokenSource??"release-fingerprint",phase:"download-assets",execution:"lambda"}),Ie(r,n);}if(m.length===0)continue;let h=[];for(let b=0;b<m.length;b+=d)h.push(m.slice(b,b+d));let f=await Promise.all(h.map(b=>c.fetch({urls:b,ignoreHttpsErrors:e.ignoreHttpsErrors,timeoutMs:6e4})));for(let b of f)for(let p of b.assets){let g=p.requestedUrl;try{if(p.outcome!=="fetched"||!p.object||!p.finalUrl){let O=p.error||`Remote asset fetch ended with ${p.outcome}.`;if(n.error(`Failed remote asset ${g}`,{url:g,status:p.httpStatus,outcome:p.outcome,error:O,execution:"lambda"}),s.strictTargeted)throw new Error(O);continue}let w=oe(p.finalUrl,n,"remote-asset-response",g);if(!w)continue;let x=tt(e,w.toString()),k=x.originalFilePath,M=x.originalPublicUrlWithSearch;if(x.preferQueryHashed&&x.hashedFilePath&&x.hashedPublicUrl&&qn(r,x.originalFilePath,p.object.sha256)){let O=jn(e,r.assetMap,w.toString());k=O?.outputPath??x.hashedFilePath,M=O?.publicUrl??x.hashedPublicUrl;}rr(e,r.assetMap,w.toString(),M,x.originalPublicUrl),w.toString()!==g&&rr(e,r.assetMap,g,M,x.originalPublicUrl),Nn(r,x.originalFilePath,p.object.sha256);let I=vt(e,k),v=p.contentType?.trim()||"application/octet-stream",R=wi(w,v);De(i,{relativePath:I,sourceUrl:g,kind:"asset",contentType:v,cacheControl:p.cacheControl,isText:R,object:p.object}),G(o,e,k),R&&se(o,k),Fe(o,e,k,p.cacheControl);for(let O of p.discoveredAssets)q(e,r,O,n,w.toString());r.stats.assetsSaved++,s.trackManifest&&(s.manifest.assets[g]={url:g,outputPath:k,isText:R,contentType:v,cacheControl:p.cacheControl,changeToken:null,tokenSource:null,discoveredAssets:[...p.discoveredAssets],lastCrawledAt:new Date().toISOString(),lastSeenRunId:s.runId,unreferencedRuns:0,rewriteComplete:!R},delete s.manifest.pages[g]),n.debug(`Remote asset fetch completed ${g}`,{url:g,finalUrl:w.toString(),relativePath:I,bytes:p.object.bytes,taskId:b.taskId,attempts:b.attempts,execution:"lambda"});}finally{r.doneAssets.add(g),Ie(r,n);}}}}async function bi(e,t,r,n){for(let s of [...t.changedFiles].sort()){if(!ln(r,s))continue;let o=P.join(e.outputDir,s),i=await $.readFile(o).catch(d=>{throw new Error(`Coordinator-owned output is missing before S3 staging: ${s}`,{cause:d})}),c=le(o),a=String(Yr.lookup(s)||"")||(c?"text/plain; charset=utf-8":"application/octet-stream"),l=await n.writeWorkspaceObject({key:`${r.workspace.prefix}jobs/${r.jobId}/coordinator/${ce(s,40)}-${P.basename(s)}`,body:i,contentType:a,cacheControl:Sn(s)?e.s3.htmlCacheControl:e.s3.assetCacheControl});De(r,{relativePath:s,sourceUrl:null,kind:"generated",contentType:a,cacheControl:Sn(s)?e.s3.htmlCacheControl:e.s3.assetCacheControl,isText:c,object:l});}}function Si(e){let t=Math.ceil(e/1e3);return `${t} second${t===1?"":"s"}`}function ve(e){return Math.max(6e4,e.navigationTimeoutMs*2,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+15e3)}function Ge(e){return Math.max(15e3,Math.min(6e4,ve(e)))}function Vn(e){return Math.max(15e3,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+1e4)}function cr(e){return e.stats.pagesCompleted}function or(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 Gt(e,t,r){let n=or(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 z(e,t,r){let n;try{return await Promise.race([r(),new Promise((s,o)=>{n=globalThis.setTimeout(()=>{o(new Ye(e,t));},t);})])}finally{n!==void 0&&globalThis.clearTimeout(n);}}var Ye=class extends Error{constructor(r,n){super(`${r} timed out after ${Si(n)}.`);this.operation=r;this.timeoutMs=n;this.name="OperationTimeoutError";}operation;timeoutMs};async function Pi(e,t){let r=Vn(e);await t.evaluate(async n=>{await new Promise(s=>{let o=0,i=700,c=Date.now(),a=()=>{window.clearInterval(l),window.scrollTo(0,0),s();},l=window.setInterval(()=>{if(Date.now()-c>=n.maxDurationMs){a();return}window.scrollBy(0,i),o+=i;let d=document.body?.scrollHeight||0,u=document.documentElement?.scrollHeight||0,m=Math.max(d,u);o>=m+window.innerHeight&&a();},120);});},{maxDurationMs:r});}async function Ri(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 Pi(e,t),await t.waitForTimeout(e.readiness.fallbackWaitMs);}async function vi(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 zn(e,t){return e.noJavaScriptRenderPathPrefixes.some(r=>ur(t,r))}async function ki(e,t,r,n,s=true){let o=new Set;if(s){let c=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,u=["srcset","data-srcset","data-lazy-srcset"],m=h=>{h.querySelectorAll("*").forEach(f=>{for(let p of l){let g=f.getAttribute(p);g&&a.add(g);}for(let p of u){let g=f.getAttribute(p);g&&g.split(",").forEach(w=>{let x=w.trim().split(/\s+/)[0];x&&a.add(x);});}let b=f.getAttribute("style");b&&d.add(b),f.shadowRoot&&m(f.shadowRoot);});};return m(document),{attrs:[...a],styles:[...d]}});for(let a of c.attrs)for(let l of ci(a)){let d=Q(e,l,r,n,"dom-attr");d&&N(e,d)&&o.add(d.toString());}for(let a of c.styles)for(let l of qe(e,r,a,n,"dom-style"))o.add(l);}let i=await t.content();for(let c of qe(e,r,i,n,"page-html"))o.add(c);return [...o]}async function ir(e,t,r,n,s){let o=he(e,t);await be(o,r,"utf8");let i=await $.stat(o);s?.debug(`Saved page output ${t}`,{phase:"save-pages",url:t,outputPath:o,bytes:i.size});let c=kt(n,o),a=Math.min(n.stats.pagesQueued,cr(n)+1);s&&c&&(n.stats.pagesSaved%10===0||n.stats.pagesSaved===1)&&s.progress(`Page progress: processed ${a}, rendered ${n.stats.pagesRendered}, saved ${n.stats.pagesSaved}, discovered ${n.stats.pagesQueued}.`,{donePages:a,claimedPages:n.donePages.size,pagesRendered:n.stats.pagesRendered,pagesSaved:n.stats.pagesSaved,pagesQueued:n.stats.pagesQueued,pageQueue:n.pageQueue.length,phase:"save-pages"});}function kt(e,t){let r=P.resolve(t);return e.savedPageOutputs.has(r)?false:(e.savedPageOutputs.add(r),e.stats.pagesSaved=e.savedPageOutputs.size,true)}async function Ct(e,t,r,n,s){let o=X(e.outputDir,n);if(!o)return;if(s){let c=s.objects[o];c?.kind==="page"&&c.sourceUrl===r&&c.object?.bucket===s.workspace.bucket&&typeof c.object.key=="string"&&c.object.key.startsWith(s.workspace.prefix)&&kt(t,n);return}(await Ee(n).catch(()=>null))?.isFile()&&kt(t,n);}function Qn(e){let t=cr(e);return t%5===0||t===1||t===e.stats.pagesQueued}function Kn(e,t){let r=cr(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 Ci(e){await dr(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 xi(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 Ci(n),n}async function Ti(e,t,r,n,s,o,i,c,a,l){for(;t.pageQueue.length>0&&!(e.maxPages>0&&t.donePages.size>=e.maxPages);){let d=t.pageQueue.shift();if(!d)break;t.queuedPages.delete(d);try{let u=oe(d,r,"page","page-queue");if(!u)continue;let m=u.toString();if(d=m,t.queuedPages.delete(d),t.donePages.has(d))continue;t.donePages.add(d),o.enabled&&o.seenPages.add(d);let h=xt(e,d),f=zn(e,u.pathname);if(!Ce(u)||N(e,u)||Me(u)){if(N(e,u)){r.info(`Remote worker redirected non-page URL to asset queue: ${d}`,{url:d,source:"remote-worker-guard"}),q(e,t,d,r,"remote-worker-guard");continue}r.reject("page",d,"guard rejected non-page URL before remote rendering","remote-worker");continue}let b=o.strictTargeted?o.manifest.pages[d]:void 0;if(b?.lastSeenRunId===o.runId&&await Ee(b.outputPath)){o.seenPages.add(d);for(let R of b.discoveredAssets||[])q(e,t,R,r,d);G(i,e,b.outputPath),se(i,b.outputPath),await Ct(e,t,d,b.outputPath,l),r.info(`Resumed completed content-sync page ${d}`,{url:d,source:"content-sync-checkpoint"});continue}let p=await Mn(e,s,t,o,d,r);if(o.enabled&&n!=="single-url"&&n!=="content-sync"){let R=o.manifest.pages[d];if(p.action==="reuse"&&R){for(let O of R.discoveredAssets)q(e,t,O,r,d);for(let O of R.discoveredPages)$e(e,t,O,r,d);R.lastSeenRunId=o.runId,R.sitemapLastmod=Oe(t.sitemapLastmodByPage[d])??R.sitemapLastmod,p.changeToken?.supported&&(R.changeToken=p.changeToken.token,R.tokenSource=p.changeToken.tokenSource??R.tokenSource),await Ct(e,t,d,R.outputPath,l),r.info(`Incremental reuse skipped unchanged page ${d}`,{url:d,mode:"incremental",reason:p.changeToken?.supported===!0?"change-token-match":"sitemap-lastmod-match"});continue}}r.page(`Rendering remotely ${d}`,{url:d,execution:"lambda"});let g=await a.render({sourceOrigin:e.sourceOrigin,url:d,options:{ignoreHttpsErrors:e.ignoreHttpsErrors,javaScriptEnabled:!f,viewport:e.viewport,navigationTimeoutMs:e.navigationTimeoutMs,autoScrollTimeoutMs:Vn(e),readiness:e.readiness},downloadHtml:!l}),w=g.page,x=w.finalUrl?oe(w.finalUrl,r,"remote-final-response",d)?.toString():void 0;if(n==="content-sync"&&x&&x!==m){if(o.deleteOnMissingUrls.has(d)){await Xe(e,o,i,d,o.deleteOnMissingUrls),r.info(`Removed stale content-sync archive route redirected to ${x}`,{url:d,finalResponseUrl:x,source:"content-sync-tombstone"});continue}throw new Error(`Required content-sync route redirected outside its planned URL: ${d} -> ${x}`)}let k=w.httpStatus;if(h){if(k!==404){r.error(`Generated 404 request path returned unexpected status for ${d}`,{url:d,expectedStatus:404,status:k,requestPath:e.generated404RequestPath,execution:"lambda"});continue}}else if(k!==null&&k>=400){if(n==="content-sync"&&(k===404||k===410)&&o.deleteOnMissingUrls.has(d)){await Xe(e,o,i,d,o.deleteOnMissingUrls),r.info(`Removed stale content-sync archive page ${d}`,{url:d,status:k,source:"content-sync-tombstone"});continue}if(n==="content-sync")throw new Error(`Required content-sync route returned HTTP ${k}: ${d}`);r.skip("page",d,k,t.pageDiscoverySources.get(d));continue}t.stats.pagesRendered++;let M=new Set;if(!l){if(g.html===null)throw new Error("Remote render did not return HTML for local output mode.");for(let R of qe(e,m,g.html,r,"remote-page-html"))M.add(R);}for(let R of [...w.discoveredAssets,...w.networkUrls]){let O=Q(e,R,m,r,"remote-render");O&&N(e,O)&&M.add(O.toString());}for(let R of M)q(e,t,R,r,d);let I=n!=="single-url"&&n!=="content-sync"&&!h?[...new Set([...!l&&g.html!==null?Bn(e,d,g.html,r):[],...w.discoveredPages])]:[];for(let R of I)$e(e,t,R,r,d);for(let R of w.cookies){let O=R.sameSite==="Strict"||R.sameSite==="Lax"||R.sameSite==="None"?R.sameSite:"Unspecified",C=!Number.isFinite(R.expires)||R.expires<=0;c.add({name:R.name,domain:R.domain,path:R.path||"/",expires:C?null:R.expires,session:C,secure:R.secure,httpOnly:R.httpOnly,sameSite:O,partitioned:R.partitioned===!0});}let v=he(e,d);if(l){if(!w.html)throw new Error("Remote render completed without a workspace HTML object.");De(l,{relativePath:vt(e,v),sourceUrl:d,kind:"page",contentType:w.contentType?.trim()||"text/html; charset=utf-8",cacheControl:e.s3.htmlCacheControl,isText:!0,object:w.html}),kt(t,v);}else {if(g.html===null)throw new Error("Remote render did not return HTML for local output mode.");await ir(e,d,g.html,t,r);}G(i,e,v),se(i,v),o.trackManifest&&(o.manifest.pages[d]={url:d,outputPath:v,contentType:w.contentType?.trim()||null,changeToken:p.changeToken?.supported?p.changeToken.token:null,tokenSource:p.changeToken?.supported?p.changeToken.tokenSource??null:null,sitemapLastmod:Oe(t.sitemapLastmodByPage[d])??null,discoveredPages:I,discoveredAssets:[...M],lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,rewriteComplete:!1},(o.enabled||o.strictTargeted)&&await ke(e,o)),r.debug(`Remote render completed ${d}`,{url:d,taskId:g.taskId,attempts:g.attempts,execution:"lambda"});}catch(u){if(r.error(`Failed remote page ${d}`,{url:d,error:String(u),execution:"lambda",...u instanceof re?{status:u.status,attempts:u.attempts}:{}}),u instanceof re){t.pageHttpFailures.set(d,u);continue}if(o.strictTargeted)throw u}finally{t.stats.pagesCompleted++,Qn(t)&&Kn(t,r);}}}async function Ai(e,t,r,n,s,o,i,c){let a=await chromium.launch({headless:true}),l=or(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=or(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 u=t.pageQueue.shift();if(!u)break;t.queuedPages.delete(u);let m=null,h=null,f=!1,b=null,p=[],g=new Set;try{let w=oe(u,r,"page","page-queue");if(!w)continue;let x=w.toString();if(u=x,t.queuedPages.delete(u),t.donePages.has(u))continue;t.donePages.add(u),o.enabled&&o.seenPages.add(u);let k=xt(e,u),M=zn(e,w.pathname);if(!Ce(w)||N(e,w)||Me(w)){if(N(e,w)){r.info(`Worker redirected non-page URL to asset queue: ${u}`,{url:u,source:"worker-guard"}),q(e,t,u,r,"worker-guard");continue}r.reject("page",u,"guard rejected non-page URL before rendering","worker");continue}let I=o.strictTargeted?o.manifest.pages[u]:void 0;if(I?.lastSeenRunId===o.runId&&await Ee(I.outputPath)){o.seenPages.add(u);for(let A of I.discoveredAssets||[])q(e,t,A,r,u);G(i,e,I.outputPath),se(i,I.outputPath),await Ct(e,t,u,I.outputPath),r.info(`Resumed completed content-sync page ${u}`,{url:u,source:"content-sync-checkpoint"});continue}let v=await Mn(e,s,t,o,u,r);if(o.enabled&&n!=="single-url"&&n!=="content-sync"){let A=o.manifest.pages[u];if(v.action==="reuse"&&A){for(let D of A.discoveredAssets)q(e,t,D,r,u);for(let D of A.discoveredPages)$e(e,t,D,r,u);A.lastSeenRunId=o.runId,A.sitemapLastmod=Oe(t.sitemapLastmodByPage[u])??A.sitemapLastmod,v.changeToken?.supported&&(A.changeToken=v.changeToken.token,A.tokenSource=v.changeToken.tokenSource??A.tokenSource),await Ct(e,t,u,A.outputPath),r.info(`Incremental reuse skipped unchanged page ${u}`,{url:u,mode:"incremental",reason:v.changeToken?.supported===!0?"change-token-match":"sitemap-lastmod-match"});continue}}m=await z(`create page context ${u}`,ve(e),()=>xi(d,e,M)),h=await z(`create page ${u}`,ve(e),()=>m.newPage()),p=await m.cookies();let R=!1,O=new Set;await h.route("**/*",async A=>{let D=A.request();try{let L=Q(e,D.url(),e.sourceOrigin,r,"network-request");L&&N(e,L)&&(O.add(L.toString()),q(e,t,L.toString(),r,u));}catch{}if(D.isNavigationRequest()&&D.frame()===h.mainFrame())try{let L=new URL(D.url()),Z=new URL(x);if(L.hash="",Z.hash="",L.href===Z.href){if(R){r.warn(`Blocked same-page navigation/reload for ${u}`,{url:u,requestUrl:D.url()});try{await A.abort("aborted");}catch(J){r.debug(`Ignored canceled route while blocking reload for ${u}`,{url:u,error:String(J)});}return}R=!0;}}catch{}try{await A.continue();}catch(L){r.debug(`Ignored canceled network route for ${u}`,{url:u,requestUrl:D.url(),error:String(L)});}}),h.on("response",A=>{try{let L=Q(e,A.url(),e.sourceOrigin,r,"network-response");L&&N(e,L)&&(O.add(L.toString()),q(e,t,L.toString(),r,u));}catch{}let D=A.headerValues("set-cookie").then(L=>{for(let Z of L)c.add(Br(Z,A.url()));}).catch(()=>{}).then(()=>{});g.add(D),D.finally(()=>g.delete(D));}),r.page(`Rendering ${u}`,{url:u});let C=null,W=null;try{if(C=await h.goto(u,{waitUntil:"domcontentloaded",timeout:e.navigationTimeoutMs}),C&&C.ok())try{W=await z(`read response body ${u}`,ve(e),()=>C.text());}catch{W=null;}}catch(A){let D=t.pageHttpFailures.get(u);if(D){let L=(t.pageHttpAttempts.get(u)??0)+1;throw t.pageHttpAttempts.set(u,L),new re(u,D.status,L,`Retry navigation failed: ${String(A)}`)}r.warn(`Navigation issue for ${u}; saving current DOM if available`,{url:u,error:String(A)});}let _=C?.status();if(pt(_)){let A=(t.pageHttpAttempts.get(u)??0)+1;throw t.pageHttpAttempts.set(u,A),new re(u,_,A)}if(C)t.pageHttpFailures.delete(u);else if(t.pageHttpFailures.has(u)){let A=t.pageHttpFailures.get(u),D=(t.pageHttpAttempts.get(u)??0)+1;throw t.pageHttpAttempts.set(u,D),new re(u,A.status,D,"Retry navigation returned no HTTP response.")}if(n==="content-sync"&&C){let A=oe(C.url(),r,"content-sync-final-response",u)?.toString();if(A&&A!==x){if(o.deleteOnMissingUrls.has(u)){await Xe(e,o,i,u,o.deleteOnMissingUrls),r.info(`Removed stale content-sync archive route redirected to ${A}`,{url:u,finalResponseUrl:A,source:"content-sync-tombstone"});continue}throw new Error(`Required content-sync route redirected outside its planned URL: ${u} -> ${A}`)}}if(k){let A=C?.status()??null;if(A!==404){r.error(`Generated 404 request path returned unexpected status for ${u}`,{url:u,expectedStatus:404,status:A,requestPath:e.generated404RequestPath});continue}r.info(`Capturing rendered 404 page for ${u}`,{url:u,status:A,outputPath:he(e,u)});}else if(C&&!C.ok()){if(n==="content-sync"&&(C.status()===404||C.status()===410)&&o.deleteOnMissingUrls.has(u)){await Xe(e,o,i,u,o.deleteOnMissingUrls),r.info(`Removed stale content-sync archive page ${u}`,{url:u,status:C.status(),source:"content-sync-tombstone"}),await h.close();continue}if(n==="content-sync")throw new Error(`Required content-sync route returned HTTP ${C.status()}: ${u}`);r.skip("page",u,C.status(),t.pageDiscoverySources.get(u)),await h.close();continue}M?(r.info(`Rendering without JS execution for ${u}`,{url:u,mode:"no-js"}),await z(`wait for rendered page ${u}`,ve(e),()=>vi(e,h))):await z(`wait for rendered page ${u}`,ve(e),()=>Ri(e,h)),t.stats.pagesRendered++;let S=await z(`extract rendered assets ${u}`,ve(e),()=>ki(e,h,x,r,!M));for(let A of S)q(e,t,A,r,u);let j=[...new Set([...S,...O])],ie=W??await z(`capture rendered html ${u}`,ve(e),()=>Tt(h)),te=n!=="single-url"&&n!=="content-sync"&&!k?Bn(e,u,ie,r):[];if(n!=="single-url"&&n!=="content-sync"&&!k)for(let A of te)$e(e,t,A,r,u);await ir(e,u,ie,t,r);let ae=he(e,u);if(G(i,e,ae),se(i,ae),o.trackManifest){let A=C?.headers();o.manifest.pages[u]={url:u,outputPath:ae,contentType:Zt(A),changeToken:v.changeToken?.supported?v.changeToken.token:null,tokenSource:v.changeToken?.supported?v.changeToken.tokenSource??null:null,sitemapLastmod:Oe(t.sitemapLastmodByPage[u])??null,discoveredPages:te,discoveredAssets:j,lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,rewriteComplete:!1},(o.enabled||o.strictTargeted)&&await ke(e,o);}}catch(w){if(w instanceof re){t.pageHttpFailures.set(u,w),w.attempts<Qt?(b=mt(w.attempts),r.warn(`Retrying page after HTTP ${w.status}: ${u}`,{url:u,status:w.status,attempt:w.attempts,maxAttempts:Qt,delayMs:b,reason:w.message,execution:"local"})):(t.pageHttpFailures.set(u,w),r.error(`Failed page after HTTP retries ${u}`,{url:u,status:w.status,attempts:w.attempts,error:String(w),execution:"local"}));continue}if(f=w instanceof Ye,o.strictTargeted)throw r.error(`Failed required content-sync page ${u}`,{url:u,error:String(w)}),w;if(f)r.warn(`Skipped partial DOM for timed-out page ${u}`,{url:u,error:String(w),recovery:"recycle-worker-browser"});else try{let x=h?await z(`capture partial html ${u}`,ve(e),()=>Tt(h)):"";if(x&&x.trim()){await ir(e,u,x,t,r);let k=he(e,u);if(G(i,e,k),se(i,k),o.trackManifest){let M=o.manifest.pages[u]??o.previousManifest.pages[u];o.manifest.pages[u]={url:u,outputPath:k,contentType:M?.contentType??null,changeToken:null,tokenSource:null,sitemapLastmod:Oe(t.sitemapLastmodByPage[u])??M?.sitemapLastmod??null,discoveredPages:M?.discoveredPages?[...M.discoveredPages]:[],discoveredAssets:M?.discoveredAssets?[...M.discoveredAssets]:[],lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,rewriteComplete:!1},(o.enabled||o.strictTargeted)&&await ke(e,o);}r.warn(`Saved partial DOM for ${u}`,{url:u,error:String(w)});}}catch(x){x instanceof Ye&&(f=!0),r.error(`Could not save partial DOM for ${u}`,{url:u,error:String(x)});}r.error(`Failed page ${u}`,{url:u,error:String(w)});}finally{if(!f&&h&&await z(`drain network routes ${u}`,Ge(e),()=>h.unrouteAll({behavior:"wait"})).catch(w=>{f=!0,r.warn(`Could not drain network routes for ${u}`,{url:u,browserPid:l.pid,error:String(w),recovery:"recycle-worker-browser"});}),f&&(a=null,await Gt(d,r,`page operation timeout for ${u}`),await d.close().catch(()=>{})),g.size>0&&await Promise.allSettled([...g]),!f&&m)try{let w=await m.cookies();c.addAll(Vr(p,w));}catch{}b===null&&(t.stats.pagesCompleted++,Qn(t)&&Kn(t,r)),!f&&h&&await z(`close page ${u}`,Ge(e),()=>h.close()).catch(w=>{f=!0,r.warn(`Timed out while closing page ${u}`,{url:u,browserPid:l.pid,error:String(w),recovery:"recycle-worker-browser"});}),!f&&m&&await z(`close page context ${u}`,Ge(e),()=>m.close()).catch(w=>{f=!0,r.warn(`Timed out while closing page context for ${u}`,{url:u,browserPid:l.pid,error:String(w),recovery:"recycle-worker-browser"});}),f&&a===d&&(a=null,await Gt(d,r,`page cleanup timeout for ${u}`),await d.close().catch(()=>{})),b!==null&&(await setTimeout$1(b),t.donePages.delete(u),t.queuedPages.add(u),t.pageQueue.push(u));}}}finally{if(a){let d=a;await z("close worker browser",Ge(e),()=>d.close()).catch(u=>(r.warn("Timed out while closing crawl worker browser",{browserPid:l.pid,error:String(u)}),Gt(d,r,"browser.close timeout")));}}}async function Ii(e){try{let t=await $.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 Pn(e){let t=String(e||"").toLowerCase();return t.includes("timeout")||t.includes("timed out")||t.includes("navigation timeout")}function Ei(e){let t=String(e?.job?.command||"").trim(),r=String(e?.job?.crawlMode||"full").trim();return t!=="publish"&&t!=="crawl"?false:r!=="incremental"}function Oi(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 Jn(e){try{let t=await $.readFile(e,"utf8"),r=JSON.parse(t);return r&&typeof r=="object"&&!Array.isArray(r)?r:null}catch{return null}}function Rn(e){let t=String(e.originalFileName||"").toLowerCase();return t.endsWith("errors.jsonl")?0:t.endsWith("errors.json")?1:2}function Mi(e,t){let r=Array.isArray(t?.artifacts)?t.artifacts.filter(n=>String(n?.role||"").trim()==="errors"&&String(n?.storedFileName||"").trim()!=="").sort((n,s)=>Rn(n)-Rn(s)).map(n=>P.join(e,String(n.storedFileName))):[];return [...new Set([...r,P.join(e,"errors.jsonl"),P.join(e,"errors.json"),P.join(e,"errors.jsonl.gz"),P.join(e,"errors.json.gz")])]}async function vn(e){let t=await Jn(P.join(e,"job.json"));for(let r of Mi(e,t)){let n=await Ii(r);if(n.length>0)return n}return []}async function $i(e){let t=P.join(e.logDir,"archive"),r;try{r=await $.readdir(t);}catch{return ""}let n="",s=0;for(let o of r){let i=P.join(t,o);if(!(await $.stat(i).catch(()=>null))?.isDirectory())continue;let a=await Jn(P.join(i,"job.json"));if(!Ei(a))continue;let l=Oi(a);l>=s&&(s=l,n=i);}return n}async function ji(e){let t=await $i(e),r=t!==""?await vn(t):await vn(e.logDir),n=new Set;for(let s of r)if(Pn(s.error)||Pn(s.message)){let o=s.url;typeof o=="string"&&o&&n.add(o);}return [...n]}async function Ui(e){let t=[];for(let r of e)if(r.startsWith("@")){let n=r.slice(1),s=await $.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 Li(e){if(!e)throw new Error("Content-sync crawl requires an immutable impact plan.");let t=JSON.parse(await $.readFile(e,"utf8"));return yr(t),t}function Di(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 Je(e,t,r){let n=r==="page"?he(e,t):tt(e,t).originalFilePath;return X(e.outputDir,n)}async function Xe(e,t,r,n,s){let o=t.manifest.pages[n];if(!o)return;let i=X(e.outputDir,o.outputPath);if(!i)throw new Error(`Manifest-owned page path escaped output root: ${n}`);let c=P.resolve(o.outputPath);Object.entries(t.manifest.pages).some(([l,d])=>l!==n&&!s.has(l)&&P.resolve(d.outputPath)===c)||(await $.rm(o.outputPath,{force:true}),r.deletedFiles.add(i),r.revalidateFiles.delete(i)),delete t.manifest.pages[n];}async function Fi(e,t,r,n,s){let o=t.manifest.assets[n];if(!o)return;let i=X(e.outputDir,o.outputPath);if(!i)throw new Error(`Manifest-owned resource path escaped output root: ${n}`);let c=P.resolve(o.outputPath);Object.entries(t.manifest.assets).some(([l,d])=>l!==n&&!s.has(l)&&P.resolve(d.outputPath)===c)||(await $.rm(o.outputPath,{force:true}),r.deletedFiles.add(i)),delete t.manifest.assets[n];}function Wi(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{Ne(new URL(i))&&n.push(i);}catch{}}return r}async function qi(e,t,r,n,s){let o=Wi(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=X(e.outputDir,c.outputPath);if(!a)throw new Error(`Manifest-owned sitemap path escaped output root: ${i}`);await $.rm(c.outputPath,{force:true}),n.deletedFiles.add(a),delete r.manifest.assets[i];}await ke(e,r);}async function Ni(e){try{let t=await $.readFile(P.join(e.outputDir,"asset-map.json"),"utf8");return JSON.parse(t)}catch{return {}}}async function _i(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 $.mkdir(e,{recursive:true}),await Promise.all(t.map(async r=>{try{await $.unlink(P.join(e,r));}catch(n){if(n.code!=="ENOENT")throw n}}));}function kn(e,t,r,n,s){let o=Q(e,r,e.sourceOrigin,n,"manual-url");o&&(Ne(o)?Rt(e,t,o.toString(),n,s):N(e,o)?q(e,t,o.toString(),n,s):Ce(o)?$e(e,t,o.toString(),n,s):n.reject("manual-url",o.toString(),"not page/sitemap/asset-like",s));}async function Gn(e=process.argv.slice(2)){let t=[],r=await st(void 0,{onRemotePublisherConfigDiagnostic:y=>{t.push(y);}}),n=br(r.sitemapPaths),s=t.at(-1)??null,o=ko(e),i=o.mode==="content-sync"?await Li(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 ji(r)),o.mode==="single-url"&&(c=await Ui(o.urls)),i&&(c=[...i.directRenderUrls,...i.archiveFamilyUrls,...i.resourceRenderUrls]);let a=o.crawlMode==="incremental"&&o.mode==="full",l=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,u=o.mode!=="full"||o.resumeRewrite||l,m=u?await Ni(r):{},h=l||o.mode==="single-url"||o.mode==="content-sync"?await Mo(r):In(),f=new Set(c),b=new Set;if(i){for(let y of i.archiveFamilies)if(y.foundPosts===0)for(let E of y.pageUrls)b.add(E);for(let y of Object.keys(h.pages))Di(y,i)&&!f.has(y)&&(c.push(y),b.add(y));}let p={enabled:l,trackManifest:d,manifest:er(h),previousManifest:er(h),runId:i?.jobId??`${Date.now()}`,seenPages:new Set,changeTokenCache:new Map,pageChangeTokenPrimePromise:null,manifestSaveChain:Promise.resolve(),manifestPendingChanges:0,lastManifestSavedAt:Date.now(),strictTargeted:!!i,requiredUrls:f,deleteOnMissingUrls:b};await _i(r.logDir);let g=new Ue(r.logDir,r.logLevel),w=o.remoteRender??r.remoteWorkers?.render?.enabled===true,x=sn({explicitPath:o.remoteWorkerConfigPath,runtimeDir:et()}),k=null,M=null,I=null,v=null,R=Math.max(1,r.concurrency),O=1,C=r.remoteWorkers?.rewrite?.enabled===true,W=r.remoteWorkers?.deploy?.enabled===true,_=w&&C&&W&&!o.resumeRewrite;if(!_&&o.mode==="full"&&!o.resumeRewrite&&await $.rm(ft(r),{force:true}),w&&!o.resumeRewrite||C){if(!x)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 y=await Gr(x),E=false;if(I=new dt(y,{},{onProgress:T=>{if(T.operation==="rewrite"){g.debug("Lambda rewrite task progress.",{remoteWorkerOperation:T.operation,remoteWorkerTaskId:T.taskId,remoteWorkerStatus:T.status,remoteWorkerCompletedItems:T.completedItems,remoteWorkerFailedItems:T.failedItems,remoteWorkerTotalItems:T.totalItems,remoteWorkerUpdatedAt:T.updatedAt});return}g.progress(`Lambda ${T.operation} batch: ${T.completedItems+T.failedItems}/${T.totalItems}`,{remoteWorkerOperation:T.operation,remoteWorkerTaskId:T.taskId,remoteWorkerStatus:T.status,remoteWorkerCompletedItems:T.completedItems,remoteWorkerFailedItems:T.failedItems,remoteWorkerTotalItems:T.totalItems,remoteWorkerUpdatedAt:T.updatedAt});},onProgressError:T=>{E||(E=true,g.warn("Lambda progress status could not be read; task execution continues.",{error:T.message}));}}),_){if(!y.functions.asset)throw new Error("Full Lambda delegation requires an asset worker. Redeploy the Lambda worker stack and reinstall remote-workers.json.");let T=u?await mn(r):null;v=cn(`crawl-${ce(p.runId,40)}`,y,T),M=new ht({client:I,jobId:v.jobId,maxAttempts:2}),g.info("S3-native Lambda data plane is enabled.",{execution:"lambda",assetWorker:y.functions.asset,workspaceBucket:y.workspace.bucket,workspacePrefix:y.workspace.prefix});}}if(w&&!o.resumeRewrite){if(!I)throw new Error("Remote render worker client was not initialized.");R=Math.max(1,Math.min(100,_?r.concurrency:r.remoteWorkers?.render?.concurrency??r.concurrency)),O=Math.max(1,Math.min(20,r.remoteWorkers?.render?.batchSize??5)),k=new gt({client:I,jobId:`crawl-${ce(p.runId,40)}`,maxAttempts:r.remoteWorkers?.render?.maxAttempts??2,batchSize:O,maxConcurrentBatches:R,onRetry:y=>{g.warn(`Retrying remote render for ${y.url}`,{url:y.url,attempt:y.attempt,maxAttempts:y.maxAttempts,reason:y.reason,status:y.status,delayMs:y.delayMs,execution:"lambda"});}}),g.info("Lambda page rendering is enabled.",{remoteWorkerConfigPath:P.resolve(x),concurrency:R,maxAttempts:r.remoteWorkers?.render?.maxAttempts??2,batchSize:O,execution:"lambda"});}if(s){let y={status:s.status,virtualAssetBaseUrl:s.virtualAssetBaseUrl,subscriptionType:s.subscriptionType??null,error:s.error,requests:s.requests,source:"remote-publisher-config"};s.status==="loaded"&&s.subscriptionType?g.info("Loaded remote WP Suite publisher configuration.",y):g.warn("Remote WP Suite publisher configuration is unavailable or has no active subscription type.",y);}if(a&&!l){let y="Incremental crawl requires an active remote publisher subscription; refusing to fall back to a destructive full crawl.";throw g.error(y,{requestedMode:o.crawlMode,subscriptionType:r.subscriptionType??null,source:"incremental-subscription-guard"}),await g.flush(),new Error(y)}let S={pageQueue:[],queuedPages:new Set,donePages:new Set,savedPageOutputs:new Set,pageHttpAttempts:new Map,pageHttpFailures:new Map,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:{...m},assetVariantDigestsByOriginalPath:new Map,stats:{pagesQueued:0,pagesRendered:0,pagesCompleted:0,assetsQueued:0,sitemapsQueued:0,assetsSaved:0,pagesSaved:0}},j=Oo(),ie=new ct,te=Co();if(te&&!o.resumeRewrite&&await lt(te,ie.artifact()),await fr(r),await It(r,{startedAt:new Date().toISOString(),outputDir:P.resolve(r.outputDir)}),!o.resumeRewrite&&r.pageCache?.purgeBeforeCrawl===true){g.mark("purge-page-cache");let y=await request.newContext({ignoreHTTPSErrors:r.ignoreHttpsErrors});try{let E=await an(r,y);g.info("WordPress page cache was purged before crawl discovery.",{provider:E.provider,scope:E.scope,purgedAt:E.purgedAt??null}),g.endMark("purge-page-cache",{provider:E.provider,scope:E.scope});}catch(E){throw g.error("WordPress page-cache purge failed; crawl stopped before changing export output.",{error:E instanceof Error?E.message:String(E)}),await g.flush(),E}finally{await y.dispose();}}if(u||await $.rm(r.outputDir,{recursive:true,force:true}),await $.mkdir(r.outputDir,{recursive:true}),u||await It(r,{startedAt:new Date().toISOString(),outputDir:P.resolve(r.outputDir)}),i){let y=new Set([...i.deleteUrls,...p.deleteOnMissingUrls]);for(let T of i.deleteUrls)await Xe(r,p,j,T,y);let E=new Set(i.resourceDeleteUrls);for(let T of i.resourceDeleteUrls)await Fi(r,p,j,T,E);}if(o.resumeRewrite)g.info("Resuming final rewrite from existing output.",{phase:"rewrite-text",mode:o.mode,crawlMode:o.crawlMode});else {let y=await request.newContext({ignoreHTTPSErrors:r.ignoreHttpsErrors});try{if(g.mark("discovery"),o.mode==="full"?(n.forEach(T=>Rt(r,S,T,g)),await bn(r,y,S,g,j,p),r.seedPaths.forEach(T=>kn(r,S,T,g,"seed-path")),r.generated404RequestPath&&$e(r,S,r.generated404RequestPath,g,"generated-404-request-path")):(c.forEach(T=>kn(r,S,T,g,"cli")),i?.sitemapUrls.forEach(T=>Rt(r,S,T,g,"content-sync-impact")),await bn(r,y,S,g,j,p,o.mode==="content-sync",i?.sitemapUrls??[]),i&&await qi(r,S,p,j,i.sitemapUrls)),g.endMark("discovery",{pages:S.pageQueue.length,assets:S.assetQueue.length,sitemaps:S.sitemapQueue.length}),g.summary(`Queued ${S.pageQueue.length} pages, ${S.assetQueue.length} assets, ${S.sitemapQueue.length} sitemaps.`,{mode:o.mode,crawlMode:o.crawlMode,queuedPages:S.pageQueue.length,queuedAssets:S.assetQueue.length,queuedSitemaps:S.sitemapQueue.length}),o.mode==="retry-timeouts"&&S.pageQueue.length===0&&S.assetQueue.length===0&&S.sitemapQueue.length===0){g.summary("No timed-out URLs were queued. Skipping retry crawl.",{mode:o.mode,crawlMode:o.crawlMode,queuedPages:0,queuedAssets:0,queuedSitemaps:0}),await g.flush(),te&&await lt(te,ie.artifact());return}g.mark("render-pages");let E=Array.from({length:k?R*O:R},()=>k?Ti(r,S,g,o.mode,y,p,j,ie,k,v??void 0):Ai(r,S,g,o.mode,y,p,j,ie));if(await Promise.all(E),S.pageHttpFailures.size>0&&await g.flush(),Zr(S.pageHttpFailures),te&&await lt(te,ie.artifact()),g.endMark("render-pages",{pages:S.stats.pagesCompleted}),g.mark("download-assets"),g.progress("Asset download phase started.",{phase:"download-assets",doneAssets:S.doneAssets.size,assetsQueued:S.stats.assetsQueued,assetQueue:S.assetQueue.length}),v&&M?await yi(r,y,S,g,p,j,v,M,r.concurrency):(await ar(r,y,p,[...S.assetQueue],g),await fi(r,y,S,g,p,j)),g.endMark("download-assets",{assets:S.doneAssets.size}),p.enabled&&r.maxPages===0&&(await Wo(r,S,p,g,j),o.mode==="full"&&await qo(r,p,g,j)),o.mode==="full"){let T=await gi(r,S,g);for(let F of T)if(G(j,r,F),v&&I){let H=vt(r,F),Y=await $.readFile(F),fe=le(F),we=String(Yr.lookup(H)||"")||(fe?"text/plain; charset=utf-8":"application/octet-stream"),nt=await I.writeWorkspaceObject({key:`${v.workspace.prefix}jobs/${v.jobId}/copied/${ce(H,40)}-${P.basename(H)}`,body:Y,contentType:we});De(v,{relativePath:H,sourceUrl:null,kind:"generated",contentType:nt.contentType,cacheControl:null,isText:fe,object:nt}),fe&&se(j,F);}}}finally{await z("dispose crawl request context",Ge(r),()=>y.dispose()).catch(E=>{g.warn("Timed out while disposing crawl request context",{error:String(E)});});}}if(p.trackManifest&&await ke(r,p,true),v)for(let y of j.deletedFiles)dn(v,y);let ae=JSON.stringify(S.assetMap,null,2);if(await $.writeFile(P.join(r.outputDir,"asset-map.json"),ae,"utf8"),v&&I){let y=await I.writeWorkspaceObject({key:`${v.workspace.prefix}jobs/${v.jobId}/generated/asset-map.json`,body:ae,contentType:"application/json; charset=utf-8"});De(v,{relativePath:"asset-map.json",sourceUrl:null,kind:"generated",contentType:"application/json; charset=utf-8",cacheControl:r.s3.assetCacheControl,isText:true,object:y});}JSON.stringify(m,null,2)!==JSON.stringify(S.assetMap,null,2)&&G(j,r,P.join(r.outputDir,"asset-map.json")),v&&I&&await bi(r,j,v,I);let A=o.mode==="single-url"||o.mode==="content-sync"?Ko(r,S):p.enabled&&!o.resumeRewrite?No(r,p,j,m,S.assetMap):void 0;g.mark("rewrite-text");let D=o.mode==="single-url"||o.mode==="content-sync"?`Rewriting text files touched by URL crawl: 0/${A?.length??0}`:"Rewriting text files...";g.progress(D,{phase:"rewrite-text",index:0,totalFiles:A?.length,changedTextFiles:0}),await Ke(D);let L=Date.now(),Z={files:A,previousAssetMap:m,onStart:({totalFiles:y,workerCount:E})=>{g.info(`Rewrite phase scanning ${y} text files.`,{phase:"rewrite-text",totalFiles:y,workerCount:E});},onProgress:async({index:y,totalFiles:E,changedTextFiles:T,file:F,changed:H})=>{H&&G(j,r,P.join(r.outputDir,F)),g.checkpoint(`Rewriting text file ${y}/${E}`,{phase:"rewrite-text",index:y,totalFiles:E,changedTextFiles:T,file:F}),g.debug(`${H?"Rewrote":"Checked unchanged"} text file ${y}/${E}: ${F}`,{phase:"rewrite-text",index:y,totalFiles:E,changedTextFiles:T,file:F,changed:H});let Y=Date.now();if(!(y===1||y===E||y%50===0||Y-L>=5e3))return;L=Y;let we=`Rewriting text files: ${y}/${E}`;g.progress(we,{phase:"rewrite-text",index:y,totalFiles:E,changedTextFiles:T,file:F}),await Ke(we);}},J;if(v&&I){let y=A?.map(T=>vt(r,P.isAbsolute(T)?T:P.join(r.outputDir,T))),E=Object.values(v.objects).filter(T=>T.isText&&(!y||y.includes(T.relativePath))).length;await Z.onStart?.({totalFiles:E,workerCount:Math.min(r.concurrency,E)}),J=await nn(r,v,S.assetMap,{client:I,jobId:v.jobId,concurrency:r.concurrency,batchSize:25,maxAttempts:2,...y?{relativePaths:y}:{},onProgress:Z.onProgress,onBatchProgress:async({completedItems:T,totalItems:F,completedBatches:H,totalBatches:Y,changedTextFiles:fe})=>{let we=`Lambda rewrite: ${T}/${F} files; ${H}/${Y} batches completed`;g.progress(we,{phase:"rewrite-text",execution:"lambda",index:T,totalFiles:F,completedBatches:H,totalBatches:Y,changedTextFiles:fe}),await Ke(we);}}),await pn(r,v);}else C&&I?J=await rn(r,S.assetMap,{client:I,jobId:`crawl-${ce(p.runId,40)}`,concurrency:r.remoteWorkers?.rewrite?.concurrency??r.rewriteConcurrency,batchSize:r.remoteWorkers?.rewrite?.batchSize??25,maxAttempts:r.remoteWorkers?.rewrite?.maxAttempts??2,onStageProgress:async({index:y,totalFiles:E,file:T})=>{let F=Date.now();if(y!==1&&y!==E&&y%25!==0&&F-L<5e3)return;L=F;let H=`Staging text files for Lambda rewrite: ${y}/${E}`;g.progress(H,{phase:"rewrite-stage",index:y,totalFiles:E,file:T,execution:"lambda"}),await Ke(H);},onBatchProgress:async({completedItems:y,totalItems:E,completedBatches:T,totalBatches:F,changedTextFiles:H})=>{let Y=`Lambda rewrite: ${y}/${E} files; ${T}/${F} batches completed`;g.progress(Y,{phase:"rewrite-text",execution:"lambda",index:y,totalFiles:E,completedBatches:T,totalBatches:F,changedTextFiles:H}),await Ke(Y);},options:Z}):J=await Mr(r,S.assetMap,Z);p.trackManifest&&(_o(p,A),await ke(r,p,true)),g.endMark("rewrite-text",{changedTextFiles:J});let _e=i?[...j.deletedFiles].sort():p.enabled&&!o.resumeRewrite?await Bo(r,S,p,j,g,v):[],rt=[...new Set((A||[]).map(y=>X(r.outputDir,P.isAbsolute(y)?y:P.join(r.outputDir,y))).filter(y=>y!==null))].sort();if(i){let y=[...j.changedFiles].sort(),E=new Set(y),T=new Set(i.directRenderUrls.map(U=>Je(r,U,"page")).filter(U=>!!U&&E.has(U))),F=new Set(i.archiveFamilyUrls.map(U=>Je(r,U,"page")).filter(U=>!!U&&E.has(U))),H=new Set(i.resourceRenderUrls.map(U=>Je(r,U,"asset")).filter(U=>!!U&&E.has(U))),Y=new Set([...S.sitemapLeafUrls].map(U=>Je(r,U,"asset")).filter(U=>!!U&&E.has(U))),fe=new Set([...S.sitemapIndexUrls].map(U=>Je(r,U,"asset")).filter(U=>!!U&&E.has(U))),we=new Set([...T,...F,...H,...Y,...fe]),nt=y.filter(U=>!we.has(U)),Zn=[...new Set([...i.directRenderUrls,...i.archiveFamilyUrls,...S.resolvedSitemapRoots,...S.sitemapLeafUrls,...S.sitemapIndexUrls,...i.deleteUrls,...i.resourceRenderUrls,...i.resourceDeleteUrls].map(U=>{let lr=new URL(U);return `${lr.pathname}${lr.search}`}))].sort();await At(r,{schemaVersion:2,generatedAt:new Date().toISOString(),outputDir:P.resolve(r.outputDir),runMode:"content-sync",crawlMode:"incremental",fullSyncRequired:false,changedFiles:y,deletedFiles:_e,rewriteTargets:rt,revalidateFiles:[...j.revalidateFiles].sort(),consumerId:i.consumerId,fromSequence:i.fromSequence,toSequence:i.toSequence,impactHash:i.impactHash,resolvedSitemapUrls:[...S.resolvedSitemapRoots],uploadGroups:{assets:nt,content:[...T].sort(),listings:[...F].sort(),resources:[...H].sort(),sitemapLeaves:[...Y].sort(),sitemapIndexes:[...fe].reverse()},invalidationPaths:Zn});}else await At(r,{schemaVersion:1,generatedAt:new Date().toISOString(),outputDir:P.resolve(r.outputDir),runMode:o.mode,crawlMode:o.crawlMode,fullSyncRequired:!(p.enabled&&!o.resumeRewrite),changedFiles:p.enabled&&!o.resumeRewrite?[...j.changedFiles].sort():[],deletedFiles:p.enabled&&!o.resumeRewrite?_e:[],rewriteTargets:p.enabled&&!o.resumeRewrite?rt:[],revalidateFiles:[...j.revalidateFiles].sort()});await wr(r),g.summary(o.resumeRewrite?`Done. Resumed final rewrite over existing output and changed ${J} text files.`:`Done. Rendered ${S.stats.pagesRendered} pages, processed ${S.doneSitemaps.size} sitemaps and ${S.doneAssets.size} assets.`,{mode:o.mode,crawlMode:o.crawlMode,resumeRewrite:o.resumeRewrite,...S.stats,pagesRendered:S.stats.pagesRendered,donePages:S.stats.pagesCompleted,claimedPages:S.donePages.size,doneSitemaps:S.doneSitemaps.size,doneAssets:S.doneAssets.size,changedTextFiles:J}),await g.flush();}Gn().catch(async e=>{let t=Pe(e instanceof Error?e.message:String(e));console.error(t);try{let n=(await st().catch(()=>null))?.logDir??"logs",s=new Ue(n,"debug");s.error(`Unhandled error: ${t}`,e instanceof Error&&e.stack?{stack:Pe(e.stack)}:void 0),await s.flush();}catch{}process.exit(1);});
17
+ ${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 Mn(e,t,r,n,s,o){let i=xt(e,s);if(await Uo(e,t,r,n,s,o),!n.enabled)return {action:"render",changeToken:n.trackManifest?await bt(e,t,n,s,o):null};let c=n.manifest.pages[s];if(!c)return {action:"render",changeToken:await bt(e,t,n,s,o)};let a=await bt(e,t,n,s,o);if(a?.supported&&a.token)return c.changeToken===a.token?i&&!await Fo(e,t,s,o)?{action:"render",changeToken:a}:{action:"reuse",changeToken:a}:{action:"render",changeToken:a};let l=Ee(r.sitemapLastmodByPage[s]);return l&&c.sitemapLastmod&&c.sitemapLastmod===l?{action:"reuse",changeToken:a}:{action:"render",changeToken:a}}async function Fo(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 Wo(e,t,r,n,s){let o=wn(r.previousManifest,void 0,n,"previous-manifest"),i=0;for(let[m,h]of Object.entries(r.manifest.pages))if(!r.seenPages.has(m)){Xt(s,e,h.outputPath);try{await $.unlink(h.outputPath);}catch(f){(f.code||"")!=="ENOENT"&&n.warn(`Failed to remove stale incremental page output for ${m}`,{url:m,outputPath:h.outputPath,error:String(f)});}delete r.manifest.pages[m],i++;}let c=wn(r.manifest,r.runId,n,"active-manifest"),a=new Set,l=new Set;for(let m of c){for(let b of Ze(e,m))a.add(b);let h=r.manifest.assets[m]?.outputPath;h&&l.add(h);let f=We(e,t.assetMap,m);f&&l.add(f);}for(let m of Object.keys(r.manifest.assets)){if(c.has(m)){r.manifest.assets[m].unreferencedRuns=0;continue}let h=r.manifest.assets[m];if(_r(h.unreferencedRuns)){h.unreferencedRuns+=1,n.warn(`Deferred deletion of newly unreferenced incremental asset ${m}.`,{url:m,unreferencedRuns:h.unreferencedRuns,phase:"incremental-cleanup",source:"asset-deletion-grace"});continue}delete r.manifest.assets[m];}let d=0,u=0;for(let m of o){if(r.manifest.assets[m])continue;let h=new Set,f=r.previousManifest.assets[m]?.outputPath;f&&h.add(f);let b=We(e,t.assetMap,m);if(!c.has(m)&&b)h.add(b);else if(!c.has(m)){let p=ri(e,m,n,"incremental-cleanup");p&&(h.add(p.originalFilePath),p.hashedFilePath&&h.add(p.hashedFilePath));}for(let p of h)if(!l.has(p)){Xt(s,e,p);try{await $.unlink(p),d++;}catch(g){(g.code||"")!=="ENOENT"&&n.warn(`Failed to remove stale incremental asset output for ${m}`,{url:m,outputPath:p,error:String(g)});}}for(let p of Ze(e,m))a.has(p)||Object.prototype.hasOwnProperty.call(t.assetMap,p)&&(delete t.assetMap[p],u++);}(i>0||d>0||u>0)&&n.info(`Incremental cleanup removed ${i} stale pages, ${d} stale assets, ${u} stale asset mappings`,{removedPages:i,removedAssets:d,removedAssetMappings:u,phase:"incremental-cleanup"});}async function qo(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=>S.resolve(a))),o=Object.values(e.postCrawlCopyMap||{}).map(a=>St(String(a||""))).filter(a=>!!a).map(a=>S.resolve(e.outputDir,a)),c=(await ks(["**/*.html","**/*.htm"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(a=>Nr(S.join(e.outputDir,a),e.outputDir,s,o));for(let a of c){let l=S.join(e.outputDir,a);Xt(n,e,l),await $.unlink(l);}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 wn(e,t,r,n){let s=new Set,o=i=>{let c=i.trim();if(c){if(r){let a=oe(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 yn(e,t,r){for(let n of t)for(let s of Ze(e,n))if(r.has(s))return true;return false}function No(e,t,r,n,s){let o=new Set(r.rewriteTargets);for(let c of r.changedFiles)o.add(S.resolve(e.outputDir,c));for(let c of Object.values(t.manifest.pages))c.rewriteComplete||o.add(S.resolve(c.outputPath));for(let c of Object.values(t.manifest.assets))c.isText&&!c.rewriteComplete&&o.add(S.resolve(c.outputPath));let i=jo(n,s);if(i.size===0)return [...o];for(let c of Object.values(t.manifest.pages))yn(e,c.discoveredAssets,i)&&o.add(S.resolve(c.outputPath));for(let[c,a]of Object.entries(t.manifest.assets)){a.isText&&yn(e,a.discoveredAssets,i)&&o.add(S.resolve(a.outputPath));for(let l of Ze(e,c))if(i.has(l)){G(r,e,a.outputPath),a.isText&&o.add(S.resolve(a.outputPath));break}}return [...o]}function _o(e,t){let r=t?new Set(Array.from(t,s=>S.resolve(s))):null,n=s=>r===null||r.has(S.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 Ho(e,t,r){let n=new Set,s=o=>{if(!o)return;let i=X(e.outputDir,o);i&&n.add(i);};for(let o of t.donePages)s(he(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(We(e,t.assetMap,o));for(let o of Object.values(r.manifest.assets))o.lastSeenRunId===r.runId&&s(o.outputPath);return n}async function Bo(e,t,r,n,s,o){let i=[...n.deletedFiles].sort(),c=Ho(e,t,r),a=0;for(let u of [...c].sort())if(!o?.objects[u]){try{if((await $.stat(S.join(e.outputDir,u))).isFile())continue}catch{}a++,s.warn(`Active output is missing after crawl: ${u}`,{phase:"deploy-plan",file:u,outputPath:S.join(e.outputDir,u)});}if(a>0&&s.warn(`Detected ${a} active output file(s) missing before deploy plan save.`,{phase:"deploy-plan",missingActiveOutputs:a}),i.length===0)return [];let l=[],d=0;for(let u of i){if(!c.has(u)){l.push(u);continue}d++;let m=S.join(e.outputDir,u),h;try{h=(await $.stat(m)).isFile();}catch{h=false;}s.warn(`Deploy plan protected active output from deletion: ${u}`,{phase:"deploy-plan",file:u,outputPath:m,exists:h});}return d>0&&s.info(`Deploy plan skipped ${d} active output deletion(s).`,{phase:"deploy-plan",protectedDeletes:d,deletedFiles:l.length}),l}function Ze(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 Vo(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 $n(e,t){let r=e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/"?e.targetOrigin:"https://relative.invalid/";try{let n=new URL(t,r);return ze(e.outputDir,n.pathname)}catch{return null}}function jn(e,t,r){for(let n of Vo(e,r)){let s=t[n];if(!s)continue;let o=$n(e,s);if(o)return {outputPath:o,publicUrl:s}}return null}function zo(e,t,r){for(let n of Ze(e,r)){let s=t[n];if(!s)continue;let o=$n(e,s);if(o)return o}return null}function We(e,t,r){let n=zo(e,t,r);if(n)return n;try{return tt(e,r).originalFilePath}catch{return null}}function Qo(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?S.join(S.resolve(e),"queue-runner-heartbeat.json"):""}async function Ke(e){let t=Qo();if(t)try{let r=await $.readFile(t,"utf8"),n=JSON.parse(r);if(!n||typeof n!="object")return;await $.writeFile(t,JSON.stringify({...n,checkedAt:new Date().toISOString(),status:"running",currentStep:"rewrite",message:e},null,2),"utf8");}catch{}}function Ko(e,t){let r=new Set;for(let n of t.donePages)r.add(S.resolve(he(e,n)));for(let n of t.doneAssets){let s=We(e,t.assetMap,n);!s||!le(s)||r.add(S.resolve(s));}for(let n of t.doneSitemaps){let s=We(e,t.assetMap,n);!s||!le(s)||r.add(S.resolve(s));}return [...r]}var Pt="re:",yt=new Map;function Jo(e){if(!e.startsWith(Pt))return null;let t=yt.get(e);if(t!==void 0)return t||null;let r=e.slice(Pt.length).trim();if(!r)return yt.set(e,false),null;try{let n=new RegExp(r);return yt.set(e,n),n}catch{return console.warn(`[crawl] Ignoring invalid path matcher regex: ${e}`),yt.set(e,false),null}}function ur(e,t){let r=Jo(t);return r?r.test(e):t.startsWith(Pt)?false:e.startsWith(t)}function Go(e,t){return t.find(r=>ur(e,r))}function Un(e,t){let r=Go(t.pathname,e.blockedPathPrefixes);if(r)return r.startsWith(Pt)?`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 Zo(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 Yo(e,t){return Zo(e).has(t.hostname)}function Xo(e){let t=Se(e.trim()).replace(/\\\//g,"/").replace(/^['"]|['"]$/g,"").trim();return t=t.replace(/[)]+$/g,"").trim(),t=t.replace(/;.*$/g,"").trim(),t}function tr(e){let t=Se(e).replace(/\\\//g,"/");return /[{}]|\bwindow\.|\blocation\.|\bincludes\(|\?\?null|\+|%7B|%7D|%22|<|>|\s/.test(t)||/[()[\]'"]/.test(t)}function ei(e){let t=Se(e).replace(/\\\//g,"/").trim(),r=S.extname(t).toLowerCase();return xn.has(r)||Tn.has(r)?false:/^(?:this|[A-Za-z_$][\w$]*)\.[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/.test(t)}function Me(e){return vo.some(t=>e.pathname.startsWith(t))}function Q(e,t,r=e.sourceOrigin,n,s="url",o=false){let i=Xo(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(tr(i))return n?.ignore(s,t,"looks like JavaScript/code fragment",r),null;if(ei(i))return n?.ignore(s,t,"looks like JavaScript property access",r),null;try{let c=new URL(i,r);if(Ln(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(!Yo(e,c))return n?.ignore(s,c.toString(),"host not allowed",r),null;let a=Un(e,c);if(a&&!(o&&Mt(c)))return n?.reject(s,c.toString(),a,r),null;let l=new URL(e.sourceOrigin);return c.protocol=l.protocol,c.host=l.host,c.hash="",c}catch{return n?.reject(s,t,"invalid URL",r),null}}function Ln(e){try{return decodeURIComponent(e.pathname),decodeURIComponent(e.search),decodeURIComponent(e.hash),!1}catch{return true}}function oe(e,t,r,n){try{let s=new URL(e);return Ln(s)?(t.reject(r,e,"malformed URL encoding",n),null):Ve(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 Dn(e){return xn.has(S.extname(e.pathname).toLowerCase())}function Ce(e){return Me(e)?false:Tn.has(S.extname(e.pathname).toLowerCase())}function Ne(e){let t=e.pathname.toLowerCase();return t.endsWith(".xml")&&(t.includes("sitemap")||t.endsWith("/sitemap.xml"))}function N(e,t){return !!(Ne(t)||t.pathname==="/robots.txt"||t.pathname==="/llms.txt"||t.pathname.toLowerCase().endsWith(".xsl")||e.assetPathPrefixes.length>0&&e.assetPathPrefixes.some(r=>ur(t.pathname,r))||Dn(t)||!Ce(t)&&!Me(t))}function he(e,t){let r=new URL(t),n=Ve(r.pathname);if(n===null)throw new Error(`Unsafe page URL pathname: ${r.pathname}`);return n.endsWith("/")?n+="index.html":S.extname(n)||(n+="/index.html"),ze(e.outputDir,n)}function ti(e){if(!e.generated404RequestPath)return null;try{let t=new URL(e.generated404RequestPath,e.sourceOrigin);return !t.pathname.endsWith("/")&&S.extname(t.pathname)===""&&(t.pathname+="/"),t.hash="",t.toString()}catch{return null}}function xt(e,t){let r=ti(e);if(!r)return false;try{return new URL(t,e.sourceOrigin).toString()===r}catch{return false}}function tt(e,t){let r=new URL(t),n=Ve(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=ze(e.outputDir,o),c=Dt(e.targetOrigin,o),a=`${c}${r.search}`;if(!s)return {originalPathname:o,originalFilePath:i,originalPublicUrl:c,originalPublicUrlWithSearch:a,preferQueryHashed:s};let l=S.extname(n),u=`${l?n.slice(0,-l.length):n}.${ce(r.search)}${l||".bin"}`;return {originalPathname:o,originalFilePath:i,originalPublicUrl:c,originalPublicUrlWithSearch:a,preferQueryHashed:s,hashedPathname:u,hashedFilePath:ze(e.outputDir,u),hashedPublicUrl:Dt(e.targetOrigin,u)}}function ri(e,t,r,n){let s=oe(t,r,"asset",n);return s?tt(e,s.toString()):null}function rr(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 l=new URL(a);t[l.origin+o.pathname+o.search]=n;}catch{}try{let a=(()=>{let l=new URL(n,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin);return `${l.pathname}${l.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 Fn(e){try{return await $.readFile(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}async function Oe(e){try{return await $.stat(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}function ni(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 Wn(e){let t=String(e["last-modified"]||"").trim();if(!t)return null;let r=Date.parse(t);return Number.isFinite(r)?r:null}function si(e,t){let r=Wn(t),n=ni(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 oi(e,t){if(!t)return;let r=Wn(t);if(r===null)return;let n=await Oe(e);if(!n)return;let s=new Date(r);await $.utimes(e,n.atime,s).catch(()=>{});}function nr(e,t){let r=S.extname(e.pathname).toLowerCase(),n=t["content-type"]||"";return Ro.has(r)||Po.some(s=>n.includes(s))&&!n.startsWith("image/")&&!n.includes("font")}function ii(e){try{let t=S.extname(new URL(e).pathname).toLowerCase();return t===".js"||t===".mjs"}catch{return false}}function Ie(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 ai(e){return ce(e.toString("base64"),40)}function qn(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 Nn(e,t,r){let n=e.assetVariantDigestsByOriginalPath.get(t);n||(n=new Set,e.assetVariantDigestsByOriginalPath.set(t,n)),n.add(r);}async function sr(e,t,r,n,s,o,i){let c=tt(e,r),a=ai(n),l=c.originalFilePath,d=c.originalPublicUrlWithSearch;if(c.preferQueryHashed&&c.hashedFilePath&&c.hashedPublicUrl&&qn(s,c.originalFilePath,a)){let f=jn(e,t,r);f?(l=f.outputPath,d=f.publicUrl):(l=c.hashedFilePath,d=c.hashedPublicUrl);}rr(e,t,r,d,c.originalPublicUrl);let u=le(l)?Buffer.from(Nt(n.toString("utf8"),e,t,l),"utf8"):n,m=await Fn(l),h=false;return (m===null||!m.equals(u))&&(await be(l,u),h=true),o?.debug(`${h?"Saved":"Skipped unchanged"} asset output ${r}`,{phase:"download-assets",url:r,outputPath:l,bytes:u.length,wroteFile:h}),Nn(s,c.originalFilePath,a),await oi(l,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:l,publicUrl:d,wroteFile:h}}function $e(e,t,r,n,s){let o=()=>{let u=String(s??"").trim();if(!u)return {discoveredFrom:"",discoveredFromType:"unknown"};if(u==="seed-path"||u==="cli"||u==="generated-404-request-path")return {discoveredFrom:u,discoveredFromType:u};if(/^https?:\/\//i.test(u))try{let m=new URL(u);return Ne(m)?{discoveredFrom:u,discoveredFromType:"sitemap"}:N(e,m)?{discoveredFrom:u,discoveredFromType:"asset"}:Ce(m)&&!Me(m)?{discoveredFrom:u,discoveredFromType:"page"}:{discoveredFrom:u,discoveredFromType:"url"}}catch{return {discoveredFrom:u,discoveredFromType:"url"}}return {discoveredFrom:u,discoveredFromType:"url"}},i=s&&/^https?:\/\//i.test(s)?s:e.sourceOrigin,c=Q(e,r,i,n,"page");if(!c)return;if(!Ce(c)||Dn(c)){if(N(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(),Me(c)?"asset/internal path cannot be page":"not page-like",s);return}let a=c.toString(),{discoveredFrom:l,discoveredFromType:d}=o();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++,n.debug(`Queued discovered page ${a}`,{phase:"discovery",url:a,discoveredFrom:l,discoveredFromType:d,outputPath:he(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=Q(e,r,o,n,"asset");if(!i)return;if(!N(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 Rt(e,t,r,n,s){let o=s&&/^https?:\/\//i.test(s)?s:e.sourceOrigin,i=Q(e,r,o,n,"sitemap",Sr(s));if(!i)return;if(!Ne(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 ui(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:Ee(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 ci(e){return e.split(",").map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function li(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 di(e){return e.replace(/<script\b[^>]*>[\s\S]*?<\/script\s*>/gi,"")}function pi(e,t){if(t==="dom-style")return true;let r=(()=>{try{return S.extname(new URL(e).pathname).toLowerCase()}catch{return ""}})();return !(r===".js"||r===".mjs"||r===".map"||t.includes("javascript"))}function St(e){return e.trim().replace(/\\/g,"/").replace(/^https?:\/\/[^/]+/i,"").replace(/^\/+/,"")}async function _n(e,t,r,n){let s=[];await $.mkdir(t,{recursive:true});let o=await $.readdir(e,{withFileTypes:true});for(let i of o){let c=S.join(e,i.name),a=S.join(t,i.name);if(i.isDirectory()){s.push(...await _n(c,a,r,n));continue}await Hn(c,a,r,n)&&s.push(a);}return s}async function mi(e,t){try{let[r,n]=await Promise.all([$.stat(e),$.stat(t)]);if(r.size!==n.size)return !1;let[s,o]=await Promise.all([$.readFile(e),$.readFile(t)]);return s.equals(o)}catch{return false}}async function Hn(e,t,r,n){let s=S.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 mi(e,t)?(n.debug("Skipped unchanged post-crawl copy target",{phase:"copy-extra-paths",sourcePath:e,targetPath:t}),false):(await $.mkdir(S.dirname(t),{recursive:true}),await $.copyFile(e,t),true)}async function gi(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=>S.resolve(he(e,c))));r.mark("copy-extra-paths");for(let c of n){let a=c.sourcePath,l=c.prefix;if(!a||!l){r.warn("Skipped post-crawl copy mapping with empty key/value",{sourcePath:a,prefixPath:l});continue}let d=Ao(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 u=d.resolvedPath,m=St(l);if(!m){r.warn("Skipped post-crawl copy mapping with invalid export prefix",{sourcePath:a,prefixPath:l});continue}let h;try{h=await $.stat(u);}catch{r.warn("Skipped post-crawl copy source because it does not exist",{sourcePath:a,sourceAbs:u,prefixPath:l});continue}let f=S.resolve(e.outputDir,m);if(h.isDirectory()){let w=await _n(u,f,i,r);o.push(...w),s+=w.length,w.length>0&&r.progress(`Copied static directory to export: ${u} -> /${m}`,{phase:"copy-extra-paths",sourcePath:u,targetPath:`/${m}`,copiedItems:s,changedFiles:w.length});continue}let b=S.basename(u),p=l.endsWith("/")?S.join(f,b):f;await Hn(u,p,i,r)&&(o.push(p),s++,r.progress(`Copied static file to export: ${u} -> /${St(l.endsWith("/")?`${l}${b}`:l)}`,{phase:"copy-extra-paths",sourcePath:u,targetPath:`/${St(l.endsWith("/")?`${l}${b}`:l)}`,copiedItems:s}));}return r.endMark("copy-extra-paths",{mappedSources:n.length,copiedItems:s}),o}function qe(e,t,r,n,s){let o=new Set,i=Se(r).replace(/\\\//g,"/"),c=s==="page-html"?di(i):i,a=pi(t,s);if(a){for(let l of li(c)){let d=Q(e,l,t,n,`${s}:css-url`);d&&N(e,d)&&o.add(d.toString());}for(let l of c.matchAll(/@import\s+(?:url\()?\s*['"]?([^'"\s;]+)['"]?\s*\)?/gi)){let d=Q(e,l[1],t,n,`${s}:css-import`);d&&N(e,d)&&o.add(d.toString());}}if(a||s==="page-html")for(let l of c.matchAll(/<\?xml-stylesheet[^>]+href=["']([^"']+)["'][^>]*\?>/gi)){let d=Q(e,l[1],t,n,`${s}:xml-stylesheet`);d&&N(e,d)&&o.add(d.toString());}if(s==="page-html")for(let l of Fr(i)){let d=l.startsWith("//")?`${new URL(e.sourceOrigin).protocol}${l}`:l;if(tr(d)){n.ignore(`${s}:serialized-url`,d,"looks like JavaScript/code fragment",t);continue}let u=Q(e,d,t,n,`${s}:serialized-url`);u&&N(e,u)?o.add(u.toString()):u&&n.ignore("asset",u.toString(),"serialized URL did not pass safe asset path filter",t);}if(s!=="page-html"&&ii(t))for(let l of Wr(i)){if(tr(l)||!/\.(?:js|mjs)(?:[?#]|$)/i.test(l))continue;let d=Q(e,l,t,n,`${s}:relative-asset`);d&&N(e,d)&&o.add(d.toString());}return [...o]}function Bn(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=Q(e,c,t,n,"page-link");a&&(Un(e,a)||Ce(a)&&!Me(a)&&!N(e,a)&&s.add(a.toString()));}return [...s]}async function bn(e,t,r,n,s,o,i=false,c=[]){let a=new Set(c),l=0,d=new Map,u=(m,h)=>{let f=[h],b=new Set;for(;f.length>0;){let p=f.pop();if(p===m)return true;b.has(p)||(b.add(p),f.push(...d.get(p)??[]));}return false};for(;r.sitemapQueue.length>0;){let m=r.sitemapQueue.shift();r.queuedSitemaps.delete(m);let h=oe(m,n,"sitemap","sitemap-queue");if(!h)continue;let f=h.toString();if(r.doneSitemaps.has(f))continue;r.doneSitemaps.add(f),n.sitemap(`Fetching sitemap ${f}`,{url:f});let b=true;try{let p=await t.get(f,{timeout:6e4});if(b=!1,!p.ok()){if(n.skip("sitemap",f,p.status()),i&&!a.has(f))throw new Error(`Required child content-sync sitemap returned HTTP ${p.status()}: ${f}`);continue}let g=await p.body(),w=p.url()||f,x=oe(w,n,"sitemap-response",f);if(!x)continue;let k=x.toString();r.successfulSitemaps.add(f),r.successfulSitemaps.add(k),a.has(f)&&(r.resolvedSitemapRoots.add(k),l+=1);let M=await sr(e,r.assetMap,k,g,r,n);G(s,e,M.outputPath),se(s,M.outputPath);let I=g.toString("utf8");/<sitemapindex(?:\s|>)/i.test(I)?r.sitemapIndexUrls.add(k):r.sitemapLeafUrls.add(k);let v=qe(e,k,I,n,"sitemap");for(let O of v)q(e,r,O,n,k);let R=[];for(let O of ui(I)){let C=Q(e,O.loc,k,n,"sitemap-loc",!0);if(!C){if(i)throw new Error(`Content-sync sitemap contains an inadmissible location: ${O.loc}`);continue}if(Ne(C)){if(u(k,C.toString()))throw new Error(`Sitemap index cycle detected: ${k} -> ${C.toString()}`);if(d.has(k)||d.set(k,new Set),d.get(k).add(C.toString()),R.push(C.toString()),i&&r.doneSitemaps.has(C.toString())&&!r.successfulSitemaps.has(C.toString()))throw new Error(`Required child content-sync sitemap was not resolved: ${C.toString()}`);Rt(e,r,C.toString(),n,k);}else if(i){if(Ce(C)&&!N(e,C)){let W=o.requiredUrls.has(C.toString()),H=!!o.previousManifest.pages[C.toString()];if(!W&&!H)throw new Error(`Content-sync sitemap coverage is incomplete for ${C.toString()}.`)}n.ignore("sitemap-loc",C.toString(),"content-sync sitemap-only traversal does not enqueue urlset locations",k);}else N(e,C)?q(e,r,C.toString(),n,k):Ce(C)?(O.lastmod&&(r.sitemapLastmodByPage[C.toString()]=O.lastmod),$e(e,r,C.toString(),n,k)):n.reject("sitemap-loc",C.toString(),"not page/sitemap/asset-like",k);}o.trackManifest&&(o.manifest.assets[k]={url:k,outputPath:M.outputPath,isText:!0,contentType:p.headers()["content-type"]??"application/xml",cacheControl:Yt(p.headers()),changeToken:null,tokenSource:null,discoveredAssets:[...new Set([...v,...R])],lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,unreferencedRuns:0,rewriteComplete:!1},await ke(e,o));}catch(p){n.error(`Failed sitemap ${f}`,{url:f,error:String(p)});let g=i&&a.has(f)&&b;if(i&&!g)throw p}}if(i&&a.size>0&&l===0)throw new Error(`None of the configured content-sync sitemap roots could be resolved: ${[...a].join(", ")}`)}async function hi(e,t,r,n,s,o,i){let c=Q(e,n,e.sourceOrigin,s,"asset-fetch");if(!c||!N(e,c))return;let a=c.toString();if(r.doneAssets.has(a))return;let l=o.enabled||o.strictTargeted?o.previousManifest.assets[a]:void 0,d=o.trackManifest?await bt(e,t,o,a,s):null,u=d?.token??null,m=Ht(l?.changeToken,d),h=o.strictTargeted&&(!d?.supported||!d.token)&&Bt(e.sourceOrigin,a),f=o.strictTargeted?o.manifest.assets[a]:void 0;if(f?.lastSeenRunId===o.runId&&await Oe(f.outputPath)){r.doneAssets.add(a);for(let p of f.discoveredAssets||[])q(e,r,p,s,a);G(i,e,f.outputPath),Fe(i,e,f.outputPath,f.cacheControl),f.isText&&se(i,f.outputPath),s.info(`Resumed completed content-sync asset ${a}`,{url:a,source:"content-sync-checkpoint"}),Ie(r,s);return}if(l&&(m||h)&&await Oe(l.outputPath)){o.manifest.assets[a]={...l,changeToken:u,tokenSource:d?.tokenSource??l.tokenSource,discoveredAssets:[...l.discoveredAssets||[]],lastSeenRunId:o.runId,unreferencedRuns:0},delete o.manifest.pages[a],r.doneAssets.add(a);for(let p of l.discoveredAssets||[])q(e,r,p,s,a);Fe(i,e,l.outputPath,l.cacheControl),s.info(`Reused unchanged trusted asset ${a}.`,{url:a,tokenSource:d?.tokenSource??"unknown",phase:"download-assets",source:m?"asset-change-token-match":"content-sync-release-fingerprint"}),Ie(r,s);return}let b=(p,g={})=>{if(!l||o.strictTargeted)return false;o.manifest.assets[a]={...l,discoveredAssets:[...l.discoveredAssets||[]],lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,unreferencedRuns:0},delete o.manifest.pages[a],r.doneAssets.add(a);for(let w of l.discoveredAssets||[])q(e,r,w,s,a);return s.warn(`Keeping previous incremental asset ${a} after fetch issue.`,{url:a,reason:p,preservedFromPreviousManifest:true,...g,phase:"download-assets"}),Ie(r,s),true};s.asset(`Fetching asset ${a}`,{url:a});try{let p=We(e,r.assetMap,a),g=p?await Oe(p):null;if(p&&g&&!o.strictTargeted)try{let H=await z(`fetch asset headers ${a}`,6e4,()=>t.head(a,{timeout:6e4})),P=H.headers();if(H.ok()&&si(g,P)){let j=await Fn(p);if(j!==null){let ie=H.url()||a,te=oe(ie,s,"asset-response",a);if(!te)return;let ae=te.toString(),A=await sr(e,r.assetMap,ae,j,r,s,P);A.wroteFile&&(G(i,e,A.outputPath),le(A.outputPath)&&se(i,A.outputPath));let D=Yt(P)||l?.cacheControl||null;Fe(i,e,A.outputPath,D),r.doneAssets.add(a),s.info(`Reused existing asset ${a} based on response headers.`,{url:a,filePath:p,lastModified:P["last-modified"]||"",contentLength:P["content-length"]||"",phase:"download-assets"}),Ie(r,s);let L=nr(c,P),Z=l?.discoveredAssets?[...l.discoveredAssets]:[];if(L||l?.isText){let J=j.toString("utf8"),_e=qe(e,ae,J,s,"asset:cached");(_e.length>0||!l)&&(Z=_e);for(let rt of Z)q(e,r,rt,s,ae);}if(o.trackManifest){let J=L||!!l?.isText;o.manifest.assets[a]={url:a,outputPath:A.outputPath,isText:J,contentType:Zt(P)||l?.contentType||null,cacheControl:D,changeToken:d?.supported?d.token:null,tokenSource:d?.supported?d.tokenSource??null:null,discoveredAssets:Z,lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,unreferencedRuns:0,rewriteComplete:!J},delete o.manifest.pages[a],(o.enabled||o.strictTargeted)&&J&&await ke(e,o);}return}}}catch{}let w=await z(`fetch asset ${a}`,6e4,()=>t.get(a,{timeout:6e4}));if(!w.ok()){if(b(`http-${w.status()}`,{status:w.status()}))return;if(o.strictTargeted)throw new Error(`Required content-sync asset returned HTTP ${w.status()}: ${a}`);s.skip("asset",a,w.status());return}let x=await z(`read asset response ${a}`,6e4,()=>w.body()),k=w.url()||a,M=oe(k,s,"asset-response",a);if(!M)return;let I=M.toString(),v=w.headers(),R=await sr(e,r.assetMap,I,x,r,s,v);R.wroteFile&&(G(i,e,R.outputPath),le(R.outputPath)&&se(i,R.outputPath));let O=Yt(v);Fe(i,e,R.outputPath,O),r.doneAssets.add(a),Ie(r,s);let C=nr(c,v),W=[];if(C){let H=x.toString("utf8");W=qe(e,I,H,s,`asset:${S.extname(c.pathname).toLowerCase()||v["content-type"]||"unknown"}`);for(let P of W)q(e,r,P,s,I);}o.trackManifest&&(o.manifest.assets[a]={url:a,outputPath:R.outputPath,isText:C,contentType:Zt(v),cacheControl:O,changeToken:d?.supported?d.token:null,tokenSource:d?.supported?d.tokenSource??null:null,discoveredAssets:W,lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,unreferencedRuns:0,rewriteComplete:!C},delete o.manifest.pages[a],(o.enabled||o.strictTargeted)&&C&&await ke(e,o));}catch(p){if(b("fetch-error",{error:String(p)}))return;if(s.error(`Failed asset ${a}`,{url:a,error:String(p)}),o.strictTargeted)throw p}finally{r.doneAssets.has(a)||(r.doneAssets.add(a),Ie(r,s));}}async function fi(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 hi(e,t,r,a,n,s,o));}});await Promise.all(c);}function vt(e,t){let r=X(e.outputDir,t);if(!r)throw new Error(`Remote export output is outside outputDir: ${t}`);return r}function wi(e,t){return nr(e,{"content-type":t})}function Sn(e){return /(?:^|\/)index\.html?$|\.html?$/i.test(e)}async function yi(e,t,r,n,s,o,i,c,a){let l=Math.max(1,Math.min(100,a)),d=20;for(;r.assetQueue.length>0;){let u=r.assetQueue.splice(0,l*d);for(let b of u)r.queuedAssets.delete(b);await ar(e,t,s,u,n);let m=[];for(let b of u){let p=s.manifest.assets[b],g=p?X(e.outputDir,p.outputPath):null,w=g?i.objects[g]:void 0,x=s.changeTokenCache.get(b)??null;if(!(s.enabled&&p&&w?.kind==="asset"&&w.sourceUrl===b&&(Ht(p.changeToken,x)||(!x?.supported||!x.token)&&Bt(e.sourceOrigin,b)))||!p||!g||!w){m.push(b);continue}s.manifest.assets[b]={...p,changeToken:x?.token??null,tokenSource:x?.tokenSource??p.tokenSource,lastSeenRunId:s.runId,unreferencedRuns:0};for(let M of p.discoveredAssets||[])q(e,r,M,n,b);r.doneAssets.add(b),Fe(o,e,p.outputPath,p.cacheControl),n.info(`Reused unchanged S3-native asset ${b}.`,{url:b,relativePath:g,tokenSource:x?.tokenSource??"release-fingerprint",phase:"download-assets",execution:"lambda"}),Ie(r,n);}if(m.length===0)continue;let h=[];for(let b=0;b<m.length;b+=d)h.push(m.slice(b,b+d));let f=await Promise.all(h.map(b=>c.fetch({urls:b,ignoreHttpsErrors:e.ignoreHttpsErrors,timeoutMs:6e4})));for(let b of f)for(let p of b.assets){let g=p.requestedUrl;try{if(p.outcome!=="fetched"||!p.object||!p.finalUrl){let O=p.error||`Remote asset fetch ended with ${p.outcome}.`;if(n.error(`Failed remote asset ${g}`,{url:g,status:p.httpStatus,outcome:p.outcome,error:O,execution:"lambda"}),s.strictTargeted)throw new Error(O);continue}let w=oe(p.finalUrl,n,"remote-asset-response",g);if(!w)continue;let x=tt(e,w.toString()),k=x.originalFilePath,M=x.originalPublicUrlWithSearch;if(x.preferQueryHashed&&x.hashedFilePath&&x.hashedPublicUrl&&qn(r,x.originalFilePath,p.object.sha256)){let O=jn(e,r.assetMap,w.toString());k=O?.outputPath??x.hashedFilePath,M=O?.publicUrl??x.hashedPublicUrl;}rr(e,r.assetMap,w.toString(),M,x.originalPublicUrl),w.toString()!==g&&rr(e,r.assetMap,g,M,x.originalPublicUrl),Nn(r,x.originalFilePath,p.object.sha256);let I=vt(e,k),v=p.contentType?.trim()||"application/octet-stream",R=wi(w,v);De(i,{relativePath:I,sourceUrl:g,kind:"asset",contentType:v,cacheControl:p.cacheControl,isText:R,object:p.object}),G(o,e,k),R&&se(o,k),Fe(o,e,k,p.cacheControl);for(let O of p.discoveredAssets)q(e,r,O,n,w.toString());r.stats.assetsSaved++,s.trackManifest&&(s.manifest.assets[g]={url:g,outputPath:k,isText:R,contentType:v,cacheControl:p.cacheControl,changeToken:null,tokenSource:null,discoveredAssets:[...p.discoveredAssets],lastCrawledAt:new Date().toISOString(),lastSeenRunId:s.runId,unreferencedRuns:0,rewriteComplete:!R},delete s.manifest.pages[g]),n.debug(`Remote asset fetch completed ${g}`,{url:g,finalUrl:w.toString(),relativePath:I,bytes:p.object.bytes,taskId:b.taskId,attempts:b.attempts,execution:"lambda"});}finally{r.doneAssets.add(g),Ie(r,n);}}}}async function bi(e,t,r,n){for(let s of [...t.changedFiles].sort()){if(!ln(r,s))continue;let o=S.join(e.outputDir,s),i=await $.readFile(o).catch(d=>{throw new Error(`Coordinator-owned output is missing before S3 staging: ${s}`,{cause:d})}),c=le(o),a=String(Yr.lookup(s)||"")||(c?"text/plain; charset=utf-8":"application/octet-stream"),l=await n.writeWorkspaceObject({key:`${r.workspace.prefix}jobs/${r.jobId}/coordinator/${ce(s,40)}-${S.basename(s)}`,body:i,contentType:a,cacheControl:Sn(s)?e.s3.htmlCacheControl:e.s3.assetCacheControl});De(r,{relativePath:s,sourceUrl:null,kind:"generated",contentType:a,cacheControl:Sn(s)?e.s3.htmlCacheControl:e.s3.assetCacheControl,isText:c,object:l});}}function Si(e){let t=Math.ceil(e/1e3);return `${t} second${t===1?"":"s"}`}function ve(e){return Math.max(6e4,e.navigationTimeoutMs*2,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+15e3)}function Ge(e){return Math.max(15e3,Math.min(6e4,ve(e)))}function Vn(e){return Math.max(15e3,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+1e4)}function cr(e){return e.stats.pagesCompleted}function or(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 Gt(e,t,r){let n=or(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 z(e,t,r){let n;try{return await Promise.race([r(),new Promise((s,o)=>{n=globalThis.setTimeout(()=>{o(new Ye(e,t));},t);})])}finally{n!==void 0&&globalThis.clearTimeout(n);}}var Ye=class extends Error{constructor(r,n){super(`${r} timed out after ${Si(n)}.`);this.operation=r;this.timeoutMs=n;this.name="OperationTimeoutError";}operation;timeoutMs};async function Pi(e,t){let r=Vn(e);await t.evaluate(async n=>{await new Promise(s=>{let o=0,i=700,c=Date.now(),a=()=>{window.clearInterval(l),window.scrollTo(0,0),s();},l=window.setInterval(()=>{if(Date.now()-c>=n.maxDurationMs){a();return}window.scrollBy(0,i),o+=i;let d=document.body?.scrollHeight||0,u=document.documentElement?.scrollHeight||0,m=Math.max(d,u);o>=m+window.innerHeight&&a();},120);});},{maxDurationMs:r});}async function Ri(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 Pi(e,t),await t.waitForTimeout(e.readiness.fallbackWaitMs);}async function vi(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 zn(e,t){return e.noJavaScriptRenderPathPrefixes.some(r=>ur(t,r))}async function ki(e,t,r,n,s=true){let o=new Set;if(s){let c=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,u=["srcset","data-srcset","data-lazy-srcset"],m=h=>{h.querySelectorAll("*").forEach(f=>{for(let p of l){let g=f.getAttribute(p);g&&a.add(g);}for(let p of u){let g=f.getAttribute(p);g&&g.split(",").forEach(w=>{let x=w.trim().split(/\s+/)[0];x&&a.add(x);});}let b=f.getAttribute("style");b&&d.add(b),f.shadowRoot&&m(f.shadowRoot);});};return m(document),{attrs:[...a],styles:[...d]}});for(let a of c.attrs)for(let l of ci(a)){let d=Q(e,l,r,n,"dom-attr");d&&N(e,d)&&o.add(d.toString());}for(let a of c.styles)for(let l of qe(e,r,a,n,"dom-style"))o.add(l);}let i=await t.content();for(let c of qe(e,r,i,n,"page-html"))o.add(c);return [...o]}async function ir(e,t,r,n,s){let o=he(e,t);await be(o,r,"utf8");let i=await $.stat(o);s?.debug(`Saved page output ${t}`,{phase:"save-pages",url:t,outputPath:o,bytes:i.size});let c=kt(n,o),a=Math.min(n.stats.pagesQueued,cr(n)+1);s&&c&&(n.stats.pagesSaved%10===0||n.stats.pagesSaved===1)&&s.progress(`Page progress: processed ${a}, rendered ${n.stats.pagesRendered}, saved ${n.stats.pagesSaved}, discovered ${n.stats.pagesQueued}.`,{donePages:a,claimedPages:n.donePages.size,pagesRendered:n.stats.pagesRendered,pagesSaved:n.stats.pagesSaved,pagesQueued:n.stats.pagesQueued,pageQueue:n.pageQueue.length,phase:"save-pages"});}function kt(e,t){let r=S.resolve(t);return e.savedPageOutputs.has(r)?false:(e.savedPageOutputs.add(r),e.stats.pagesSaved=e.savedPageOutputs.size,true)}async function Ct(e,t,r,n,s){let o=X(e.outputDir,n);if(!o)return;if(s){let c=s.objects[o];c?.kind==="page"&&c.sourceUrl===r&&c.object?.bucket===s.workspace.bucket&&typeof c.object.key=="string"&&c.object.key.startsWith(s.workspace.prefix)&&kt(t,n);return}(await Oe(n).catch(()=>null))?.isFile()&&kt(t,n);}function Qn(e){let t=cr(e);return t%5===0||t===1||t===e.stats.pagesQueued}function Kn(e,t){let r=cr(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 Ci(e){await dr(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 xi(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 Ci(n),n}async function Ti(e,t,r,n,s,o,i,c,a,l){for(;t.pageQueue.length>0&&!(e.maxPages>0&&t.donePages.size>=e.maxPages);){let d=t.pageQueue.shift();if(!d)break;t.queuedPages.delete(d);try{let u=oe(d,r,"page","page-queue");if(!u)continue;let m=u.toString();if(d=m,t.queuedPages.delete(d),t.donePages.has(d))continue;t.donePages.add(d),o.enabled&&o.seenPages.add(d);let h=xt(e,d),f=zn(e,u.pathname);if(!Ce(u)||N(e,u)||Me(u)){if(N(e,u)){r.info(`Remote worker redirected non-page URL to asset queue: ${d}`,{url:d,source:"remote-worker-guard"}),q(e,t,d,r,"remote-worker-guard");continue}r.reject("page",d,"guard rejected non-page URL before remote rendering","remote-worker");continue}let b=o.strictTargeted?o.manifest.pages[d]:void 0;if(b?.lastSeenRunId===o.runId&&await Oe(b.outputPath)){o.seenPages.add(d);for(let R of b.discoveredAssets||[])q(e,t,R,r,d);G(i,e,b.outputPath),se(i,b.outputPath),await Ct(e,t,d,b.outputPath,l),r.info(`Resumed completed content-sync page ${d}`,{url:d,source:"content-sync-checkpoint"});continue}let p=await Mn(e,s,t,o,d,r);if(o.enabled&&n!=="single-url"&&n!=="content-sync"){let R=o.manifest.pages[d];if(p.action==="reuse"&&R){for(let O of R.discoveredAssets)q(e,t,O,r,d);for(let O of R.discoveredPages)$e(e,t,O,r,d);R.lastSeenRunId=o.runId,R.sitemapLastmod=Ee(t.sitemapLastmodByPage[d])??R.sitemapLastmod,p.changeToken?.supported&&(R.changeToken=p.changeToken.token,R.tokenSource=p.changeToken.tokenSource??R.tokenSource),await Ct(e,t,d,R.outputPath,l),r.info(`Incremental reuse skipped unchanged page ${d}`,{url:d,mode:"incremental",reason:p.changeToken?.supported===!0?"change-token-match":"sitemap-lastmod-match"});continue}}r.page(`Rendering remotely ${d}`,{url:d,execution:"lambda"});let g=await a.render({sourceOrigin:e.sourceOrigin,url:d,options:{ignoreHttpsErrors:e.ignoreHttpsErrors,javaScriptEnabled:!f,viewport:e.viewport,navigationTimeoutMs:e.navigationTimeoutMs,autoScrollTimeoutMs:Vn(e),readiness:e.readiness},downloadHtml:!l}),w=g.page,x=w.finalUrl?oe(w.finalUrl,r,"remote-final-response",d)?.toString():void 0;if(n==="content-sync"&&x&&x!==m){if(o.deleteOnMissingUrls.has(d)){await Xe(e,o,i,d,o.deleteOnMissingUrls),r.info(`Removed stale content-sync archive route redirected to ${x}`,{url:d,finalResponseUrl:x,source:"content-sync-tombstone"});continue}throw new Error(`Required content-sync route redirected outside its planned URL: ${d} -> ${x}`)}let k=w.httpStatus;if(h){if(k!==404){r.error(`Generated 404 request path returned unexpected status for ${d}`,{url:d,expectedStatus:404,status:k,requestPath:e.generated404RequestPath,execution:"lambda"});continue}}else if(k!==null&&k>=400){if(n==="content-sync"&&(k===404||k===410)&&o.deleteOnMissingUrls.has(d)){await Xe(e,o,i,d,o.deleteOnMissingUrls),r.info(`Removed stale content-sync archive page ${d}`,{url:d,status:k,source:"content-sync-tombstone"});continue}if(n==="content-sync")throw new Error(`Required content-sync route returned HTTP ${k}: ${d}`);r.skip("page",d,k,t.pageDiscoverySources.get(d));continue}t.stats.pagesRendered++;let M=new Set;if(!l){if(g.html===null)throw new Error("Remote render did not return HTML for local output mode.");for(let R of qe(e,m,g.html,r,"remote-page-html"))M.add(R);}for(let R of [...w.discoveredAssets,...w.networkUrls]){let O=Q(e,R,m,r,"remote-render");O&&N(e,O)&&M.add(O.toString());}for(let R of M)q(e,t,R,r,d);let I=n!=="single-url"&&n!=="content-sync"&&!h?[...new Set([...!l&&g.html!==null?Bn(e,d,g.html,r):[],...w.discoveredPages])]:[];for(let R of I)$e(e,t,R,r,d);for(let R of w.cookies){let O=R.sameSite==="Strict"||R.sameSite==="Lax"||R.sameSite==="None"?R.sameSite:"Unspecified",C=!Number.isFinite(R.expires)||R.expires<=0;c.add({name:R.name,domain:R.domain,path:R.path||"/",expires:C?null:R.expires,session:C,secure:R.secure,httpOnly:R.httpOnly,sameSite:O,partitioned:R.partitioned===!0});}let v=he(e,d);if(l){if(!w.html)throw new Error("Remote render completed without a workspace HTML object.");De(l,{relativePath:vt(e,v),sourceUrl:d,kind:"page",contentType:w.contentType?.trim()||"text/html; charset=utf-8",cacheControl:e.s3.htmlCacheControl,isText:!0,object:w.html}),kt(t,v);}else {if(g.html===null)throw new Error("Remote render did not return HTML for local output mode.");await ir(e,d,g.html,t,r);}G(i,e,v),se(i,v),o.trackManifest&&(o.manifest.pages[d]={url:d,outputPath:v,contentType:w.contentType?.trim()||null,changeToken:p.changeToken?.supported?p.changeToken.token:null,tokenSource:p.changeToken?.supported?p.changeToken.tokenSource??null:null,sitemapLastmod:Ee(t.sitemapLastmodByPage[d])??null,discoveredPages:I,discoveredAssets:[...M],lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,rewriteComplete:!1},(o.enabled||o.strictTargeted)&&await ke(e,o)),r.debug(`Remote render completed ${d}`,{url:d,taskId:g.taskId,attempts:g.attempts,execution:"lambda"});}catch(u){if(r.error(`Failed remote page ${d}`,{url:d,error:String(u),execution:"lambda",...u instanceof re?{status:u.status,attempts:u.attempts}:{}}),u instanceof re){t.pageHttpFailures.set(d,u);continue}if(o.strictTargeted)throw u}finally{t.stats.pagesCompleted++,Qn(t)&&Kn(t,r);}}}async function Ai(e,t,r,n,s,o,i,c){let a=await chromium.launch({headless:true}),l=or(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=or(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 u=t.pageQueue.shift();if(!u)break;t.queuedPages.delete(u);let m=null,h=null,f=!1,b=null,p=[],g=new Set;try{let w=oe(u,r,"page","page-queue");if(!w)continue;let x=w.toString();if(u=x,t.queuedPages.delete(u),t.donePages.has(u))continue;t.donePages.add(u),o.enabled&&o.seenPages.add(u);let k=xt(e,u),M=zn(e,w.pathname);if(!Ce(w)||N(e,w)||Me(w)){if(N(e,w)){r.info(`Worker redirected non-page URL to asset queue: ${u}`,{url:u,source:"worker-guard"}),q(e,t,u,r,"worker-guard");continue}r.reject("page",u,"guard rejected non-page URL before rendering","worker");continue}let I=o.strictTargeted?o.manifest.pages[u]:void 0;if(I?.lastSeenRunId===o.runId&&await Oe(I.outputPath)){o.seenPages.add(u);for(let A of I.discoveredAssets||[])q(e,t,A,r,u);G(i,e,I.outputPath),se(i,I.outputPath),await Ct(e,t,u,I.outputPath),r.info(`Resumed completed content-sync page ${u}`,{url:u,source:"content-sync-checkpoint"});continue}let v=await Mn(e,s,t,o,u,r);if(o.enabled&&n!=="single-url"&&n!=="content-sync"){let A=o.manifest.pages[u];if(v.action==="reuse"&&A){for(let D of A.discoveredAssets)q(e,t,D,r,u);for(let D of A.discoveredPages)$e(e,t,D,r,u);A.lastSeenRunId=o.runId,A.sitemapLastmod=Ee(t.sitemapLastmodByPage[u])??A.sitemapLastmod,v.changeToken?.supported&&(A.changeToken=v.changeToken.token,A.tokenSource=v.changeToken.tokenSource??A.tokenSource),await Ct(e,t,u,A.outputPath),r.info(`Incremental reuse skipped unchanged page ${u}`,{url:u,mode:"incremental",reason:v.changeToken?.supported===!0?"change-token-match":"sitemap-lastmod-match"});continue}}m=await z(`create page context ${u}`,ve(e),()=>xi(d,e,M)),h=await z(`create page ${u}`,ve(e),()=>m.newPage()),p=await m.cookies();let R=!1,O=new Set;await h.route("**/*",async A=>{let D=A.request();try{let L=Q(e,D.url(),e.sourceOrigin,r,"network-request");L&&N(e,L)&&(O.add(L.toString()),q(e,t,L.toString(),r,u));}catch{}if(D.isNavigationRequest()&&D.frame()===h.mainFrame())try{let L=new URL(D.url()),Z=new URL(x);if(L.hash="",Z.hash="",L.href===Z.href){if(R){r.warn(`Blocked same-page navigation/reload for ${u}`,{url:u,requestUrl:D.url()});try{await A.abort("aborted");}catch(J){r.debug(`Ignored canceled route while blocking reload for ${u}`,{url:u,error:String(J)});}return}R=!0;}}catch{}try{await A.continue();}catch(L){r.debug(`Ignored canceled network route for ${u}`,{url:u,requestUrl:D.url(),error:String(L)});}}),h.on("response",A=>{try{let L=Q(e,A.url(),e.sourceOrigin,r,"network-response");L&&N(e,L)&&(O.add(L.toString()),q(e,t,L.toString(),r,u));}catch{}let D=A.headerValues("set-cookie").then(L=>{for(let Z of L)c.add(Br(Z,A.url()));}).catch(()=>{}).then(()=>{});g.add(D),D.finally(()=>g.delete(D));}),r.page(`Rendering ${u}`,{url:u});let C=null,W=null;try{if(C=await h.goto(u,{waitUntil:"domcontentloaded",timeout:e.navigationTimeoutMs}),C&&C.ok())try{W=await z(`read response body ${u}`,ve(e),()=>C.text());}catch{W=null;}}catch(A){let D=t.pageHttpFailures.get(u);if(D){let L=(t.pageHttpAttempts.get(u)??0)+1;throw t.pageHttpAttempts.set(u,L),new re(u,D.status,L,`Retry navigation failed: ${String(A)}`)}r.warn(`Navigation issue for ${u}; saving current DOM if available`,{url:u,error:String(A)});}let H=C?.status();if(pt(H)){let A=(t.pageHttpAttempts.get(u)??0)+1;throw t.pageHttpAttempts.set(u,A),new re(u,H,A)}if(C)t.pageHttpFailures.delete(u);else if(t.pageHttpFailures.has(u)){let A=t.pageHttpFailures.get(u),D=(t.pageHttpAttempts.get(u)??0)+1;throw t.pageHttpAttempts.set(u,D),new re(u,A.status,D,"Retry navigation returned no HTTP response.")}if(n==="content-sync"&&C){let A=oe(C.url(),r,"content-sync-final-response",u)?.toString();if(A&&A!==x){if(o.deleteOnMissingUrls.has(u)){await Xe(e,o,i,u,o.deleteOnMissingUrls),r.info(`Removed stale content-sync archive route redirected to ${A}`,{url:u,finalResponseUrl:A,source:"content-sync-tombstone"});continue}throw new Error(`Required content-sync route redirected outside its planned URL: ${u} -> ${A}`)}}if(k){let A=C?.status()??null;if(A!==404){r.error(`Generated 404 request path returned unexpected status for ${u}`,{url:u,expectedStatus:404,status:A,requestPath:e.generated404RequestPath});continue}r.info(`Capturing rendered 404 page for ${u}`,{url:u,status:A,outputPath:he(e,u)});}else if(C&&!C.ok()){if(n==="content-sync"&&(C.status()===404||C.status()===410)&&o.deleteOnMissingUrls.has(u)){await Xe(e,o,i,u,o.deleteOnMissingUrls),r.info(`Removed stale content-sync archive page ${u}`,{url:u,status:C.status(),source:"content-sync-tombstone"}),await h.close();continue}if(n==="content-sync")throw new Error(`Required content-sync route returned HTTP ${C.status()}: ${u}`);r.skip("page",u,C.status(),t.pageDiscoverySources.get(u)),await h.close();continue}M?(r.info(`Rendering without JS execution for ${u}`,{url:u,mode:"no-js"}),await z(`wait for rendered page ${u}`,ve(e),()=>vi(e,h))):await z(`wait for rendered page ${u}`,ve(e),()=>Ri(e,h)),t.stats.pagesRendered++;let P=await z(`extract rendered assets ${u}`,ve(e),()=>ki(e,h,x,r,!M));for(let A of P)q(e,t,A,r,u);let j=[...new Set([...P,...O])],ie=W??await z(`capture rendered html ${u}`,ve(e),()=>Tt(h)),te=n!=="single-url"&&n!=="content-sync"&&!k?Bn(e,u,ie,r):[];if(n!=="single-url"&&n!=="content-sync"&&!k)for(let A of te)$e(e,t,A,r,u);await ir(e,u,ie,t,r);let ae=he(e,u);if(G(i,e,ae),se(i,ae),o.trackManifest){let A=C?.headers();o.manifest.pages[u]={url:u,outputPath:ae,contentType:Zt(A),changeToken:v.changeToken?.supported?v.changeToken.token:null,tokenSource:v.changeToken?.supported?v.changeToken.tokenSource??null:null,sitemapLastmod:Ee(t.sitemapLastmodByPage[u])??null,discoveredPages:te,discoveredAssets:j,lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,rewriteComplete:!1},(o.enabled||o.strictTargeted)&&await ke(e,o);}}catch(w){if(w instanceof re){t.pageHttpFailures.set(u,w),w.attempts<Qt?(b=mt(w.attempts),r.warn(`Retrying page after HTTP ${w.status}: ${u}`,{url:u,status:w.status,attempt:w.attempts,maxAttempts:Qt,delayMs:b,reason:w.message,execution:"local"})):(t.pageHttpFailures.set(u,w),r.error(`Failed page after HTTP retries ${u}`,{url:u,status:w.status,attempts:w.attempts,error:String(w),execution:"local"}));continue}if(f=w instanceof Ye,o.strictTargeted)throw r.error(`Failed required content-sync page ${u}`,{url:u,error:String(w)}),w;if(f)r.warn(`Skipped partial DOM for timed-out page ${u}`,{url:u,error:String(w),recovery:"recycle-worker-browser"});else try{let x=h?await z(`capture partial html ${u}`,ve(e),()=>Tt(h)):"";if(x&&x.trim()){await ir(e,u,x,t,r);let k=he(e,u);if(G(i,e,k),se(i,k),o.trackManifest){let M=o.manifest.pages[u]??o.previousManifest.pages[u];o.manifest.pages[u]={url:u,outputPath:k,contentType:M?.contentType??null,changeToken:null,tokenSource:null,sitemapLastmod:Ee(t.sitemapLastmodByPage[u])??M?.sitemapLastmod??null,discoveredPages:M?.discoveredPages?[...M.discoveredPages]:[],discoveredAssets:M?.discoveredAssets?[...M.discoveredAssets]:[],lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,rewriteComplete:!1},(o.enabled||o.strictTargeted)&&await ke(e,o);}r.warn(`Saved partial DOM for ${u}`,{url:u,error:String(w)});}}catch(x){x instanceof Ye&&(f=!0),r.error(`Could not save partial DOM for ${u}`,{url:u,error:String(x)});}r.error(`Failed page ${u}`,{url:u,error:String(w)});}finally{if(!f&&h&&await z(`drain network routes ${u}`,Ge(e),()=>h.unrouteAll({behavior:"wait"})).catch(w=>{f=!0,r.warn(`Could not drain network routes for ${u}`,{url:u,browserPid:l.pid,error:String(w),recovery:"recycle-worker-browser"});}),f&&(a=null,await Gt(d,r,`page operation timeout for ${u}`),await d.close().catch(()=>{})),g.size>0&&await Promise.allSettled([...g]),!f&&m)try{let w=await m.cookies();c.addAll(Vr(p,w));}catch{}b===null&&(t.stats.pagesCompleted++,Qn(t)&&Kn(t,r)),!f&&h&&await z(`close page ${u}`,Ge(e),()=>h.close()).catch(w=>{f=!0,r.warn(`Timed out while closing page ${u}`,{url:u,browserPid:l.pid,error:String(w),recovery:"recycle-worker-browser"});}),!f&&m&&await z(`close page context ${u}`,Ge(e),()=>m.close()).catch(w=>{f=!0,r.warn(`Timed out while closing page context for ${u}`,{url:u,browserPid:l.pid,error:String(w),recovery:"recycle-worker-browser"});}),f&&a===d&&(a=null,await Gt(d,r,`page cleanup timeout for ${u}`),await d.close().catch(()=>{})),b!==null&&(await setTimeout$1(b),t.donePages.delete(u),t.queuedPages.add(u),t.pageQueue.push(u));}}}finally{if(a){let d=a;await z("close worker browser",Ge(e),()=>d.close()).catch(u=>(r.warn("Timed out while closing crawl worker browser",{browserPid:l.pid,error:String(u)}),Gt(d,r,"browser.close timeout")));}}}async function Ii(e){try{let t=await $.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 Pn(e){let t=String(e||"").toLowerCase();return t.includes("timeout")||t.includes("timed out")||t.includes("navigation timeout")}function Ei(e){let t=String(e?.job?.command||"").trim(),r=String(e?.job?.crawlMode||"full").trim();return t!=="publish"&&t!=="crawl"?false:r!=="incremental"}function Oi(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 Jn(e){try{let t=await $.readFile(e,"utf8"),r=JSON.parse(t);return r&&typeof r=="object"&&!Array.isArray(r)?r:null}catch{return null}}function Rn(e){let t=String(e.originalFileName||"").toLowerCase();return t.endsWith("errors.jsonl")?0:t.endsWith("errors.json")?1:2}function Mi(e,t){let r=Array.isArray(t?.artifacts)?t.artifacts.filter(n=>String(n?.role||"").trim()==="errors"&&String(n?.storedFileName||"").trim()!=="").sort((n,s)=>Rn(n)-Rn(s)).map(n=>S.join(e,String(n.storedFileName))):[];return [...new Set([...r,S.join(e,"errors.jsonl"),S.join(e,"errors.json"),S.join(e,"errors.jsonl.gz"),S.join(e,"errors.json.gz")])]}async function vn(e){let t=await Jn(S.join(e,"job.json"));for(let r of Mi(e,t)){let n=await Ii(r);if(n.length>0)return n}return []}async function $i(e){let t=S.join(e.logDir,"archive"),r;try{r=await $.readdir(t);}catch{return ""}let n="",s=0;for(let o of r){let i=S.join(t,o);if(!(await $.stat(i).catch(()=>null))?.isDirectory())continue;let a=await Jn(S.join(i,"job.json"));if(!Ei(a))continue;let l=Oi(a);l>=s&&(s=l,n=i);}return n}async function ji(e){let t=await $i(e),r=t!==""?await vn(t):await vn(e.logDir),n=new Set;for(let s of r)if(Pn(s.error)||Pn(s.message)){let o=s.url;typeof o=="string"&&o&&n.add(o);}return [...n]}async function Ui(e){let t=[];for(let r of e)if(r.startsWith("@")){let n=r.slice(1),s=await $.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 Li(e){if(!e)throw new Error("Content-sync crawl requires an immutable impact plan.");let t=JSON.parse(await $.readFile(e,"utf8"));return yr(t),t}function Di(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 Je(e,t,r){let n=r==="page"?he(e,t):tt(e,t).originalFilePath;return X(e.outputDir,n)}async function Xe(e,t,r,n,s){let o=t.manifest.pages[n];if(!o)return;let i=X(e.outputDir,o.outputPath);if(!i)throw new Error(`Manifest-owned page path escaped output root: ${n}`);let c=S.resolve(o.outputPath);Object.entries(t.manifest.pages).some(([l,d])=>l!==n&&!s.has(l)&&S.resolve(d.outputPath)===c)||(await $.rm(o.outputPath,{force:true}),r.deletedFiles.add(i),r.revalidateFiles.delete(i)),delete t.manifest.pages[n];}async function Fi(e,t,r,n,s){let o=t.manifest.assets[n];if(!o)return;let i=X(e.outputDir,o.outputPath);if(!i)throw new Error(`Manifest-owned resource path escaped output root: ${n}`);let c=S.resolve(o.outputPath);Object.entries(t.manifest.assets).some(([l,d])=>l!==n&&!s.has(l)&&S.resolve(d.outputPath)===c)||(await $.rm(o.outputPath,{force:true}),r.deletedFiles.add(i)),delete t.manifest.assets[n];}function Wi(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{Ne(new URL(i))&&n.push(i);}catch{}}return r}async function qi(e,t,r,n,s){let o=Wi(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=X(e.outputDir,c.outputPath);if(!a)throw new Error(`Manifest-owned sitemap path escaped output root: ${i}`);await $.rm(c.outputPath,{force:true}),n.deletedFiles.add(a),delete r.manifest.assets[i];}await ke(e,r);}async function Ni(e){try{let t=await $.readFile(S.join(e.outputDir,"asset-map.json"),"utf8");return JSON.parse(t)}catch{return {}}}async function _i(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 $.mkdir(e,{recursive:true}),await Promise.all(t.map(async r=>{try{await $.unlink(S.join(e,r));}catch(n){if(n.code!=="ENOENT")throw n}}));}function kn(e,t,r,n,s){let o=Q(e,r,e.sourceOrigin,n,"manual-url");o&&(Ne(o)?Rt(e,t,o.toString(),n,s):N(e,o)?q(e,t,o.toString(),n,s):Ce(o)?$e(e,t,o.toString(),n,s):n.reject("manual-url",o.toString(),"not page/sitemap/asset-like",s));}async function Gn(e=process.argv.slice(2)){let t=[],r=await st(void 0,{onRemotePublisherConfigDiagnostic:y=>{t.push(y);}}),n=br(r.sitemapPaths),s=t.at(-1)??null,o=ko(e),i=o.mode==="content-sync"?await Li(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 ji(r)),o.mode==="single-url"&&(c=await Ui(o.urls)),i&&(c=[...i.directRenderUrls,...i.archiveFamilyUrls,...i.resourceRenderUrls]);let a=o.crawlMode==="incremental"&&o.mode==="full",l=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,u=o.mode!=="full"||o.resumeRewrite||l,m=u?await Ni(r):{},h=l||o.mode==="single-url"||o.mode==="content-sync"?await Mo(r):In(),f=new Set(c),b=new Set;if(i){for(let y of i.archiveFamilies)if(y.foundPosts===0)for(let E of y.pageUrls)b.add(E);for(let y of Object.keys(h.pages))Di(y,i)&&!f.has(y)&&(c.push(y),b.add(y));}let p={enabled:l,trackManifest:d,manifest:er(h),previousManifest:er(h),runId:i?.jobId??`${Date.now()}`,seenPages:new Set,changeTokenCache:new Map,pageChangeTokenPrimePromise:null,manifestSaveChain:Promise.resolve(),manifestPendingChanges:0,lastManifestSavedAt:Date.now(),strictTargeted:!!i,requiredUrls:f,deleteOnMissingUrls:b};await _i(r.logDir);let g=new Ue(r.logDir,r.logLevel),w=o.remoteRender??r.remoteWorkers?.render?.enabled===true,x=sn({explicitPath:o.remoteWorkerConfigPath,runtimeDir:et()}),k=null,M=null,I=null,v=null,R=Math.max(1,r.concurrency),O=1,C=r.remoteWorkers?.rewrite?.enabled===true,W=r.remoteWorkers?.deploy?.enabled===true,H=w&&C&&W&&!o.resumeRewrite;if(!H&&o.mode==="full"&&!o.resumeRewrite&&await $.rm(ft(r),{force:true}),w&&!o.resumeRewrite||C){if(!x)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 y=await Gr(x),E=false;if(I=new dt(y,{},{onProgress:T=>{if(T.operation==="rewrite"){g.debug("Lambda rewrite task progress.",{remoteWorkerOperation:T.operation,remoteWorkerTaskId:T.taskId,remoteWorkerStatus:T.status,remoteWorkerCompletedItems:T.completedItems,remoteWorkerFailedItems:T.failedItems,remoteWorkerTotalItems:T.totalItems,remoteWorkerUpdatedAt:T.updatedAt});return}g.progress(`Lambda ${T.operation} batch: ${T.completedItems+T.failedItems}/${T.totalItems}`,{remoteWorkerOperation:T.operation,remoteWorkerTaskId:T.taskId,remoteWorkerStatus:T.status,remoteWorkerCompletedItems:T.completedItems,remoteWorkerFailedItems:T.failedItems,remoteWorkerTotalItems:T.totalItems,remoteWorkerUpdatedAt:T.updatedAt});},onProgressError:T=>{E||(E=true,g.warn("Lambda progress status could not be read; task execution continues.",{error:T.message}));}}),H){if(!y.functions.asset)throw new Error("Full Lambda delegation requires an asset worker. Redeploy the Lambda worker stack and reinstall remote-workers.json.");let T=u?await mn(r):null;v=cn(`crawl-${ce(p.runId,40)}`,y,T),M=new ht({client:I,jobId:v.jobId,maxAttempts:2}),g.info("S3-native Lambda data plane is enabled.",{execution:"lambda",assetWorker:y.functions.asset,workspaceBucket:y.workspace.bucket,workspacePrefix:y.workspace.prefix});}}if(w&&!o.resumeRewrite){if(!I)throw new Error("Remote render worker client was not initialized.");R=Math.max(1,Math.min(100,H?r.concurrency:r.remoteWorkers?.render?.concurrency??r.concurrency)),O=Math.max(1,Math.min(20,r.remoteWorkers?.render?.batchSize??5)),k=new gt({client:I,jobId:`crawl-${ce(p.runId,40)}`,maxAttempts:r.remoteWorkers?.render?.maxAttempts??2,batchSize:O,maxConcurrentBatches:R,onRetry:y=>{g.warn(`Retrying remote render for ${y.url}`,{url:y.url,attempt:y.attempt,maxAttempts:y.maxAttempts,reason:y.reason,status:y.status,delayMs:y.delayMs,execution:"lambda"});}}),g.info("Lambda page rendering is enabled.",{remoteWorkerConfigPath:S.resolve(x),concurrency:R,maxAttempts:r.remoteWorkers?.render?.maxAttempts??2,batchSize:O,execution:"lambda"});}if(s){let y={status:s.status,virtualAssetBaseUrl:s.virtualAssetBaseUrl,subscriptionType:s.subscriptionType??null,error:s.error,requests:s.requests,source:"remote-publisher-config"};s.status==="loaded"&&s.subscriptionType?g.info("Loaded remote WP Suite publisher configuration.",y):g.warn("Remote WP Suite publisher configuration is unavailable or has no active subscription type.",y);}if(a&&!l){let y="Incremental crawl requires an active remote publisher subscription; refusing to fall back to a destructive full crawl.";throw g.error(y,{requestedMode:o.crawlMode,subscriptionType:r.subscriptionType??null,source:"incremental-subscription-guard"}),await g.flush(),new Error(y)}let P={pageQueue:[],queuedPages:new Set,donePages:new Set,savedPageOutputs:new Set,pageHttpAttempts:new Map,pageHttpFailures:new Map,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:{...m},assetVariantDigestsByOriginalPath:new Map,stats:{pagesQueued:0,pagesRendered:0,pagesCompleted:0,assetsQueued:0,sitemapsQueued:0,assetsSaved:0,pagesSaved:0}},j=Oo(),ie=new ct,te=Co();if(te&&!o.resumeRewrite&&await lt(te,ie.artifact()),await fr(r),await It(r,{startedAt:new Date().toISOString(),outputDir:S.resolve(r.outputDir)}),!o.resumeRewrite&&r.pageCache?.purgeBeforeCrawl===true){g.mark("purge-page-cache");let y=await request.newContext({ignoreHTTPSErrors:r.ignoreHttpsErrors});try{let E=await an(r,y);g.info("WordPress page cache was purged before crawl discovery.",{provider:E.provider,scope:E.scope,purgedAt:E.purgedAt??null}),g.endMark("purge-page-cache",{provider:E.provider,scope:E.scope});}catch(E){throw g.error("WordPress page-cache purge failed; crawl stopped before changing export output.",{error:E instanceof Error?E.message:String(E)}),await g.flush(),E}finally{await y.dispose();}}if(u||await $.rm(r.outputDir,{recursive:true,force:true}),await $.mkdir(r.outputDir,{recursive:true}),u||await It(r,{startedAt:new Date().toISOString(),outputDir:S.resolve(r.outputDir)}),i){let y=new Set([...i.deleteUrls,...p.deleteOnMissingUrls]);for(let T of i.deleteUrls)await Xe(r,p,j,T,y);let E=new Set(i.resourceDeleteUrls);for(let T of i.resourceDeleteUrls)await Fi(r,p,j,T,E);}if(o.resumeRewrite)g.info("Resuming final rewrite from existing output.",{phase:"rewrite-text",mode:o.mode,crawlMode:o.crawlMode});else {let y=await request.newContext({ignoreHTTPSErrors:r.ignoreHttpsErrors});try{if(g.mark("discovery"),o.mode==="full"?(n.forEach(T=>Rt(r,P,T,g)),await bn(r,y,P,g,j,p),r.seedPaths.forEach(T=>kn(r,P,T,g,"seed-path")),r.generated404RequestPath&&$e(r,P,r.generated404RequestPath,g,"generated-404-request-path")):(c.forEach(T=>kn(r,P,T,g,"cli")),i?.sitemapUrls.forEach(T=>Rt(r,P,T,g,"content-sync-impact")),await bn(r,y,P,g,j,p,o.mode==="content-sync",i?.sitemapUrls??[]),i&&await qi(r,P,p,j,i.sitemapUrls)),g.endMark("discovery",{pages:P.pageQueue.length,assets:P.assetQueue.length,sitemaps:P.sitemapQueue.length}),g.summary(`Queued ${P.pageQueue.length} pages, ${P.assetQueue.length} assets, ${P.sitemapQueue.length} sitemaps.`,{mode:o.mode,crawlMode:o.crawlMode,queuedPages:P.pageQueue.length,queuedAssets:P.assetQueue.length,queuedSitemaps:P.sitemapQueue.length}),o.mode==="retry-timeouts"&&P.pageQueue.length===0&&P.assetQueue.length===0&&P.sitemapQueue.length===0){g.summary("No timed-out URLs were queued. Skipping retry crawl.",{mode:o.mode,crawlMode:o.crawlMode,queuedPages:0,queuedAssets:0,queuedSitemaps:0}),await g.flush(),te&&await lt(te,ie.artifact());return}g.mark("render-pages");let E=Array.from({length:k?R*O:R},()=>k?Ti(r,P,g,o.mode,y,p,j,ie,k,v??void 0):Ai(r,P,g,o.mode,y,p,j,ie));if(await Promise.all(E),P.pageHttpFailures.size>0&&await g.flush(),Zr(P.pageHttpFailures),te&&await lt(te,ie.artifact()),g.endMark("render-pages",{pages:P.stats.pagesCompleted}),g.mark("download-assets"),g.progress("Asset download phase started.",{phase:"download-assets",doneAssets:P.doneAssets.size,assetsQueued:P.stats.assetsQueued,assetQueue:P.assetQueue.length}),v&&M?await yi(r,y,P,g,p,j,v,M,r.concurrency):(await ar(r,y,p,[...P.assetQueue],g),await fi(r,y,P,g,p,j)),g.endMark("download-assets",{assets:P.doneAssets.size}),p.enabled&&r.maxPages===0&&(await Wo(r,P,p,g,j),o.mode==="full"&&await qo(r,p,g,j)),o.mode==="full"){let T=await gi(r,P,g);for(let F of T)if(G(j,r,F),v&&I){let _=vt(r,F),Y=await $.readFile(F),fe=le(F),we=String(Yr.lookup(_)||"")||(fe?"text/plain; charset=utf-8":"application/octet-stream"),nt=await I.writeWorkspaceObject({key:`${v.workspace.prefix}jobs/${v.jobId}/copied/${ce(_,40)}-${S.basename(_)}`,body:Y,contentType:we});De(v,{relativePath:_,sourceUrl:null,kind:"generated",contentType:nt.contentType,cacheControl:null,isText:fe,object:nt}),fe&&se(j,F);}}}finally{await z("dispose crawl request context",Ge(r),()=>y.dispose()).catch(E=>{g.warn("Timed out while disposing crawl request context",{error:String(E)});});}}if(p.trackManifest&&await ke(r,p,true),v)for(let y of j.deletedFiles)dn(v,y);let ae=JSON.stringify(P.assetMap,null,2);if(await $.writeFile(S.join(r.outputDir,"asset-map.json"),ae,"utf8"),v&&I){let y=await I.writeWorkspaceObject({key:`${v.workspace.prefix}jobs/${v.jobId}/generated/asset-map.json`,body:ae,contentType:"application/json; charset=utf-8"});De(v,{relativePath:"asset-map.json",sourceUrl:null,kind:"generated",contentType:"application/json; charset=utf-8",cacheControl:r.s3.assetCacheControl,isText:true,object:y});}JSON.stringify(m,null,2)!==JSON.stringify(P.assetMap,null,2)&&G(j,r,S.join(r.outputDir,"asset-map.json")),v&&I&&await bi(r,j,v,I);let A=o.mode==="single-url"||o.mode==="content-sync"?Ko(r,P):p.enabled&&!o.resumeRewrite?No(r,p,j,m,P.assetMap):void 0;g.mark("rewrite-text");let D=o.mode==="single-url"||o.mode==="content-sync"?`Rewriting text files touched by URL crawl: 0/${A?.length??0}`:"Rewriting text files...";g.progress(D,{phase:"rewrite-text",index:0,totalFiles:A?.length,changedTextFiles:0}),await Ke(D);let L=Date.now(),Z={files:A,previousAssetMap:m,onStart:({totalFiles:y,workerCount:E})=>{g.info(`Rewrite phase scanning ${y} text files.`,{phase:"rewrite-text",totalFiles:y,workerCount:E});},onProgress:async({index:y,totalFiles:E,changedTextFiles:T,file:F,changed:_})=>{_&&G(j,r,S.join(r.outputDir,F)),g.checkpoint(`Rewriting text file ${y}/${E}`,{phase:"rewrite-text",index:y,totalFiles:E,changedTextFiles:T,file:F}),g.debug(`${_?"Rewrote":"Checked unchanged"} text file ${y}/${E}: ${F}`,{phase:"rewrite-text",index:y,totalFiles:E,changedTextFiles:T,file:F,changed:_});let Y=Date.now();if(!(y===1||y===E||y%50===0||Y-L>=5e3))return;L=Y;let we=`Rewriting text files: ${y}/${E}`;g.progress(we,{phase:"rewrite-text",index:y,totalFiles:E,changedTextFiles:T,file:F}),await Ke(we);}},J;if(v&&I){let y=A?.map(T=>vt(r,S.isAbsolute(T)?T:S.join(r.outputDir,T))),E=Object.values(v.objects).filter(T=>T.isText&&(!y||y.includes(T.relativePath))).length;await Z.onStart?.({totalFiles:E,workerCount:Math.min(r.concurrency,E)}),J=await nn(r,v,P.assetMap,{client:I,jobId:v.jobId,concurrency:r.concurrency,batchSize:25,maxAttempts:2,...y?{relativePaths:y}:{},onProgress:Z.onProgress,onBatchProgress:async({completedItems:T,totalItems:F,completedBatches:_,totalBatches:Y,changedTextFiles:fe})=>{let we=`Lambda rewrite: ${T}/${F} files; ${_}/${Y} batches completed`;g.progress(we,{phase:"rewrite-text",execution:"lambda",index:T,totalFiles:F,completedBatches:_,totalBatches:Y,changedTextFiles:fe}),await Ke(we);}}),await pn(r,v);}else C&&I?J=await rn(r,P.assetMap,{client:I,jobId:`crawl-${ce(p.runId,40)}`,concurrency:r.remoteWorkers?.rewrite?.concurrency??r.rewriteConcurrency,batchSize:r.remoteWorkers?.rewrite?.batchSize??25,maxAttempts:r.remoteWorkers?.rewrite?.maxAttempts??2,onStageProgress:async({index:y,totalFiles:E,file:T})=>{let F=Date.now();if(y!==1&&y!==E&&y%25!==0&&F-L<5e3)return;L=F;let _=`Staging text files for Lambda rewrite: ${y}/${E}`;g.progress(_,{phase:"rewrite-stage",index:y,totalFiles:E,file:T,execution:"lambda"}),await Ke(_);},onBatchProgress:async({completedItems:y,totalItems:E,completedBatches:T,totalBatches:F,changedTextFiles:_})=>{let Y=`Lambda rewrite: ${y}/${E} files; ${T}/${F} batches completed`;g.progress(Y,{phase:"rewrite-text",execution:"lambda",index:y,totalFiles:E,completedBatches:T,totalBatches:F,changedTextFiles:_}),await Ke(Y);},options:Z}):J=await Mr(r,P.assetMap,Z);p.trackManifest&&(_o(p,A),await ke(r,p,true)),g.endMark("rewrite-text",{changedTextFiles:J});let _e=i?[...j.deletedFiles].sort():p.enabled&&!o.resumeRewrite?await Bo(r,P,p,j,g,v):[],rt=[...new Set((A||[]).map(y=>X(r.outputDir,S.isAbsolute(y)?y:S.join(r.outputDir,y))).filter(y=>y!==null))].sort();if(i){let y=[...j.changedFiles].sort(),E=new Set(y),T=new Set(i.directRenderUrls.map(U=>Je(r,U,"page")).filter(U=>!!U&&E.has(U))),F=new Set(i.archiveFamilyUrls.map(U=>Je(r,U,"page")).filter(U=>!!U&&E.has(U))),_=new Set(i.resourceRenderUrls.map(U=>Je(r,U,"asset")).filter(U=>!!U&&E.has(U))),Y=new Set([...P.sitemapLeafUrls].map(U=>Je(r,U,"asset")).filter(U=>!!U&&E.has(U))),fe=new Set([...P.sitemapIndexUrls].map(U=>Je(r,U,"asset")).filter(U=>!!U&&E.has(U))),we=new Set([...T,...F,..._,...Y,...fe]),nt=y.filter(U=>!we.has(U)),Zn=[...new Set([...i.directRenderUrls,...i.archiveFamilyUrls,...P.resolvedSitemapRoots,...P.sitemapLeafUrls,...P.sitemapIndexUrls,...i.deleteUrls,...i.resourceRenderUrls,...i.resourceDeleteUrls].map(U=>{let lr=new URL(U);return `${lr.pathname}${lr.search}`}))].sort();await At(r,{schemaVersion:2,generatedAt:new Date().toISOString(),outputDir:S.resolve(r.outputDir),runMode:"content-sync",crawlMode:"incremental",fullSyncRequired:false,changedFiles:y,deletedFiles:_e,rewriteTargets:rt,revalidateFiles:[...j.revalidateFiles].sort(),consumerId:i.consumerId,fromSequence:i.fromSequence,toSequence:i.toSequence,impactHash:i.impactHash,resolvedSitemapUrls:[...P.resolvedSitemapRoots],uploadGroups:{assets:nt,content:[...T].sort(),listings:[...F].sort(),resources:[..._].sort(),sitemapLeaves:[...Y].sort(),sitemapIndexes:[...fe].reverse()},invalidationPaths:Zn});}else await At(r,{schemaVersion:1,generatedAt:new Date().toISOString(),outputDir:S.resolve(r.outputDir),runMode:o.mode,crawlMode:o.crawlMode,fullSyncRequired:!(p.enabled&&!o.resumeRewrite),changedFiles:p.enabled&&!o.resumeRewrite?[...j.changedFiles].sort():[],deletedFiles:p.enabled&&!o.resumeRewrite?_e:[],rewriteTargets:p.enabled&&!o.resumeRewrite?rt:[],revalidateFiles:[...j.revalidateFiles].sort()});await wr(r),g.summary(o.resumeRewrite?`Done. Resumed final rewrite over existing output and changed ${J} text files.`:`Done. Rendered ${P.stats.pagesRendered} pages, processed ${P.doneSitemaps.size} sitemaps and ${P.doneAssets.size} assets.`,{mode:o.mode,crawlMode:o.crawlMode,resumeRewrite:o.resumeRewrite,...P.stats,pagesRendered:P.stats.pagesRendered,donePages:P.stats.pagesCompleted,claimedPages:P.donePages.size,doneSitemaps:P.doneSitemaps.size,doneAssets:P.doneAssets.size,changedTextFiles:J}),await g.flush();}Gn().catch(async e=>{let t=Pe(e instanceof Error?e.message:String(e));console.error(t);try{let n=(await st().catch(()=>null))?.logDir??"logs",s=new Ue(n,"debug");s.error(`Unhandled error: ${t}`,e instanceof Error&&e.stack?{stack:Pe(e.stack)}:void 0),await s.flush();}catch{}process.exit(1);});