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