@smart-cloud/publisher-exporter 1.1.52 → 1.1.53

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.
@@ -10,5 +10,5 @@ ${e.path}`}function mr(e,t){let n;try{n=new URL(t);}catch{return null}let r=e.sp
10
10
  `,{encoding:"utf8",mode:384}),await T.rename(n,e);}var mi=["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"],kr=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"]),$r=new Set(["",".html",".htm"]),hi=new Set([".css",".xml",".xsl",".svg",".json",".html",".htm",".txt",".enc",".jws"]),wi=["/wp-content/","/wp-includes/","/wp-admin/","/static/","/assets/","/build/","/_next/"];function yi(e){let t=[],n="full",r="full",s=false,i=false,a="";for(let u=0;u<e.length;u++){let o=e[u];if(o==="--retry-timeouts")n="retry-timeouts",s=true;else if(o==="--resume")s=true;else if(o==="--resume-rewrite")s=true,i=true;else if(o==="--crawl-mode"){let l=e[++u];if(!l)throw new Error("--crawl-mode requires a value");r=l==="incremental"?"incremental":"full",s||=r==="incremental";}else if(o.startsWith("--crawl-mode="))r=o.slice(13)==="incremental"?"incremental":"full",s||=r==="incremental";else if(o==="--incremental")r="incremental",s=true;else if(o==="--url"){let l=e[++u];if(!l)throw new Error("--url requires a value");n="single-url",s=true,t.push(l);}else if(o.startsWith("--url="))n="single-url",s=true,t.push(o.slice(6));else if(o==="--urls"){let l=e[++u];if(!l)throw new Error("--urls requires a file path");n="single-url",s=true,t.push(`@${l}`);}else if(o==="--content-sync-plan"){let l=e[++u];if(!l)throw new Error("--content-sync-plan requires a file path");n="content-sync",r="incremental",s=true,a=S.resolve(l);}else o.startsWith("--content-sync-plan=")&&(n="content-sync",r="incremental",s=true,a=S.resolve(o.slice(20)));}return {mode:n,crawlMode:r,urls:t,preserveOutput:s,resumeRewrite:i,contentSyncPlanPath:a}}function xt(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?S.resolve(e):""}function Si(){let e=xt();return e?S.join(e,"privacy","cookie-observations.json"):null}function bi(){let e=xt();return e?S.resolve(e,".."):""}function Pi(){let e=process.env.STATIC_PUBLISHER_WP_ROOT||process.env.WPSUITE_STATIC_PUBLISHER_WP_ROOT||"";return e.trim()?S.resolve(e):""}function vi(e){let t=e.trim(),n=[{alias:"@storage-root",root:bi(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@runtime",root:xt(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@wp-root",root:Pi(),requiredEnv:"STATIC_PUBLISHER_WP_ROOT or WPSUITE_STATIC_PUBLISHER_WP_ROOT"}];for(let r of n){if(t!==r.alias&&!t.startsWith(`${r.alias}/`))continue;if(!r.root)return {resolvedPath:null,alias:r.alias,requiredEnv:r.requiredEnv};let s=t.slice(r.alias.length).replace(/^\/+/,"");return {resolvedPath:s?S.resolve(r.root,s):r.root,alias:r.alias}}return {resolvedPath:S.resolve(t)}}function Er(e){let t=String(process.env.STATIC_PUBLISHER_CRAWL_MANIFEST_PATH||"").trim();if(t)return S.resolve(t);let n=xt();return n?S.join(n,"crawl-manifest.json"):S.join(e.outputDir,".crawl-manifest.json")}function Mr(){return {schemaVersion:5,updatedAt:"",pages:{},assets:{}}}function wr(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 Ci(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(n=>String(n)):[],lastCrawledAt:String(e.lastCrawledAt||""),lastSeenRunId:String(e.lastSeenRunId||""),unreferencedRuns:Math.max(0,Number(e.unreferencedRuns)||0),rewriteComplete:e.rewriteComplete===true||!t}}function sn(e){let t=e?.["content-type"]?.trim();return t||null}function Ri(){return {rewriteTargets:new Set,changedFiles:new Set,deletedFiles:new Set}}function X(e,t,n){let r=Se(t.outputDir,n);r&&(e.changedFiles.add(r),e.deletedFiles.delete(r));}function yr(e,t,n){let r=Se(t.outputDir,n);r&&(e.deletedFiles.add(r),e.changedFiles.delete(r));}function Ie(e,t){e.rewriteTargets.add(S.resolve(t));}async function Ii(e){try{let t=await T.readFile(Er(e),"utf8"),n=JSON.parse(t);if(n&&typeof n=="object"&&n.pages&&typeof n.pages=="object"){if((n.schemaVersion===2||n.schemaVersion===3||n.schemaVersion===4||n.schemaVersion===5)&&n.assets&&typeof n.assets=="object")return {schemaVersion:5,updatedAt:String(n.updatedAt||""),pages:Object.fromEntries(Object.entries(n.pages).map(([r,s])=>[r,wr(s)])),assets:Object.fromEntries(Object.entries(n.assets).map(([r,s])=>[r,Ci(s)]))};if(n.schemaVersion===1)return {schemaVersion:5,updatedAt:String(n.updatedAt||""),pages:Object.fromEntries(Object.entries(n.pages).map(([r,s])=>[r,wr(s)])),assets:{}}}}catch{}return Mr()}function on(e){return JSON.parse(JSON.stringify(e))}async function xi(e,t){let n=Er(e);await T.mkdir(S.dirname(n),{recursive:true}),await T.writeFile(n,JSON.stringify(t,null,2),"utf8");}async function Pe(e,t){if(!t.trackManifest)return;let n=async()=>{let r=on(t.manifest);r.updatedAt=new Date().toISOString(),t.manifest.updatedAt=r.updatedAt,await xi(e,r);};t.manifestSaveChain=t.manifestSaveChain.then(n,n),await t.manifestSaveChain;}function et(e){if(!e)return null;let t=e.trim();return t||null}function Ai(e,t){let n=new Set,r=new Set([...Object.keys(e),...Object.keys(t)]);for(let s of r){let i=e[s],a=t[s];!i||!a||i===a||n.add(s);}return n}async function Dr(e,t,n,r){let s=[...new Set(n.map(u=>u.trim()).filter(Boolean))],i=String(e.wpsuite?.runtimeToken||"").trim();if(s.length===0||!i)return new Map;let a=new URL("/wp-json/smartcloud-static-publisher/v1/change-tokens",e.sourceOrigin).toString();try{let u=await t.post(a,{timeout:3e4,failOnStatusCode:!1,headers:{"content-type":"application/json","x-static-publisher-token":i},data:JSON.stringify({urls:s})});if(!u.ok())return r.warn(`Change token lookup failed with HTTP ${u.status()}`,{endpoint:a,status:u.status()}),new Map;let o=await u.json().catch(()=>null);if(!o||!Array.isArray(o.items))return new Map;let l=new Map;for(let c of o.items)!c||typeof c.url!="string"||l.set(c.url,c);return l}catch(u){return r.warn("Change token lookup failed; falling back to sitemap metadata",{endpoint:a,error:u instanceof Error?`${u.name}: ${u.message.split(/\r?\n/u,1)[0]}`:"Unknown change-token request failure"}),new Map}}async function vt(e,t,n,r,s){if(!n.enabled&&!n.trackManifest)return null;if(n.changeTokenCache.has(r))return n.changeTokenCache.get(r)??null;let a=(await Dr(e,t,[r],s)).get(r)??null;return pn(e,r)&&(!a||a.supported!==true||!a.token)&&(a=await $i(e,t,r,s)),a=Fr(e,a),n.changeTokenCache.set(r,a),a}async function Ti(e,t,n,r,s){if(!n.trackManifest)return;let i=[...new Set(r.map(a=>a.trim()).filter(Boolean))].filter(a=>!n.changeTokenCache.has(a));for(let a=0;a<i.length;a+=250){let u=i.slice(a,a+250),o=await Dr(e,t,u,s);for(let l of u)n.changeTokenCache.set(l,Fr(e,o.get(l)??null));}}function ki(e){return `subscriber=${e.wpsuite?.siteSettings?.subscriber===true?"1":"0"}`}function Fr(e,t){if(!t?.supported||!t.token||t.tokenSource==="wp-media-file")return t;let n=ki(e);return {...t,token:Ze(`${t.token}
11
11
  ${n}`,40),tokenSource:t.tokenSource?`${t.tokenSource}+site-subscriber`:"site-subscriber"}}async function $i(e,t,n,r){try{let s=await t.get(n,{timeout:Math.min(e.navigationTimeoutMs,15e3),failOnStatusCode:!1});if(s.status()!==404)return r.warn(`Generated 404 fallback token skipped for ${n}`,{url:n,status:s.status(),requestPath:e.generated404RequestPath,source:"generated-404-change-token-fallback"}),null;let i=await s.text().catch(()=>""),a=Ze(`${n}
12
12
  404
13
- ${i}`,40);return r.info(`Using generated 404 fallback change token for ${n}`,{url:n,requestPath:e.generated404RequestPath,source:"generated-404-change-token-fallback"}),{url:n,supported:!0,token:a,tokenSource:"generated-404-response-hash",postId:null,dependencyPostIds:[],reason:null}}catch(s){return r.warn(`Generated 404 fallback token lookup failed for ${n}`,{url:n,error:String(s),requestPath:e.generated404RequestPath,source:"generated-404-change-token-fallback"}),null}}async function Ei(e,t,n,r,s,i){let a=pn(e,s);if(!r.enabled)return {action:"render",changeToken:r.trackManifest?await vt(e,t,r,s,i):null};let u=r.manifest.pages[s];if(!u)return {action:"render",changeToken:await vt(e,t,r,s,i)};let o=await vt(e,t,r,s,i);if(o?.supported&&o.token)return u.changeToken===o.token?a&&!await Mi(e,t,s,i)?{action:"render",changeToken:o}:{action:"reuse",changeToken:o}:{action:"render",changeToken:o};let l=et(n.sitemapLastmodByPage[s]);return l&&u.sitemapLastmod&&u.sitemapLastmod===l?{action:"reuse",changeToken:o}:{action:"render",changeToken:o}}async function Mi(e,t,n,r){try{let i=(await t.get(n,{timeout:Math.min(e.navigationTimeoutMs,15e3),failOnStatusCode:!1})).status();return i===404?!0:(r.warn(`Generated 404 request path no longer returns 404 for ${n}`,{url:n,status:i,requestPath:e.generated404RequestPath,source:"generated-404-status-probe"}),!1)}catch(s){return r.warn(`Generated 404 status probe failed for ${n}`,{url:n,error:String(s),requestPath:e.generated404RequestPath,source:"generated-404-status-probe"}),false}}async function Di(e,t,n,r,s){let i=Sr(n.previousManifest,void 0,r,"previous-manifest"),a=0;for(let[p,f]of Object.entries(n.manifest.pages))if(!n.seenPages.has(p)){yr(s,e,f.outputPath);try{await T.unlink(f.outputPath);}catch(g){(g.code||"")!=="ENOENT"&&r.warn(`Failed to remove stale incremental page output for ${p}`,{url:p,outputPath:f.outputPath,error:String(g)});}delete n.manifest.pages[p],a++;}let u=Sr(n.manifest,n.runId,r,"active-manifest"),o=new Set,l=new Set;for(let p of u){for(let y of tt(e,p))o.add(y);let f=n.manifest.assets[p]?.outputPath;f&&l.add(f);let g=je(e,t.assetMap,p);g&&l.add(g);}for(let p of Object.keys(n.manifest.assets)){if(u.has(p)){n.manifest.assets[p].unreferencedRuns=0;continue}let f=n.manifest.assets[p];if(gr(f.unreferencedRuns)){f.unreferencedRuns+=1,r.warn(`Deferred deletion of newly unreferenced incremental asset ${p}.`,{url:p,unreferencedRuns:f.unreferencedRuns,phase:"incremental-cleanup",source:"asset-deletion-grace"});continue}delete n.manifest.assets[p];}let c=0,d=0;for(let p of i){if(n.manifest.assets[p])continue;let f=new Set,g=n.previousManifest.assets[p]?.outputPath;g&&f.add(g);let y=je(e,t.assetMap,p);if(!u.has(p)&&y)f.add(y);else if(!u.has(p)){let m=Gi(e,p,r,"incremental-cleanup");m&&(f.add(m.originalFilePath),m.hashedFilePath&&f.add(m.hashedFilePath));}for(let m of f)if(!l.has(m)){yr(s,e,m);try{await T.unlink(m),c++;}catch(h){(h.code||"")!=="ENOENT"&&r.warn(`Failed to remove stale incremental asset output for ${p}`,{url:p,outputPath:m,error:String(h)});}}for(let m of tt(e,p))o.has(m)||Object.prototype.hasOwnProperty.call(t.assetMap,m)&&(delete t.assetMap[m],d++);}(a>0||c>0||d>0)&&r.info(`Incremental cleanup removed ${a} stale pages, ${c} stale assets, ${d} stale asset mappings`,{removedPages:a,removedAssets:c,removedAssetMappings:d,phase:"incremental-cleanup"});}function Sr(e,t,n,r){let s=new Set,i=a=>{let u=a.trim();if(u){if(n){let o=ve(u,n,"asset",r??"manifest");if(!o)return;s.add(o.toString());return}s.add(u);}};for(let a of Object.values(e.pages))for(let u of a.discoveredAssets||[])i(u);for(let[a,u]of Object.entries(e.assets||{}))t&&u.lastSeenRunId!==t||i(a);return s}function br(e,t,n){for(let r of t)for(let s of tt(e,r))if(n.has(s))return true;return false}function Fi(e,t,n,r,s){let i=new Set(n.rewriteTargets);for(let u of Object.values(t.manifest.pages))u.rewriteComplete||i.add(S.resolve(u.outputPath));for(let u of Object.values(t.manifest.assets))u.isText&&!u.rewriteComplete&&i.add(S.resolve(u.outputPath));let a=Ai(r,s);if(a.size===0)return [...i];for(let u of Object.values(t.manifest.pages))br(e,u.discoveredAssets,a)&&i.add(S.resolve(u.outputPath));for(let[u,o]of Object.entries(t.manifest.assets)){o.isText&&br(e,o.discoveredAssets,a)&&i.add(S.resolve(o.outputPath));for(let l of tt(e,u))if(a.has(l)){X(n,e,o.outputPath),o.isText&&i.add(S.resolve(o.outputPath));break}}return [...i]}function Oi(e,t){let n=t?new Set(Array.from(t,s=>S.resolve(s))):null,r=s=>n===null||n.has(S.resolve(s));for(let s of Object.values(e.manifest.pages))r(s.outputPath)&&(s.rewriteComplete=true);for(let s of Object.values(e.manifest.assets)){if(!s.isText){s.rewriteComplete=true;continue}r(s.outputPath)&&(s.rewriteComplete=true);}}function Ui(e,t,n){let r=new Set,s=i=>{if(!i)return;let a=Se(e.outputDir,i);a&&r.add(a);};for(let i of t.donePages)s(ge(e,i));for(let i of Object.values(n.manifest.pages))i.lastSeenRunId===n.runId&&s(i.outputPath);for(let i of t.doneAssets)s(je(e,t.assetMap,i));for(let i of Object.values(n.manifest.assets))i.lastSeenRunId===n.runId&&s(i.outputPath);return r}async function Li(e,t,n,r,s){let i=[...r.deletedFiles].sort(),a=Ui(e,t,n),u=0;for(let c of [...a].sort()){try{if((await T.stat(S.join(e.outputDir,c))).isFile())continue}catch{}u++,s.warn(`Active output is missing after crawl: ${c}`,{phase:"deploy-plan",file:c,outputPath:S.join(e.outputDir,c)});}if(u>0&&s.warn(`Detected ${u} active output file(s) missing before deploy plan save.`,{phase:"deploy-plan",missingActiveOutputs:u}),i.length===0)return [];let o=[],l=0;for(let c of i){if(!a.has(c)){o.push(c);continue}l++;let d=S.join(e.outputDir,c),p;try{p=(await T.stat(d)).isFile();}catch{p=false;}s.warn(`Deploy plan protected active output from deletion: ${c}`,{phase:"deploy-plan",file:c,outputPath:d,exists:p});}return l>0&&s.info(`Deploy plan skipped ${l} active output deletion(s).`,{phase:"deploy-plan",protectedDeletes:l,deletedFiles:o.length}),o}function tt(e,t){let n=new Set([t]);try{let r=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 a of i)try{n.add(new URL(a).origin+r.pathname+r.search);}catch{}n.add(r.pathname+r.search),n.add(r.pathname);}catch{}return [...n]}function ji(e,t){let n=new Set([t]);try{let r=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 a of i)try{n.add(new URL(a).origin+r.pathname+r.search);}catch{}n.add(r.pathname+r.search);}catch{}return [...n]}function Or(e,t){let n=e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/"?e.targetOrigin:"https://relative.invalid/";try{let r=new URL(t,n);return S.join(e.outputDir,dn(r.pathname))}catch{return null}}function qi(e,t,n){for(let r of ji(e,n)){let s=t[r];if(!s)continue;let i=Or(e,s);if(i)return {outputPath:i,publicUrl:s}}return null}function _i(e,t,n){for(let r of tt(e,n)){let s=t[r];if(!s)continue;let i=Or(e,s);if(i)return i}return null}function je(e,t,n){let r=_i(e,t,n);if(r)return r;try{return At(e,n).originalFilePath}catch{return null}}function Ni(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?S.join(S.resolve(e),"queue-runner-heartbeat.json"):""}async function Pr(e){let t=Ni();if(t)try{let n=await T.readFile(t,"utf8"),r=JSON.parse(n);if(!r||typeof r!="object")return;await T.writeFile(t,JSON.stringify({...r,checkedAt:new Date().toISOString(),status:"running",currentStep:"rewrite",message:e},null,2),"utf8");}catch{}}function Bi(e,t){let n=new Set;for(let r of t.donePages)n.add(S.resolve(ge(e,r)));for(let r of t.doneAssets){let s=je(e,t.assetMap,r);!s||!be(s)||n.add(S.resolve(s));}for(let r of t.doneSitemaps){let s=je(e,t.assetMap,r);!s||!be(s)||n.add(S.resolve(s));}return [...n]}var Rt="re:",bt=new Map;function Hi(e){if(!e.startsWith(Rt))return null;let t=bt.get(e);if(t!==void 0)return t||null;let n=e.slice(Rt.length).trim();if(!n)return bt.set(e,false),null;try{let r=new RegExp(n);return bt.set(e,r),r}catch{return console.warn(`[crawl] Ignoring invalid path matcher regex: ${e}`),bt.set(e,false),null}}function ln(e,t){let n=Hi(t);return n?n.test(e):t.startsWith(Rt)?false:e.startsWith(t)}function Wi(e,t){return t.find(n=>ln(e,n))}function Ur(e,t){let n=Wi(t.pathname,e.blockedPathPrefixes);if(n)return n.startsWith(Rt)?`blocked path regex: ${n}`:`blocked path prefix: ${n}`;let r=e.blockedSearchFragments.find(s=>t.search.includes(s));return r?`blocked search fragment: ${r}`:null}function zi(e){let t=new URL(e.sourceOrigin),n=new Set([t.hostname,...e.allowedAssetHosts]);if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{n.add(new URL(e.targetOrigin).hostname);}catch{}for(let r of Object.keys(e.extraReplacements||{}))try{n.add(new URL(r).hostname);}catch{}return n}function Qi(e,t){return zi(e).has(t.hostname)}function Ji(e){let t=de(e.trim()).replace(/\\\//g,"/").replace(/^['"]|['"]$/g,"").trim();return t=t.replace(/[)]+$/g,"").trim(),t=t.replace(/;.*$/g,"").trim(),t}function an(e){let t=de(e).replace(/\\\//g,"/");return /[{}]|\bwindow\.|\blocation\.|\bincludes\(|\?\?null|\+|%7B|%7D|%22|<|>|\s/.test(t)||/[()[\]'"]/.test(t)}function Vi(e){let t=de(e).replace(/\\\//g,"/").trim(),n=S.extname(t).toLowerCase();return kr.has(n)||$r.has(n)?false:/^(?:this|[A-Za-z_$][\w$]*)\.[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/.test(t)}function qe(e){return wi.some(t=>e.pathname.startsWith(t))}function z(e,t,n=e.sourceOrigin,r,s="url"){let i=Ji(t);if(!i||i.startsWith("data:")||i.startsWith("blob:")||i.startsWith("mailto:")||i.startsWith("tel:")||i.startsWith("#"))return r?.ignore(s,t,"empty or unsupported scheme",n),null;if(an(i))return r?.ignore(s,t,"looks like JavaScript/code fragment",n),null;if(Vi(i))return r?.ignore(s,t,"looks like JavaScript property access",n),null;try{let a=new URL(i,n);if(Lr(a))return r?.reject(s,t,"malformed URL encoding",n),null;if(!["http:","https:"].includes(a.protocol))return r?.ignore(s,t,"unsupported protocol: ",n),null;if(!Qi(e,a))return r?.ignore(s,a.toString(),"host not allowed",n),null;let u=Ur(e,a);if(u)return r?.reject(s,a.toString(),u,n),null;let o=new URL(e.sourceOrigin);return a.protocol=o.protocol,a.host=o.host,a.hash="",a}catch{return r?.reject(s,t,"invalid URL",n),null}}function Lr(e){try{return decodeURIComponent(e.pathname),decodeURIComponent(e.search),decodeURIComponent(e.hash),!1}catch{return true}}function ve(e,t,n,r){try{let s=new URL(e);return Lr(s)?(t.reject(n,e,"malformed URL encoding",r),null):s.protocol!=="http:"&&s.protocol!=="https:"?(t.reject(n,e,`unsupported protocol: ${s.protocol}`,r),null):s}catch{return t.reject(n,e,"invalid URL",r),null}}function jr(e){return kr.has(S.extname(e.pathname).toLowerCase())}function Ce(e){return qe(e)?false:$r.has(S.extname(e.pathname).toLowerCase())}function _e(e){let t=e.pathname.toLowerCase();return t.endsWith(".xml")&&(t.includes("sitemap")||t.endsWith("/sitemap.xml"))}function B(e,t){return !!(_e(t)||t.pathname==="/robots.txt"||t.pathname==="/llms.txt"||t.pathname.toLowerCase().endsWith(".xsl")||e.assetPathPrefixes.length>0&&e.assetPathPrefixes.some(n=>ln(t.pathname,n))||jr(t)||!Ce(t)&&!qe(t))}function ge(e,t){let n=new URL(t),r=dn(n.pathname);return r.endsWith("/")?r+="index.html":S.extname(r)||(r+="/index.html"),S.join(e.outputDir,r)}function dn(e){try{return decodeURIComponent(e)}catch{return e}}function Ki(e){if(!e.generated404RequestPath)return null;try{let t=new URL(e.generated404RequestPath,e.sourceOrigin);return !t.pathname.endsWith("/")&&S.extname(t.pathname)===""&&(t.pathname+="/"),t.hash="",t.toString()}catch{return null}}function pn(e,t){let n=Ki(e);if(!n)return false;try{return new URL(t,e.sourceOrigin).toString()===n}catch{return false}}function At(e,t){let n=new URL(t),r=dn(n.pathname);r.endsWith("/")&&(r+="index.html");let s=!!n.search,i=r,a=S.join(e.outputDir,i),u=Zt(e.targetOrigin,i),o=`${u}${n.search}`;if(!s)return {originalPathname:i,originalFilePath:a,originalPublicUrl:u,originalPublicUrlWithSearch:o,preferQueryHashed:s};let l=S.extname(r),d=`${l?r.slice(0,-l.length):r}.${Ze(n.search)}${l||".bin"}`;return {originalPathname:i,originalFilePath:a,originalPublicUrl:u,originalPublicUrlWithSearch:o,preferQueryHashed:s,hashedPathname:d,hashedFilePath:S.join(e.outputDir,d),hashedPublicUrl:Zt(e.targetOrigin,d)}}function Gi(e,t,n,r){let s=ve(t,n,"asset",r);return s?At(e,s.toString()):null}function Zi(e,t,n,r,s){t[n]=r;try{let i=new URL(n),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 o of u)try{let l=new URL(o);t[l.origin+i.pathname+i.search]=r;}catch{}try{let o=(()=>{let l=new URL(r,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin);return `${l.pathname}${l.search}`})();t[i.pathname+i.search]=o;}catch{}try{let o=new URL(r,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[i.pathname]=o;}catch{}try{let o=new URL(s,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[i.pathname]=o;}catch{}}catch{}}async function qr(e){try{return await T.readFile(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}async function Le(e){try{return await T.stat(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}function Yi(e){let t=String(e["content-length"]||"").trim();if(!t)return null;let n=Number.parseInt(t,10);return Number.isFinite(n)&&n>=0?n:null}function _r(e){let t=String(e["last-modified"]||"").trim();if(!t)return null;let n=Date.parse(t);return Number.isFinite(n)?n:null}function Xi(e,t){let n=_r(t),r=Yi(t),s=e?.mtime.getTime();return n!==null&&Math.abs((s??0)-n)>=1e3||r!==null&&e?.size!==r?false:n!==null||r!==null}async function eo(e,t){if(!t)return;let n=_r(t);if(n===null)return;let r=await Le(e);if(!r)return;let s=new Date(n);await T.utimes(e,r.atime,s).catch(()=>{});}function vr(e,t){let n=S.extname(e.pathname).toLowerCase(),r=t["content-type"]||"";return hi.has(n)||mi.some(s=>r.includes(s))&&!r.startsWith("image/")&&!r.includes("font")}function to(e){try{let t=S.extname(new URL(e).pathname).toLowerCase();return t===".js"||t===".mjs"}catch{return false}}function Ue(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 no(e){return Ze(e.toString("base64"),40)}function ro(e,t,n){let r=e.assetVariantDigestsByOriginalPath.get(t);if(!r||r.size===0)return false;for(let s of r)if(s!==n)return true;return false}function so(e,t,n){let r=e.assetVariantDigestsByOriginalPath.get(t);r||(r=new Set,e.assetVariantDigestsByOriginalPath.set(t,r)),r.add(n);}async function cn(e,t,n,r,s,i,a){let u=At(e,n),o=no(r),l=u.originalFilePath,c=u.originalPublicUrlWithSearch;if(u.preferQueryHashed&&u.hashedFilePath&&u.hashedPublicUrl&&ro(s,u.originalFilePath,o)){let g=qi(e,t,n);g?(l=g.outputPath,c=g.publicUrl):(l=u.hashedFilePath,c=u.hashedPublicUrl);}Zi(e,t,n,c,u.originalPublicUrl);let d=be(l)?Buffer.from(en(r.toString("utf8"),e,t,l),"utf8"):r,p=await qr(l),f=false;return (p===null||!p.equals(d))&&(await Ye(l,d),f=true),i?.debug(`${f?"Saved":"Skipped unchanged"} asset output ${n}`,{phase:"download-assets",url:n,outputPath:l,bytes:d.length,wroteFile:f}),so(s,u.originalFilePath,o),await eo(l,a),s.stats.assetsSaved++,i&&(s.stats.assetsSaved%50===0||s.stats.assetsSaved===1)&&i.progress(`Asset progress: saved ${s.stats.assetsSaved}, discovered ${s.stats.assetsQueued}, pending ${s.assetQueue.length}.`,{assetsSaved:s.stats.assetsSaved,assetsQueued:s.stats.assetsQueued,assetQueue:s.assetQueue.length,phase:"download-assets"}),{outputPath:l,publicUrl:c,wroteFile:f}}function nt(e,t,n,r,s){let i=()=>{let d=String(s??"").trim();if(!d)return {discoveredFrom:"",discoveredFromType:"unknown"};if(d==="seed-path"||d==="cli"||d==="generated-404-request-path")return {discoveredFrom:d,discoveredFromType:d};if(/^https?:\/\//i.test(d))try{let p=new URL(d);return _e(p)?{discoveredFrom:d,discoveredFromType:"sitemap"}:B(e,p)?{discoveredFrom:d,discoveredFromType:"asset"}:Ce(p)&&!qe(p)?{discoveredFrom:d,discoveredFromType:"page"}:{discoveredFrom:d,discoveredFromType:"url"}}catch{return {discoveredFrom:d,discoveredFromType:"url"}}return {discoveredFrom:d,discoveredFromType:"url"}},a=s&&/^https?:\/\//i.test(s)?s:e.sourceOrigin,u=z(e,n,a,r,"page");if(!u)return;if(!Ce(u)||jr(u)){if(B(e,u)){r.info(`Seeded/non-page URL queued as asset: ${u.toString()}`,{url:u.toString(),source:s}),W(e,t,u.toString(),r,s);return}r.reject("page",u.toString(),qe(u)?"asset/internal path cannot be page":"not page-like",s);return}let o=u.toString(),{discoveredFrom:l,discoveredFromType:c}=i();l&&!t.pageDiscoverySources.has(o)&&t.pageDiscoverySources.set(o,l),!t.donePages.has(o)&&!t.queuedPages.has(o)&&(t.queuedPages.add(o),t.pageQueue.push(o),t.stats.pagesQueued++,r.debug(`Queued discovered page ${o}`,{phase:"discovery",url:o,discoveredFrom:l,discoveredFromType:c,outputPath:ge(e,o)}),(t.stats.pagesQueued%25===0||t.stats.pagesQueued===1)&&r.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 W(e,t,n,r,s){let i=s&&/^https?:\/\//i.test(s)?s:e.sourceOrigin,a=z(e,n,i,r,"asset");if(!a)return;if(!B(e,a)){r.reject("asset",a.toString(),"not a safe asset path/prefix",s);return}let u=a.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)&&r.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 It(e,t,n,r,s){let i=s&&/^https?:\/\//i.test(s)?s:e.sourceOrigin,a=z(e,n,i,r,"sitemap");if(!a)return;if(!_e(a)){r.reject("sitemap",a.toString(),"not sitemap-like",s);return}let u=a.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)&&r.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 io(e){let t=de(e),n=[...t.matchAll(/<url>\s*([\s\S]*?)\s*<\/url>/gi)].map(r=>r[1]);return n.length>0?n.map(r=>{let s=r.match(/<loc>\s*([^<]+?)\s*<\/loc>/i);if(!s?.[1])return null;let i=r.match(/<lastmod>\s*([^<]+?)\s*<\/lastmod>/i);return {loc:s[1].trim(),lastmod:et(i?.[1]??null)}}).filter(r=>!!r):[...t.matchAll(/<loc>\s*([^<]+?)\s*<\/loc>/gi)].map(r=>({loc:r[1].trim(),lastmod:null})).filter(r=>r.loc)}function oo(e){return e.split(",").map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function ao(e){let t=[],n=/url\(\s*(?:"([^"]+)"|'([^']+)'|([^)]*?))\s*\)/gi;for(let r of e.matchAll(n)){let s=e.slice(Math.max(0,r.index-8),r.index);if(/\bnew\s+$/i.test(s))continue;let i=(r[1]||r[2]||r[3]||"").trim();i&&t.push(i);}return t}function co(e){return e.replace(/<script\b[^>]*>[\s\S]*?<\/script\s*>/gi,"")}function uo(e,t){if(t==="dom-style")return true;let n=(()=>{try{return S.extname(new URL(e).pathname).toLowerCase()}catch{return ""}})();return !(n===".js"||n===".mjs"||n===".map"||t.includes("javascript"))}function rn(e){return e.trim().replace(/\\/g,"/").replace(/^https?:\/\/[^/]+/i,"").replace(/^\/+/,"")}async function Nr(e,t,n,r){let s=[];await T.mkdir(t,{recursive:true});let i=await T.readdir(e,{withFileTypes:true});for(let a of i){let u=S.join(e,a.name),o=S.join(t,a.name);if(a.isDirectory()){s.push(...await Nr(u,o,n,r));continue}await Br(u,o,n,r)&&s.push(o);}return s}async function lo(e,t){try{let[n,r]=await Promise.all([T.stat(e),T.stat(t)]);if(n.size!==r.size)return !1;let[s,i]=await Promise.all([T.readFile(e),T.readFile(t)]);return s.equals(i)}catch{return false}}async function Br(e,t,n,r){let s=S.resolve(t);return n.has(s)?(r.debug("Skipped post-crawl copy over crawled page output",{phase:"copy-extra-paths",sourcePath:e,targetPath:t}),false):await lo(e,t)?(r.debug("Skipped unchanged post-crawl copy target",{phase:"copy-extra-paths",sourcePath:e,targetPath:t}),false):(await T.mkdir(S.dirname(t),{recursive:true}),await T.copyFile(e,t),true)}async function po(e,t,n){let r=Object.entries(e.postCrawlCopyMap||{}).map(([u,o])=>({sourcePath:u.trim(),prefix:String(o||"").trim()}));if(r.length===0)return [];let s=0,i=[],a=new Set([...t.donePages].map(u=>S.resolve(ge(e,u))));n.mark("copy-extra-paths");for(let u of r){let o=u.sourcePath,l=u.prefix;if(!o||!l){n.warn("Skipped post-crawl copy mapping with empty key/value",{sourcePath:o,prefixPath:l});continue}let c=vi(o);if(!c.resolvedPath){n.warn("Skipped post-crawl copy source because alias root is not configured",{sourcePath:o,alias:c.alias||"",requiredEnv:c.requiredEnv||"",prefixPath:l});continue}let d=c.resolvedPath,p=rn(l);if(!p){n.warn("Skipped post-crawl copy mapping with invalid export prefix",{sourcePath:o,prefixPath:l});continue}let f;try{f=await T.stat(d);}catch{n.warn("Skipped post-crawl copy source because it does not exist",{sourcePath:o,sourceAbs:d,prefixPath:l});continue}let g=S.resolve(e.outputDir,p);if(f.isDirectory()){let w=await Nr(d,g,a,n);i.push(...w),s+=w.length,w.length>0&&n.progress(`Copied static directory to export: ${d} -> /${p}`,{phase:"copy-extra-paths",sourcePath:d,targetPath:`/${p}`,copiedItems:s,changedFiles:w.length});continue}let y=S.basename(d),m=l.endsWith("/")?S.join(g,y):g;await Br(d,m,a,n)&&(i.push(m),s++,n.progress(`Copied static file to export: ${d} -> /${rn(l.endsWith("/")?`${l}${y}`:l)}`,{phase:"copy-extra-paths",sourcePath:d,targetPath:`/${rn(l.endsWith("/")?`${l}${y}`:l)}`,copiedItems:s}));}return n.endMark("copy-extra-paths",{mappedSources:r.length,copiedItems:s}),i}function rt(e,t,n,r,s){let i=new Set,a=de(n).replace(/\\\//g,"/"),u=s==="page-html"?co(a):a,o=uo(t,s);if(o){for(let c of ao(u)){let d=z(e,c,t,r,`${s}:css-url`);d&&B(e,d)&&i.add(d.toString());}for(let c of u.matchAll(/@import\s+(?:url\()?\s*['"]?([^'"\s;]+)['"]?\s*\)?/gi)){let d=z(e,c[1],t,r,`${s}:css-import`);d&&B(e,d)&&i.add(d.toString());}}if(o||s==="page-html")for(let c of u.matchAll(/<\?xml-stylesheet[^>]+href=["']([^"']+)["'][^>]*\?>/gi)){let d=z(e,c[1],t,r,`${s}:xml-stylesheet`);d&&B(e,d)&&i.add(d.toString());}let l=new RegExp(`(?:https?:)?//[^\\s'"<>\\);]+\\.${tn}(?:\\?[^\\s'"<>\\);]*)?|(?<!\\.)/[^\\s'"<>\\);]+\\.${tn}(?:\\?[^\\s'"<>\\);]*)?`,"gi");if(s==="page-html")for(let c of a.matchAll(l)){let d=c[0].startsWith("//")?`${new URL(e.sourceOrigin).protocol}${c[0]}`:c[0];if(an(d)){r.ignore(`${s}:serialized-url`,d,"looks like JavaScript/code fragment",t);continue}let p=z(e,d,t,r,`${s}:serialized-url`);p&&B(e,p)?i.add(p.toString()):p&&r.ignore("asset",p.toString(),"serialized URL did not pass safe asset path filter",t);}if(s!=="page-html"&&to(t))for(let c of lr(a)){if(an(c)||!/\.(?:js|mjs)(?:[?#]|$)/i.test(c))continue;let d=z(e,c,t,r,`${s}:relative-asset`);d&&B(e,d)&&i.add(d.toString());}return [...i]}function go(e,t,n,r){let s=new Set,i=de(n);for(let a of i.matchAll(/href=["']([^"'#\s][^"']*?)["']/gi)){let u=a[1],o=z(e,u,t,r,"page-link");o&&(Ur(e,o)||Ce(o)&&!qe(o)&&!B(e,o)&&s.add(o.toString()));}return [...s]}async function Cr(e,t,n,r,s,i,a=false,u=[]){let o=new Set(u),l=0,c=new Map,d=(p,f)=>{let g=[f],y=new Set;for(;g.length>0;){let m=g.pop();if(m===p)return true;y.has(m)||(y.add(m),g.push(...c.get(m)??[]));}return false};for(;n.sitemapQueue.length>0;){let p=n.sitemapQueue.shift();n.queuedSitemaps.delete(p);let f=ve(p,r,"sitemap","sitemap-queue");if(!f)continue;let g=f.toString();if(n.doneSitemaps.has(g))continue;n.doneSitemaps.add(g),r.sitemap(`Fetching sitemap ${g}`,{url:g});let y=true;try{let m=await t.get(g,{timeout:6e4});if(y=!1,!m.ok()){if(r.skip("sitemap",g,m.status()),a&&!o.has(g))throw new Error(`Required child content-sync sitemap returned HTTP ${m.status()}: ${g}`);continue}let h=await m.body(),w=m.url()||g,v=ve(w,r,"sitemap-response",g);if(!v)continue;let I=v.toString();n.successfulSitemaps.add(g),n.successfulSitemaps.add(I),o.has(g)&&(n.resolvedSitemapRoots.add(I),l+=1);let j=await cn(e,n.assetMap,I,h,n,r);X(s,e,j.outputPath),Ie(s,j.outputPath);let U=h.toString("utf8");/<sitemapindex(?:\s|>)/i.test(U)?n.sitemapIndexUrls.add(I):n.sitemapLeafUrls.add(I);let $=rt(e,I,U,r,"sitemap");for(let q of $)W(e,n,q,r,I);let C=[];for(let q of io(U)){let R=z(e,q.loc,I,r,"sitemap-loc");if(!R){if(a)throw new Error(`Content-sync sitemap contains an inadmissible location: ${q.loc}`);continue}if(_e(R)){if(d(I,R.toString()))throw new Error(`Sitemap index cycle detected: ${I} -> ${R.toString()}`);if(c.has(I)||c.set(I,new Set),c.get(I).add(R.toString()),C.push(R.toString()),a&&n.doneSitemaps.has(R.toString())&&!n.successfulSitemaps.has(R.toString()))throw new Error(`Required child content-sync sitemap was not resolved: ${R.toString()}`);It(e,n,R.toString(),r,I);}else if(a){if(Ce(R)&&!B(e,R)){let M=i.requiredUrls.has(R.toString()),b=i.manifest.pages[R.toString()],A=!!b&&!!await Le(b.outputPath);if(!M&&!A)throw new Error(`Content-sync sitemap coverage is incomplete for ${R.toString()}.`)}r.ignore("sitemap-loc",R.toString(),"content-sync sitemap-only traversal does not enqueue urlset locations",I);}else B(e,R)?W(e,n,R.toString(),r,I):Ce(R)?(q.lastmod&&(n.sitemapLastmodByPage[R.toString()]=q.lastmod),nt(e,n,R.toString(),r,I)):r.reject("sitemap-loc",R.toString(),"not page/sitemap/asset-like",I);}i.trackManifest&&(i.manifest.assets[I]={url:I,outputPath:j.outputPath,isText:!0,contentType:m.headers()["content-type"]??"application/xml",changeToken:null,tokenSource:null,discoveredAssets:[...new Set([...$,...C])],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,unreferencedRuns:0,rewriteComplete:!1},await Pe(e,i));}catch(m){r.error(`Failed sitemap ${g}`,{url:g,error:String(m)});let h=a&&o.has(g)&&y;if(a&&!h)throw m}}if(a&&o.size>0&&l===0)throw new Error(`None of the configured content-sync sitemap roots could be resolved: ${[...o].join(", ")}`)}async function fo(e,t,n,r,s,i,a){let u=z(e,r,e.sourceOrigin,s,"asset-fetch");if(!u||!B(e,u))return;let o=u.toString();if(n.doneAssets.has(o))return;let l=i.enabled||i.strictTargeted?i.previousManifest.assets[o]:void 0,c=i.trackManifest?await vt(e,t,i,o,s):null,d=c?.token??null,p=dr(l?.changeToken,c),f=i.strictTargeted&&(!c?.supported||!c.token)&&pr(e.sourceOrigin,o),g=i.strictTargeted?i.manifest.assets[o]:void 0;if(g?.lastSeenRunId===i.runId&&await Le(g.outputPath)){n.doneAssets.add(o);for(let m of g.discoveredAssets||[])W(e,n,m,s,o);X(a,e,g.outputPath),g.isText&&Ie(a,g.outputPath),s.info(`Resumed completed content-sync asset ${o}`,{url:o,source:"content-sync-checkpoint"}),Ue(n,s);return}if(l&&(p||f)&&await Le(l.outputPath)){i.manifest.assets[o]={...l,changeToken:d,tokenSource:c?.tokenSource??l.tokenSource,discoveredAssets:[...l.discoveredAssets||[]],lastSeenRunId:i.runId,unreferencedRuns:0},delete i.manifest.pages[o],n.doneAssets.add(o);for(let m of l.discoveredAssets||[])W(e,n,m,s,o);s.info(`Reused unchanged trusted asset ${o}.`,{url:o,tokenSource:c?.tokenSource??"unknown",phase:"download-assets",source:p?"asset-change-token-match":"content-sync-release-fingerprint"}),Ue(n,s);return}let y=(m,h={})=>{if(!l||i.strictTargeted)return false;i.manifest.assets[o]={...l,discoveredAssets:[...l.discoveredAssets||[]],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,unreferencedRuns:0},delete i.manifest.pages[o],n.doneAssets.add(o);for(let w of l.discoveredAssets||[])W(e,n,w,s,o);return s.warn(`Keeping previous incremental asset ${o} after fetch issue.`,{url:o,reason:m,preservedFromPreviousManifest:true,...h,phase:"download-assets"}),Ue(n,s),true};s.asset(`Fetching asset ${o}`,{url:o});try{let m=je(e,n.assetMap,o),h=m?await Le(m):null;if(m&&h)try{let M=await H(`fetch asset headers ${o}`,6e4,()=>t.head(o,{timeout:6e4})),b=M.headers();if(M.ok()&&Xi(h,b)){let A=await qr(m);if(A!==null){let P=M.url()||o,E=ve(P,s,"asset-response",o);if(!E)return;let D=E.toString(),L=await cn(e,n.assetMap,D,A,n,s,b);L.wroteFile&&(X(a,e,L.outputPath),be(L.outputPath)&&Ie(a,L.outputPath)),n.doneAssets.add(o),s.info(`Reused existing asset ${o} based on response headers.`,{url:o,filePath:m,lastModified:b["last-modified"]||"",contentLength:b["content-length"]||"",phase:"download-assets"}),Ue(n,s);let G=vr(u,b),te=l?.discoveredAssets?[...l.discoveredAssets]:[];if(G||l?.isText){let ce=A.toString("utf8"),F=rt(e,D,ce,s,"asset:cached");(F.length>0||!l)&&(te=F);for(let Ae of te)W(e,n,Ae,s,D);}if(i.trackManifest){let ce=G||!!l?.isText;i.manifest.assets[o]={url:o,outputPath:L.outputPath,isText:ce,contentType:sn(b)||l?.contentType||null,changeToken:c?.supported?c.token:null,tokenSource:c?.supported?c.tokenSource??null:null,discoveredAssets:te,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,unreferencedRuns:0,rewriteComplete:!ce},delete i.manifest.pages[o],(i.enabled||i.strictTargeted)&&ce&&await Pe(e,i);}return}}}catch{}let w=await H(`fetch asset ${o}`,6e4,()=>t.get(o,{timeout:6e4}));if(!w.ok()){if(y(`http-${w.status()}`,{status:w.status()}))return;if(i.strictTargeted)throw new Error(`Required content-sync asset returned HTTP ${w.status()}: ${o}`);s.skip("asset",o,w.status());return}let v=await H(`read asset response ${o}`,6e4,()=>w.body()),I=w.url()||o,j=ve(I,s,"asset-response",o);if(!j)return;let U=j.toString(),$=w.headers(),C=await cn(e,n.assetMap,U,v,n,s,$);C.wroteFile&&(X(a,e,C.outputPath),be(C.outputPath)&&Ie(a,C.outputPath)),n.doneAssets.add(o),Ue(n,s);let q=vr(u,$),R=[];if(q){let M=v.toString("utf8");R=rt(e,U,M,s,`asset:${S.extname(u.pathname).toLowerCase()||$["content-type"]||"unknown"}`);for(let b of R)W(e,n,b,s,U);}i.trackManifest&&(i.manifest.assets[o]={url:o,outputPath:C.outputPath,isText:q,contentType:sn($),changeToken:c?.supported?c.token:null,tokenSource:c?.supported?c.tokenSource??null:null,discoveredAssets:R,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,unreferencedRuns:0,rewriteComplete:!q},delete i.manifest.pages[o],(i.enabled||i.strictTargeted)&&q&&await Pe(e,i));}catch(m){if(y("fetch-error",{error:String(m)}))return;if(s.error(`Failed asset ${o}`,{url:o,error:String(m)}),i.strictTargeted)throw m}finally{n.doneAssets.has(o)||(n.doneAssets.add(o),Ue(n,s));}}async function mo(e,t,n,r,s,i){let a=Math.max(1,Number(e.assetDownloadConcurrency||e.concurrency||1)),u=Array.from({length:a},async()=>{for(;n.assetQueue.length>0;){let o=n.assetQueue.shift();o&&(n.queuedAssets.delete(o),await fo(e,t,n,o,r,s,i));}});await Promise.all(u);}function ho(e){let t=Math.ceil(e/1e3);return `${t} second${t===1?"":"s"}`}function pe(e){return Math.max(6e4,e.navigationTimeoutMs*2,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+15e3)}function Ct(e){return Math.max(15e3,Math.min(6e4,pe(e)))}function wo(e){return Math.max(15e3,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+1e4)}function gn(e){return e.stats.pagesCompleted}function Hr(e){let n=e.options?.browserProcess;return {pid:typeof n?.process?.pid=="number"?n.process.pid:null,kill:typeof n?.kill=="function"?n.kill.bind(n):null}}async function yo(e,t,n){let r=Hr(e);try{if(r.kill){await r.kill(),t.warn(`Force-killed crawl worker browser after ${n}`,{browserPid:r.pid,reason:n});return}if(r.pid!==null){process.kill(r.pid,"SIGKILL"),t.warn(`Sent SIGKILL to crawl worker browser after ${n}`,{browserPid:r.pid,reason:n});return}t.warn(`Could not resolve crawl worker browser PID after ${n}`,{reason:n});}catch(s){t.error(`Failed to force-kill crawl worker browser after ${n}`,{browserPid:r.pid,reason:n,error:String(s)});}}async function H(e,t,n){let r;try{return await Promise.race([n(),new Promise((s,i)=>{r=globalThis.setTimeout(()=>{i(new Error(`${e} timed out after ${ho(t)}.`));},t);})])}finally{r!==void 0&&globalThis.clearTimeout(r);}}async function So(e,t){let n=wo(e);await t.evaluate(async r=>{await new Promise(s=>{let i=0,a=700,u=Date.now(),o=()=>{window.clearInterval(l),window.scrollTo(0,0),s();},l=window.setInterval(()=>{if(Date.now()-u>=r.maxDurationMs){o();return}window.scrollBy(0,a),i+=a;let c=document.body?.scrollHeight||0,d=document.documentElement?.scrollHeight||0,p=Math.max(c,d);i>=p+window.innerHeight&&o();},120);});},{maxDurationMs:n});}async function bo(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 So(e,t),await t.waitForTimeout(e.readiness.fallbackWaitMs);}async function Po(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 vo(e,t){return e.noJavaScriptRenderPathPrefixes.some(n=>ln(t,n))}async function Co(e,t,n,r,s=true){let i=new Set;if(s){let u=await t.evaluate(()=>{let o=new Set,l=["href","src","poster","data-src","data-lazy-src","data-original","data-bg","data-background","data-href"],c=new Set,d=["srcset","data-srcset","data-lazy-srcset"],p=f=>{f.querySelectorAll("*").forEach(g=>{for(let m of l){let h=g.getAttribute(m);h&&o.add(h);}for(let m of d){let h=g.getAttribute(m);h&&h.split(",").forEach(w=>{let v=w.trim().split(/\s+/)[0];v&&o.add(v);});}let y=g.getAttribute("style");y&&c.add(y),g.shadowRoot&&p(g.shadowRoot);});};return p(document),{attrs:[...o],styles:[...c]}});for(let o of u.attrs)for(let l of oo(o)){let c=z(e,l,n,r,"dom-attr");c&&B(e,c)&&i.add(c.toString());}for(let o of u.styles)for(let l of rt(e,n,o,r,"dom-style"))i.add(l);}let a=await t.content();for(let u of rt(e,n,a,r,"page-html"))i.add(u);return [...i]}async function Rr(e,t,n,r,s){let i=ge(e,t);await Ye(i,n,"utf8");let a=await T.stat(i);s?.debug(`Saved page output ${t}`,{phase:"save-pages",url:t,outputPath:i,bytes:a.size}),r.stats.pagesSaved++;let u=Math.min(r.stats.pagesQueued,gn(r)+1);s&&(r.stats.pagesSaved%10===0||r.stats.pagesSaved===1)&&s.progress(`Page progress: processed ${u}, rendered ${r.stats.pagesRendered}, saved ${r.stats.pagesSaved}, discovered ${r.stats.pagesQueued}.`,{donePages:u,claimedPages:r.donePages.size,pagesRendered:r.stats.pagesRendered,pagesSaved:r.stats.pagesSaved,pagesQueued:r.stats.pagesQueued,pageQueue:r.pageQueue.length,phase:"save-pages"});}function Ro(e){let t=gn(e);return t%5===0||t===1||t===e.stats.pagesQueued}function Io(e,t){let n=gn(e);t.progress(`Render progress: processed ${n}, rendered ${e.stats.pagesRendered}, saved ${e.stats.pagesSaved}, discovered ${e.stats.pagesQueued}.`,{donePages:n,claimedPages:e.donePages.size,pagesRendered:e.stats.pagesRendered,pagesSaved:e.stats.pagesSaved,pagesQueued:e.stats.pagesQueued,phase:"render-pages"});}async function xo(e){await e.addInitScript(()=>{Object.defineProperty(window,"__WPSUITE_STATIC_EXPORT__",{value:true,writable:false,configurable:true});let t=n=>{if(n==null||String(n)==="")return true;try{let r=new URL(String(n),window.location.href),s=new URL(window.location.href);return r.hash="",s.hash="",r.href===s.href}catch{return false}};try{let n=window.location.assign.bind(window.location),r=window.location.replace.bind(window.location),s=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 n(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 r(i)}}),Object.defineProperty(window.location,"reload",{configurable:!0,value:()=>{console.warn("[smartcloud-static-publisher] blocked location.reload");}});}catch{}});}async function Ao(e,t,n){let r=await e.newContext({viewport:t.viewport,userAgent:"WPSuiteStaticPublisher/0.8 Playwright SitemapOnly",ignoreHTTPSErrors:t.ignoreHttpsErrors,...n?{javaScriptEnabled:false}:{}});return n||await xo(r),r}async function To(e,t,n,r,s,i,a,u){let o=await chromium.launch({headless:true}),l=Hr(o);l.pid!==null&&n.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 c=t.pageQueue.shift();if(!c)break;t.queuedPages.delete(c);let d=null,p=null,f=[],g=new Set;try{let y=ve(c,n,"page","page-queue");if(!y)continue;let m=y.toString();if(c=m,t.queuedPages.delete(c),t.donePages.has(c))continue;t.donePages.add(c),i.enabled&&i.seenPages.add(c);let h=pn(e,c),w=vo(e,y.pathname);if(!Ce(y)||B(e,y)||qe(y)){if(B(e,y)){n.info(`Worker redirected non-page URL to asset queue: ${c}`,{url:c,source:"worker-guard"}),W(e,t,c,n,"worker-guard");continue}n.reject("page",c,"guard rejected non-page URL before rendering","worker");continue}let v=i.strictTargeted?i.manifest.pages[c]:void 0;if(v?.lastSeenRunId===i.runId&&await Le(v.outputPath)){i.seenPages.add(c);for(let P of v.discoveredAssets||[])W(e,t,P,n,c);X(a,e,v.outputPath),Ie(a,v.outputPath),n.info(`Resumed completed content-sync page ${c}`,{url:c,source:"content-sync-checkpoint"});continue}let I=await Ei(e,s,t,i,c,n);if(i.enabled&&r!=="single-url"&&r!=="content-sync"){let P=i.manifest.pages[c];if(I.action==="reuse"&&P){for(let E of P.discoveredAssets)W(e,t,E,n,c);for(let E of P.discoveredPages)nt(e,t,E,n,c);P.lastSeenRunId=i.runId,P.sitemapLastmod=et(t.sitemapLastmodByPage[c])??P.sitemapLastmod,I.changeToken?.supported&&(P.changeToken=I.changeToken.token,P.tokenSource=I.changeToken.tokenSource??P.tokenSource),n.info(`Incremental reuse skipped unchanged page ${c}`,{url:c,mode:"incremental",reason:I.changeToken?.supported===!0?"change-token-match":"sitemap-lastmod-match"});continue}}d=await H(`create page context ${c}`,pe(e),()=>Ao(o,e,w)),p=await H(`create page ${c}`,pe(e),()=>d.newPage()),f=await d.cookies();let j=!1,U=new Set;await p.route("**/*",async P=>{let E=P.request();try{let D=z(e,E.url(),e.sourceOrigin,n,"network-request");D&&B(e,D)&&(U.add(D.toString()),W(e,t,D.toString(),n,c));}catch{}if(E.isNavigationRequest()&&E.frame()===p.mainFrame())try{let D=new URL(E.url()),L=new URL(m);if(D.hash="",L.hash="",D.href===L.href){if(j){n.warn(`Blocked same-page navigation/reload for ${c}`,{url:c,requestUrl:E.url()}),await P.abort("aborted");return}j=!0;}}catch{}await P.continue();}),p.on("response",P=>{try{let D=z(e,P.url(),e.sourceOrigin,n,"network-response");D&&B(e,D)&&(U.add(D.toString()),W(e,t,D.toString(),n,c));}catch{}let E=P.headerValues("set-cookie").then(D=>{for(let L of D)u.add(mr(L,P.url()));}).catch(()=>{}).then(()=>{});g.add(E),E.finally(()=>g.delete(E));}),n.page(`Rendering ${c}`,{url:c});let $=null,C=null;try{if($=await p.goto(c,{waitUntil:"domcontentloaded",timeout:e.navigationTimeoutMs}),$&&$.ok())try{C=await H(`read response body ${c}`,pe(e),()=>$.text());}catch{C=null;}}catch(P){n.warn(`Navigation issue for ${c}; saving current DOM if available`,{url:c,error:String(P)});}if(r==="content-sync"&&$){let P=ve($.url(),n,"content-sync-final-response",c)?.toString();if(P&&P!==m){if(i.deleteOnMissingUrls.has(c)){await un(e,i,a,c,i.deleteOnMissingUrls),n.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(h){let P=$?.status()??null;if(P!==404){n.error(`Generated 404 request path returned unexpected status for ${c}`,{url:c,expectedStatus:404,status:P,requestPath:e.generated404RequestPath});continue}n.info(`Capturing rendered 404 page for ${c}`,{url:c,status:P,outputPath:ge(e,c)});}else if($&&!$.ok()){if(r==="content-sync"&&($.status()===404||$.status()===410)&&i.deleteOnMissingUrls.has(c)){await un(e,i,a,c,i.deleteOnMissingUrls),n.info(`Removed stale content-sync archive page ${c}`,{url:c,status:$.status(),source:"content-sync-tombstone"}),await p.close();continue}if(r==="content-sync")throw new Error(`Required content-sync route returned HTTP ${$.status()}: ${c}`);n.skip("page",c,$.status(),t.pageDiscoverySources.get(c)),await p.close();continue}w?(n.info(`Rendering without JS execution for ${c}`,{url:c,mode:"no-js"}),await H(`wait for rendered page ${c}`,pe(e),()=>Po(e,p))):await H(`wait for rendered page ${c}`,pe(e),()=>bo(e,p)),t.stats.pagesRendered++;let q=await H(`extract rendered assets ${c}`,pe(e),()=>Co(e,p,m,n,!w));for(let P of q)W(e,t,P,n,c);let R=[...new Set([...q,...U])],M=C??await H(`capture rendered html ${c}`,pe(e),()=>p.content()),b=r!=="single-url"&&r!=="content-sync"&&!h?go(e,c,M,n):[];if(r!=="single-url"&&r!=="content-sync"&&!h)for(let P of b)nt(e,t,P,n,c);await Rr(e,c,M,t,n);let A=ge(e,c);if(X(a,e,A),Ie(a,A),i.trackManifest){let P=$?.headers();i.manifest.pages[c]={url:c,outputPath:A,contentType:sn(P),changeToken:I.changeToken?.supported?I.changeToken.token:null,tokenSource:I.changeToken?.supported?I.changeToken.tokenSource??null:null,sitemapLastmod:et(t.sitemapLastmodByPage[c])??null,discoveredPages:b,discoveredAssets:R,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!1},(i.enabled||i.strictTargeted)&&await Pe(e,i);}}catch(y){if(i.strictTargeted)throw n.error(`Failed required content-sync page ${c}`,{url:c,error:String(y)}),y;try{let m=p?await H(`capture partial html ${c}`,pe(e),()=>p.content()):"";if(m&&m.trim()){await Rr(e,c,m,t,n);let h=ge(e,c);if(X(a,e,h),Ie(a,h),i.trackManifest){let w=i.manifest.pages[c]??i.previousManifest.pages[c];i.manifest.pages[c]={url:c,outputPath:h,contentType:w?.contentType??null,changeToken:null,tokenSource:null,sitemapLastmod:et(t.sitemapLastmodByPage[c])??w?.sitemapLastmod??null,discoveredPages:w?.discoveredPages?[...w.discoveredPages]:[],discoveredAssets:w?.discoveredAssets?[...w.discoveredAssets]:[],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!1},(i.enabled||i.strictTargeted)&&await Pe(e,i);}n.warn(`Saved partial DOM for ${c}`,{url:c,error:String(y)});}}catch(m){n.error(`Could not save partial DOM for ${c}`,{url:c,error:String(m)});}n.error(`Failed page ${c}`,{url:c,error:String(y)});}finally{if(g.size>0&&await Promise.allSettled([...g]),d)try{let y=await d.cookies();u.addAll(hr(f,y));}catch{}t.stats.pagesCompleted++,Ro(t)&&Io(t,n),p&&await H(`close page ${c}`,Ct(e),()=>p.close()).catch(y=>{n.warn(`Timed out while closing page ${c}`,{url:c,browserPid:l.pid,error:String(y)});}),d&&await H(`close page context ${c}`,Ct(e),()=>d.close()).catch(y=>{n.warn(`Timed out while closing page context for ${c}`,{url:c,browserPid:l.pid,error:String(y)});});}}}finally{await H("close worker browser",Ct(e),()=>o.close()).catch(c=>(n.warn("Timed out while closing crawl worker browser",{browserPid:l.pid,error:String(c)}),yo(o,n,"browser.close timeout")));}}async function ko(e){try{let t=await T.readFile(e),r=(e.endsWith(".gz")?gunzipSync(t):t).toString("utf8").trim();if(!r)return [];try{let s=JSON.parse(r);if(Array.isArray(s))return s;if(s&&typeof s=="object")return [s]}catch{return r.split(/\r?\n/).map(s=>s.trim()).filter(Boolean).map(s=>{try{let i=JSON.parse(s);return i&&typeof i=="object"?i:null}catch{return null}}).filter(s=>s!==null)}return []}catch{return []}}function Ir(e){let t=String(e||"").toLowerCase();return t.includes("timeout")||t.includes("timed out")||t.includes("navigation timeout")}function $o(e){let t=String(e?.job?.command||"").trim(),n=String(e?.job?.crawlMode||"full").trim();return t!=="publish"&&t!=="crawl"?false:n!=="incremental"}function Eo(e){let t=[e?.archivedAt,e?.job?.endedAt,e?.job?.startedAt];for(let n of t){let r=Date.parse(String(n||""));if(Number.isFinite(r))return r}return 0}async function Wr(e){try{let t=await T.readFile(e,"utf8"),n=JSON.parse(t);return n&&typeof n=="object"&&!Array.isArray(n)?n:null}catch{return null}}function xr(e){let t=String(e.originalFileName||"").toLowerCase();return t.endsWith("errors.jsonl")?0:t.endsWith("errors.json")?1:2}function Mo(e,t){let n=Array.isArray(t?.artifacts)?t.artifacts.filter(r=>String(r?.role||"").trim()==="errors"&&String(r?.storedFileName||"").trim()!=="").sort((r,s)=>xr(r)-xr(s)).map(r=>S.join(e,String(r.storedFileName))):[];return [...new Set([...n,S.join(e,"errors.jsonl"),S.join(e,"errors.json"),S.join(e,"errors.jsonl.gz"),S.join(e,"errors.json.gz")])]}async function Ar(e){let t=await Wr(S.join(e,"job.json"));for(let n of Mo(e,t)){let r=await ko(n);if(r.length>0)return r}return []}async function Do(e){let t=S.join(e.logDir,"archive"),n;try{n=await T.readdir(t);}catch{return ""}let r="",s=0;for(let i of n){let a=S.join(t,i);if(!(await T.stat(a).catch(()=>null))?.isDirectory())continue;let o=await Wr(S.join(a,"job.json"));if(!$o(o))continue;let l=Eo(o);l>=s&&(s=l,r=a);}return r}async function Fo(e){let t=await Do(e),n=t!==""?await Ar(t):await Ar(e.logDir),r=new Set;for(let s of n)if(Ir(s.error)||Ir(s.message)){let i=s.url;typeof i=="string"&&i&&r.add(i);}return [...r]}async function Oo(e){let t=[];for(let n of e)if(n.startsWith("@")){let r=n.slice(1),s=await T.readFile(r,"utf8");t.push(...s.split(/\r?\n/).map(i=>i.trim()).filter(i=>i&&!i.startsWith("#")));}else t.push(n);return t}async function Uo(e){if(!e)throw new Error("Content-sync crawl requires an immutable impact plan.");let t=JSON.parse(await T.readFile(e,"utf8"));return Je(t),t}function Lo(e,t){let n;try{n=new URL(e);}catch{return false}return t.archiveFamilies.some(r=>{let s=new URL(r.url);if(n.origin!==s.origin)return false;if(n.toString()===s.toString())return true;if(n.searchParams.has("paged")&&n.pathname===s.pathname)return /^\d+$/.test(n.searchParams.get("paged")||"");let i=s.pathname.replace(/\/+$/,""),a=n.pathname.slice(i.length).replace(/^\/+/,""),u=String(r.paginationBase||"page").replace(/^\/+|\/+$/g,"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return n.pathname.startsWith(`${i}/`)&&new RegExp(`^${u}/\\d+/?$`).test(a)})}function Pt(e,t,n){let r=n==="page"?ge(e,t):At(e,t).originalFilePath;return Se(e.outputDir,r)}async function un(e,t,n,r,s){let i=t.manifest.pages[r];if(!i)return;let a=Se(e.outputDir,i.outputPath);if(!a)throw new Error(`Manifest-owned page path escaped output root: ${r}`);let u=S.resolve(i.outputPath);Object.entries(t.manifest.pages).some(([l,c])=>l!==r&&!s.has(l)&&S.resolve(c.outputPath)===u)||(await T.rm(i.outputPath,{force:true}),n.deletedFiles.add(a)),delete t.manifest.pages[r];}function jo(e,t){let n=new Set,r=[...t];for(;r.length>0;){let s=r.shift();if(n.has(s))continue;n.add(s);let i=e.assets[s];for(let a of i?.discoveredAssets??[])try{_e(new URL(a))&&r.push(a);}catch{}}return n}async function qo(e,t,n,r,s){let i=jo(n.previousManifest,s);for(let a of i){if(t.successfulSitemaps.has(a))continue;let u=n.previousManifest.assets[a];if(!u)continue;let o=Se(e.outputDir,u.outputPath);if(!o)throw new Error(`Manifest-owned sitemap path escaped output root: ${a}`);await T.rm(u.outputPath,{force:true}),r.deletedFiles.add(o),delete n.manifest.assets[a];}await Pe(e,n);}async function _o(e){try{let t=await T.readFile(S.join(e.outputDir,"asset-map.json"),"utf8");return JSON.parse(t)}catch{return {}}}async function No(e){let t=["crawl.log.jsonl","current-crawl-event.json","rejected.jsonl","ignored.jsonl","skipped-http.jsonl","errors.jsonl","timings.jsonl","rejected.json","ignored.json","skipped-http.json","errors.json","timings.json"];await T.mkdir(e,{recursive:true}),await Promise.all(t.map(async n=>{try{await T.unlink(S.join(e,n));}catch(r){if(r.code!=="ENOENT")throw r}}));}function Tr(e,t,n,r,s){let i=z(e,n,e.sourceOrigin,r,"manual-url");i&&(_e(i)?It(e,t,i.toString(),r,s):B(e,i)?W(e,t,i.toString(),r,s):Ce(i)?nt(e,t,i.toString(),r,s):r.reject("manual-url",i.toString(),"not page/sitemap/asset-like",s));}async function zr(e=process.argv.slice(2)){let t=[],n=await se(void 0,{onRemotePublisherConfigDiagnostic:b=>{t.push(b);}}),r=Ke(n.sitemapPaths),s=t.at(-1)??null,i=yi(e),a=i.mode==="content-sync"?await Uo(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 Fo(n)),i.mode==="single-url"&&(u=await Oo(i.urls)),a&&(u=[...a.directRenderUrls,...a.archiveFamilyUrls]);let o=i.crawlMode==="incremental"&&i.mode==="full",l=o&&typeof n.subscriptionType=="string"&&n.subscriptionType.trim()!=="";if(a&&n.subscriptionType!=="PROFESSIONAL"&&n.subscriptionType!=="AGENCY")throw new Error("Content-sync requires an active Professional or Agency subscription.");let c=(i.mode==="full"||i.mode==="single-url"||i.mode==="content-sync")&&!i.resumeRewrite,d=i.mode!=="full"||i.resumeRewrite||l,p=d?await _o(n):{},f=l||i.mode==="single-url"||i.mode==="content-sync"?await Ii(n):Mr(),g=new Set(u),y=new Set;if(a){for(let b of a.archiveFamilies)if(b.foundPosts===0)for(let A of b.pageUrls)y.add(A);for(let b of Object.keys(f.pages))Lo(b,a)&&!g.has(b)&&(u.push(b),y.add(b));}let m={enabled:l,trackManifest:c,manifest:on(f),previousManifest:on(f),runId:a?.jobId??`${Date.now()}`,seenPages:new Set,changeTokenCache:new Map,manifestSaveChain:Promise.resolve(),strictTargeted:!!a,requiredUrls:g,deleteOnMissingUrls:y};await No(n.logDir);let h=new ht(n.logDir,n.logLevel);if(s){let b={status:s.status,virtualAssetBaseUrl:s.virtualAssetBaseUrl,subscriptionType:s.subscriptionType??null,error:s.error,requests:s.requests,source:"remote-publisher-config"};s.status==="loaded"&&s.subscriptionType?h.info("Loaded remote WP Suite publisher configuration.",b):h.warn("Remote WP Suite publisher configuration is unavailable or has no active subscription type.",b);}if(o&&!l){let b="Incremental crawl requires an active remote publisher subscription; refusing to fall back to a destructive full crawl.";throw h.error(b,{requestedMode:i.crawlMode,subscriptionType:n.subscriptionType??null,source:"incremental-subscription-guard"}),await h.flush(),new Error(b)}let w={pageQueue:[],queuedPages:new Set,donePages:new Set,pageDiscoverySources:new Map,assetQueue:[],queuedAssets:new Set,doneAssets:new Set,sitemapQueue:[],queuedSitemaps:new Set,doneSitemaps:new Set,successfulSitemaps:new Set,resolvedSitemapRoots:new Set,sitemapIndexUrls:new Set,sitemapLeafUrls:new Set,sitemapLastmodByPage:{},assetMap:{...p},assetVariantDigestsByOriginalPath:new Map,stats:{pagesQueued:0,pagesRendered:0,pagesCompleted:0,assetsQueued:0,sitemapsQueued:0,assetsSaved:0,pagesSaved:0}},v=Ri(),I=new yt,j=Si();if(j&&!i.resumeRewrite&&await St(j,I.artifact()),await De(n),await Kn(n,{startedAt:new Date().toISOString(),outputDir:S.resolve(n.outputDir)}),d||await T.rm(n.outputDir,{recursive:true,force:true}),await T.mkdir(n.outputDir,{recursive:true}),a){let b=new Set([...a.deleteUrls,...m.deleteOnMissingUrls]);for(let A of a.deleteUrls)await un(n,m,v,A,b);}if(i.resumeRewrite)h.info("Resuming final rewrite from existing output.",{phase:"rewrite-text",mode:i.mode,crawlMode:i.crawlMode});else {let b=await request.newContext({ignoreHTTPSErrors:n.ignoreHttpsErrors});try{if(h.mark("discovery"),i.mode==="full"?(r.forEach(P=>It(n,w,P,h)),await Cr(n,b,w,h,v,m),n.seedPaths.forEach(P=>Tr(n,w,P,h,"seed-path")),n.generated404RequestPath&&nt(n,w,n.generated404RequestPath,h,"generated-404-request-path")):(u.forEach(P=>Tr(n,w,P,h,"cli")),a?.sitemapUrls.forEach(P=>It(n,w,P,h,"content-sync-impact")),await Cr(n,b,w,h,v,m,i.mode==="content-sync",a?.sitemapUrls??[]),a&&await qo(n,w,m,v,a.sitemapUrls)),h.endMark("discovery",{pages:w.pageQueue.length,assets:w.assetQueue.length,sitemaps:w.sitemapQueue.length}),h.summary(`Queued ${w.pageQueue.length} pages, ${w.assetQueue.length} assets, ${w.sitemapQueue.length} sitemaps.`,{mode:i.mode,crawlMode:i.crawlMode,queuedPages:w.pageQueue.length,queuedAssets:w.assetQueue.length,queuedSitemaps:w.sitemapQueue.length}),i.mode==="retry-timeouts"&&w.pageQueue.length===0&&w.assetQueue.length===0&&w.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(),j&&await St(j,I.artifact());return}h.mark("render-pages");let A=Array.from({length:Math.max(1,n.concurrency)},()=>To(n,w,h,i.mode,b,m,v,I));if(await Promise.all(A),j&&await St(j,I.artifact()),h.endMark("render-pages",{pages:w.stats.pagesCompleted}),h.mark("download-assets"),h.progress("Asset download phase started.",{phase:"download-assets",doneAssets:w.doneAssets.size,assetsQueued:w.stats.assetsQueued,assetQueue:w.assetQueue.length}),await Ti(n,b,m,[...w.assetQueue],h),await mo(n,b,w,h,m,v),h.endMark("download-assets",{assets:w.doneAssets.size}),m.enabled&&n.maxPages===0&&await Di(n,w,m,h,v),i.mode==="full"){let P=await po(n,w,h);for(let E of P)X(v,n,E);}}finally{await H("dispose crawl request context",Ct(n),()=>b.dispose()).catch(A=>{h.warn("Timed out while disposing crawl request context",{error:String(A)});});}}m.trackManifest&&await Pe(n,m),await T.writeFile(S.join(n.outputDir,"asset-map.json"),JSON.stringify(w.assetMap,null,2),"utf8"),JSON.stringify(p,null,2)!==JSON.stringify(w.assetMap,null,2)&&X(v,n,S.join(n.outputDir,"asset-map.json"));let U=i.mode==="single-url"||i.mode==="content-sync"?Bi(n,w):m.enabled&&!i.resumeRewrite?Fi(n,m,v,p,w.assetMap):void 0;h.mark("rewrite-text");let $=i.mode==="single-url"||i.mode==="content-sync"?`Rewriting text files touched by URL crawl: 0/${U?.length??0}`:"Rewriting text files...";h.progress($,{phase:"rewrite-text",index:0,totalFiles:U?.length,changedTextFiles:0}),await Pr($);let C=Date.now(),q=await gt(n,w.assetMap,{files:U,previousAssetMap:p,onStart:({totalFiles:b,workerCount:A})=>{h.info(`Rewrite phase scanning ${b} text files.`,{phase:"rewrite-text",totalFiles:b,workerCount:A});},onProgress:async({index:b,totalFiles:A,changedTextFiles:P,file:E,changed:D})=>{D&&X(v,n,S.join(n.outputDir,E)),h.checkpoint(`Rewriting text file ${b}/${A}`,{phase:"rewrite-text",index:b,totalFiles:A,changedTextFiles:P,file:E}),h.debug(`${D?"Rewrote":"Checked unchanged"} text file ${b}/${A}: ${E}`,{phase:"rewrite-text",index:b,totalFiles:A,changedTextFiles:P,file:E,changed:D});let L=Date.now();if(!(b===1||b===A||b%50===0||L-C>=5e3))return;C=L;let te=`Rewriting text files: ${b}/${A}`;h.progress(te,{phase:"rewrite-text",index:b,totalFiles:A,changedTextFiles:P,file:E}),await Pr(te);}});m.trackManifest&&(Oi(m,U),await Pe(n,m)),h.endMark("rewrite-text",{changedTextFiles:q});let R=a?[...v.deletedFiles].sort():m.enabled&&!i.resumeRewrite?await Li(n,w,m,v,h):[],M=[...new Set((U||[]).map(b=>Se(n.outputDir,S.isAbsolute(b)?b:S.join(n.outputDir,b))).filter(b=>b!==null))].sort();if(a){let b=[...v.changedFiles].sort(),A=new Set(b),P=new Set(a.directRenderUrls.map(F=>Pt(n,F,"page")).filter(F=>!!F&&A.has(F))),E=new Set(a.archiveFamilyUrls.map(F=>Pt(n,F,"page")).filter(F=>!!F&&A.has(F))),D=new Set([...w.sitemapLeafUrls].map(F=>Pt(n,F,"asset")).filter(F=>!!F&&A.has(F))),L=new Set([...w.sitemapIndexUrls].map(F=>Pt(n,F,"asset")).filter(F=>!!F&&A.has(F))),G=new Set([...P,...E,...D,...L]),te=b.filter(F=>!G.has(F)),ce=[...new Set([...a.directRenderUrls,...a.archiveFamilyUrls,...w.resolvedSitemapRoots,...w.sitemapLeafUrls,...w.sitemapIndexUrls,...a.deleteUrls].map(F=>{let Ae=new URL(F);return `${Ae.pathname}${Ae.search}`}))].sort();await Gt(n,{schemaVersion:2,generatedAt:new Date().toISOString(),outputDir:S.resolve(n.outputDir),runMode:"content-sync",crawlMode:"incremental",fullSyncRequired:false,changedFiles:b,deletedFiles:R,rewriteTargets:M,consumerId:a.consumerId,fromSequence:a.fromSequence,toSequence:a.toSequence,impactHash:a.impactHash,resolvedSitemapUrls:[...w.resolvedSitemapRoots],uploadGroups:{assets:te,content:[...P].sort(),listings:[...E].sort(),sitemapLeaves:[...D].sort(),sitemapIndexes:[...L].reverse()},invalidationPaths:ce});}else await Gt(n,{schemaVersion:1,generatedAt:new Date().toISOString(),outputDir:S.resolve(n.outputDir),runMode:i.mode,crawlMode:i.crawlMode,fullSyncRequired:!(m.enabled&&!i.resumeRewrite),changedFiles:m.enabled&&!i.resumeRewrite?[...v.changedFiles].sort():[],deletedFiles:m.enabled&&!i.resumeRewrite?R:[],rewriteTargets:m.enabled&&!i.resumeRewrite?M:[]});await Zn(n),h.summary(i.resumeRewrite?`Done. Resumed final rewrite over existing output and changed ${q} text files.`:`Done. Rendered ${w.stats.pagesRendered} pages, processed ${w.doneSitemaps.size} sitemaps and ${w.doneAssets.size} assets.`,{mode:i.mode,crawlMode:i.crawlMode,resumeRewrite:i.resumeRewrite,...w.stats,pagesRendered:w.stats.pagesRendered,donePages:w.stats.pagesCompleted,claimedPages:w.donePages.size,doneSitemaps:w.doneSitemaps.size,doneAssets:w.doneAssets.size,changedTextFiles:q}),await h.flush();}function Bo(e){let t=e/6e4;if(Number.isInteger(t)&&t>=1)return `${t} minute${t===1?"":"s"}`;let n=Math.ceil(e/1e3);return `${n} second${n===1?"":"s"}`}async function ee(e,t,n){let r=new AbortController,s=globalThis.setTimeout(()=>{r.abort(new Error(`${e} timed out after ${Bo(t)}.`));},t);try{return await n({abortController:r,httpOptions:{abortSignal:r.signal,requestTimeout:t}})}finally{globalThis.clearTimeout(s);}}function Ho(e){return typeof e.subscriptionType=="string"&&e.subscriptionType.trim()!==""}function Tt(e){let t="";for(let r=0;r<e.length;r++){let s=e[r];if(s==="--profile"){let i=(e[r+1]||"").trim();if(!i)throw new Error("Missing value for --profile.");t=i,r+=1;}else if(s.startsWith("--profile=")){let i=s.slice(10).trim();if(!i)throw new Error("Missing value for --profile.");t=i;}}let n=String(process.env.PUBLISHER_DEPLOY_PROFILE||process.env.PUBLISHER_DEPLOYMENT_PROFILE||"").trim();return t||n||null}function Wo(e,t){return {...e,...t??{}}}function zo(e,t){return {...e,...t??{},invalidationPaths:[...(t?.invalidationPaths??e.invalidationPaths)||[]]}}function Ne(e,t){let n=String(t??e.deploymentTargetOverride??"").trim();if(!Ho(e)){if(n)throw new Error(`Deployment target "${n}" requires an active WPSuite subscription and remote publisher config.`);return {name:null,profile:null,config:e}}let r=String(n||e.defaultDeploymentProfile||"").trim();if(!r)return {name:null,profile:null,config:e};let s=e.deploymentProfiles?.[r];if(!s)throw new Error(`Unknown deployment profile "${r}". Check the linked WPSuite publisher configuration.`);return {name:r,profile:s,config:{...e,targetOrigin:s.targetOrigin??e.targetOrigin,s3:Wo(e.s3,s.s3),cloudFront:zo(e.cloudFront,s.cloudFront)}}}var Kr="wpsuite-sha256",Gr="wpsuite-normalized-sha256",ea=/(?:^|[-_:.])(id|uid|nonce|token|hash|instance)(?:$|[-_:.])/i,Sn=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,ta=["SIGINT","SIGTERM"],Et=new Set,kt=new Map,Qr=null;function na(e){Et.add(e);let t=false;return ()=>{t||(t=true,Et.delete(e));}}async function ra(){let e=[...Et];e.length!==0&&await Promise.allSettled(e.map(async t=>{Et.delete(t),await T.rm(t,{recursive:true,force:true});}));}function sa(){if(!(kt.size>0))for(let e of ta){let t=()=>{Qr||(Qr=ra().finally(()=>{for(let[n,r]of kt)process.off(n,r);kt.clear(),process.exit(1);}));};kt.set(e,t),process.on(e,t);}}sa();function ia(e,t){let n=String(process.env.STATIC_PUBLISHER_CRAWL_MANIFEST_PATH||"").trim();if(n)return S.resolve(n);let r=t.trim();return r?S.join(S.resolve(r),"crawl-manifest.json"):S.join(S.resolve(e),".crawl-manifest.json")}function Zr(e){return S.normalize(e).split(S.sep).join("/")}function Jr(e,t){let n=S.relative(S.resolve(e),S.resolve(t));return !n||n.startsWith("..")||S.isAbsolute(n)?null:Zr(n)}async function oa(e,t,n){let r=ia(e.outputDir,t),s;try{s=await T.readFile(r,"utf8");}catch(c){return c.code==="ENOENT"?(n.warn("Deploy rewrite guard disabled because the crawl manifest is missing.",{manifestPath:r,source:"deploy-guard"}),null):(n.warn("Deploy rewrite guard disabled because the crawl manifest could not be read.",{manifestPath:r,error:c instanceof Error?c.message:String(c),source:"deploy-guard"}),null)}let i;try{i=JSON.parse(s);}catch(c){return n.warn("Deploy rewrite guard disabled because the crawl manifest is invalid JSON.",{manifestPath:r,error:c instanceof Error?c.message:String(c),source:"deploy-guard"}),null}let a=new Map,u=new Map,o=0,l=0;for(let[c,d]of Object.entries(i.pages||{})){let p=String(d?.outputPath||"").trim(),f=p?Jr(e.outputDir,p):null;if(f){let g=typeof d?.contentType=="string"&&d.contentType?d.contentType:null;g&&u.set(f,g);}!p||d?.rewriteComplete===true||f&&(o++,a.has(f)||a.set(f,{kind:"page",sourceUrl:c,outputPath:S.resolve(p),relativePath:f}));}for(let[c,d]of Object.entries(i.assets||{})){let p=String(d?.outputPath||"").trim(),f=d?.isText===true,g=p?Jr(e.outputDir,p):null;if(g){let y=typeof d?.contentType=="string"&&d.contentType?d.contentType:null;y&&u.set(g,y);}!p||!f||d?.rewriteComplete===true||g&&(l++,a.has(g)||a.set(g,{kind:"asset",sourceUrl:c,outputPath:S.resolve(p),relativePath:g}));}return {manifestPath:r,byRelativePath:a,contentTypeByRelativePath:u,pendingPages:o,pendingTextAssets:l}}function aa(e){return e&&(Sn.test(e)?"__uuid__":/^[0-9a-f]{6,}$/i.test(e)?"__hex__":/^[0-9]{8,}$/.test(e)?"__num__":/^(?=.*[a-z])(?=.*\d)[a-z0-9]{8,}$/i.test(e)?"__alnum__":e)}function mn(e){return e.split(/([_:.\-/=?&#]+)/g).map((t,n)=>n%2===1?t:aa(t)).join("")}function ca(e){return e.split(/([_:.\-/=?&#]+)/g).map((t,n)=>n%2===1?t:Sn.test(t)?"__uuid__":/^[0-9a-f]{6,}$/i.test(t)?"__hex__":/^[0-9]{6,}$/.test(t)?"__num__":/^[a-z0-9_-]{6,}$/i.test(t)?"__id__":t).join("")}function Mt(e,t){return Array.isArray(e)?e.map(n=>Mt(n,t)):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,Mt(r,n)])):typeof e!="string"?e:t&&ea.test(t)?ca(e):Sn.test(e)?"__uuid__":/^[0-9a-f]{6,}$/i.test(e)||/^[0-9]{8,}$/.test(e)?mn(e):e}function ua(e){return e.replace(/((?:https?:\/\/[^"'\s>]+|\/)(?:wp-content|wp-includes)\/[^"'\s>?]+)\?ver=[A-Za-z0-9._-]+(?=$|[#"'])/gi,"$1")}function la(e,t){let n=t.trim();if((n.startsWith("{")||n.startsWith("[")||n.startsWith('"'))&&e.startsWith("data-"))try{let s=JSON.parse(n);return JSON.stringify(Mt(s))}catch{}if(e.startsWith("data-")&&/^[A-Za-z0-9+/=]+$/.test(n))try{let s=Buffer.from(n,"base64").toString("utf8"),i=JSON.parse(s),a=JSON.stringify(Mt(i));return Buffer.from(a,"utf8").toString("base64")}catch{}return t}function da(e,t){let n=e.toLowerCase();return n==="class"?t.split(/(\s+)/).map((r,s)=>s%2===1?r:mn(r)).join(""):n==="id"||n==="for"||n==="aria-controls"||n==="aria-labelledby"||n==="aria-describedby"||n==="aria-owns"||n==="aria-activedescendant"||n==="name"?mn(t):n==="href"||n==="src"?ua(t):la(n,t)}function pa(e){return e.replace(/<([a-z][^\s/>]*)([^<>]*?)>/gi,(t,n,r)=>{if(n.startsWith("/"))return t;let s=r.replace(/\s([:@a-zA-Z_][-:.a-zA-Z0-9_]*?)=(['"])([\s\S]*?)\2/g,(i,a,u,o)=>{let l=da(a,o);return ` ${a}=${u}${l}${u}`});return `<${n}${s}>`})}function fn(e){let t=S.extname(e).toLowerCase();return [".html",".htm",".xml",".xsl",".txt"].includes(t)||["robots.txt","sitemap.xml"].includes(S.basename(e))}function $t(e,t){return [e.replace(/^\/+|\/+$/g,""),t.replace(/^\/+/,"")].filter(Boolean).join("/")}async function ga(e,t,n,r){let s=new Map,i,a=0;do{a++;let u=await ee(`S3 list objects page ${a} for s3://${t}/${n||""}`,3e5,({httpOptions:o})=>e.send(new ListObjectsV2Command({Bucket:t,Prefix:n||void 0,ContinuationToken:i}),o));for(let o of u.Contents||[]){if(!o.Key)continue;let l=(o.ETag||"").replace(/^"|"$/g,"").toLowerCase(),c=Number(o.Size??0);s.set(o.Key,{etag:l,size:c});}i=u.NextContinuationToken,r.debug(`Listed S3 keys page ${a}: ${s.size} keys so far`);}while(i);return s}async function fa(e,t,n,r){if(r.has(n))return r.get(n)??null;try{let s=await ee(`S3 head object ${n}`,3e5,({httpOptions:a})=>e.send(new HeadObjectCommand({Bucket:t,Key:n}),a)),i={etag:(s.ETag||"").replace(/^"|"$/g,"").toLowerCase(),size:Number(s.ContentLength??0)};return r.set(n,i),i}catch{return r.set(n,null),null}}async function ma(e,t,n,r){let s=[...new Set(Array.from(n).filter(Boolean))];if(s.length===0)return r.info("No explicitly tombstoned S3 objects to delete."),[];r.info(`Deleting ${s.length} explicitly tombstoned S3 object(s)\u2026`);for(let i=0;i<s.length;i+=1e3){let a=s.slice(i,i+1e3);if(a.length===0)continue;let u=await ee(`S3 delete objects batch ${Math.floor(i/1e3)+1}`,3e5,({httpOptions:o})=>e.send(new DeleteObjectsCommand({Bucket:t,Delete:{Objects:a.map(l=>({Key:l}))}}),o));if(u.Errors&&u.Errors.length>0){let o=u.Errors.map(l=>`${l.Key||"(unknown)"}: ${l.Code||"DeleteFailed"}`);throw new Error(`S3 reported ${o.length} object deletion error(s): ${o.join(", ")}`)}r.info(`Deleted batch of ${a.length} object(s).`);for(let o of a)r.debug(` deleted: ${o}`);}return s}function ha(e){return createHash("md5").update(e).digest("hex")}function Vr(e){return createHash("sha256").update(e).digest("hex")}function hn(e){return createHash("sha256").update(pa(e.toString("utf8"))).digest("hex")}async function wa(e,t,n,r){if(r.has(n))return r.get(n)??null;try{let a=((await ee(`S3 head object metadata ${n}`,3e5,({httpOptions:u})=>e.send(new HeadObjectCommand({Bucket:t,Key:n}),u))).Metadata?.[Kr]||"").trim().toLowerCase()||null;return r.set(n,a),a}catch{return r.set(n,null),null}}async function ya(e,t,n,r,s){if(r.has(n))return r.get(n)??null;try{let a=((await ee(`S3 head object normalized metadata ${n}`,3e5,({httpOptions:u})=>e.send(new HeadObjectCommand({Bucket:t,Key:n}),u))).Metadata?.[Gr]||"").trim().toLowerCase();if(a)return r.set(n,a),a}catch{return r.set(n,null),null}if(s.has(n)){let i=s.get(n)??null;return r.set(n,i),i}try{let a=await(await ee(`S3 get object ${n}`,3e5,({httpOptions:o})=>e.send(new GetObjectCommand({Bucket:t,Key:n}),o))).Body?.transformToByteArray(),u=a?hn(Buffer.from(a)):null;return s.set(n,u),r.set(n,u),u}catch{return s.set(n,null),r.set(n,null),null}}function Sa(e){return e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")||"profile"}function ba(e,t){let n=e,r=Object.entries(t).sort((s,i)=>i[0].length-s[0].length);for(let[s,i]of r)s&&(n=n.split(s).join(i));return n}async function Pa(e,t,n,r){let s=S.join(e,"asset-map.json"),i;try{i=await T.readFile(s,"utf8");}catch(o){if(o.code==="ENOENT")return;throw o}let a=JSON.parse(i);if(!a||typeof a!="object")return;let u=Object.fromEntries(Object.entries(a).map(([o,l])=>{let c=String(l??"");return t.urlRewriteMode==="absolute"&&t.targetOrigin&&n.targetOrigin&&t.targetOrigin!==n.targetOrigin&&(c=c.split(t.targetOrigin).join(n.targetOrigin)),c=ba(c,r),[o,c]}));await T.writeFile(s,JSON.stringify(u,null,2),"utf8");}async function va(e,t,n,r,s,i){let a=e.targetOrigin!==t.targetOrigin,u=Object.keys(r).length>0;if(!n||!a&&!u)return {outputDir:e.outputDir,cleanup:async()=>{}};if(a&&e.urlRewriteMode!=="absolute")throw new Error(`Deployment profile "${n}" changes targetOrigin, but the base crawl output must use urlRewriteMode "absolute" for multi-target redeploys.`);let o=S.join(S.dirname(e.outputDir),`.deploy-profile-${Sa(n)}-${Date.now()}`),l=na(o);s.info(`Preparing deployment profile "${n}" from existing crawl output to ${o}...`);try{if(await T.rm(o,{recursive:!0,force:!0}),i){await T.mkdir(o,{recursive:!0});for(let f of i){let g=S.join(e.outputDir,f),y=S.join(o,f);await T.mkdir(S.dirname(y),{recursive:!0}),await T.copyFile(g,y);}}else await T.cp(e.outputDir,o,{recursive:!0});let c={...e,sourceOrigin:e.targetOrigin,targetOrigin:t.targetOrigin,extraReplacements:r,outputDir:o},d=1;s.info(`Rewriting text files for deployment profile "${n}"...`);let p=await gt(c,{},{files:i,onStart:({totalFiles:f,workerCount:g})=>{d=g,s.info(`Rewriting ${f} text file(s) for deployment profile "${n}" with ${g} worker(s).`);},onProgress:({index:f,totalFiles:g,changedTextFiles:y,file:m,changed:h})=>{let v=`Rewriting [${f}/${g}] ${m} (${h?"rewrote":"checked"}; ${y} changed so far)`;g<=200||f<=5||f%10===0||f===g?(s.progress(v,{file:m,index:f,totalFiles:g,changed:h,changedTextFiles:y,workerCount:d}),s.info(v)):s.debug(v);}});return await Pa(o,e,t,r),s.info(`Prepared deployment profile "${n}" in ${o} (${p} rewritten text file(s)).`),{outputDir:o,cleanup:async()=>{l(),await T.rm(o,{recursive:!0,force:!0});}}}catch(c){throw s.error(`Failed to prepare deployment profile "${n}" temporary output.`,{tempDir:o,outputDir:e.outputDir,error:c instanceof Error?c.message:String(c),...c instanceof Error&&c.stack?{stack:c.stack}:{}}),await T.rm(o,{recursive:true,force:true}).catch(()=>{}),l(),await s.flush().catch(()=>{}),c}}async function Yr(e=process.argv.slice(2)){let t=await se(),n=Tt(e),r=Ne(t,n),s=S.resolve(r.config.logDir||"logs"),i=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",a=i?S.join(S.resolve(i),"deploy-diff.json"):"",u=new Oe(s,"deploy.log.jsonl",r.config.logLevel??"info"),o=r.profile?.extraReplacements??{},l=async()=>{};try{let c=await Me(t);if(e.includes("--content-sync")&&c?.schemaVersion!==2)throw new Error("Content-sync deployment requires a valid schema-2 targeted deploy plan.");let p=await Gn(t);if(p)throw new Error(`Deployment blocked: the crawl started at ${p.startedAt} did not complete its final rewrite. Run a successful crawl or resume the rewrite before deploying.`);let f=await va(t,r.config,r.name,o,u,c?.schemaVersion===2?c.changedFiles:void 0);l=f.cleanup;let g={...r.config,outputDir:f.outputDir},y=g.s3SyncMode??"sdk-upload-delete";if(c?.schemaVersion===2&&c.deletedFiles.length>0&&y!=="sdk-upload-delete")throw new Error("Content-sync tombstones require the sdk-upload-delete S3 sync mode.");let m=c?.schemaVersion!==2&&f.outputDir!==t.outputDir&&(t.targetOrigin!==r.config.targetOrigin||Object.keys(o).length>0),h=!!c&&!c.fullSyncRequired&&!m;if(c?.schemaVersion===2&&!h)throw new Error("Content-sync deployment cannot widen into a full-output deployment.");r.name&&u.info(`Using deployment profile: ${r.name}`),u.info(`Starting deploy \u2014 s3://${g.s3.bucket}/${g.s3.prefix||""} (region: ${g.s3.region})`),u.info(`S3 sync mode: ${y}`),c&&c.fullSyncRequired?u.info("Deploy plan requests a full sync; scanning the whole output tree."):c&&m?u.info("Ignoring incremental deploy plan because deployment-profile rewrites require a full sync."):h&&u.info(`Using incremental deploy plan: ${c.changedFiles.length} changed file(s), ${c.deletedFiles.length} deleted file(s).`),u.mark("deploy");let w=new S3Client({region:g.s3.region}),v=f.outputDir===t.outputDir?await oa(t,i,u):null,I=c?.schemaVersion===2?[...c.uploadGroups.assets,...c.uploadGroups.content,...c.uploadGroups.listings,...c.uploadGroups.sitemapLeaves,...c.uploadGroups.sitemapIndexes]:c?.changedFiles??[];if(c?.schemaVersion===2){let k=[...new Set(I)],J=[...new Set(c.changedFiles)];if(k.length!==J.length||J.some(x=>!k.includes(x)))throw new Error("Content-sync deploy-plan upload groups do not cover the exact changed-file set.")}let j=h?(await Promise.all(I.map(async k=>{try{return (await T.stat(S.join(g.outputDir,k))).isFile()?k:null}catch{if(c?.schemaVersion===2)throw new Error(`Content-sync planned upload is missing: ${k}`);return null}}))).filter(k=>k!==null):await qs(["**/*"],{cwd:g.outputDir,onlyFiles:!0,dot:!0}),U=[],$=[],C=j.filter(k=>{let J=v?.byRelativePath.get(Zr(k));if(!J)return !0;let x=$t(g.s3.prefix,k);return U.push(k),$.push(x),u.reject(J.kind,J.sourceUrl||k,"rewrite not completed; deploy upload blocked","deploy-guard",{file:k,key:x,outputPath:J.outputPath,manifestPath:v?.manifestPath}),!1}),q=new Set((h?C:j).map(k=>$t(g.s3.prefix,k)));v&&(v.pendingPages>0||v.pendingTextAssets>0)&&u.info(`Deploy rewrite guard loaded ${v.pendingPages} pending page(s) and ${v.pendingTextAssets} pending text asset(s) from crawl manifest.`,{manifestPath:v.manifestPath,pendingPages:v.pendingPages,pendingTextAssets:v.pendingTextAssets,source:"deploy-guard"}),U.length>0&&u.warn(`Deploy rewrite guard blocked ${U.length} file(s) from upload because final crawl rewrite is incomplete.`,{rejected:U.length,manifestPath:v?.manifestPath,source:"deploy-guard"}),h?u.info(`Using ${C.length} eligible planned changed file(s) from deploy plan for upload${U.length>0?` (${U.length} blocked by deploy rewrite guard)`:""}.`):u.info(`Found ${j.length} file(s) in output directory "${g.outputDir}"${U.length>0?`; ${C.length} remain eligible for upload after deploy rewrite guard filtering`:""}.`),u.progress("Deploy preflight: comparing local output with remote S3 state.",{phase:"deploy",mode:y,totalFiles:C.length,scannedFiles:j.length,rejected:U.length,deploymentProfile:r.name||"",s3Bucket:g.s3.bucket,s3Prefix:g.s3.prefix||"",targetedPlan:h,deployGuardEnabled:f.outputDir===t.outputDir});let R=0,M=0,b=0,A=[],P=[],E=[],D=[],L=[],G=new Map,te=new Map,ce=new Map,F=new Map,Ae=new Map;h||(u.info("Listing existing S3 objects to detect unchanged files..."),G=await ga(w,g.s3.bucket,g.s3.prefix,u),u.info(`Found ${G.size} existing key(s) in S3.`));let os=async k=>G.has(k)?G.get(k)??null:h?fa(w,g.s3.bucket,k,te):null;for(let k of C){let J=S.join(g.outputDir,k),x=$t(g.s3.prefix,k),ne=v?.contentTypeByRelativePath.get(k),He=ne&&ne!=="application/octet-stream"?ne:Xo.lookup(k)||ne||"application/octet-stream",as=fn(k)?g.s3.htmlCacheControl:g.s3.assetCacheControl,N=R+M+b+1;C.length<=200||N<=5||N%10===0||N===C.length?(u.progress(`Uploading [${N}/${C.length}] ${x} (${He})`,{file:k,key:x,index:N,totalFiles:C.length,contentType:He,mode:y}),u.info(`Uploading [${N}/${C.length}] ${x} (${He})`)):u.debug(`Uploading [${N}/${C.length}] ${x} (${He})`);try{let re=await T.readFile(J),We=await os(x),ze=null,Te=null;if(We){let Ot=re.byteLength;if(We.size===Ot){let it=We.etag.includes("-");if(We.etag!==""&&!it){let cs=ha(re);if(We.etag===cs){M++,C.length<=200||M<=5||M%25===0?(u.progress(`Skipped unchanged [${N}/${C.length}] ${x}`,{file:k,key:x,index:N,totalFiles:C.length,uploaded:R,skipped:M,failed:b,mode:y,reason:"etag-md5-match"}),u.info(`Skipped unchanged [${N}/${C.length}] ${x}`)):u.debug(`Skipped unchanged [${N}/${C.length}] ${x}`),P.push(x);continue}}ze=Vr(re);let In=await wa(w,g.s3.bucket,x,ce);if(In&&In===ze){M++,C.length<=200||M<=5||M%25===0?(u.progress(`Skipped unchanged [${N}/${C.length}] ${x}`,{file:k,key:x,index:N,totalFiles:C.length,uploaded:R,skipped:M,failed:b,mode:y,reason:"metadata-sha256-match"}),u.info(`Skipped unchanged [${N}/${C.length}] ${x}`)):u.debug(`Skipped unchanged [${N}/${C.length}] ${x}`),P.push(x);continue}}if(fn(k)){Te=hn(re);let it=await ya(w,g.s3.bucket,x,F,Ae);if(it&&it===Te){M++,C.length<=200||M<=5||M%25===0?(u.progress(`Skipped semantically unchanged [${N}/${C.length}] ${x}`,{file:k,key:x,index:N,totalFiles:C.length,uploaded:R,skipped:M,failed:b,mode:y,reason:"normalized-html-match"}),u.info(`Skipped semantically unchanged [${N}/${C.length}] ${x}`)):u.debug(`Skipped semantically unchanged [${N}/${C.length}] ${x}`),P.push(x);continue}}}ze=ze??Vr(re),Te=Te??(fn(k)?hn(re):null),await ee(`S3 upload ${x}`,9e5,({abortController:Ot})=>new Upload({client:w,abortController:Ot,params:{Bucket:g.s3.bucket,Key:x,Body:re,ContentType:He,CacheControl:as,Metadata:{[Kr]:ze,...Te?{[Gr]:Te}:{}}}}).done()),R++,A.push(x),(R%25===0||R===C.length)&&(u.progress(`Uploaded ${R}/${C.length} file(s)\u2026`,{uploaded:R,skipped:M,failed:b,totalFiles:C.length,mode:y}),u.info(`Uploaded ${R}/${C.length} file(s)\u2026`));}catch(re){b++,E.push(x),u.error(`Failed to upload ${x}: ${re.message}`,{key:x,error:String(re)});}}if(u.info(`Upload complete: ${R} uploaded, ${M} skipped unchanged, ${$.length} rejected by guard, ${b} failed.`),E.length>0||$.length>0)throw new Error(`Deployment stopped before deletion because ${E.length} upload(s) failed and ${$.length} upload(s) were rejected.`);if(y==="sdk-upload-delete"){let k=new Set((c?.deletedFiles??[]).map(x=>$t(g.s3.prefix,x))),J=[...k].filter(x=>!q.has(x));if(!h&&(L=[...G.keys()].filter(ne=>!q.has(ne)).filter(ne=>!k.has(ne)),L.length>0)){u.warn(`Protected ${L.length} remote-only S3 object(s) from deletion because the crawl did not provide explicit tombstones.`,{protected:L.length,source:"deploy-delete-guard"});for(let ne of L)u.debug(` protected remote-only object: ${ne}`);}D=await ma(w,g.s3.bucket,h?J:J.filter(x=>G.has(x)),u);}else u.info("Sync mode is sdk-upload-only \u2014 skipping stale object deletion.");a&&(await T.mkdir(S.dirname(a),{recursive:!0}),await T.writeFile(a,JSON.stringify({generatedAt:new Date().toISOString(),mode:y,summary:{totalFiles:j.length,eligibleFiles:C.length,uploaded:A.length,skipped:P.length,rejected:$.length,failed:E.length,deleted:D.length,protected:L.length,...r.name?{profile:r.name}:{}},uploadedKeys:A,skippedKeys:P,rejectedKeys:$,failedKeys:E,deletedKeys:D,protectedRemoteOnlyKeys:L},null,2),"utf8")),c?.schemaVersion!==2&&await De(t),u.endMark("deploy"),await u.flush();}finally{await l().catch(()=>{});}}function Ra(e){let t=e;return t.endsWith("/")?t+="index.html":S.posix.basename(t).includes(".")||(t+="/index.html"),t}function Ia(e,t){let n=t.trim().replace(/^\/+|\/+$/g,"");if(!n)return null;let r=`/${n}`;return e===r||e.startsWith(`${r}/`)?e:`${r}${e.startsWith("/")?e:`/${e}`}`}function Xr(e,t){let n=new Set;for(let r of e){let s=new URL(r,"https://content-sync.invalid");if(s.origin!=="https://content-sync.invalid")continue;let i=`${s.pathname}${s.search}`,a=Ra(s.pathname);n.add(i),n.add(`${a}${s.search}`);let u=Ia(a,t);u&&n.add(`${u}${s.search}`);}return [...n].sort()}function ka(){let e=String(process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"").trim();return e?S.join(S.resolve(e),"content-sync-invalidation.json"):""}async function bn(e,t){if(!e)return;await T.mkdir(S.dirname(e),{recursive:true});let n=`${e}.${process.pid}.${Date.now()}.tmp`;await T.writeFile(n,JSON.stringify({...t,updatedAt:new Date().toISOString()},null,2),"utf8"),await T.rename(n,e);}async function $a(e,t,n,r){if(!e)return null;try{let s=JSON.parse(await T.readFile(e,"utf8"));if(s.schemaVersion!==1||s.distributionId!==t||s.impactHash!==n||!Array.isArray(s.batches))throw new Error("Content-sync invalidation state does not match the deploy plan.");let i=s.batches.flatMap(a=>a.paths);return i.length!==r.length||i.some((a,u)=>a!==r[u])?null:s}catch(s){if(s.code==="ENOENT")return null;throw s}}function Ea(e,t=3e3){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}async function ts(e=process.argv.slice(2)){let t=await se(),n=Tt(e),r=Ne(t,n),s=r.config,i=new Oe(s.logDir||"logs","invalidate.log.jsonl",s.logLevel??"info"),a=e.includes("--content-sync"),u=await Me(t);if(a&&u?.schemaVersion!==2)throw new Error("Content-sync invalidation requires a valid schema-2 targeted deploy plan.");if(r.name&&i.info(`Using deployment profile: ${r.name}`),!s.cloudFront.distributionId){i.info("No CloudFront distributionId configured; skipping invalidation."),await i.flush();return}let o=u?.schemaVersion===2?u.invalidationPaths:s.cloudFront.invalidationPaths.length>0?s.cloudFront.invalidationPaths:["/*"],l=u?.schemaVersion===2?Xr(o,s.s3.prefix||""):o;if(u?.schemaVersion===2&&l.some(g=>g==="/*"))throw new Error("Content-sync cannot use a whole-distribution invalidation.");if(l.length===0){i.info("The targeted deploy plan has no CloudFront paths to invalidate."),await i.flush();return}let c=s.cloudFront.distributionId,d=new CloudFrontClient({region:"us-east-1",maxAttempts:5});if(i.mark("invalidate"),u?.schemaVersion!==2){let g=`smartcloud-static-publisher-${Date.now()}`;await ee(`CloudFront invalidation for distribution ${c}`,3e5,({httpOptions:y})=>d.send(new CreateInvalidationCommand({DistributionId:c,InvalidationBatch:{CallerReference:g,Paths:{Quantity:l.length,Items:l}}}),y)),i.endMark("invalidate"),await i.flush();return}let p=ka(),f=await $a(p,c,u.impactHash,l);if(!f){let g=createHash("sha256").update(JSON.stringify(l)).digest("hex");f={schemaVersion:1,distributionId:c,impactHash:u.impactHash,updatedAt:new Date().toISOString(),batches:Ea(l).map((y,m)=>({index:m,callerReference:`wpsuite-content-sync-${u.impactHash.slice(0,24)}-${g.slice(0,24)}-${m}`,paths:y,invalidationId:null,status:"pending"}))},await bn(p,f);}for(let g of f.batches){if(!g.invalidationId){let y=await ee(`CloudFront targeted invalidation batch ${g.index+1}`,3e5,({httpOptions:h})=>d.send(new CreateInvalidationCommand({DistributionId:c,InvalidationBatch:{CallerReference:g.callerReference,Paths:{Quantity:g.paths.length,Items:g.paths}}}),h)),m=String(y.Invalidation?.Id||"").trim();if(!m)throw new Error("CloudFront did not return an invalidation ID.");g.invalidationId=m,g.status="created",await bn(p,f);}await waitUntilInvalidationCompleted({client:d,maxWaitTime:900,minDelay:2,maxDelay:15},{DistributionId:c,Id:g.invalidationId}),g.status="completed",await bn(p,f),i.info(`CloudFront invalidation batch ${g.index+1}/${f.batches.length} completed.`,{invalidationId:g.invalidationId,pathCount:g.paths.length});}i.endMark("invalidate"),await i.flush();}function Ft(e){let t=new URL(e);return t.hash="",t.href}function ns(e,t,n){let r=new Set([...t].map(o=>Ft(o))),s=new Map,i=new Map,a=o=>{s.set(Ft(o),o);},u=o=>{if(!o)return;let l=Ft(o);s.has(l)||i.set(l,o);};for(let o of e.deleteUrls)a(o);for(let o of e.archiveFamilies)if(o.foundPosts===0)for(let l of o.pageUrls)r.has(Ft(l))||a(l);u(e.directRenderUrls[0]);for(let o of e.archiveFamilies)u(o.pageUrls[0]),u(o.pageUrls.at(-1));for(let o of n)u(o);return {expectedAvailable:[...i.values()],expectedMissing:[...s.values()]}}var ss=["claimed","impact-planned","rendered","deployed","invalidated","verified","acknowledged"];function Cn(){let e=String(process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"").trim();if(!e)throw new Error("Content-sync requires a runtime directory.");return S.resolve(e)}function Be(e,t){return ss.indexOf(e)>=ss.indexOf(t)}async function me(e,t,n,r,s={}){let i={timestamp:new Date().toISOString(),eventType:t,status:t.endsWith("failed")?"failed":"success",actorSource:"content-sync",jobId:n.id||"",command:"content-sync",message:r,details:s};await T.mkdir(e,{recursive:true}),await T.appendFile(S.join(e,"audit-events.jsonl"),`${JSON.stringify(i)}
13
+ ${i}`,40);return r.info(`Using generated 404 fallback change token for ${n}`,{url:n,requestPath:e.generated404RequestPath,source:"generated-404-change-token-fallback"}),{url:n,supported:!0,token:a,tokenSource:"generated-404-response-hash",postId:null,dependencyPostIds:[],reason:null}}catch(s){return r.warn(`Generated 404 fallback token lookup failed for ${n}`,{url:n,error:String(s),requestPath:e.generated404RequestPath,source:"generated-404-change-token-fallback"}),null}}async function Ei(e,t,n,r,s,i){let a=pn(e,s);if(!r.enabled)return {action:"render",changeToken:r.trackManifest?await vt(e,t,r,s,i):null};let u=r.manifest.pages[s];if(!u)return {action:"render",changeToken:await vt(e,t,r,s,i)};let o=await vt(e,t,r,s,i);if(o?.supported&&o.token)return u.changeToken===o.token?a&&!await Mi(e,t,s,i)?{action:"render",changeToken:o}:{action:"reuse",changeToken:o}:{action:"render",changeToken:o};let l=et(n.sitemapLastmodByPage[s]);return l&&u.sitemapLastmod&&u.sitemapLastmod===l?{action:"reuse",changeToken:o}:{action:"render",changeToken:o}}async function Mi(e,t,n,r){try{let i=(await t.get(n,{timeout:Math.min(e.navigationTimeoutMs,15e3),failOnStatusCode:!1})).status();return i===404?!0:(r.warn(`Generated 404 request path no longer returns 404 for ${n}`,{url:n,status:i,requestPath:e.generated404RequestPath,source:"generated-404-status-probe"}),!1)}catch(s){return r.warn(`Generated 404 status probe failed for ${n}`,{url:n,error:String(s),requestPath:e.generated404RequestPath,source:"generated-404-status-probe"}),false}}async function Di(e,t,n,r,s){let i=Sr(n.previousManifest,void 0,r,"previous-manifest"),a=0;for(let[p,f]of Object.entries(n.manifest.pages))if(!n.seenPages.has(p)){yr(s,e,f.outputPath);try{await T.unlink(f.outputPath);}catch(g){(g.code||"")!=="ENOENT"&&r.warn(`Failed to remove stale incremental page output for ${p}`,{url:p,outputPath:f.outputPath,error:String(g)});}delete n.manifest.pages[p],a++;}let u=Sr(n.manifest,n.runId,r,"active-manifest"),o=new Set,l=new Set;for(let p of u){for(let y of tt(e,p))o.add(y);let f=n.manifest.assets[p]?.outputPath;f&&l.add(f);let g=je(e,t.assetMap,p);g&&l.add(g);}for(let p of Object.keys(n.manifest.assets)){if(u.has(p)){n.manifest.assets[p].unreferencedRuns=0;continue}let f=n.manifest.assets[p];if(gr(f.unreferencedRuns)){f.unreferencedRuns+=1,r.warn(`Deferred deletion of newly unreferenced incremental asset ${p}.`,{url:p,unreferencedRuns:f.unreferencedRuns,phase:"incremental-cleanup",source:"asset-deletion-grace"});continue}delete n.manifest.assets[p];}let c=0,d=0;for(let p of i){if(n.manifest.assets[p])continue;let f=new Set,g=n.previousManifest.assets[p]?.outputPath;g&&f.add(g);let y=je(e,t.assetMap,p);if(!u.has(p)&&y)f.add(y);else if(!u.has(p)){let m=Gi(e,p,r,"incremental-cleanup");m&&(f.add(m.originalFilePath),m.hashedFilePath&&f.add(m.hashedFilePath));}for(let m of f)if(!l.has(m)){yr(s,e,m);try{await T.unlink(m),c++;}catch(h){(h.code||"")!=="ENOENT"&&r.warn(`Failed to remove stale incremental asset output for ${p}`,{url:p,outputPath:m,error:String(h)});}}for(let m of tt(e,p))o.has(m)||Object.prototype.hasOwnProperty.call(t.assetMap,m)&&(delete t.assetMap[m],d++);}(a>0||c>0||d>0)&&r.info(`Incremental cleanup removed ${a} stale pages, ${c} stale assets, ${d} stale asset mappings`,{removedPages:a,removedAssets:c,removedAssetMappings:d,phase:"incremental-cleanup"});}function Sr(e,t,n,r){let s=new Set,i=a=>{let u=a.trim();if(u){if(n){let o=ve(u,n,"asset",r??"manifest");if(!o)return;s.add(o.toString());return}s.add(u);}};for(let a of Object.values(e.pages))for(let u of a.discoveredAssets||[])i(u);for(let[a,u]of Object.entries(e.assets||{}))t&&u.lastSeenRunId!==t||i(a);return s}function br(e,t,n){for(let r of t)for(let s of tt(e,r))if(n.has(s))return true;return false}function Fi(e,t,n,r,s){let i=new Set(n.rewriteTargets);for(let u of n.changedFiles)i.add(S.resolve(e.outputDir,u));for(let u of Object.values(t.manifest.pages))u.rewriteComplete||i.add(S.resolve(u.outputPath));for(let u of Object.values(t.manifest.assets))u.isText&&!u.rewriteComplete&&i.add(S.resolve(u.outputPath));let a=Ai(r,s);if(a.size===0)return [...i];for(let u of Object.values(t.manifest.pages))br(e,u.discoveredAssets,a)&&i.add(S.resolve(u.outputPath));for(let[u,o]of Object.entries(t.manifest.assets)){o.isText&&br(e,o.discoveredAssets,a)&&i.add(S.resolve(o.outputPath));for(let l of tt(e,u))if(a.has(l)){X(n,e,o.outputPath),o.isText&&i.add(S.resolve(o.outputPath));break}}return [...i]}function Oi(e,t){let n=t?new Set(Array.from(t,s=>S.resolve(s))):null,r=s=>n===null||n.has(S.resolve(s));for(let s of Object.values(e.manifest.pages))r(s.outputPath)&&(s.rewriteComplete=true);for(let s of Object.values(e.manifest.assets)){if(!s.isText){s.rewriteComplete=true;continue}r(s.outputPath)&&(s.rewriteComplete=true);}}function Ui(e,t,n){let r=new Set,s=i=>{if(!i)return;let a=Se(e.outputDir,i);a&&r.add(a);};for(let i of t.donePages)s(ge(e,i));for(let i of Object.values(n.manifest.pages))i.lastSeenRunId===n.runId&&s(i.outputPath);for(let i of t.doneAssets)s(je(e,t.assetMap,i));for(let i of Object.values(n.manifest.assets))i.lastSeenRunId===n.runId&&s(i.outputPath);return r}async function Li(e,t,n,r,s){let i=[...r.deletedFiles].sort(),a=Ui(e,t,n),u=0;for(let c of [...a].sort()){try{if((await T.stat(S.join(e.outputDir,c))).isFile())continue}catch{}u++,s.warn(`Active output is missing after crawl: ${c}`,{phase:"deploy-plan",file:c,outputPath:S.join(e.outputDir,c)});}if(u>0&&s.warn(`Detected ${u} active output file(s) missing before deploy plan save.`,{phase:"deploy-plan",missingActiveOutputs:u}),i.length===0)return [];let o=[],l=0;for(let c of i){if(!a.has(c)){o.push(c);continue}l++;let d=S.join(e.outputDir,c),p;try{p=(await T.stat(d)).isFile();}catch{p=false;}s.warn(`Deploy plan protected active output from deletion: ${c}`,{phase:"deploy-plan",file:c,outputPath:d,exists:p});}return l>0&&s.info(`Deploy plan skipped ${l} active output deletion(s).`,{phase:"deploy-plan",protectedDeletes:l,deletedFiles:o.length}),o}function tt(e,t){let n=new Set([t]);try{let r=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 a of i)try{n.add(new URL(a).origin+r.pathname+r.search);}catch{}n.add(r.pathname+r.search),n.add(r.pathname);}catch{}return [...n]}function ji(e,t){let n=new Set([t]);try{let r=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 a of i)try{n.add(new URL(a).origin+r.pathname+r.search);}catch{}n.add(r.pathname+r.search);}catch{}return [...n]}function Or(e,t){let n=e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/"?e.targetOrigin:"https://relative.invalid/";try{let r=new URL(t,n);return S.join(e.outputDir,dn(r.pathname))}catch{return null}}function qi(e,t,n){for(let r of ji(e,n)){let s=t[r];if(!s)continue;let i=Or(e,s);if(i)return {outputPath:i,publicUrl:s}}return null}function _i(e,t,n){for(let r of tt(e,n)){let s=t[r];if(!s)continue;let i=Or(e,s);if(i)return i}return null}function je(e,t,n){let r=_i(e,t,n);if(r)return r;try{return At(e,n).originalFilePath}catch{return null}}function Ni(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?S.join(S.resolve(e),"queue-runner-heartbeat.json"):""}async function Pr(e){let t=Ni();if(t)try{let n=await T.readFile(t,"utf8"),r=JSON.parse(n);if(!r||typeof r!="object")return;await T.writeFile(t,JSON.stringify({...r,checkedAt:new Date().toISOString(),status:"running",currentStep:"rewrite",message:e},null,2),"utf8");}catch{}}function Bi(e,t){let n=new Set;for(let r of t.donePages)n.add(S.resolve(ge(e,r)));for(let r of t.doneAssets){let s=je(e,t.assetMap,r);!s||!be(s)||n.add(S.resolve(s));}for(let r of t.doneSitemaps){let s=je(e,t.assetMap,r);!s||!be(s)||n.add(S.resolve(s));}return [...n]}var Rt="re:",bt=new Map;function Hi(e){if(!e.startsWith(Rt))return null;let t=bt.get(e);if(t!==void 0)return t||null;let n=e.slice(Rt.length).trim();if(!n)return bt.set(e,false),null;try{let r=new RegExp(n);return bt.set(e,r),r}catch{return console.warn(`[crawl] Ignoring invalid path matcher regex: ${e}`),bt.set(e,false),null}}function ln(e,t){let n=Hi(t);return n?n.test(e):t.startsWith(Rt)?false:e.startsWith(t)}function Wi(e,t){return t.find(n=>ln(e,n))}function Ur(e,t){let n=Wi(t.pathname,e.blockedPathPrefixes);if(n)return n.startsWith(Rt)?`blocked path regex: ${n}`:`blocked path prefix: ${n}`;let r=e.blockedSearchFragments.find(s=>t.search.includes(s));return r?`blocked search fragment: ${r}`:null}function zi(e){let t=new URL(e.sourceOrigin),n=new Set([t.hostname,...e.allowedAssetHosts]);if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{n.add(new URL(e.targetOrigin).hostname);}catch{}for(let r of Object.keys(e.extraReplacements||{}))try{n.add(new URL(r).hostname);}catch{}return n}function Qi(e,t){return zi(e).has(t.hostname)}function Ji(e){let t=de(e.trim()).replace(/\\\//g,"/").replace(/^['"]|['"]$/g,"").trim();return t=t.replace(/[)]+$/g,"").trim(),t=t.replace(/;.*$/g,"").trim(),t}function an(e){let t=de(e).replace(/\\\//g,"/");return /[{}]|\bwindow\.|\blocation\.|\bincludes\(|\?\?null|\+|%7B|%7D|%22|<|>|\s/.test(t)||/[()[\]'"]/.test(t)}function Vi(e){let t=de(e).replace(/\\\//g,"/").trim(),n=S.extname(t).toLowerCase();return kr.has(n)||$r.has(n)?false:/^(?:this|[A-Za-z_$][\w$]*)\.[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/.test(t)}function qe(e){return wi.some(t=>e.pathname.startsWith(t))}function z(e,t,n=e.sourceOrigin,r,s="url"){let i=Ji(t);if(!i||i.startsWith("data:")||i.startsWith("blob:")||i.startsWith("mailto:")||i.startsWith("tel:")||i.startsWith("#"))return r?.ignore(s,t,"empty or unsupported scheme",n),null;if(an(i))return r?.ignore(s,t,"looks like JavaScript/code fragment",n),null;if(Vi(i))return r?.ignore(s,t,"looks like JavaScript property access",n),null;try{let a=new URL(i,n);if(Lr(a))return r?.reject(s,t,"malformed URL encoding",n),null;if(!["http:","https:"].includes(a.protocol))return r?.ignore(s,t,"unsupported protocol: ",n),null;if(!Qi(e,a))return r?.ignore(s,a.toString(),"host not allowed",n),null;let u=Ur(e,a);if(u)return r?.reject(s,a.toString(),u,n),null;let o=new URL(e.sourceOrigin);return a.protocol=o.protocol,a.host=o.host,a.hash="",a}catch{return r?.reject(s,t,"invalid URL",n),null}}function Lr(e){try{return decodeURIComponent(e.pathname),decodeURIComponent(e.search),decodeURIComponent(e.hash),!1}catch{return true}}function ve(e,t,n,r){try{let s=new URL(e);return Lr(s)?(t.reject(n,e,"malformed URL encoding",r),null):s.protocol!=="http:"&&s.protocol!=="https:"?(t.reject(n,e,`unsupported protocol: ${s.protocol}`,r),null):s}catch{return t.reject(n,e,"invalid URL",r),null}}function jr(e){return kr.has(S.extname(e.pathname).toLowerCase())}function Ce(e){return qe(e)?false:$r.has(S.extname(e.pathname).toLowerCase())}function _e(e){let t=e.pathname.toLowerCase();return t.endsWith(".xml")&&(t.includes("sitemap")||t.endsWith("/sitemap.xml"))}function B(e,t){return !!(_e(t)||t.pathname==="/robots.txt"||t.pathname==="/llms.txt"||t.pathname.toLowerCase().endsWith(".xsl")||e.assetPathPrefixes.length>0&&e.assetPathPrefixes.some(n=>ln(t.pathname,n))||jr(t)||!Ce(t)&&!qe(t))}function ge(e,t){let n=new URL(t),r=dn(n.pathname);return r.endsWith("/")?r+="index.html":S.extname(r)||(r+="/index.html"),S.join(e.outputDir,r)}function dn(e){try{return decodeURIComponent(e)}catch{return e}}function Ki(e){if(!e.generated404RequestPath)return null;try{let t=new URL(e.generated404RequestPath,e.sourceOrigin);return !t.pathname.endsWith("/")&&S.extname(t.pathname)===""&&(t.pathname+="/"),t.hash="",t.toString()}catch{return null}}function pn(e,t){let n=Ki(e);if(!n)return false;try{return new URL(t,e.sourceOrigin).toString()===n}catch{return false}}function At(e,t){let n=new URL(t),r=dn(n.pathname);r.endsWith("/")&&(r+="index.html");let s=!!n.search,i=r,a=S.join(e.outputDir,i),u=Zt(e.targetOrigin,i),o=`${u}${n.search}`;if(!s)return {originalPathname:i,originalFilePath:a,originalPublicUrl:u,originalPublicUrlWithSearch:o,preferQueryHashed:s};let l=S.extname(r),d=`${l?r.slice(0,-l.length):r}.${Ze(n.search)}${l||".bin"}`;return {originalPathname:i,originalFilePath:a,originalPublicUrl:u,originalPublicUrlWithSearch:o,preferQueryHashed:s,hashedPathname:d,hashedFilePath:S.join(e.outputDir,d),hashedPublicUrl:Zt(e.targetOrigin,d)}}function Gi(e,t,n,r){let s=ve(t,n,"asset",r);return s?At(e,s.toString()):null}function Zi(e,t,n,r,s){t[n]=r;try{let i=new URL(n),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 o of u)try{let l=new URL(o);t[l.origin+i.pathname+i.search]=r;}catch{}try{let o=(()=>{let l=new URL(r,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin);return `${l.pathname}${l.search}`})();t[i.pathname+i.search]=o;}catch{}try{let o=new URL(r,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[i.pathname]=o;}catch{}try{let o=new URL(s,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[i.pathname]=o;}catch{}}catch{}}async function qr(e){try{return await T.readFile(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}async function Le(e){try{return await T.stat(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}function Yi(e){let t=String(e["content-length"]||"").trim();if(!t)return null;let n=Number.parseInt(t,10);return Number.isFinite(n)&&n>=0?n:null}function _r(e){let t=String(e["last-modified"]||"").trim();if(!t)return null;let n=Date.parse(t);return Number.isFinite(n)?n:null}function Xi(e,t){let n=_r(t),r=Yi(t),s=e?.mtime.getTime();return n!==null&&Math.abs((s??0)-n)>=1e3||r!==null&&e?.size!==r?false:n!==null||r!==null}async function eo(e,t){if(!t)return;let n=_r(t);if(n===null)return;let r=await Le(e);if(!r)return;let s=new Date(n);await T.utimes(e,r.atime,s).catch(()=>{});}function vr(e,t){let n=S.extname(e.pathname).toLowerCase(),r=t["content-type"]||"";return hi.has(n)||mi.some(s=>r.includes(s))&&!r.startsWith("image/")&&!r.includes("font")}function to(e){try{let t=S.extname(new URL(e).pathname).toLowerCase();return t===".js"||t===".mjs"}catch{return false}}function Ue(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 no(e){return Ze(e.toString("base64"),40)}function ro(e,t,n){let r=e.assetVariantDigestsByOriginalPath.get(t);if(!r||r.size===0)return false;for(let s of r)if(s!==n)return true;return false}function so(e,t,n){let r=e.assetVariantDigestsByOriginalPath.get(t);r||(r=new Set,e.assetVariantDigestsByOriginalPath.set(t,r)),r.add(n);}async function cn(e,t,n,r,s,i,a){let u=At(e,n),o=no(r),l=u.originalFilePath,c=u.originalPublicUrlWithSearch;if(u.preferQueryHashed&&u.hashedFilePath&&u.hashedPublicUrl&&ro(s,u.originalFilePath,o)){let g=qi(e,t,n);g?(l=g.outputPath,c=g.publicUrl):(l=u.hashedFilePath,c=u.hashedPublicUrl);}Zi(e,t,n,c,u.originalPublicUrl);let d=be(l)?Buffer.from(en(r.toString("utf8"),e,t,l),"utf8"):r,p=await qr(l),f=false;return (p===null||!p.equals(d))&&(await Ye(l,d),f=true),i?.debug(`${f?"Saved":"Skipped unchanged"} asset output ${n}`,{phase:"download-assets",url:n,outputPath:l,bytes:d.length,wroteFile:f}),so(s,u.originalFilePath,o),await eo(l,a),s.stats.assetsSaved++,i&&(s.stats.assetsSaved%50===0||s.stats.assetsSaved===1)&&i.progress(`Asset progress: saved ${s.stats.assetsSaved}, discovered ${s.stats.assetsQueued}, pending ${s.assetQueue.length}.`,{assetsSaved:s.stats.assetsSaved,assetsQueued:s.stats.assetsQueued,assetQueue:s.assetQueue.length,phase:"download-assets"}),{outputPath:l,publicUrl:c,wroteFile:f}}function nt(e,t,n,r,s){let i=()=>{let d=String(s??"").trim();if(!d)return {discoveredFrom:"",discoveredFromType:"unknown"};if(d==="seed-path"||d==="cli"||d==="generated-404-request-path")return {discoveredFrom:d,discoveredFromType:d};if(/^https?:\/\//i.test(d))try{let p=new URL(d);return _e(p)?{discoveredFrom:d,discoveredFromType:"sitemap"}:B(e,p)?{discoveredFrom:d,discoveredFromType:"asset"}:Ce(p)&&!qe(p)?{discoveredFrom:d,discoveredFromType:"page"}:{discoveredFrom:d,discoveredFromType:"url"}}catch{return {discoveredFrom:d,discoveredFromType:"url"}}return {discoveredFrom:d,discoveredFromType:"url"}},a=s&&/^https?:\/\//i.test(s)?s:e.sourceOrigin,u=z(e,n,a,r,"page");if(!u)return;if(!Ce(u)||jr(u)){if(B(e,u)){r.info(`Seeded/non-page URL queued as asset: ${u.toString()}`,{url:u.toString(),source:s}),W(e,t,u.toString(),r,s);return}r.reject("page",u.toString(),qe(u)?"asset/internal path cannot be page":"not page-like",s);return}let o=u.toString(),{discoveredFrom:l,discoveredFromType:c}=i();l&&!t.pageDiscoverySources.has(o)&&t.pageDiscoverySources.set(o,l),!t.donePages.has(o)&&!t.queuedPages.has(o)&&(t.queuedPages.add(o),t.pageQueue.push(o),t.stats.pagesQueued++,r.debug(`Queued discovered page ${o}`,{phase:"discovery",url:o,discoveredFrom:l,discoveredFromType:c,outputPath:ge(e,o)}),(t.stats.pagesQueued%25===0||t.stats.pagesQueued===1)&&r.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 W(e,t,n,r,s){let i=s&&/^https?:\/\//i.test(s)?s:e.sourceOrigin,a=z(e,n,i,r,"asset");if(!a)return;if(!B(e,a)){r.reject("asset",a.toString(),"not a safe asset path/prefix",s);return}let u=a.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)&&r.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 It(e,t,n,r,s){let i=s&&/^https?:\/\//i.test(s)?s:e.sourceOrigin,a=z(e,n,i,r,"sitemap");if(!a)return;if(!_e(a)){r.reject("sitemap",a.toString(),"not sitemap-like",s);return}let u=a.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)&&r.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 io(e){let t=de(e),n=[...t.matchAll(/<url>\s*([\s\S]*?)\s*<\/url>/gi)].map(r=>r[1]);return n.length>0?n.map(r=>{let s=r.match(/<loc>\s*([^<]+?)\s*<\/loc>/i);if(!s?.[1])return null;let i=r.match(/<lastmod>\s*([^<]+?)\s*<\/lastmod>/i);return {loc:s[1].trim(),lastmod:et(i?.[1]??null)}}).filter(r=>!!r):[...t.matchAll(/<loc>\s*([^<]+?)\s*<\/loc>/gi)].map(r=>({loc:r[1].trim(),lastmod:null})).filter(r=>r.loc)}function oo(e){return e.split(",").map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function ao(e){let t=[],n=/url\(\s*(?:"([^"]+)"|'([^']+)'|([^)]*?))\s*\)/gi;for(let r of e.matchAll(n)){let s=e.slice(Math.max(0,r.index-8),r.index);if(/\bnew\s+$/i.test(s))continue;let i=(r[1]||r[2]||r[3]||"").trim();i&&t.push(i);}return t}function co(e){return e.replace(/<script\b[^>]*>[\s\S]*?<\/script\s*>/gi,"")}function uo(e,t){if(t==="dom-style")return true;let n=(()=>{try{return S.extname(new URL(e).pathname).toLowerCase()}catch{return ""}})();return !(n===".js"||n===".mjs"||n===".map"||t.includes("javascript"))}function rn(e){return e.trim().replace(/\\/g,"/").replace(/^https?:\/\/[^/]+/i,"").replace(/^\/+/,"")}async function Nr(e,t,n,r){let s=[];await T.mkdir(t,{recursive:true});let i=await T.readdir(e,{withFileTypes:true});for(let a of i){let u=S.join(e,a.name),o=S.join(t,a.name);if(a.isDirectory()){s.push(...await Nr(u,o,n,r));continue}await Br(u,o,n,r)&&s.push(o);}return s}async function lo(e,t){try{let[n,r]=await Promise.all([T.stat(e),T.stat(t)]);if(n.size!==r.size)return !1;let[s,i]=await Promise.all([T.readFile(e),T.readFile(t)]);return s.equals(i)}catch{return false}}async function Br(e,t,n,r){let s=S.resolve(t);return n.has(s)?(r.debug("Skipped post-crawl copy over crawled page output",{phase:"copy-extra-paths",sourcePath:e,targetPath:t}),false):await lo(e,t)?(r.debug("Skipped unchanged post-crawl copy target",{phase:"copy-extra-paths",sourcePath:e,targetPath:t}),false):(await T.mkdir(S.dirname(t),{recursive:true}),await T.copyFile(e,t),true)}async function po(e,t,n){let r=Object.entries(e.postCrawlCopyMap||{}).map(([u,o])=>({sourcePath:u.trim(),prefix:String(o||"").trim()}));if(r.length===0)return [];let s=0,i=[],a=new Set([...t.donePages].map(u=>S.resolve(ge(e,u))));n.mark("copy-extra-paths");for(let u of r){let o=u.sourcePath,l=u.prefix;if(!o||!l){n.warn("Skipped post-crawl copy mapping with empty key/value",{sourcePath:o,prefixPath:l});continue}let c=vi(o);if(!c.resolvedPath){n.warn("Skipped post-crawl copy source because alias root is not configured",{sourcePath:o,alias:c.alias||"",requiredEnv:c.requiredEnv||"",prefixPath:l});continue}let d=c.resolvedPath,p=rn(l);if(!p){n.warn("Skipped post-crawl copy mapping with invalid export prefix",{sourcePath:o,prefixPath:l});continue}let f;try{f=await T.stat(d);}catch{n.warn("Skipped post-crawl copy source because it does not exist",{sourcePath:o,sourceAbs:d,prefixPath:l});continue}let g=S.resolve(e.outputDir,p);if(f.isDirectory()){let w=await Nr(d,g,a,n);i.push(...w),s+=w.length,w.length>0&&n.progress(`Copied static directory to export: ${d} -> /${p}`,{phase:"copy-extra-paths",sourcePath:d,targetPath:`/${p}`,copiedItems:s,changedFiles:w.length});continue}let y=S.basename(d),m=l.endsWith("/")?S.join(g,y):g;await Br(d,m,a,n)&&(i.push(m),s++,n.progress(`Copied static file to export: ${d} -> /${rn(l.endsWith("/")?`${l}${y}`:l)}`,{phase:"copy-extra-paths",sourcePath:d,targetPath:`/${rn(l.endsWith("/")?`${l}${y}`:l)}`,copiedItems:s}));}return n.endMark("copy-extra-paths",{mappedSources:r.length,copiedItems:s}),i}function rt(e,t,n,r,s){let i=new Set,a=de(n).replace(/\\\//g,"/"),u=s==="page-html"?co(a):a,o=uo(t,s);if(o){for(let c of ao(u)){let d=z(e,c,t,r,`${s}:css-url`);d&&B(e,d)&&i.add(d.toString());}for(let c of u.matchAll(/@import\s+(?:url\()?\s*['"]?([^'"\s;]+)['"]?\s*\)?/gi)){let d=z(e,c[1],t,r,`${s}:css-import`);d&&B(e,d)&&i.add(d.toString());}}if(o||s==="page-html")for(let c of u.matchAll(/<\?xml-stylesheet[^>]+href=["']([^"']+)["'][^>]*\?>/gi)){let d=z(e,c[1],t,r,`${s}:xml-stylesheet`);d&&B(e,d)&&i.add(d.toString());}let l=new RegExp(`(?:https?:)?//[^\\s'"<>\\);]+\\.${tn}(?:\\?[^\\s'"<>\\);]*)?|(?<!\\.)/[^\\s'"<>\\);]+\\.${tn}(?:\\?[^\\s'"<>\\);]*)?`,"gi");if(s==="page-html")for(let c of a.matchAll(l)){let d=c[0].startsWith("//")?`${new URL(e.sourceOrigin).protocol}${c[0]}`:c[0];if(an(d)){r.ignore(`${s}:serialized-url`,d,"looks like JavaScript/code fragment",t);continue}let p=z(e,d,t,r,`${s}:serialized-url`);p&&B(e,p)?i.add(p.toString()):p&&r.ignore("asset",p.toString(),"serialized URL did not pass safe asset path filter",t);}if(s!=="page-html"&&to(t))for(let c of lr(a)){if(an(c)||!/\.(?:js|mjs)(?:[?#]|$)/i.test(c))continue;let d=z(e,c,t,r,`${s}:relative-asset`);d&&B(e,d)&&i.add(d.toString());}return [...i]}function go(e,t,n,r){let s=new Set,i=de(n);for(let a of i.matchAll(/href=["']([^"'#\s][^"']*?)["']/gi)){let u=a[1],o=z(e,u,t,r,"page-link");o&&(Ur(e,o)||Ce(o)&&!qe(o)&&!B(e,o)&&s.add(o.toString()));}return [...s]}async function Cr(e,t,n,r,s,i,a=false,u=[]){let o=new Set(u),l=0,c=new Map,d=(p,f)=>{let g=[f],y=new Set;for(;g.length>0;){let m=g.pop();if(m===p)return true;y.has(m)||(y.add(m),g.push(...c.get(m)??[]));}return false};for(;n.sitemapQueue.length>0;){let p=n.sitemapQueue.shift();n.queuedSitemaps.delete(p);let f=ve(p,r,"sitemap","sitemap-queue");if(!f)continue;let g=f.toString();if(n.doneSitemaps.has(g))continue;n.doneSitemaps.add(g),r.sitemap(`Fetching sitemap ${g}`,{url:g});let y=true;try{let m=await t.get(g,{timeout:6e4});if(y=!1,!m.ok()){if(r.skip("sitemap",g,m.status()),a&&!o.has(g))throw new Error(`Required child content-sync sitemap returned HTTP ${m.status()}: ${g}`);continue}let h=await m.body(),w=m.url()||g,v=ve(w,r,"sitemap-response",g);if(!v)continue;let I=v.toString();n.successfulSitemaps.add(g),n.successfulSitemaps.add(I),o.has(g)&&(n.resolvedSitemapRoots.add(I),l+=1);let j=await cn(e,n.assetMap,I,h,n,r);X(s,e,j.outputPath),Ie(s,j.outputPath);let U=h.toString("utf8");/<sitemapindex(?:\s|>)/i.test(U)?n.sitemapIndexUrls.add(I):n.sitemapLeafUrls.add(I);let $=rt(e,I,U,r,"sitemap");for(let q of $)W(e,n,q,r,I);let C=[];for(let q of io(U)){let R=z(e,q.loc,I,r,"sitemap-loc");if(!R){if(a)throw new Error(`Content-sync sitemap contains an inadmissible location: ${q.loc}`);continue}if(_e(R)){if(d(I,R.toString()))throw new Error(`Sitemap index cycle detected: ${I} -> ${R.toString()}`);if(c.has(I)||c.set(I,new Set),c.get(I).add(R.toString()),C.push(R.toString()),a&&n.doneSitemaps.has(R.toString())&&!n.successfulSitemaps.has(R.toString()))throw new Error(`Required child content-sync sitemap was not resolved: ${R.toString()}`);It(e,n,R.toString(),r,I);}else if(a){if(Ce(R)&&!B(e,R)){let M=i.requiredUrls.has(R.toString()),b=i.manifest.pages[R.toString()],A=!!b&&!!await Le(b.outputPath);if(!M&&!A)throw new Error(`Content-sync sitemap coverage is incomplete for ${R.toString()}.`)}r.ignore("sitemap-loc",R.toString(),"content-sync sitemap-only traversal does not enqueue urlset locations",I);}else B(e,R)?W(e,n,R.toString(),r,I):Ce(R)?(q.lastmod&&(n.sitemapLastmodByPage[R.toString()]=q.lastmod),nt(e,n,R.toString(),r,I)):r.reject("sitemap-loc",R.toString(),"not page/sitemap/asset-like",I);}i.trackManifest&&(i.manifest.assets[I]={url:I,outputPath:j.outputPath,isText:!0,contentType:m.headers()["content-type"]??"application/xml",changeToken:null,tokenSource:null,discoveredAssets:[...new Set([...$,...C])],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,unreferencedRuns:0,rewriteComplete:!1},await Pe(e,i));}catch(m){r.error(`Failed sitemap ${g}`,{url:g,error:String(m)});let h=a&&o.has(g)&&y;if(a&&!h)throw m}}if(a&&o.size>0&&l===0)throw new Error(`None of the configured content-sync sitemap roots could be resolved: ${[...o].join(", ")}`)}async function fo(e,t,n,r,s,i,a){let u=z(e,r,e.sourceOrigin,s,"asset-fetch");if(!u||!B(e,u))return;let o=u.toString();if(n.doneAssets.has(o))return;let l=i.enabled||i.strictTargeted?i.previousManifest.assets[o]:void 0,c=i.trackManifest?await vt(e,t,i,o,s):null,d=c?.token??null,p=dr(l?.changeToken,c),f=i.strictTargeted&&(!c?.supported||!c.token)&&pr(e.sourceOrigin,o),g=i.strictTargeted?i.manifest.assets[o]:void 0;if(g?.lastSeenRunId===i.runId&&await Le(g.outputPath)){n.doneAssets.add(o);for(let m of g.discoveredAssets||[])W(e,n,m,s,o);X(a,e,g.outputPath),g.isText&&Ie(a,g.outputPath),s.info(`Resumed completed content-sync asset ${o}`,{url:o,source:"content-sync-checkpoint"}),Ue(n,s);return}if(l&&(p||f)&&await Le(l.outputPath)){i.manifest.assets[o]={...l,changeToken:d,tokenSource:c?.tokenSource??l.tokenSource,discoveredAssets:[...l.discoveredAssets||[]],lastSeenRunId:i.runId,unreferencedRuns:0},delete i.manifest.pages[o],n.doneAssets.add(o);for(let m of l.discoveredAssets||[])W(e,n,m,s,o);s.info(`Reused unchanged trusted asset ${o}.`,{url:o,tokenSource:c?.tokenSource??"unknown",phase:"download-assets",source:p?"asset-change-token-match":"content-sync-release-fingerprint"}),Ue(n,s);return}let y=(m,h={})=>{if(!l||i.strictTargeted)return false;i.manifest.assets[o]={...l,discoveredAssets:[...l.discoveredAssets||[]],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,unreferencedRuns:0},delete i.manifest.pages[o],n.doneAssets.add(o);for(let w of l.discoveredAssets||[])W(e,n,w,s,o);return s.warn(`Keeping previous incremental asset ${o} after fetch issue.`,{url:o,reason:m,preservedFromPreviousManifest:true,...h,phase:"download-assets"}),Ue(n,s),true};s.asset(`Fetching asset ${o}`,{url:o});try{let m=je(e,n.assetMap,o),h=m?await Le(m):null;if(m&&h)try{let M=await H(`fetch asset headers ${o}`,6e4,()=>t.head(o,{timeout:6e4})),b=M.headers();if(M.ok()&&Xi(h,b)){let A=await qr(m);if(A!==null){let P=M.url()||o,E=ve(P,s,"asset-response",o);if(!E)return;let D=E.toString(),L=await cn(e,n.assetMap,D,A,n,s,b);L.wroteFile&&(X(a,e,L.outputPath),be(L.outputPath)&&Ie(a,L.outputPath)),n.doneAssets.add(o),s.info(`Reused existing asset ${o} based on response headers.`,{url:o,filePath:m,lastModified:b["last-modified"]||"",contentLength:b["content-length"]||"",phase:"download-assets"}),Ue(n,s);let G=vr(u,b),te=l?.discoveredAssets?[...l.discoveredAssets]:[];if(G||l?.isText){let ce=A.toString("utf8"),F=rt(e,D,ce,s,"asset:cached");(F.length>0||!l)&&(te=F);for(let Ae of te)W(e,n,Ae,s,D);}if(i.trackManifest){let ce=G||!!l?.isText;i.manifest.assets[o]={url:o,outputPath:L.outputPath,isText:ce,contentType:sn(b)||l?.contentType||null,changeToken:c?.supported?c.token:null,tokenSource:c?.supported?c.tokenSource??null:null,discoveredAssets:te,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,unreferencedRuns:0,rewriteComplete:!ce},delete i.manifest.pages[o],(i.enabled||i.strictTargeted)&&ce&&await Pe(e,i);}return}}}catch{}let w=await H(`fetch asset ${o}`,6e4,()=>t.get(o,{timeout:6e4}));if(!w.ok()){if(y(`http-${w.status()}`,{status:w.status()}))return;if(i.strictTargeted)throw new Error(`Required content-sync asset returned HTTP ${w.status()}: ${o}`);s.skip("asset",o,w.status());return}let v=await H(`read asset response ${o}`,6e4,()=>w.body()),I=w.url()||o,j=ve(I,s,"asset-response",o);if(!j)return;let U=j.toString(),$=w.headers(),C=await cn(e,n.assetMap,U,v,n,s,$);C.wroteFile&&(X(a,e,C.outputPath),be(C.outputPath)&&Ie(a,C.outputPath)),n.doneAssets.add(o),Ue(n,s);let q=vr(u,$),R=[];if(q){let M=v.toString("utf8");R=rt(e,U,M,s,`asset:${S.extname(u.pathname).toLowerCase()||$["content-type"]||"unknown"}`);for(let b of R)W(e,n,b,s,U);}i.trackManifest&&(i.manifest.assets[o]={url:o,outputPath:C.outputPath,isText:q,contentType:sn($),changeToken:c?.supported?c.token:null,tokenSource:c?.supported?c.tokenSource??null:null,discoveredAssets:R,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,unreferencedRuns:0,rewriteComplete:!q},delete i.manifest.pages[o],(i.enabled||i.strictTargeted)&&q&&await Pe(e,i));}catch(m){if(y("fetch-error",{error:String(m)}))return;if(s.error(`Failed asset ${o}`,{url:o,error:String(m)}),i.strictTargeted)throw m}finally{n.doneAssets.has(o)||(n.doneAssets.add(o),Ue(n,s));}}async function mo(e,t,n,r,s,i){let a=Math.max(1,Number(e.assetDownloadConcurrency||e.concurrency||1)),u=Array.from({length:a},async()=>{for(;n.assetQueue.length>0;){let o=n.assetQueue.shift();o&&(n.queuedAssets.delete(o),await fo(e,t,n,o,r,s,i));}});await Promise.all(u);}function ho(e){let t=Math.ceil(e/1e3);return `${t} second${t===1?"":"s"}`}function pe(e){return Math.max(6e4,e.navigationTimeoutMs*2,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+15e3)}function Ct(e){return Math.max(15e3,Math.min(6e4,pe(e)))}function wo(e){return Math.max(15e3,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+1e4)}function gn(e){return e.stats.pagesCompleted}function Hr(e){let n=e.options?.browserProcess;return {pid:typeof n?.process?.pid=="number"?n.process.pid:null,kill:typeof n?.kill=="function"?n.kill.bind(n):null}}async function yo(e,t,n){let r=Hr(e);try{if(r.kill){await r.kill(),t.warn(`Force-killed crawl worker browser after ${n}`,{browserPid:r.pid,reason:n});return}if(r.pid!==null){process.kill(r.pid,"SIGKILL"),t.warn(`Sent SIGKILL to crawl worker browser after ${n}`,{browserPid:r.pid,reason:n});return}t.warn(`Could not resolve crawl worker browser PID after ${n}`,{reason:n});}catch(s){t.error(`Failed to force-kill crawl worker browser after ${n}`,{browserPid:r.pid,reason:n,error:String(s)});}}async function H(e,t,n){let r;try{return await Promise.race([n(),new Promise((s,i)=>{r=globalThis.setTimeout(()=>{i(new Error(`${e} timed out after ${ho(t)}.`));},t);})])}finally{r!==void 0&&globalThis.clearTimeout(r);}}async function So(e,t){let n=wo(e);await t.evaluate(async r=>{await new Promise(s=>{let i=0,a=700,u=Date.now(),o=()=>{window.clearInterval(l),window.scrollTo(0,0),s();},l=window.setInterval(()=>{if(Date.now()-u>=r.maxDurationMs){o();return}window.scrollBy(0,a),i+=a;let c=document.body?.scrollHeight||0,d=document.documentElement?.scrollHeight||0,p=Math.max(c,d);i>=p+window.innerHeight&&o();},120);});},{maxDurationMs:n});}async function bo(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 So(e,t),await t.waitForTimeout(e.readiness.fallbackWaitMs);}async function Po(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 vo(e,t){return e.noJavaScriptRenderPathPrefixes.some(n=>ln(t,n))}async function Co(e,t,n,r,s=true){let i=new Set;if(s){let u=await t.evaluate(()=>{let o=new Set,l=["href","src","poster","data-src","data-lazy-src","data-original","data-bg","data-background","data-href"],c=new Set,d=["srcset","data-srcset","data-lazy-srcset"],p=f=>{f.querySelectorAll("*").forEach(g=>{for(let m of l){let h=g.getAttribute(m);h&&o.add(h);}for(let m of d){let h=g.getAttribute(m);h&&h.split(",").forEach(w=>{let v=w.trim().split(/\s+/)[0];v&&o.add(v);});}let y=g.getAttribute("style");y&&c.add(y),g.shadowRoot&&p(g.shadowRoot);});};return p(document),{attrs:[...o],styles:[...c]}});for(let o of u.attrs)for(let l of oo(o)){let c=z(e,l,n,r,"dom-attr");c&&B(e,c)&&i.add(c.toString());}for(let o of u.styles)for(let l of rt(e,n,o,r,"dom-style"))i.add(l);}let a=await t.content();for(let u of rt(e,n,a,r,"page-html"))i.add(u);return [...i]}async function Rr(e,t,n,r,s){let i=ge(e,t);await Ye(i,n,"utf8");let a=await T.stat(i);s?.debug(`Saved page output ${t}`,{phase:"save-pages",url:t,outputPath:i,bytes:a.size}),r.stats.pagesSaved++;let u=Math.min(r.stats.pagesQueued,gn(r)+1);s&&(r.stats.pagesSaved%10===0||r.stats.pagesSaved===1)&&s.progress(`Page progress: processed ${u}, rendered ${r.stats.pagesRendered}, saved ${r.stats.pagesSaved}, discovered ${r.stats.pagesQueued}.`,{donePages:u,claimedPages:r.donePages.size,pagesRendered:r.stats.pagesRendered,pagesSaved:r.stats.pagesSaved,pagesQueued:r.stats.pagesQueued,pageQueue:r.pageQueue.length,phase:"save-pages"});}function Ro(e){let t=gn(e);return t%5===0||t===1||t===e.stats.pagesQueued}function Io(e,t){let n=gn(e);t.progress(`Render progress: processed ${n}, rendered ${e.stats.pagesRendered}, saved ${e.stats.pagesSaved}, discovered ${e.stats.pagesQueued}.`,{donePages:n,claimedPages:e.donePages.size,pagesRendered:e.stats.pagesRendered,pagesSaved:e.stats.pagesSaved,pagesQueued:e.stats.pagesQueued,phase:"render-pages"});}async function xo(e){await e.addInitScript(()=>{Object.defineProperty(window,"__WPSUITE_STATIC_EXPORT__",{value:true,writable:false,configurable:true});let t=n=>{if(n==null||String(n)==="")return true;try{let r=new URL(String(n),window.location.href),s=new URL(window.location.href);return r.hash="",s.hash="",r.href===s.href}catch{return false}};try{let n=window.location.assign.bind(window.location),r=window.location.replace.bind(window.location),s=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 n(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 r(i)}}),Object.defineProperty(window.location,"reload",{configurable:!0,value:()=>{console.warn("[smartcloud-static-publisher] blocked location.reload");}});}catch{}});}async function Ao(e,t,n){let r=await e.newContext({viewport:t.viewport,userAgent:"WPSuiteStaticPublisher/0.8 Playwright SitemapOnly",ignoreHTTPSErrors:t.ignoreHttpsErrors,...n?{javaScriptEnabled:false}:{}});return n||await xo(r),r}async function To(e,t,n,r,s,i,a,u){let o=await chromium.launch({headless:true}),l=Hr(o);l.pid!==null&&n.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 c=t.pageQueue.shift();if(!c)break;t.queuedPages.delete(c);let d=null,p=null,f=[],g=new Set;try{let y=ve(c,n,"page","page-queue");if(!y)continue;let m=y.toString();if(c=m,t.queuedPages.delete(c),t.donePages.has(c))continue;t.donePages.add(c),i.enabled&&i.seenPages.add(c);let h=pn(e,c),w=vo(e,y.pathname);if(!Ce(y)||B(e,y)||qe(y)){if(B(e,y)){n.info(`Worker redirected non-page URL to asset queue: ${c}`,{url:c,source:"worker-guard"}),W(e,t,c,n,"worker-guard");continue}n.reject("page",c,"guard rejected non-page URL before rendering","worker");continue}let v=i.strictTargeted?i.manifest.pages[c]:void 0;if(v?.lastSeenRunId===i.runId&&await Le(v.outputPath)){i.seenPages.add(c);for(let P of v.discoveredAssets||[])W(e,t,P,n,c);X(a,e,v.outputPath),Ie(a,v.outputPath),n.info(`Resumed completed content-sync page ${c}`,{url:c,source:"content-sync-checkpoint"});continue}let I=await Ei(e,s,t,i,c,n);if(i.enabled&&r!=="single-url"&&r!=="content-sync"){let P=i.manifest.pages[c];if(I.action==="reuse"&&P){for(let E of P.discoveredAssets)W(e,t,E,n,c);for(let E of P.discoveredPages)nt(e,t,E,n,c);P.lastSeenRunId=i.runId,P.sitemapLastmod=et(t.sitemapLastmodByPage[c])??P.sitemapLastmod,I.changeToken?.supported&&(P.changeToken=I.changeToken.token,P.tokenSource=I.changeToken.tokenSource??P.tokenSource),n.info(`Incremental reuse skipped unchanged page ${c}`,{url:c,mode:"incremental",reason:I.changeToken?.supported===!0?"change-token-match":"sitemap-lastmod-match"});continue}}d=await H(`create page context ${c}`,pe(e),()=>Ao(o,e,w)),p=await H(`create page ${c}`,pe(e),()=>d.newPage()),f=await d.cookies();let j=!1,U=new Set;await p.route("**/*",async P=>{let E=P.request();try{let D=z(e,E.url(),e.sourceOrigin,n,"network-request");D&&B(e,D)&&(U.add(D.toString()),W(e,t,D.toString(),n,c));}catch{}if(E.isNavigationRequest()&&E.frame()===p.mainFrame())try{let D=new URL(E.url()),L=new URL(m);if(D.hash="",L.hash="",D.href===L.href){if(j){n.warn(`Blocked same-page navigation/reload for ${c}`,{url:c,requestUrl:E.url()}),await P.abort("aborted");return}j=!0;}}catch{}await P.continue();}),p.on("response",P=>{try{let D=z(e,P.url(),e.sourceOrigin,n,"network-response");D&&B(e,D)&&(U.add(D.toString()),W(e,t,D.toString(),n,c));}catch{}let E=P.headerValues("set-cookie").then(D=>{for(let L of D)u.add(mr(L,P.url()));}).catch(()=>{}).then(()=>{});g.add(E),E.finally(()=>g.delete(E));}),n.page(`Rendering ${c}`,{url:c});let $=null,C=null;try{if($=await p.goto(c,{waitUntil:"domcontentloaded",timeout:e.navigationTimeoutMs}),$&&$.ok())try{C=await H(`read response body ${c}`,pe(e),()=>$.text());}catch{C=null;}}catch(P){n.warn(`Navigation issue for ${c}; saving current DOM if available`,{url:c,error:String(P)});}if(r==="content-sync"&&$){let P=ve($.url(),n,"content-sync-final-response",c)?.toString();if(P&&P!==m){if(i.deleteOnMissingUrls.has(c)){await un(e,i,a,c,i.deleteOnMissingUrls),n.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(h){let P=$?.status()??null;if(P!==404){n.error(`Generated 404 request path returned unexpected status for ${c}`,{url:c,expectedStatus:404,status:P,requestPath:e.generated404RequestPath});continue}n.info(`Capturing rendered 404 page for ${c}`,{url:c,status:P,outputPath:ge(e,c)});}else if($&&!$.ok()){if(r==="content-sync"&&($.status()===404||$.status()===410)&&i.deleteOnMissingUrls.has(c)){await un(e,i,a,c,i.deleteOnMissingUrls),n.info(`Removed stale content-sync archive page ${c}`,{url:c,status:$.status(),source:"content-sync-tombstone"}),await p.close();continue}if(r==="content-sync")throw new Error(`Required content-sync route returned HTTP ${$.status()}: ${c}`);n.skip("page",c,$.status(),t.pageDiscoverySources.get(c)),await p.close();continue}w?(n.info(`Rendering without JS execution for ${c}`,{url:c,mode:"no-js"}),await H(`wait for rendered page ${c}`,pe(e),()=>Po(e,p))):await H(`wait for rendered page ${c}`,pe(e),()=>bo(e,p)),t.stats.pagesRendered++;let q=await H(`extract rendered assets ${c}`,pe(e),()=>Co(e,p,m,n,!w));for(let P of q)W(e,t,P,n,c);let R=[...new Set([...q,...U])],M=C??await H(`capture rendered html ${c}`,pe(e),()=>p.content()),b=r!=="single-url"&&r!=="content-sync"&&!h?go(e,c,M,n):[];if(r!=="single-url"&&r!=="content-sync"&&!h)for(let P of b)nt(e,t,P,n,c);await Rr(e,c,M,t,n);let A=ge(e,c);if(X(a,e,A),Ie(a,A),i.trackManifest){let P=$?.headers();i.manifest.pages[c]={url:c,outputPath:A,contentType:sn(P),changeToken:I.changeToken?.supported?I.changeToken.token:null,tokenSource:I.changeToken?.supported?I.changeToken.tokenSource??null:null,sitemapLastmod:et(t.sitemapLastmodByPage[c])??null,discoveredPages:b,discoveredAssets:R,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!1},(i.enabled||i.strictTargeted)&&await Pe(e,i);}}catch(y){if(i.strictTargeted)throw n.error(`Failed required content-sync page ${c}`,{url:c,error:String(y)}),y;try{let m=p?await H(`capture partial html ${c}`,pe(e),()=>p.content()):"";if(m&&m.trim()){await Rr(e,c,m,t,n);let h=ge(e,c);if(X(a,e,h),Ie(a,h),i.trackManifest){let w=i.manifest.pages[c]??i.previousManifest.pages[c];i.manifest.pages[c]={url:c,outputPath:h,contentType:w?.contentType??null,changeToken:null,tokenSource:null,sitemapLastmod:et(t.sitemapLastmodByPage[c])??w?.sitemapLastmod??null,discoveredPages:w?.discoveredPages?[...w.discoveredPages]:[],discoveredAssets:w?.discoveredAssets?[...w.discoveredAssets]:[],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!1},(i.enabled||i.strictTargeted)&&await Pe(e,i);}n.warn(`Saved partial DOM for ${c}`,{url:c,error:String(y)});}}catch(m){n.error(`Could not save partial DOM for ${c}`,{url:c,error:String(m)});}n.error(`Failed page ${c}`,{url:c,error:String(y)});}finally{if(g.size>0&&await Promise.allSettled([...g]),d)try{let y=await d.cookies();u.addAll(hr(f,y));}catch{}t.stats.pagesCompleted++,Ro(t)&&Io(t,n),p&&await H(`close page ${c}`,Ct(e),()=>p.close()).catch(y=>{n.warn(`Timed out while closing page ${c}`,{url:c,browserPid:l.pid,error:String(y)});}),d&&await H(`close page context ${c}`,Ct(e),()=>d.close()).catch(y=>{n.warn(`Timed out while closing page context for ${c}`,{url:c,browserPid:l.pid,error:String(y)});});}}}finally{await H("close worker browser",Ct(e),()=>o.close()).catch(c=>(n.warn("Timed out while closing crawl worker browser",{browserPid:l.pid,error:String(c)}),yo(o,n,"browser.close timeout")));}}async function ko(e){try{let t=await T.readFile(e),r=(e.endsWith(".gz")?gunzipSync(t):t).toString("utf8").trim();if(!r)return [];try{let s=JSON.parse(r);if(Array.isArray(s))return s;if(s&&typeof s=="object")return [s]}catch{return r.split(/\r?\n/).map(s=>s.trim()).filter(Boolean).map(s=>{try{let i=JSON.parse(s);return i&&typeof i=="object"?i:null}catch{return null}}).filter(s=>s!==null)}return []}catch{return []}}function Ir(e){let t=String(e||"").toLowerCase();return t.includes("timeout")||t.includes("timed out")||t.includes("navigation timeout")}function $o(e){let t=String(e?.job?.command||"").trim(),n=String(e?.job?.crawlMode||"full").trim();return t!=="publish"&&t!=="crawl"?false:n!=="incremental"}function Eo(e){let t=[e?.archivedAt,e?.job?.endedAt,e?.job?.startedAt];for(let n of t){let r=Date.parse(String(n||""));if(Number.isFinite(r))return r}return 0}async function Wr(e){try{let t=await T.readFile(e,"utf8"),n=JSON.parse(t);return n&&typeof n=="object"&&!Array.isArray(n)?n:null}catch{return null}}function xr(e){let t=String(e.originalFileName||"").toLowerCase();return t.endsWith("errors.jsonl")?0:t.endsWith("errors.json")?1:2}function Mo(e,t){let n=Array.isArray(t?.artifacts)?t.artifacts.filter(r=>String(r?.role||"").trim()==="errors"&&String(r?.storedFileName||"").trim()!=="").sort((r,s)=>xr(r)-xr(s)).map(r=>S.join(e,String(r.storedFileName))):[];return [...new Set([...n,S.join(e,"errors.jsonl"),S.join(e,"errors.json"),S.join(e,"errors.jsonl.gz"),S.join(e,"errors.json.gz")])]}async function Ar(e){let t=await Wr(S.join(e,"job.json"));for(let n of Mo(e,t)){let r=await ko(n);if(r.length>0)return r}return []}async function Do(e){let t=S.join(e.logDir,"archive"),n;try{n=await T.readdir(t);}catch{return ""}let r="",s=0;for(let i of n){let a=S.join(t,i);if(!(await T.stat(a).catch(()=>null))?.isDirectory())continue;let o=await Wr(S.join(a,"job.json"));if(!$o(o))continue;let l=Eo(o);l>=s&&(s=l,r=a);}return r}async function Fo(e){let t=await Do(e),n=t!==""?await Ar(t):await Ar(e.logDir),r=new Set;for(let s of n)if(Ir(s.error)||Ir(s.message)){let i=s.url;typeof i=="string"&&i&&r.add(i);}return [...r]}async function Oo(e){let t=[];for(let n of e)if(n.startsWith("@")){let r=n.slice(1),s=await T.readFile(r,"utf8");t.push(...s.split(/\r?\n/).map(i=>i.trim()).filter(i=>i&&!i.startsWith("#")));}else t.push(n);return t}async function Uo(e){if(!e)throw new Error("Content-sync crawl requires an immutable impact plan.");let t=JSON.parse(await T.readFile(e,"utf8"));return Je(t),t}function Lo(e,t){let n;try{n=new URL(e);}catch{return false}return t.archiveFamilies.some(r=>{let s=new URL(r.url);if(n.origin!==s.origin)return false;if(n.toString()===s.toString())return true;if(n.searchParams.has("paged")&&n.pathname===s.pathname)return /^\d+$/.test(n.searchParams.get("paged")||"");let i=s.pathname.replace(/\/+$/,""),a=n.pathname.slice(i.length).replace(/^\/+/,""),u=String(r.paginationBase||"page").replace(/^\/+|\/+$/g,"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return n.pathname.startsWith(`${i}/`)&&new RegExp(`^${u}/\\d+/?$`).test(a)})}function Pt(e,t,n){let r=n==="page"?ge(e,t):At(e,t).originalFilePath;return Se(e.outputDir,r)}async function un(e,t,n,r,s){let i=t.manifest.pages[r];if(!i)return;let a=Se(e.outputDir,i.outputPath);if(!a)throw new Error(`Manifest-owned page path escaped output root: ${r}`);let u=S.resolve(i.outputPath);Object.entries(t.manifest.pages).some(([l,c])=>l!==r&&!s.has(l)&&S.resolve(c.outputPath)===u)||(await T.rm(i.outputPath,{force:true}),n.deletedFiles.add(a)),delete t.manifest.pages[r];}function jo(e,t){let n=new Set,r=[...t];for(;r.length>0;){let s=r.shift();if(n.has(s))continue;n.add(s);let i=e.assets[s];for(let a of i?.discoveredAssets??[])try{_e(new URL(a))&&r.push(a);}catch{}}return n}async function qo(e,t,n,r,s){let i=jo(n.previousManifest,s);for(let a of i){if(t.successfulSitemaps.has(a))continue;let u=n.previousManifest.assets[a];if(!u)continue;let o=Se(e.outputDir,u.outputPath);if(!o)throw new Error(`Manifest-owned sitemap path escaped output root: ${a}`);await T.rm(u.outputPath,{force:true}),r.deletedFiles.add(o),delete n.manifest.assets[a];}await Pe(e,n);}async function _o(e){try{let t=await T.readFile(S.join(e.outputDir,"asset-map.json"),"utf8");return JSON.parse(t)}catch{return {}}}async function No(e){let t=["crawl.log.jsonl","current-crawl-event.json","rejected.jsonl","ignored.jsonl","skipped-http.jsonl","errors.jsonl","timings.jsonl","rejected.json","ignored.json","skipped-http.json","errors.json","timings.json"];await T.mkdir(e,{recursive:true}),await Promise.all(t.map(async n=>{try{await T.unlink(S.join(e,n));}catch(r){if(r.code!=="ENOENT")throw r}}));}function Tr(e,t,n,r,s){let i=z(e,n,e.sourceOrigin,r,"manual-url");i&&(_e(i)?It(e,t,i.toString(),r,s):B(e,i)?W(e,t,i.toString(),r,s):Ce(i)?nt(e,t,i.toString(),r,s):r.reject("manual-url",i.toString(),"not page/sitemap/asset-like",s));}async function zr(e=process.argv.slice(2)){let t=[],n=await se(void 0,{onRemotePublisherConfigDiagnostic:b=>{t.push(b);}}),r=Ke(n.sitemapPaths),s=t.at(-1)??null,i=yi(e),a=i.mode==="content-sync"?await Uo(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 Fo(n)),i.mode==="single-url"&&(u=await Oo(i.urls)),a&&(u=[...a.directRenderUrls,...a.archiveFamilyUrls]);let o=i.crawlMode==="incremental"&&i.mode==="full",l=o&&typeof n.subscriptionType=="string"&&n.subscriptionType.trim()!=="";if(a&&n.subscriptionType!=="PROFESSIONAL"&&n.subscriptionType!=="AGENCY")throw new Error("Content-sync requires an active Professional or Agency subscription.");let c=(i.mode==="full"||i.mode==="single-url"||i.mode==="content-sync")&&!i.resumeRewrite,d=i.mode!=="full"||i.resumeRewrite||l,p=d?await _o(n):{},f=l||i.mode==="single-url"||i.mode==="content-sync"?await Ii(n):Mr(),g=new Set(u),y=new Set;if(a){for(let b of a.archiveFamilies)if(b.foundPosts===0)for(let A of b.pageUrls)y.add(A);for(let b of Object.keys(f.pages))Lo(b,a)&&!g.has(b)&&(u.push(b),y.add(b));}let m={enabled:l,trackManifest:c,manifest:on(f),previousManifest:on(f),runId:a?.jobId??`${Date.now()}`,seenPages:new Set,changeTokenCache:new Map,manifestSaveChain:Promise.resolve(),strictTargeted:!!a,requiredUrls:g,deleteOnMissingUrls:y};await No(n.logDir);let h=new ht(n.logDir,n.logLevel);if(s){let b={status:s.status,virtualAssetBaseUrl:s.virtualAssetBaseUrl,subscriptionType:s.subscriptionType??null,error:s.error,requests:s.requests,source:"remote-publisher-config"};s.status==="loaded"&&s.subscriptionType?h.info("Loaded remote WP Suite publisher configuration.",b):h.warn("Remote WP Suite publisher configuration is unavailable or has no active subscription type.",b);}if(o&&!l){let b="Incremental crawl requires an active remote publisher subscription; refusing to fall back to a destructive full crawl.";throw h.error(b,{requestedMode:i.crawlMode,subscriptionType:n.subscriptionType??null,source:"incremental-subscription-guard"}),await h.flush(),new Error(b)}let w={pageQueue:[],queuedPages:new Set,donePages:new Set,pageDiscoverySources:new Map,assetQueue:[],queuedAssets:new Set,doneAssets:new Set,sitemapQueue:[],queuedSitemaps:new Set,doneSitemaps:new Set,successfulSitemaps:new Set,resolvedSitemapRoots:new Set,sitemapIndexUrls:new Set,sitemapLeafUrls:new Set,sitemapLastmodByPage:{},assetMap:{...p},assetVariantDigestsByOriginalPath:new Map,stats:{pagesQueued:0,pagesRendered:0,pagesCompleted:0,assetsQueued:0,sitemapsQueued:0,assetsSaved:0,pagesSaved:0}},v=Ri(),I=new yt,j=Si();if(j&&!i.resumeRewrite&&await St(j,I.artifact()),await De(n),await Kn(n,{startedAt:new Date().toISOString(),outputDir:S.resolve(n.outputDir)}),d||await T.rm(n.outputDir,{recursive:true,force:true}),await T.mkdir(n.outputDir,{recursive:true}),a){let b=new Set([...a.deleteUrls,...m.deleteOnMissingUrls]);for(let A of a.deleteUrls)await un(n,m,v,A,b);}if(i.resumeRewrite)h.info("Resuming final rewrite from existing output.",{phase:"rewrite-text",mode:i.mode,crawlMode:i.crawlMode});else {let b=await request.newContext({ignoreHTTPSErrors:n.ignoreHttpsErrors});try{if(h.mark("discovery"),i.mode==="full"?(r.forEach(P=>It(n,w,P,h)),await Cr(n,b,w,h,v,m),n.seedPaths.forEach(P=>Tr(n,w,P,h,"seed-path")),n.generated404RequestPath&&nt(n,w,n.generated404RequestPath,h,"generated-404-request-path")):(u.forEach(P=>Tr(n,w,P,h,"cli")),a?.sitemapUrls.forEach(P=>It(n,w,P,h,"content-sync-impact")),await Cr(n,b,w,h,v,m,i.mode==="content-sync",a?.sitemapUrls??[]),a&&await qo(n,w,m,v,a.sitemapUrls)),h.endMark("discovery",{pages:w.pageQueue.length,assets:w.assetQueue.length,sitemaps:w.sitemapQueue.length}),h.summary(`Queued ${w.pageQueue.length} pages, ${w.assetQueue.length} assets, ${w.sitemapQueue.length} sitemaps.`,{mode:i.mode,crawlMode:i.crawlMode,queuedPages:w.pageQueue.length,queuedAssets:w.assetQueue.length,queuedSitemaps:w.sitemapQueue.length}),i.mode==="retry-timeouts"&&w.pageQueue.length===0&&w.assetQueue.length===0&&w.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(),j&&await St(j,I.artifact());return}h.mark("render-pages");let A=Array.from({length:Math.max(1,n.concurrency)},()=>To(n,w,h,i.mode,b,m,v,I));if(await Promise.all(A),j&&await St(j,I.artifact()),h.endMark("render-pages",{pages:w.stats.pagesCompleted}),h.mark("download-assets"),h.progress("Asset download phase started.",{phase:"download-assets",doneAssets:w.doneAssets.size,assetsQueued:w.stats.assetsQueued,assetQueue:w.assetQueue.length}),await Ti(n,b,m,[...w.assetQueue],h),await mo(n,b,w,h,m,v),h.endMark("download-assets",{assets:w.doneAssets.size}),m.enabled&&n.maxPages===0&&await Di(n,w,m,h,v),i.mode==="full"){let P=await po(n,w,h);for(let E of P)X(v,n,E);}}finally{await H("dispose crawl request context",Ct(n),()=>b.dispose()).catch(A=>{h.warn("Timed out while disposing crawl request context",{error:String(A)});});}}m.trackManifest&&await Pe(n,m),await T.writeFile(S.join(n.outputDir,"asset-map.json"),JSON.stringify(w.assetMap,null,2),"utf8"),JSON.stringify(p,null,2)!==JSON.stringify(w.assetMap,null,2)&&X(v,n,S.join(n.outputDir,"asset-map.json"));let U=i.mode==="single-url"||i.mode==="content-sync"?Bi(n,w):m.enabled&&!i.resumeRewrite?Fi(n,m,v,p,w.assetMap):void 0;h.mark("rewrite-text");let $=i.mode==="single-url"||i.mode==="content-sync"?`Rewriting text files touched by URL crawl: 0/${U?.length??0}`:"Rewriting text files...";h.progress($,{phase:"rewrite-text",index:0,totalFiles:U?.length,changedTextFiles:0}),await Pr($);let C=Date.now(),q=await gt(n,w.assetMap,{files:U,previousAssetMap:p,onStart:({totalFiles:b,workerCount:A})=>{h.info(`Rewrite phase scanning ${b} text files.`,{phase:"rewrite-text",totalFiles:b,workerCount:A});},onProgress:async({index:b,totalFiles:A,changedTextFiles:P,file:E,changed:D})=>{D&&X(v,n,S.join(n.outputDir,E)),h.checkpoint(`Rewriting text file ${b}/${A}`,{phase:"rewrite-text",index:b,totalFiles:A,changedTextFiles:P,file:E}),h.debug(`${D?"Rewrote":"Checked unchanged"} text file ${b}/${A}: ${E}`,{phase:"rewrite-text",index:b,totalFiles:A,changedTextFiles:P,file:E,changed:D});let L=Date.now();if(!(b===1||b===A||b%50===0||L-C>=5e3))return;C=L;let te=`Rewriting text files: ${b}/${A}`;h.progress(te,{phase:"rewrite-text",index:b,totalFiles:A,changedTextFiles:P,file:E}),await Pr(te);}});m.trackManifest&&(Oi(m,U),await Pe(n,m)),h.endMark("rewrite-text",{changedTextFiles:q});let R=a?[...v.deletedFiles].sort():m.enabled&&!i.resumeRewrite?await Li(n,w,m,v,h):[],M=[...new Set((U||[]).map(b=>Se(n.outputDir,S.isAbsolute(b)?b:S.join(n.outputDir,b))).filter(b=>b!==null))].sort();if(a){let b=[...v.changedFiles].sort(),A=new Set(b),P=new Set(a.directRenderUrls.map(F=>Pt(n,F,"page")).filter(F=>!!F&&A.has(F))),E=new Set(a.archiveFamilyUrls.map(F=>Pt(n,F,"page")).filter(F=>!!F&&A.has(F))),D=new Set([...w.sitemapLeafUrls].map(F=>Pt(n,F,"asset")).filter(F=>!!F&&A.has(F))),L=new Set([...w.sitemapIndexUrls].map(F=>Pt(n,F,"asset")).filter(F=>!!F&&A.has(F))),G=new Set([...P,...E,...D,...L]),te=b.filter(F=>!G.has(F)),ce=[...new Set([...a.directRenderUrls,...a.archiveFamilyUrls,...w.resolvedSitemapRoots,...w.sitemapLeafUrls,...w.sitemapIndexUrls,...a.deleteUrls].map(F=>{let Ae=new URL(F);return `${Ae.pathname}${Ae.search}`}))].sort();await Gt(n,{schemaVersion:2,generatedAt:new Date().toISOString(),outputDir:S.resolve(n.outputDir),runMode:"content-sync",crawlMode:"incremental",fullSyncRequired:false,changedFiles:b,deletedFiles:R,rewriteTargets:M,consumerId:a.consumerId,fromSequence:a.fromSequence,toSequence:a.toSequence,impactHash:a.impactHash,resolvedSitemapUrls:[...w.resolvedSitemapRoots],uploadGroups:{assets:te,content:[...P].sort(),listings:[...E].sort(),sitemapLeaves:[...D].sort(),sitemapIndexes:[...L].reverse()},invalidationPaths:ce});}else await Gt(n,{schemaVersion:1,generatedAt:new Date().toISOString(),outputDir:S.resolve(n.outputDir),runMode:i.mode,crawlMode:i.crawlMode,fullSyncRequired:!(m.enabled&&!i.resumeRewrite),changedFiles:m.enabled&&!i.resumeRewrite?[...v.changedFiles].sort():[],deletedFiles:m.enabled&&!i.resumeRewrite?R:[],rewriteTargets:m.enabled&&!i.resumeRewrite?M:[]});await Zn(n),h.summary(i.resumeRewrite?`Done. Resumed final rewrite over existing output and changed ${q} text files.`:`Done. Rendered ${w.stats.pagesRendered} pages, processed ${w.doneSitemaps.size} sitemaps and ${w.doneAssets.size} assets.`,{mode:i.mode,crawlMode:i.crawlMode,resumeRewrite:i.resumeRewrite,...w.stats,pagesRendered:w.stats.pagesRendered,donePages:w.stats.pagesCompleted,claimedPages:w.donePages.size,doneSitemaps:w.doneSitemaps.size,doneAssets:w.doneAssets.size,changedTextFiles:q}),await h.flush();}function Bo(e){let t=e/6e4;if(Number.isInteger(t)&&t>=1)return `${t} minute${t===1?"":"s"}`;let n=Math.ceil(e/1e3);return `${n} second${n===1?"":"s"}`}async function ee(e,t,n){let r=new AbortController,s=globalThis.setTimeout(()=>{r.abort(new Error(`${e} timed out after ${Bo(t)}.`));},t);try{return await n({abortController:r,httpOptions:{abortSignal:r.signal,requestTimeout:t}})}finally{globalThis.clearTimeout(s);}}function Ho(e){return typeof e.subscriptionType=="string"&&e.subscriptionType.trim()!==""}function Tt(e){let t="";for(let r=0;r<e.length;r++){let s=e[r];if(s==="--profile"){let i=(e[r+1]||"").trim();if(!i)throw new Error("Missing value for --profile.");t=i,r+=1;}else if(s.startsWith("--profile=")){let i=s.slice(10).trim();if(!i)throw new Error("Missing value for --profile.");t=i;}}let n=String(process.env.PUBLISHER_DEPLOY_PROFILE||process.env.PUBLISHER_DEPLOYMENT_PROFILE||"").trim();return t||n||null}function Wo(e,t){return {...e,...t??{}}}function zo(e,t){return {...e,...t??{},invalidationPaths:[...(t?.invalidationPaths??e.invalidationPaths)||[]]}}function Ne(e,t){let n=String(t??e.deploymentTargetOverride??"").trim();if(!Ho(e)){if(n)throw new Error(`Deployment target "${n}" requires an active WPSuite subscription and remote publisher config.`);return {name:null,profile:null,config:e}}let r=String(n||e.defaultDeploymentProfile||"").trim();if(!r)return {name:null,profile:null,config:e};let s=e.deploymentProfiles?.[r];if(!s)throw new Error(`Unknown deployment profile "${r}". Check the linked WPSuite publisher configuration.`);return {name:r,profile:s,config:{...e,targetOrigin:s.targetOrigin??e.targetOrigin,s3:Wo(e.s3,s.s3),cloudFront:zo(e.cloudFront,s.cloudFront)}}}var Kr="wpsuite-sha256",Gr="wpsuite-normalized-sha256",ea=/(?:^|[-_:.])(id|uid|nonce|token|hash|instance)(?:$|[-_:.])/i,Sn=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,ta=["SIGINT","SIGTERM"],Et=new Set,kt=new Map,Qr=null;function na(e){Et.add(e);let t=false;return ()=>{t||(t=true,Et.delete(e));}}async function ra(){let e=[...Et];e.length!==0&&await Promise.allSettled(e.map(async t=>{Et.delete(t),await T.rm(t,{recursive:true,force:true});}));}function sa(){if(!(kt.size>0))for(let e of ta){let t=()=>{Qr||(Qr=ra().finally(()=>{for(let[n,r]of kt)process.off(n,r);kt.clear(),process.exit(1);}));};kt.set(e,t),process.on(e,t);}}sa();function ia(e,t){let n=String(process.env.STATIC_PUBLISHER_CRAWL_MANIFEST_PATH||"").trim();if(n)return S.resolve(n);let r=t.trim();return r?S.join(S.resolve(r),"crawl-manifest.json"):S.join(S.resolve(e),".crawl-manifest.json")}function Zr(e){return S.normalize(e).split(S.sep).join("/")}function Jr(e,t){let n=S.relative(S.resolve(e),S.resolve(t));return !n||n.startsWith("..")||S.isAbsolute(n)?null:Zr(n)}async function oa(e,t,n){let r=ia(e.outputDir,t),s;try{s=await T.readFile(r,"utf8");}catch(c){return c.code==="ENOENT"?(n.warn("Deploy rewrite guard disabled because the crawl manifest is missing.",{manifestPath:r,source:"deploy-guard"}),null):(n.warn("Deploy rewrite guard disabled because the crawl manifest could not be read.",{manifestPath:r,error:c instanceof Error?c.message:String(c),source:"deploy-guard"}),null)}let i;try{i=JSON.parse(s);}catch(c){return n.warn("Deploy rewrite guard disabled because the crawl manifest is invalid JSON.",{manifestPath:r,error:c instanceof Error?c.message:String(c),source:"deploy-guard"}),null}let a=new Map,u=new Map,o=0,l=0;for(let[c,d]of Object.entries(i.pages||{})){let p=String(d?.outputPath||"").trim(),f=p?Jr(e.outputDir,p):null;if(f){let g=typeof d?.contentType=="string"&&d.contentType?d.contentType:null;g&&u.set(f,g);}!p||d?.rewriteComplete===true||f&&(o++,a.has(f)||a.set(f,{kind:"page",sourceUrl:c,outputPath:S.resolve(p),relativePath:f}));}for(let[c,d]of Object.entries(i.assets||{})){let p=String(d?.outputPath||"").trim(),f=d?.isText===true,g=p?Jr(e.outputDir,p):null;if(g){let y=typeof d?.contentType=="string"&&d.contentType?d.contentType:null;y&&u.set(g,y);}!p||!f||d?.rewriteComplete===true||g&&(l++,a.has(g)||a.set(g,{kind:"asset",sourceUrl:c,outputPath:S.resolve(p),relativePath:g}));}return {manifestPath:r,byRelativePath:a,contentTypeByRelativePath:u,pendingPages:o,pendingTextAssets:l}}function aa(e){return e&&(Sn.test(e)?"__uuid__":/^[0-9a-f]{6,}$/i.test(e)?"__hex__":/^[0-9]{8,}$/.test(e)?"__num__":/^(?=.*[a-z])(?=.*\d)[a-z0-9]{8,}$/i.test(e)?"__alnum__":e)}function mn(e){return e.split(/([_:.\-/=?&#]+)/g).map((t,n)=>n%2===1?t:aa(t)).join("")}function ca(e){return e.split(/([_:.\-/=?&#]+)/g).map((t,n)=>n%2===1?t:Sn.test(t)?"__uuid__":/^[0-9a-f]{6,}$/i.test(t)?"__hex__":/^[0-9]{6,}$/.test(t)?"__num__":/^[a-z0-9_-]{6,}$/i.test(t)?"__id__":t).join("")}function Mt(e,t){return Array.isArray(e)?e.map(n=>Mt(n,t)):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,Mt(r,n)])):typeof e!="string"?e:t&&ea.test(t)?ca(e):Sn.test(e)?"__uuid__":/^[0-9a-f]{6,}$/i.test(e)||/^[0-9]{8,}$/.test(e)?mn(e):e}function ua(e){return e.replace(/((?:https?:\/\/[^"'\s>]+|\/)(?:wp-content|wp-includes)\/[^"'\s>?]+)\?ver=[A-Za-z0-9._-]+(?=$|[#"'])/gi,"$1")}function la(e,t){let n=t.trim();if((n.startsWith("{")||n.startsWith("[")||n.startsWith('"'))&&e.startsWith("data-"))try{let s=JSON.parse(n);return JSON.stringify(Mt(s))}catch{}if(e.startsWith("data-")&&/^[A-Za-z0-9+/=]+$/.test(n))try{let s=Buffer.from(n,"base64").toString("utf8"),i=JSON.parse(s),a=JSON.stringify(Mt(i));return Buffer.from(a,"utf8").toString("base64")}catch{}return t}function da(e,t){let n=e.toLowerCase();return n==="class"?t.split(/(\s+)/).map((r,s)=>s%2===1?r:mn(r)).join(""):n==="id"||n==="for"||n==="aria-controls"||n==="aria-labelledby"||n==="aria-describedby"||n==="aria-owns"||n==="aria-activedescendant"||n==="name"?mn(t):n==="href"||n==="src"?ua(t):la(n,t)}function pa(e){return e.replace(/<([a-z][^\s/>]*)([^<>]*?)>/gi,(t,n,r)=>{if(n.startsWith("/"))return t;let s=r.replace(/\s([:@a-zA-Z_][-:.a-zA-Z0-9_]*?)=(['"])([\s\S]*?)\2/g,(i,a,u,o)=>{let l=da(a,o);return ` ${a}=${u}${l}${u}`});return `<${n}${s}>`})}function fn(e){let t=S.extname(e).toLowerCase();return [".html",".htm",".xml",".xsl",".txt"].includes(t)||["robots.txt","sitemap.xml"].includes(S.basename(e))}function $t(e,t){return [e.replace(/^\/+|\/+$/g,""),t.replace(/^\/+/,"")].filter(Boolean).join("/")}async function ga(e,t,n,r){let s=new Map,i,a=0;do{a++;let u=await ee(`S3 list objects page ${a} for s3://${t}/${n||""}`,3e5,({httpOptions:o})=>e.send(new ListObjectsV2Command({Bucket:t,Prefix:n||void 0,ContinuationToken:i}),o));for(let o of u.Contents||[]){if(!o.Key)continue;let l=(o.ETag||"").replace(/^"|"$/g,"").toLowerCase(),c=Number(o.Size??0);s.set(o.Key,{etag:l,size:c});}i=u.NextContinuationToken,r.debug(`Listed S3 keys page ${a}: ${s.size} keys so far`);}while(i);return s}async function fa(e,t,n,r){if(r.has(n))return r.get(n)??null;try{let s=await ee(`S3 head object ${n}`,3e5,({httpOptions:a})=>e.send(new HeadObjectCommand({Bucket:t,Key:n}),a)),i={etag:(s.ETag||"").replace(/^"|"$/g,"").toLowerCase(),size:Number(s.ContentLength??0)};return r.set(n,i),i}catch{return r.set(n,null),null}}async function ma(e,t,n,r){let s=[...new Set(Array.from(n).filter(Boolean))];if(s.length===0)return r.info("No explicitly tombstoned S3 objects to delete."),[];r.info(`Deleting ${s.length} explicitly tombstoned S3 object(s)\u2026`);for(let i=0;i<s.length;i+=1e3){let a=s.slice(i,i+1e3);if(a.length===0)continue;let u=await ee(`S3 delete objects batch ${Math.floor(i/1e3)+1}`,3e5,({httpOptions:o})=>e.send(new DeleteObjectsCommand({Bucket:t,Delete:{Objects:a.map(l=>({Key:l}))}}),o));if(u.Errors&&u.Errors.length>0){let o=u.Errors.map(l=>`${l.Key||"(unknown)"}: ${l.Code||"DeleteFailed"}`);throw new Error(`S3 reported ${o.length} object deletion error(s): ${o.join(", ")}`)}r.info(`Deleted batch of ${a.length} object(s).`);for(let o of a)r.debug(` deleted: ${o}`);}return s}function ha(e){return createHash("md5").update(e).digest("hex")}function Vr(e){return createHash("sha256").update(e).digest("hex")}function hn(e){return createHash("sha256").update(pa(e.toString("utf8"))).digest("hex")}async function wa(e,t,n,r){if(r.has(n))return r.get(n)??null;try{let a=((await ee(`S3 head object metadata ${n}`,3e5,({httpOptions:u})=>e.send(new HeadObjectCommand({Bucket:t,Key:n}),u))).Metadata?.[Kr]||"").trim().toLowerCase()||null;return r.set(n,a),a}catch{return r.set(n,null),null}}async function ya(e,t,n,r,s){if(r.has(n))return r.get(n)??null;try{let a=((await ee(`S3 head object normalized metadata ${n}`,3e5,({httpOptions:u})=>e.send(new HeadObjectCommand({Bucket:t,Key:n}),u))).Metadata?.[Gr]||"").trim().toLowerCase();if(a)return r.set(n,a),a}catch{return r.set(n,null),null}if(s.has(n)){let i=s.get(n)??null;return r.set(n,i),i}try{let a=await(await ee(`S3 get object ${n}`,3e5,({httpOptions:o})=>e.send(new GetObjectCommand({Bucket:t,Key:n}),o))).Body?.transformToByteArray(),u=a?hn(Buffer.from(a)):null;return s.set(n,u),r.set(n,u),u}catch{return s.set(n,null),r.set(n,null),null}}function Sa(e){return e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")||"profile"}function ba(e,t){let n=e,r=Object.entries(t).sort((s,i)=>i[0].length-s[0].length);for(let[s,i]of r)s&&(n=n.split(s).join(i));return n}async function Pa(e,t,n,r){let s=S.join(e,"asset-map.json"),i;try{i=await T.readFile(s,"utf8");}catch(o){if(o.code==="ENOENT")return;throw o}let a=JSON.parse(i);if(!a||typeof a!="object")return;let u=Object.fromEntries(Object.entries(a).map(([o,l])=>{let c=String(l??"");return t.urlRewriteMode==="absolute"&&t.targetOrigin&&n.targetOrigin&&t.targetOrigin!==n.targetOrigin&&(c=c.split(t.targetOrigin).join(n.targetOrigin)),c=ba(c,r),[o,c]}));await T.writeFile(s,JSON.stringify(u,null,2),"utf8");}async function va(e,t,n,r,s,i){let a=e.targetOrigin!==t.targetOrigin,u=Object.keys(r).length>0;if(!n||!a&&!u)return {outputDir:e.outputDir,cleanup:async()=>{}};if(a&&e.urlRewriteMode!=="absolute")throw new Error(`Deployment profile "${n}" changes targetOrigin, but the base crawl output must use urlRewriteMode "absolute" for multi-target redeploys.`);let o=S.join(S.dirname(e.outputDir),`.deploy-profile-${Sa(n)}-${Date.now()}`),l=na(o);s.info(`Preparing deployment profile "${n}" from existing crawl output to ${o}...`);try{if(await T.rm(o,{recursive:!0,force:!0}),i){await T.mkdir(o,{recursive:!0});for(let f of i){let g=S.join(e.outputDir,f),y=S.join(o,f);await T.mkdir(S.dirname(y),{recursive:!0}),await T.copyFile(g,y);}}else await T.cp(e.outputDir,o,{recursive:!0});let c={...e,sourceOrigin:e.targetOrigin,targetOrigin:t.targetOrigin,extraReplacements:r,outputDir:o},d=1;s.info(`Rewriting text files for deployment profile "${n}"...`);let p=await gt(c,{},{files:i,onStart:({totalFiles:f,workerCount:g})=>{d=g,s.info(`Rewriting ${f} text file(s) for deployment profile "${n}" with ${g} worker(s).`);},onProgress:({index:f,totalFiles:g,changedTextFiles:y,file:m,changed:h})=>{let v=`Rewriting [${f}/${g}] ${m} (${h?"rewrote":"checked"}; ${y} changed so far)`;g<=200||f<=5||f%10===0||f===g?(s.progress(v,{file:m,index:f,totalFiles:g,changed:h,changedTextFiles:y,workerCount:d}),s.info(v)):s.debug(v);}});return await Pa(o,e,t,r),s.info(`Prepared deployment profile "${n}" in ${o} (${p} rewritten text file(s)).`),{outputDir:o,cleanup:async()=>{l(),await T.rm(o,{recursive:!0,force:!0});}}}catch(c){throw s.error(`Failed to prepare deployment profile "${n}" temporary output.`,{tempDir:o,outputDir:e.outputDir,error:c instanceof Error?c.message:String(c),...c instanceof Error&&c.stack?{stack:c.stack}:{}}),await T.rm(o,{recursive:true,force:true}).catch(()=>{}),l(),await s.flush().catch(()=>{}),c}}async function Yr(e=process.argv.slice(2)){let t=await se(),n=Tt(e),r=Ne(t,n),s=S.resolve(r.config.logDir||"logs"),i=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",a=i?S.join(S.resolve(i),"deploy-diff.json"):"",u=new Oe(s,"deploy.log.jsonl",r.config.logLevel??"info"),o=r.profile?.extraReplacements??{},l=async()=>{};try{let c=await Me(t);if(e.includes("--content-sync")&&c?.schemaVersion!==2)throw new Error("Content-sync deployment requires a valid schema-2 targeted deploy plan.");let p=await Gn(t);if(p)throw new Error(`Deployment blocked: the crawl started at ${p.startedAt} did not complete its final rewrite. Run a successful crawl or resume the rewrite before deploying.`);let f=await va(t,r.config,r.name,o,u,c?.schemaVersion===2?c.changedFiles:void 0);l=f.cleanup;let g={...r.config,outputDir:f.outputDir},y=g.s3SyncMode??"sdk-upload-delete";if(c?.schemaVersion===2&&c.deletedFiles.length>0&&y!=="sdk-upload-delete")throw new Error("Content-sync tombstones require the sdk-upload-delete S3 sync mode.");let m=c?.schemaVersion!==2&&f.outputDir!==t.outputDir&&(t.targetOrigin!==r.config.targetOrigin||Object.keys(o).length>0),h=!!c&&!c.fullSyncRequired&&!m;if(c?.schemaVersion===2&&!h)throw new Error("Content-sync deployment cannot widen into a full-output deployment.");r.name&&u.info(`Using deployment profile: ${r.name}`),u.info(`Starting deploy \u2014 s3://${g.s3.bucket}/${g.s3.prefix||""} (region: ${g.s3.region})`),u.info(`S3 sync mode: ${y}`),c&&c.fullSyncRequired?u.info("Deploy plan requests a full sync; scanning the whole output tree."):c&&m?u.info("Ignoring incremental deploy plan because deployment-profile rewrites require a full sync."):h&&u.info(`Using incremental deploy plan: ${c.changedFiles.length} changed file(s), ${c.deletedFiles.length} deleted file(s).`),u.mark("deploy");let w=new S3Client({region:g.s3.region}),v=f.outputDir===t.outputDir?await oa(t,i,u):null,I=c?.schemaVersion===2?[...c.uploadGroups.assets,...c.uploadGroups.content,...c.uploadGroups.listings,...c.uploadGroups.sitemapLeaves,...c.uploadGroups.sitemapIndexes]:c?.changedFiles??[];if(c?.schemaVersion===2){let k=[...new Set(I)],J=[...new Set(c.changedFiles)];if(k.length!==J.length||J.some(x=>!k.includes(x)))throw new Error("Content-sync deploy-plan upload groups do not cover the exact changed-file set.")}let j=h?(await Promise.all(I.map(async k=>{try{return (await T.stat(S.join(g.outputDir,k))).isFile()?k:null}catch{if(c?.schemaVersion===2)throw new Error(`Content-sync planned upload is missing: ${k}`);return null}}))).filter(k=>k!==null):await qs(["**/*"],{cwd:g.outputDir,onlyFiles:!0,dot:!0}),U=[],$=[],C=j.filter(k=>{let J=v?.byRelativePath.get(Zr(k));if(!J)return !0;let x=$t(g.s3.prefix,k);return U.push(k),$.push(x),u.reject(J.kind,J.sourceUrl||k,"rewrite not completed; deploy upload blocked","deploy-guard",{file:k,key:x,outputPath:J.outputPath,manifestPath:v?.manifestPath}),!1}),q=new Set((h?C:j).map(k=>$t(g.s3.prefix,k)));v&&(v.pendingPages>0||v.pendingTextAssets>0)&&u.info(`Deploy rewrite guard loaded ${v.pendingPages} pending page(s) and ${v.pendingTextAssets} pending text asset(s) from crawl manifest.`,{manifestPath:v.manifestPath,pendingPages:v.pendingPages,pendingTextAssets:v.pendingTextAssets,source:"deploy-guard"}),U.length>0&&u.warn(`Deploy rewrite guard blocked ${U.length} file(s) from upload because final crawl rewrite is incomplete.`,{rejected:U.length,manifestPath:v?.manifestPath,source:"deploy-guard"}),h?u.info(`Using ${C.length} eligible planned changed file(s) from deploy plan for upload${U.length>0?` (${U.length} blocked by deploy rewrite guard)`:""}.`):u.info(`Found ${j.length} file(s) in output directory "${g.outputDir}"${U.length>0?`; ${C.length} remain eligible for upload after deploy rewrite guard filtering`:""}.`),u.progress("Deploy preflight: comparing local output with remote S3 state.",{phase:"deploy",mode:y,totalFiles:C.length,scannedFiles:j.length,rejected:U.length,deploymentProfile:r.name||"",s3Bucket:g.s3.bucket,s3Prefix:g.s3.prefix||"",targetedPlan:h,deployGuardEnabled:f.outputDir===t.outputDir});let R=0,M=0,b=0,A=[],P=[],E=[],D=[],L=[],G=new Map,te=new Map,ce=new Map,F=new Map,Ae=new Map;h||(u.info("Listing existing S3 objects to detect unchanged files..."),G=await ga(w,g.s3.bucket,g.s3.prefix,u),u.info(`Found ${G.size} existing key(s) in S3.`));let os=async k=>G.has(k)?G.get(k)??null:h?fa(w,g.s3.bucket,k,te):null;for(let k of C){let J=S.join(g.outputDir,k),x=$t(g.s3.prefix,k),ne=v?.contentTypeByRelativePath.get(k),He=ne&&ne!=="application/octet-stream"?ne:Xo.lookup(k)||ne||"application/octet-stream",as=fn(k)?g.s3.htmlCacheControl:g.s3.assetCacheControl,N=R+M+b+1;C.length<=200||N<=5||N%10===0||N===C.length?(u.progress(`Uploading [${N}/${C.length}] ${x} (${He})`,{file:k,key:x,index:N,totalFiles:C.length,contentType:He,mode:y}),u.info(`Uploading [${N}/${C.length}] ${x} (${He})`)):u.debug(`Uploading [${N}/${C.length}] ${x} (${He})`);try{let re=await T.readFile(J),We=await os(x),ze=null,Te=null;if(We){let Ot=re.byteLength;if(We.size===Ot){let it=We.etag.includes("-");if(We.etag!==""&&!it){let cs=ha(re);if(We.etag===cs){M++,C.length<=200||M<=5||M%25===0?(u.progress(`Skipped unchanged [${N}/${C.length}] ${x}`,{file:k,key:x,index:N,totalFiles:C.length,uploaded:R,skipped:M,failed:b,mode:y,reason:"etag-md5-match"}),u.info(`Skipped unchanged [${N}/${C.length}] ${x}`)):u.debug(`Skipped unchanged [${N}/${C.length}] ${x}`),P.push(x);continue}}ze=Vr(re);let In=await wa(w,g.s3.bucket,x,ce);if(In&&In===ze){M++,C.length<=200||M<=5||M%25===0?(u.progress(`Skipped unchanged [${N}/${C.length}] ${x}`,{file:k,key:x,index:N,totalFiles:C.length,uploaded:R,skipped:M,failed:b,mode:y,reason:"metadata-sha256-match"}),u.info(`Skipped unchanged [${N}/${C.length}] ${x}`)):u.debug(`Skipped unchanged [${N}/${C.length}] ${x}`),P.push(x);continue}}if(fn(k)){Te=hn(re);let it=await ya(w,g.s3.bucket,x,F,Ae);if(it&&it===Te){M++,C.length<=200||M<=5||M%25===0?(u.progress(`Skipped semantically unchanged [${N}/${C.length}] ${x}`,{file:k,key:x,index:N,totalFiles:C.length,uploaded:R,skipped:M,failed:b,mode:y,reason:"normalized-html-match"}),u.info(`Skipped semantically unchanged [${N}/${C.length}] ${x}`)):u.debug(`Skipped semantically unchanged [${N}/${C.length}] ${x}`),P.push(x);continue}}}ze=ze??Vr(re),Te=Te??(fn(k)?hn(re):null),await ee(`S3 upload ${x}`,9e5,({abortController:Ot})=>new Upload({client:w,abortController:Ot,params:{Bucket:g.s3.bucket,Key:x,Body:re,ContentType:He,CacheControl:as,Metadata:{[Kr]:ze,...Te?{[Gr]:Te}:{}}}}).done()),R++,A.push(x),(R%25===0||R===C.length)&&(u.progress(`Uploaded ${R}/${C.length} file(s)\u2026`,{uploaded:R,skipped:M,failed:b,totalFiles:C.length,mode:y}),u.info(`Uploaded ${R}/${C.length} file(s)\u2026`));}catch(re){b++,E.push(x),u.error(`Failed to upload ${x}: ${re.message}`,{key:x,error:String(re)});}}if(u.info(`Upload complete: ${R} uploaded, ${M} skipped unchanged, ${$.length} rejected by guard, ${b} failed.`),E.length>0||$.length>0)throw new Error(`Deployment stopped before deletion because ${E.length} upload(s) failed and ${$.length} upload(s) were rejected.`);if(y==="sdk-upload-delete"){let k=new Set((c?.deletedFiles??[]).map(x=>$t(g.s3.prefix,x))),J=[...k].filter(x=>!q.has(x));if(!h&&(L=[...G.keys()].filter(ne=>!q.has(ne)).filter(ne=>!k.has(ne)),L.length>0)){u.warn(`Protected ${L.length} remote-only S3 object(s) from deletion because the crawl did not provide explicit tombstones.`,{protected:L.length,source:"deploy-delete-guard"});for(let ne of L)u.debug(` protected remote-only object: ${ne}`);}D=await ma(w,g.s3.bucket,h?J:J.filter(x=>G.has(x)),u);}else u.info("Sync mode is sdk-upload-only \u2014 skipping stale object deletion.");a&&(await T.mkdir(S.dirname(a),{recursive:!0}),await T.writeFile(a,JSON.stringify({generatedAt:new Date().toISOString(),mode:y,summary:{totalFiles:j.length,eligibleFiles:C.length,uploaded:A.length,skipped:P.length,rejected:$.length,failed:E.length,deleted:D.length,protected:L.length,...r.name?{profile:r.name}:{}},uploadedKeys:A,skippedKeys:P,rejectedKeys:$,failedKeys:E,deletedKeys:D,protectedRemoteOnlyKeys:L},null,2),"utf8")),c?.schemaVersion!==2&&await De(t),u.endMark("deploy"),await u.flush();}finally{await l().catch(()=>{});}}function Ra(e){let t=e;return t.endsWith("/")?t+="index.html":S.posix.basename(t).includes(".")||(t+="/index.html"),t}function Ia(e,t){let n=t.trim().replace(/^\/+|\/+$/g,"");if(!n)return null;let r=`/${n}`;return e===r||e.startsWith(`${r}/`)?e:`${r}${e.startsWith("/")?e:`/${e}`}`}function Xr(e,t){let n=new Set;for(let r of e){let s=new URL(r,"https://content-sync.invalid");if(s.origin!=="https://content-sync.invalid")continue;let i=`${s.pathname}${s.search}`,a=Ra(s.pathname);n.add(i),n.add(`${a}${s.search}`);let u=Ia(a,t);u&&n.add(`${u}${s.search}`);}return [...n].sort()}function ka(){let e=String(process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"").trim();return e?S.join(S.resolve(e),"content-sync-invalidation.json"):""}async function bn(e,t){if(!e)return;await T.mkdir(S.dirname(e),{recursive:true});let n=`${e}.${process.pid}.${Date.now()}.tmp`;await T.writeFile(n,JSON.stringify({...t,updatedAt:new Date().toISOString()},null,2),"utf8"),await T.rename(n,e);}async function $a(e,t,n,r){if(!e)return null;try{let s=JSON.parse(await T.readFile(e,"utf8"));if(s.schemaVersion!==1||s.distributionId!==t||s.impactHash!==n||!Array.isArray(s.batches))throw new Error("Content-sync invalidation state does not match the deploy plan.");let i=s.batches.flatMap(a=>a.paths);return i.length!==r.length||i.some((a,u)=>a!==r[u])?null:s}catch(s){if(s.code==="ENOENT")return null;throw s}}function Ea(e,t=3e3){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}async function ts(e=process.argv.slice(2)){let t=await se(),n=Tt(e),r=Ne(t,n),s=r.config,i=new Oe(s.logDir||"logs","invalidate.log.jsonl",s.logLevel??"info"),a=e.includes("--content-sync"),u=await Me(t);if(a&&u?.schemaVersion!==2)throw new Error("Content-sync invalidation requires a valid schema-2 targeted deploy plan.");if(r.name&&i.info(`Using deployment profile: ${r.name}`),!s.cloudFront.distributionId){i.info("No CloudFront distributionId configured; skipping invalidation."),await i.flush();return}let o=u?.schemaVersion===2?u.invalidationPaths:s.cloudFront.invalidationPaths.length>0?s.cloudFront.invalidationPaths:["/*"],l=u?.schemaVersion===2?Xr(o,s.s3.prefix||""):o;if(u?.schemaVersion===2&&l.some(g=>g==="/*"))throw new Error("Content-sync cannot use a whole-distribution invalidation.");if(l.length===0){i.info("The targeted deploy plan has no CloudFront paths to invalidate."),await i.flush();return}let c=s.cloudFront.distributionId,d=new CloudFrontClient({region:"us-east-1",maxAttempts:5});if(i.mark("invalidate"),u?.schemaVersion!==2){let g=`smartcloud-static-publisher-${Date.now()}`;await ee(`CloudFront invalidation for distribution ${c}`,3e5,({httpOptions:y})=>d.send(new CreateInvalidationCommand({DistributionId:c,InvalidationBatch:{CallerReference:g,Paths:{Quantity:l.length,Items:l}}}),y)),i.endMark("invalidate"),await i.flush();return}let p=ka(),f=await $a(p,c,u.impactHash,l);if(!f){let g=createHash("sha256").update(JSON.stringify(l)).digest("hex");f={schemaVersion:1,distributionId:c,impactHash:u.impactHash,updatedAt:new Date().toISOString(),batches:Ea(l).map((y,m)=>({index:m,callerReference:`wpsuite-content-sync-${u.impactHash.slice(0,24)}-${g.slice(0,24)}-${m}`,paths:y,invalidationId:null,status:"pending"}))},await bn(p,f);}for(let g of f.batches){if(!g.invalidationId){let y=await ee(`CloudFront targeted invalidation batch ${g.index+1}`,3e5,({httpOptions:h})=>d.send(new CreateInvalidationCommand({DistributionId:c,InvalidationBatch:{CallerReference:g.callerReference,Paths:{Quantity:g.paths.length,Items:g.paths}}}),h)),m=String(y.Invalidation?.Id||"").trim();if(!m)throw new Error("CloudFront did not return an invalidation ID.");g.invalidationId=m,g.status="created",await bn(p,f);}await waitUntilInvalidationCompleted({client:d,maxWaitTime:900,minDelay:2,maxDelay:15},{DistributionId:c,Id:g.invalidationId}),g.status="completed",await bn(p,f),i.info(`CloudFront invalidation batch ${g.index+1}/${f.batches.length} completed.`,{invalidationId:g.invalidationId,pathCount:g.paths.length});}i.endMark("invalidate"),await i.flush();}function Ft(e){let t=new URL(e);return t.hash="",t.href}function ns(e,t,n){let r=new Set([...t].map(o=>Ft(o))),s=new Map,i=new Map,a=o=>{s.set(Ft(o),o);},u=o=>{if(!o)return;let l=Ft(o);s.has(l)||i.set(l,o);};for(let o of e.deleteUrls)a(o);for(let o of e.archiveFamilies)if(o.foundPosts===0)for(let l of o.pageUrls)r.has(Ft(l))||a(l);u(e.directRenderUrls[0]);for(let o of e.archiveFamilies)u(o.pageUrls[0]),u(o.pageUrls.at(-1));for(let o of n)u(o);return {expectedAvailable:[...i.values()],expectedMissing:[...s.values()]}}var ss=["claimed","impact-planned","rendered","deployed","invalidated","verified","acknowledged"];function Cn(){let e=String(process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"").trim();if(!e)throw new Error("Content-sync requires a runtime directory.");return S.resolve(e)}function Be(e,t){return ss.indexOf(e)>=ss.indexOf(t)}async function me(e,t,n,r,s={}){let i={timestamp:new Date().toISOString(),eventType:t,status:t.endsWith("failed")?"failed":"success",actorSource:"content-sync",jobId:n.id||"",command:"content-sync",message:r,details:s};await T.mkdir(e,{recursive:true}),await T.appendFile(S.join(e,"audit-events.jsonl"),`${JSON.stringify(i)}
14
14
  `,"utf8");}function Da(e){return Qe({postTypes:e.postTypes??[],listingPaths:e.listingPaths??[],includeSubsites:e.includeSubsites,includePostTypeArchives:e.includePostTypeArchives,includeTaxonomyArchives:e.includeTaxonomyArchives,includeAuthorArchives:e.includeAuthorArchives,includeDateArchives:e.includeDateArchives,includePostsPage:e.includePostsPage,includeSitemapChain:e.includeSitemapChain})}function Fa(e,t){let n=(e.scheduler?.rules??[]).find(r=>r.command==="content-sync"&&r.id===t);if(!n)throw new Error(`Content-sync scheduler rule not found: ${t}`);if(n.enabled===false)throw new Error(`Content-sync scheduler rule is disabled: ${t}`);return n}async function Rn(e,t){if(e.subscriptionType!=="PROFESSIONAL"&&e.subscriptionType!=="AGENCY")throw new Error("Content-sync requires an active Professional or Agency subscription.");let n=Da(t),r=Ne(e,t.deploymentProfile),s=r.name||"",i=Tn(e.sourceOrigin,String(t.id||""),n),a=kn({sourceOrigin:e.sourceOrigin,targetOrigin:r.config.targetOrigin,deploymentProfile:s,s3Bucket:r.config.s3.bucket,s3Prefix:r.config.s3.prefix,cloudFrontDistributionId:r.config.cloudFront.distributionId,urlRewriteMode:r.config.urlRewriteMode,extraReplacements:r.profile?.extraReplacements??{}}),u=$n({siteId:e.wpsuite?.siteSettings?.siteId,accountId:e.wpsuite?.siteSettings?.accountId,sourceOrigin:e.sourceOrigin,ruleId:String(t.id||""),targetFingerprint:a}),o=`content-sync:${String(t.id||"")}:${ue({scopeFingerprint:i,targetFingerprint:a}).slice(0,32)}`,l=new at({sourceOrigin:e.sourceOrigin,runtimeToken:String(e.wpsuite?.runtimeToken||""),ignoreHttpsErrors:e.ignoreHttpsErrors}),c=await l.releaseFingerprint(n.includeSubsites),d=An({wordpressFingerprint:c,targetFingerprint:a,sourceOrigin:e.sourceOrigin,sitemapPaths:Ke(e.sitemapPaths),blockedPathPrefixes:e.blockedPathPrefixes,assetPathPrefixes:e.assetPathPrefixes,noJavaScriptRenderPathPrefixes:e.noJavaScriptRenderPathPrefixes,urlRewriteMode:e.urlRewriteMode});return {rule:t,scope:n,deployment:r,deploymentProfile:s,scopeFingerprint:i,targetFingerprint:a,consumerId:u,coalesceKey:o,client:l,releaseFingerprint:d}}async function Oa(e){let t=Cn(),n=ct(t),r=await se(),s=(r.scheduler?.rules??[]).filter(l=>l.command==="content-sync"&&l.enabled!==false);if(s.length===0)return 0;let i=await _t(n),a=await ut(n),u=await qt(n),o=0;for(let l of s){let c=await Rn(r,l),d=u.entries[c.coalesceKey];if(!d||d.releaseJobId!==e||d.scopeFingerprint!==c.scopeFingerprint||d.targetFingerprint!==c.targetFingerprint||d.releaseFingerprint!==c.releaseFingerprint)throw new Error(`The normal release has no matching pre-crawl content-sync cutoff for rule ${String(l.id||"")}.`);let p=ue({releaseJobId:e,releaseFingerprint:c.releaseFingerprint,scopeFingerprint:c.scopeFingerprint,targetFingerprint:c.targetFingerprint,sequence:d.sequence}),f=await c.client.establishBaseline({consumerId:c.consumerId,scopeFingerprint:c.scopeFingerprint,baselineId:p,postTypes:c.scope.postTypes,includeSubsites:c.scope.includeSubsites,sequence:d.sequence}),g={schemaVersion:1,ruleId:String(l.id||""),consumerId:c.consumerId,coalesceKey:c.coalesceKey,scopeFingerprint:c.scopeFingerprint,targetFingerprint:c.targetFingerprint,releaseFingerprint:c.releaseFingerprint,baselineId:p,deploymentProfile:c.deploymentProfile,committedSequence:f.committedSequence,releaseJobId:e,verifiedAt:new Date().toISOString()};i.entries[c.coalesceKey]=g;let y=a.rules[c.coalesceKey];a.rules[c.coalesceKey]={ruleId:String(l.id||""),consumerId:c.consumerId,coalesceKey:c.coalesceKey,committedSequence:f.committedSequence,observedHeadSequence:f.headSequence,lag:Math.max(0,f.headSequence-f.committedSequence),lastSuccessfulJobId:y?.lastSuccessfulJobId||e,lastSuccessfulAt:new Date().toISOString(),trailingWorkDetected:f.headSequence>f.committedSequence,retryAttempt:0,nextRetryAt:null,lastError:null,baselineStatus:"ready",baselineReason:null};let m=await _n(n,c.coalesceKey);await me(t,"content-sync-baseline-established",{id:e},"A normal release established a verified content-sync baseline.",{ruleId:l.id,consumerId:c.consumerId,committedSequence:f.committedSequence,supersededCurrent:m}),o++;}return await On(n,i),await lt(n,a),await T.rm(n.releaseCutoff,{force:true}),o}async function Ua(e){let t=Cn(),n=ct(t),r=await se(),s=(r.scheduler?.rules??[]).filter(u=>u.command==="content-sync"&&u.enabled!==false);if(s.length===0)return 0;let i=await qt(n),a=0;for(let u of s){let o=await Rn(r,u),l=Object.values(i.entries).find(p=>p.releaseJobId===e&&p.ruleId===String(u.id||""));if(l){if(l.coalesceKey===o.coalesceKey&&l.scopeFingerprint===o.scopeFingerprint&&l.targetFingerprint===o.targetFingerprint&&l.releaseFingerprint===o.releaseFingerprint){a++;continue}throw new Error(`The normal release scope changed after its journal cutoff was captured for rule ${String(u.id||"")}. Start a new normal publish instead of resuming this release.`)}let c=await o.client.unboundHead(o.scope.postTypes,o.scope.includeSubsites),d={schemaVersion:1,releaseJobId:e,ruleId:String(u.id||""),coalesceKey:o.coalesceKey,scopeFingerprint:o.scopeFingerprint,targetFingerprint:o.targetFingerprint,releaseFingerprint:o.releaseFingerprint,sequence:c.headSequence,capturedAt:new Date().toISOString()};i.entries[o.coalesceKey]=d,await me(t,"content-sync-release-cutoff-captured",{id:e},"A normal release captured its pre-crawl content-sync journal cutoff.",{ruleId:u.id,consumerId:o.consumerId,sequence:c.headSequence}),a++;}return await Fn(n,i),a}async function La(e,t){let n=JSON.parse(await T.readFile(S.join(e,"current-run.json"),"utf8"));if(n.id!==t||n.command!=="content-sync"||!String(n.ruleId||"").trim())throw new Error("The active queue job is not the requested content-sync job.");return n}async function vn(e,t,n=0){let r=e.protocol==="https:"?Dn:ms,s=e.protocol==="https:"?new Dn.Agent({rejectUnauthorized:!t}):void 0;return new Promise((i,a)=>{let u=r.get(e,{agent:s,timeout:3e4,headers:{"user-agent":"WP-Suite-Content-Sync/1"}},o=>{let l=o.statusCode??500,c=o.headers.location;if(l>=300&&l<400&&c&&n<5){o.resume(),vn(new URL(c,e),t,n+1).then(i,a);return}let d=[],p=0;o.on("data",f=>{p+=f.byteLength,p<=1048576&&d.push(f);}),o.on("error",a),o.on("end",()=>i({status:l,body:Buffer.concat(d).toString("utf8")}));});u.on("timeout",()=>u.destroy(new Error(`Verification timed out: ${e}`))),u.on("error",a);})}async function ja(e,t,n,r){let s=t.deployment.config.targetOrigin;if(!/^https?:\/\//i.test(s))throw new Error("Content-sync verification requires an absolute HTTP(S) target origin.");let i=JSON.parse(await T.readFile(r,"utf8")),a=new Set;for(let[l,c]of Object.entries(i.pages??{}))a.add(l),typeof c.url=="string"&&a.add(c.url);let u=await Me(e);if(u?.schemaVersion!==2||u.impactHash!==n.impactHash)throw new Error("Content-sync verification requires the matching targeted deploy plan.");let o=ns(n,a,u.resolvedSitemapUrls);for(let l of o.expectedAvailable){let c=new URL(l),d=new URL(`${c.pathname}${c.search}`,s),p=await vn(d,e.ignoreHttpsErrors);if(p.status<200||p.status>=400)throw new Error(`Content-sync verification failed (${p.status}): ${d}`)}for(let l of o.expectedMissing.slice(0,10)){let c=new URL(l),d=new URL(`${c.pathname}${c.search}`,s),p=await vn(d,e.ignoreHttpsErrors);if(p.status>=200&&p.status<300)throw new Error(`Deleted content is still publicly available: ${d}`)}}async function qa(e){let t=await T.readFile(e.candidateManifest,"utf8");JSON.parse(t);let n=`${e.trustedManifest}.${process.pid}.tmp`;await T.writeFile(n,t,"utf8"),await T.rename(n,e.trustedManifest);}async function _a(e,t){try{let n=JSON.parse(await T.readFile(e.candidateManifest,"utf8"));if([...Object.values(n.pages??{}),...Object.values(n.assets??{})].some(s=>s?.lastSeenRunId===t))return "resumed"}catch(n){if(n.code!=="ENOENT")throw new Error(`The content-sync candidate manifest is invalid: ${n instanceof Error?n.message:String(n)}`,{cause:n})}return await T.copyFile(e.trustedManifest,e.candidateManifest).catch(n=>{throw new Error(`A trusted crawl manifest is required before content-sync: ${n instanceof Error?n.message:String(n)}`,{cause:n})}),"initialized"}async function xe(e,t,n,r,s={},i=0,a=async()=>{}){t.phase=n,await Un(e,t),await qn(e,{schemaVersion:1,jobId:t.jobId,phase:n,completedItems:r,totalItems:r,attempt:i,updatedAt:new Date().toISOString(),details:s}),await me(S.dirname(e.state),"content-sync-checkpoint",{id:t.jobId},`Content-sync checkpoint completed: ${n}.`,{phase:n,completedItems:r,totalItems:r,attempt:i,...s}),await a(n,t);}async function Na(e,t={}){let n={loadConfig:se,resolveRuleContext:Rn,runCrawl:zr,runDeploy:Yr,runInvalidate:ts,verifyDeployment:ja,promoteCandidateManifest:qa,clearDeployPlan:De,afterCheckpoint:async()=>{},...t},r=Cn(),s=ct(r),i=await La(r,e),a=await n.loadConfig(),u=Fa(a,String(i.ruleId)),o=await n.resolveRuleContext(a,u);if(i.coalesceKey&&i.coalesceKey!==o.coalesceKey)throw new Error("Queued content-sync demand no longer matches the active rule scope.");let c=(await _t(s)).entries[o.coalesceKey];if(!c||c.scopeFingerprint!==o.scopeFingerprint||c.targetFingerprint!==o.targetFingerprint||c.releaseFingerprint!==o.releaseFingerprint)throw await me(r,"content-sync-baseline-rejected",i,"Content-sync requires a new verified full or incremental release baseline.",{ruleId:u.id,reason:c?"mismatch":"missing"}),new Error("Content-sync baseline is missing or stale. Run a successful normal publish first.");let d=await Nt(s),p=await o.client.head({consumerId:o.consumerId,scopeFingerprint:o.scopeFingerprint,baselineId:c.baselineId,postTypes:o.scope.postTypes,includeSubsites:o.scope.includeSubsites});if(d&&d.jobId!==i.id)throw new Error("Another immutable content-sync range is still active.");if(d||(d={schemaVersion:1,jobId:i.id,ruleId:String(u.id||""),consumerId:o.consumerId,coalesceKey:o.coalesceKey,scopeFingerprint:o.scopeFingerprint,targetFingerprint:o.targetFingerprint,baselineId:c.baselineId,fromSequence:p.committedSequence,toSequence:p.headSequence,phase:"claimed",impactHash:null,startedAt:new Date().toISOString(),updatedAt:new Date().toISOString()},await xe(s,d,"claimed",0,{fromSequence:d.fromSequence,toSequence:d.toSequence},0,n.afterCheckpoint),await me(r,"content-sync-range-claimed",i,"Content-sync claimed a closed journal range.",{fromSequence:d.fromSequence,toSequence:d.toSequence})),d.fromSequence===d.toSequence){let h=await ut(s);h.rules[o.coalesceKey]={ruleId:String(u.id||""),consumerId:o.consumerId,coalesceKey:o.coalesceKey,committedSequence:d.toSequence,observedHeadSequence:p.headSequence,lag:Math.max(0,p.headSequence-d.toSequence),lastSuccessfulJobId:i.id,lastSuccessfulAt:new Date().toISOString(),trailingWorkDetected:false,retryAttempt:0,nextRetryAt:null,lastError:null},await lt(s,h),await Bt(s);return}let f=await Ln(s);if(!Be(d.phase,"impact-planned")){let h=await o.client.events({consumerId:o.consumerId,scopeFingerprint:o.scopeFingerprint,baselineId:c.baselineId,postTypes:o.scope.postTypes,includeSubsites:o.scope.includeSubsites,afterSequence:d.fromSequence,throughSequence:d.toSequence}),w=jt({events:h,scope:o.scope,sourceOrigin:a.sourceOrigin}),v=await o.client.resolveImpactFamilies(w,o.scope.includeSubsites);f=Mn({jobId:i.id,ruleId:String(u.id||""),consumerId:o.consumerId,coalesceKey:o.coalesceKey,scopeFingerprint:o.scopeFingerprint,targetFingerprint:o.targetFingerprint,baselineId:c.baselineId,sourceOrigin:a.sourceOrigin,scope:o.scope,fromSequence:d.fromSequence,toSequence:d.toSequence,events:h,resolvedArchiveFamilies:v,sitemapUrls:Ke(a.sitemapPaths)}),await jn(s,f),d.impactHash=f.impactHash,await xe(s,d,"impact-planned",h.length,{eventCount:h.length,foldedCount:f.foldedCount,impactHash:f.impactHash},0,n.afterCheckpoint),await me(r,"content-sync-impact-planned",i,"Content-sync persisted an immutable impact plan.",{impactHash:f.impactHash,eventCount:h.length});}if(!f||f.jobId!==i.id||d.impactHash!==f.impactHash)throw new Error("The immutable content-sync impact plan is missing or mismatched.");if(process.env.STATIC_PUBLISHER_CRAWL_MANIFEST_PATH=s.candidateManifest,!Be(d.phase,"rendered")){let h=await _a(s,i.id);await me(r,h==="resumed"?"content-sync-render-resumed":"content-sync-render-initialized",i,h==="resumed"?"Content-sync resumed its candidate crawl manifest.":"Content-sync initialized a candidate crawl manifest.",{impactHash:f.impactHash}),await n.runCrawl(["--content-sync-plan",s.impact]),await xe(s,d,"rendered",f.directRenderUrls.length+f.archiveFamilyUrls.length,{impactHash:f.impactHash},i.attempt??0,n.afterCheckpoint);}let g=o.deploymentProfile?["--profile",o.deploymentProfile]:[];if(Be(d.phase,"deployed")||(await n.runDeploy([...g,"--content-sync"]),await xe(s,d,"deployed",1,{impactHash:f.impactHash},0,n.afterCheckpoint),await me(r,"content-sync-deployed",i,"Content-sync targeted deployment completed.",{impactHash:f.impactHash})),Be(d.phase,"invalidated")?Be(d.phase,"verified")||await n.runInvalidate([...g,"--content-sync"]):(await n.runInvalidate([...g,"--content-sync"]),await xe(s,d,"invalidated",1,{impactHash:f.impactHash},0,n.afterCheckpoint)),Be(d.phase,"verified")||(await n.verifyDeployment(a,o,f,s.candidateManifest),await n.promoteCandidateManifest(s),await xe(s,d,"verified",1,{impactHash:f.impactHash},0,n.afterCheckpoint)),p=await o.client.head({consumerId:o.consumerId,scopeFingerprint:o.scopeFingerprint,baselineId:c.baselineId,postTypes:o.scope.postTypes,includeSubsites:o.scope.includeSubsites}),p.committedSequence===d.fromSequence)await o.client.acknowledge({consumerId:o.consumerId,scopeFingerprint:o.scopeFingerprint,baselineId:c.baselineId,expectedSequence:d.fromSequence,sequence:d.toSequence,postTypes:o.scope.postTypes,includeSubsites:o.scope.includeSubsites});else if(p.committedSequence!==d.toSequence)throw new Error("Content-sync acknowledgement cursor is in an unexpected state.");await xe(s,d,"acknowledged",1,{sequence:d.toSequence},0,n.afterCheckpoint),await me(r,"content-sync-cursor-acknowledged",i,"Content-sync committed its journal cursor after verification.",{sequence:d.toSequence});let y=await o.client.head({consumerId:o.consumerId,scopeFingerprint:o.scopeFingerprint,baselineId:c.baselineId,postTypes:o.scope.postTypes,includeSubsites:o.scope.includeSubsites}),m=await ut(s);m.rules[o.coalesceKey]={ruleId:String(u.id||""),consumerId:o.consumerId,coalesceKey:o.coalesceKey,committedSequence:d.toSequence,observedHeadSequence:y.headSequence,lag:Math.max(0,y.headSequence-d.toSequence),lastSuccessfulJobId:i.id,lastSuccessfulAt:new Date().toISOString(),trailingWorkDetected:y.headSequence>d.toSequence,retryAttempt:0,nextRetryAt:null,lastError:null},await lt(s,m),await n.clearDeployPlan(a),await T.rm(S.join(r,"content-sync-invalidation.json"),{force:true}),await T.rm(s.candidateManifest,{force:true}),await Bt(s);}async function is(e=process.argv.slice(2)){let n=e.indexOf("--capture-baseline-cutoffs");if(n>=0){let a=String(e[n+1]||"").trim();if(!a)throw new Error("--capture-baseline-cutoffs requires a release job ID.");await Ua(a);return}let r=e.indexOf("--establish-baselines");if(r>=0){let a=String(e[r+1]||"").trim();if(!a)throw new Error("--establish-baselines requires a release job ID.");await Oa(a);return}let s=e.indexOf("--job-id"),i=s>=0?String(e[s+1]||"").trim():"";if(!i)throw new Error("Content-sync requires --job-id.");await Na(i);}is().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1);});
package/dist/crawl.js CHANGED
@@ -1,12 +1,12 @@
1
- import {request,chromium}from'playwright';import C from'fs/promises';import w from'path';import {gunzipSync}from'zlib';import xt,{createHash}from'crypto';import Ir from'http';import Mr from'https';import Br from'fast-glob';import {availableParallelism}from'os';import {Worker}from'worker_threads';var yr=".deploy-plan.json",Sr="deploy-plan.json",Pr=".crawl-incomplete.json",br="crawl-incomplete.json";function dt(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?w.resolve(e):""}function pt(e){let t=String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").trim(),r=w.posix.normalize(t);return !t||!r||r==="."||/^[a-zA-Z]:/.test(r)||r.startsWith("../")||r===".."?null:r}function vr(e){let t=String(e||"").trim();if(!t.startsWith("/")||t.startsWith("//")||t.includes("*")||t.includes("#"))return null;try{let r=new URL(t,"https://content-sync.invalid");return r.origin!=="https://content-sync.invalid"?null:`${w.posix.normalize(r.pathname)}${r.search}`}catch{return null}}function Y(e){return [...new Set(e.map(pt).filter(t=>t!==null))]}function Cr(e,t){let r={generatedAt:String(t.generatedAt||new Date().toISOString()),outputDir:w.resolve(e.outputDir),runMode:t.runMode,crawlMode:t.crawlMode,fullSyncRequired:!!t.fullSyncRequired,changedFiles: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(vr).filter(s=>s!==null))].sort()}:{schemaVersion:1,...r,runMode:t.runMode}}function gt(e){let t=w.join(w.resolve(e.outputDir),yr),r=dt();return r?[w.join(r,Sr),t]:[t]}function ft(e){let t=w.join(w.resolve(e.outputDir),Pr),r=dt();return r?[w.join(r,br),t]:[t]}function ee(e,t){let r=w.resolve(e),s=w.resolve(t),n=w.relative(r,s).replace(/\\/g,"/");return pt(n)}async function _e(e,t){let r=Cr(e,t);for(let s of gt(e)){await C.mkdir(w.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:w.resolve(e.outputDir)};for(let s of ft(e)){await C.mkdir(w.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 Ar(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 kr(e){return JSON.stringify(We(e))}function xr(e){return createHash("sha256").update(kr(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(xr(r)!==t)throw new Error("Content-sync impact plan hash mismatch.");for(let s of [...e.directRenderUrls,...e.deleteUrls])if(Ar(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 bt(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function $r(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&&w.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 Lr(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=bt(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 Ur(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 vt(e){let t=e&&typeof e=="object"?e:{},r=Array.isArray(t.rules)?t.rules.map((s,n)=>Ur(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 Or(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=Or(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 Er(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function Ct(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function Dr(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 Rt(e,t,r=5){let s=new URL(Ct(e)),n=String(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase(),i=s.protocol==="http:"?Ir:Mr,o=Dr(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(Rt(new URL(S,s),{method:d===303?"GET":n},r-1));return}let m=new Headers;for(let[P,g]of Object.entries(u.headers))Array.isArray(g)?m.set(P,g.join(", ")):typeof g=="string"&&m.set(P,g);c(new Response(Buffer.concat(p),{status:d,statusText:u.statusMessage??"",headers:m}));});});l.on("error",a),l.end();})}function Fr(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;Er(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 jr(e){let t=String(e.wpsuite?.virtualAssetBaseUrl??e.wpsuite?.uploadUrl??"").trim();if(!Fr(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=Ct(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 Rt(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 qr(e,t){let r=Lr(t?.deploymentProfiles),s=String(t?.defaultDeploymentProfile??"").trim(),n=r[s]?s:"",i=ze(t?.subscriptionType),o=Je(e.wpsuite);return {...e,scheduler:vt(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 Nr(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?w.resolve(e):""}function Pt(e,t,r){let s=String(t||"").trim();return s&&w.isAbsolute(s)?w.resolve(s):w.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=bt(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=$r(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=vt(void 0),n.deploymentProfiles={},n.defaultDeploymentProfile="",n.deploymentTargetOverride=String(n.deploymentTargetOverride??"").trim();let i=await jr(n);t.onRemotePublisherConfigDiagnostic?.(i.diagnostic);let o=qr(n,i.remote),c=Nr(),a=c?w.resolve(c,".."):"";return a?(o.outputDir=Pt(a,o.outputDir,"export"),o.logDir=Pt(a,o.logDir,"logs")):(w.isAbsolute(o.outputDir)||(o.outputDir=He(o.outputDir,"export")),w.isAbsolute(o.logDir)||(o.logDir=He(o.logDir,"logs"))),o}function ye(e,t=10){return xt.createHash("sha1").update(e).digest("hex").slice(0,t)}async function _r(e){await C.mkdir(w.dirname(e),{recursive:true});}async function Se(e,t,r){await _r(e);let s=w.join(w.dirname(e),`.${w.basename(e)}.${process.pid}.${Date.now()}.${xt.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(w.extname(e).toLowerCase())}function J(e){return e.replace(/&quot;/g,'"').replace(/&#34;/g,'"').replace(/&apos;/g,"'").replace(/&#39;/g,"'").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">")}function ce(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function xe(e){return e.replace(/\//g,"\\/")}function At(e){return e.replace(/\//g,"\\\\/")}function Wr(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 kt(e,t,r){if(!t)return;e[t]=r;let s=xe(t),n=xe(r);e[s]=n;let i=At(t),o=At(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){kt(e,t,r);let s=Wr(t);s&&s!==t&&kt(e,s,r);}function Ve(e,t){let r=t.startsWith("/")?t:`/${t}`,s=(e||"").replace(/\/$/,"");return !s||s==="."||s==="/"?r:`${s}${r}`}function Tt(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function It(e,t,r){if(!t)return r;let s=w.dirname(w.resolve(t)),n=w.resolve(e,r.replace(/^\/+/,"")),i=w.relative(s,n).replace(/\\/g,"/");return i?(i.startsWith(".")||(i=`./${i}`),i):"."}var Jr=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],Vr=new Set([".html",".htm"]),Mt="WPSuite.io Static Publisher",Gr=Mt.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function Kr(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Zr(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function Yr(e,t,r){return Zr(t)?e.replace(new RegExp(`(?<!:)${Kr(t)}`,"g"),r):e.split(t).join(r)}function Xr(e,t,r){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let n=w.extname(r).toLowerCase();return Vr.has(n)?/<head\b|<html\b|<!doctype html/i.test(t):false}function es(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${Gr}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${Mt}" />`;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 C from'fs/promises';import m from'path';import {gunzipSync}from'zlib';import xt,{createHash}from'crypto';import Ir from'http';import Mr from'https';import Br from'fast-glob';import {availableParallelism}from'os';import {Worker}from'worker_threads';var yr=".deploy-plan.json",Sr="deploy-plan.json",Pr=".crawl-incomplete.json",br="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 vr(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 Cr(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(vr).filter(s=>s!==null))].sort()}:{schemaVersion:1,...r,runMode:t.runMode}}function gt(e){let t=m.join(m.resolve(e.outputDir),yr),r=dt();return r?[m.join(r,Sr),t]:[t]}function ft(e){let t=m.join(m.resolve(e.outputDir),Pr),r=dt();return r?[m.join(r,br),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=Cr(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 Ar(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 kr(e){return JSON.stringify(We(e))}function xr(e){return createHash("sha256").update(kr(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(xr(r)!==t)throw new Error("Content-sync impact plan hash mismatch.");for(let s of [...e.directRenderUrls,...e.deleteUrls])if(Ar(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 bt(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function $r(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 Lr(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=bt(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 Ur(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 vt(e){let t=e&&typeof e=="object"?e:{},r=Array.isArray(t.rules)?t.rules.map((s,n)=>Ur(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 Or(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=Or(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 Ct(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function Er(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 Rt(e,t,r=5){let s=new URL(Ct(e)),n=String(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase(),i=s.protocol==="http:"?Ir:Mr,o=Er(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(Rt(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 Fr(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 jr(e){let t=String(e.wpsuite?.virtualAssetBaseUrl??e.wpsuite?.uploadUrl??"").trim();if(!Fr(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=Ct(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 Rt(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 qr(e,t){let r=Lr(t?.deploymentProfiles),s=String(t?.defaultDeploymentProfile??"").trim(),n=r[s]?s:"",i=ze(t?.subscriptionType),o=Je(e.wpsuite);return {...e,scheduler:vt(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 Nr(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?m.resolve(e):""}function Pt(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=bt(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=$r(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=vt(void 0),n.deploymentProfiles={},n.defaultDeploymentProfile="",n.deploymentTargetOverride=String(n.deploymentTargetOverride??"").trim();let i=await jr(n);t.onRemotePublisherConfigDiagnostic?.(i.diagnostic);let o=qr(n,i.remote),c=Nr(),a=c?m.resolve(c,".."):"";return a?(o.outputDir=Pt(a,o.outputDir,"export"),o.logDir=Pt(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 xt.createHash("sha1").update(e).digest("hex").slice(0,t)}async function _r(e){await C.mkdir(m.dirname(e),{recursive:true});}async function Se(e,t,r){await _r(e);let s=m.join(m.dirname(e),`.${m.basename(e)}.${process.pid}.${Date.now()}.${xt.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(/&quot;/g,'"').replace(/&#34;/g,'"').replace(/&apos;/g,"'").replace(/&#39;/g,"'").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">")}function ce(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function xe(e){return e.replace(/\//g,"\\/")}function At(e){return e.replace(/\//g,"\\\\/")}function Wr(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 kt(e,t,r){if(!t)return;e[t]=r;let s=xe(t),n=xe(r);e[s]=n;let i=At(t),o=At(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){kt(e,t,r);let s=Wr(t);s&&s!==t&&kt(e,s,r);}function Ve(e,t){let r=t.startsWith("/")?t:`/${t}`,s=(e||"").replace(/\/$/,"");return !s||s==="."||s==="/"?r:`${s}${r}`}function Tt(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function It(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 Jr=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],Vr=new Set([".html",".htm"]),Mt="WPSuite.io Static Publisher",Gr=Mt.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function Kr(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Zr(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function Yr(e,t,r){return Zr(t)?e.replace(new RegExp(`(?<!:)${Kr(t)}`,"g"),r):e.split(t).join(r)}function Xr(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 Vr.has(n)?/<head\b|<html\b|<!doctype html/i.test(t):false}function es(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${Gr}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${Mt}" />`;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 ts(e){let t=J(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function rs(e,t){let r=[...new Set(t)].filter(i=>i.includes("/")&&!/\\+\//.test(i)).map(i=>[i,xe(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[c,a]of r)o=o.split(c).join(a);return o},n=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(i,o,c,a)=>`${o}${s(c)}${a}`);return n=n.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(i,o,c,a,l)=>ts(a)?`${o}${s(a)}${l}`:i),n}function ss(e,t){if(!t)return null;let r=w.dirname(w.resolve(t)),s=w.resolve(e.outputDir),n=w.relative(r,s).replace(/\\/g,"/");return n?(n.startsWith(".")||(n=`./${n}`),n.endsWith("/")?n:`${n}/`):"./"}function ns(e,t,r){let s=ss(t,r);if(!s)return e;let n=e;for(let i of Jr){let o=i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),c=new RegExp(`(?:\\.{1,}/)+${o}`,"g"),a=new RegExp(`(?<!\\.)/${o}`,"g");n=n.replace(c,`${s}${i}`).replace(a,`${s}${i}`);let l=i.replace(/\//g,"\\/"),u=s.replace(/\//g,"\\/"),p=l.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),d=new RegExp(`(?:\\.{1,}\\\\/)+${p}`,"g"),S=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${p}`,"g"),m=new RegExp(`(?<![\\.\\\\])\\/${p}`,"g");n=n.replace(d,`${u}${l}`).replace(S,`${u}${l}`).replace(m,`${u}${l}`);}return n}function Ke(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:Tt(t,e.targetOrigin),i=s?`${s.search}${s.hash}`:"";return e.urlRewriteMode==="root-relative"?`${n}${i}`:`${It(e.outputDir,r,n)}${i}`}function Ge(e,t,r,s,n){Te(e,r,Ke(t,s,n));}function is(e,t,r,s,n){if(!r||r===s)return;Te(e,r,s);let i=Ke(t,r,n),o=Ke(t,s,n);Te(e,i,o);}function Ze(e,t,r,s,n={}){let i=e,o={};Ge(o,t,t.sourceOrigin,t.targetOrigin,s);for(let[a,l]of Object.entries(t.extraReplacements))Ge(o,t,a,l,s);for(let[a,l]of Object.entries(r))Ge(o,t,a,l,s);for(let[a,l]of Object.entries(n)){let u=r[a];!u||u===l||is(o,t,l,u,s);}let c=Object.entries(o).sort((a,l)=>l[0].length-a[0].length);for(let[a,l]of c)i=Yr(i,a,l);return t.urlRewriteMode!=="absolute"&&(i=ns(i,t,s)),i=rs(i,c.map(([,a])=>a)),Xr(t,i,s)&&(i=es(i)),i}async function os(e,t,r,s){let n=w.join(e.outputDir,s),i=w.extname(n).toLowerCase(),o;try{o=await C.readFile(n,"utf8");}catch(l){if(l.code!=="ENOENT")throw l;return {changed:false}}let a=Ze(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 as(e,t){return await new Promise((r,s)=>{let n=a=>{if(c(),a?.error){s(new Error(a.error));return}r({changed:!!a?.changed});},i=a=>{c(),s(a);},o=a=>{c(),a!==0&&s(new Error(`Rewrite worker exited with code ${a}.`));},c=()=>{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 $t(e,t,r={}){let n=(r.files?[...new Set(r.files)].map(d=>w.resolve(d)).filter(d=>d.startsWith(w.resolve(e.outputDir))).map(d=>w.relative(e.outputDir,d).replace(/\\/g,"/")).filter(d=>d.length>0):await Br(["**/*"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(d=>d!=="asset-map.json"&&re(d)),i=0;if(n.length===0)return 0;let o=Math.max(1,Number(e.rewriteConcurrency||e.assetDownloadConcurrency||1)),c=Math.max(1,Math.min(o,n.length,availableParallelism()));await r.onStart?.({totalFiles:n.length,workerCount:c});let a=0,l=0,u=null;if(c===1){for(let d of n){let S=await os(e,t,r.previousAssetMap??{},d);S.changed&&(i+=1),l+=1,await r.onProgress?.({index:l,totalFiles:n.length,changedTextFiles:i,file:d,changed:S.changed});}return i}let p=Array.from({length:c},async()=>{let d=new Worker(new URL("./rewrite-worker.js",import.meta.url),{workerData:{config:e,assetMap:t,previousAssetMap:r.previousAssetMap??{}}});try{for(;!u;){let S=a;if(S>=n.length)return;a+=1;let m=n[S],P=await as(d,m);P.changed&&(i+=1),l+=1,await r.onProgress?.({index:l,totalFiles:n.length,changedTextFiles:i,file:m,changed:P.changed});}}catch(S){throw u=S instanceof Error?S:new Error(String(S)),u}finally{await d.terminate().catch(()=>{});}});return await Promise.all(p),i}var se={error:0,warn:1,info:2,debug:3},us=/^(?:authorization|proxyAuthorization|runtimeToken|siteKey|nonce|accessToken|refreshToken|accessKeyId|secretAccessKey|sessionToken|xStaticPublisherToken|xApiKey)$/i;function V(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 Me(e){return typeof e=="string"?V(e):Array.isArray(e)?e.map(t=>Me(t)):e instanceof Error?{name:e.name,message:V(e.message),...e.stack?{stack:V(e.stack)}:{}}:e&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,r])=>[t,us.test(t)?"[REDACTED]":Me(r)])):e}function Ye(e){return e?Me(e):void 0}var Lt=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",Ie=Lt?w.join(Lt,"current-progress.json"):"",Ut=Promise.resolve();function Ot(e){return e.includes("crawl")?"crawl":e.includes("deploy")?"deploy":e.includes("invalidate")?"invalidate":e}function cs(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 ls(e,t,r){Ie&&(Ut=Ut.then(async()=>{let s=new Date,n=s.toISOString();await C.mkdir(w.dirname(Ie),{recursive:true});let i=await C.readFile(Ie,"utf8").then(h=>JSON.parse(h)).catch(()=>null),o=i&&typeof i.details=="object"&&i.details?i.details:{},c=Ot(e),a=i?.currentStep||Ot(i?.source||""),l=i?.startedAt||n,u={...i?.stepDurationsSec??{}},p=i?.stepStartedAt||n;if(a&&a!==c&&i?.stepStartedAt){let h=Math.max(0,Math.round((s.getTime()-new Date(i.stepStartedAt).getTime())/1e3));u[a]=(u[a]??0)+h,p=n;}let d=Math.max(0,Math.round((s.getTime()-new Date(p).getTime())/1e3)),S=Math.max(0,Math.round((s.getTime()-new Date(l).getTime())/1e3)),m=V(t),P=Ye(r)??{},g={checkedAt:n,source:e,message:m,details:cs(o,P),startedAt:l,currentStep:c,stepStartedAt:p,stepElapsedSec:d,totalElapsedSec:S,stepDurationsSec:u};await C.writeFile(Ie,JSON.stringify(g,null,2),"utf8");}).catch(()=>{}));}async function ds(e,t){await C.mkdir(w.dirname(e),{recursive:true}),await C.appendFile(e,`${JSON.stringify(Me(t))}
5
- `,"utf8");}function ps(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 gs(e,t,r){let s=Ye(r);return {checkedAt:new Date().toISOString(),currentStep:ps(e,s),level:e,message:V(t),details:s??{}}}var le=class{constructor(t,r="info"){this.logDir=t;this.level=typeof r=="boolean"?r?"debug":"info":r,this.ensureLogFileReady();}logDir;startedAt=Date.now();marks=new Map;initPromise=null;writeQueue=Promise.resolve();writeError=null;level;get logPath(){return w.join(this.logDir,"crawl.log.jsonl")}get currentEventPath(){return w.join(this.logDir,"current-crawl-event.json")}get rejectedPath(){return w.join(this.logDir,"rejected.jsonl")}get ignoredPath(){return w.join(this.logDir,"ignored.jsonl")}get skippedPath(){return w.join(this.logDir,"skipped-http.jsonl")}get errorsPath(){return w.join(this.logDir,"errors.jsonl")}get timingsPath(){return w.join(this.logDir,"timings.jsonl")}ensureLogFileReady(){return this.initPromise||(this.initPromise=(async()=>{await C.mkdir(this.logDir,{recursive:true}),await C.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 C.appendFile(this.logPath,`${t}
6
- `,"utf8");});}enqueueJsonLine(t,r){this.enqueueTask(()=>ds(t,r));}updateCurrentEvent(t,r,s){let n=gs(t,r,s);this.enqueueTask(async()=>{await C.mkdir(this.logDir,{recursive:true}),await C.writeFile(this.currentEventPath,JSON.stringify(n,null,2),"utf8");});}push(t,r,s){let n=V(r),i=Ye(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||""):(se[this.level]>=se.debug||["summary","page","sitemap","asset","timing"].includes(t))&&console.log(n);}info(t,r){this.push("info",t,r);}debug(t,r){se[this.level]<se.debug||this.push("debug",t,r);}progress(t,r){ls("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),se[this.level]>=se.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),se[this.level]>=se.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 Xe="(?: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 Et(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 Dt(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]&&Et(i[1])&&r.push({index:i.index??0,value:i[1]});for(let i of e.matchAll(n))i[1]&&Et(i[1])&&r.push({index:i.index??0,value:i[1]});for(let i of r.sort((o,c)=>o.index-c.index))t.add(i.value);return [...t]}function Ft(e,t){return typeof e=="string"&&e.length>0&&t?.supported===true&&typeof t.token=="string"&&t.token.length>0&&e===t.token}function jt(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 Nt(e){let t=String(e??"").toLowerCase();return t==="strict"?"Strict":t==="lax"?"Lax":t==="none"?"None":"Unspecified"}function hs(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()}
4
+ `;return e.replace(/<head\b[^>]*>/i,n=>`${n}${s} ${t}`)}function ts(e){let t=J(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function rs(e,t){let r=[...new Set(t)].filter(i=>i.includes("/")&&!/\\+\//.test(i)).map(i=>[i,xe(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[c,a]of r)o=o.split(c).join(a);return o},n=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(i,o,c,a)=>`${o}${s(c)}${a}`);return n=n.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(i,o,c,a,l)=>ts(a)?`${o}${s(a)}${l}`:i),n}function ss(e,t){if(!t)return null;let r=m.dirname(m.resolve(t)),s=m.resolve(e.outputDir),n=m.relative(r,s).replace(/\\/g,"/");return n?(n.startsWith(".")||(n=`./${n}`),n.endsWith("/")?n:`${n}/`):"./"}function ns(e,t,r){let s=ss(t,r);if(!s)return e;let n=e;for(let i of Jr){let o=i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),c=new RegExp(`(?:\\.{1,}/)+${o}`,"g"),a=new RegExp(`(?<!\\.)/${o}`,"g");n=n.replace(c,`${s}${i}`).replace(a,`${s}${i}`);let l=i.replace(/\//g,"\\/"),u=s.replace(/\//g,"\\/"),p=l.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),d=new RegExp(`(?:\\.{1,}\\\\/)+${p}`,"g"),S=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${p}`,"g"),w=new RegExp(`(?<![\\.\\\\])\\/${p}`,"g");n=n.replace(d,`${u}${l}`).replace(S,`${u}${l}`).replace(w,`${u}${l}`);}return n}function Ke(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:Tt(t,e.targetOrigin),i=s?`${s.search}${s.hash}`:"";return e.urlRewriteMode==="root-relative"?`${n}${i}`:`${It(e.outputDir,r,n)}${i}`}function Ge(e,t,r,s,n){Te(e,r,Ke(t,s,n));}function is(e,t,r,s,n){if(!r||r===s)return;Te(e,r,s);let i=Ke(t,r,n),o=Ke(t,s,n);Te(e,i,o);}function Ze(e,t,r,s,n={}){let i=e,o={};Ge(o,t,t.sourceOrigin,t.targetOrigin,s);for(let[a,l]of Object.entries(t.extraReplacements))Ge(o,t,a,l,s);for(let[a,l]of Object.entries(r))Ge(o,t,a,l,s);for(let[a,l]of Object.entries(n)){let u=r[a];!u||u===l||is(o,t,l,u,s);}let c=Object.entries(o).sort((a,l)=>l[0].length-a[0].length);for(let[a,l]of c)i=Yr(i,a,l);return t.urlRewriteMode!=="absolute"&&(i=ns(i,t,s)),i=rs(i,c.map(([,a])=>a)),Xr(t,i,s)&&(i=es(i)),i}async function os(e,t,r,s){let n=m.join(e.outputDir,s),i=m.extname(n).toLowerCase(),o;try{o=await C.readFile(n,"utf8");}catch(l){if(l.code!=="ENOENT")throw l;return {changed:false}}let a=Ze(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 as(e,t){return await new Promise((r,s)=>{let n=a=>{if(c(),a?.error){s(new Error(a.error));return}r({changed:!!a?.changed});},i=a=>{c(),s(a);},o=a=>{c(),a!==0&&s(new Error(`Rewrite worker exited with code ${a}.`));},c=()=>{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 $t(e,t,r={}){let n=(r.files?[...new Set(r.files)].map(d=>m.resolve(d)).filter(d=>d.startsWith(m.resolve(e.outputDir))).map(d=>m.relative(e.outputDir,d).replace(/\\/g,"/")).filter(d=>d.length>0):await Br(["**/*"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(d=>d!=="asset-map.json"&&re(d)),i=0;if(n.length===0)return 0;let o=Math.max(1,Number(e.rewriteConcurrency||e.assetDownloadConcurrency||1)),c=Math.max(1,Math.min(o,n.length,availableParallelism()));await r.onStart?.({totalFiles:n.length,workerCount:c});let a=0,l=0,u=null;if(c===1){for(let d of n){let S=await os(e,t,r.previousAssetMap??{},d);S.changed&&(i+=1),l+=1,await r.onProgress?.({index:l,totalFiles:n.length,changedTextFiles:i,file:d,changed:S.changed});}return i}let p=Array.from({length:c},async()=>{let d=new Worker(new URL("./rewrite-worker.js",import.meta.url),{workerData:{config:e,assetMap:t,previousAssetMap:r.previousAssetMap??{}}});try{for(;!u;){let S=a;if(S>=n.length)return;a+=1;let w=n[S],P=await as(d,w);P.changed&&(i+=1),l+=1,await r.onProgress?.({index:l,totalFiles:n.length,changedTextFiles:i,file:w,changed:P.changed});}}catch(S){throw u=S instanceof Error?S:new Error(String(S)),u}finally{await d.terminate().catch(()=>{});}});return await Promise.all(p),i}var se={error:0,warn:1,info:2,debug:3},us=/^(?:authorization|proxyAuthorization|runtimeToken|siteKey|nonce|accessToken|refreshToken|accessKeyId|secretAccessKey|sessionToken|xStaticPublisherToken|xApiKey)$/i;function V(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 Me(e){return typeof e=="string"?V(e):Array.isArray(e)?e.map(t=>Me(t)):e instanceof Error?{name:e.name,message:V(e.message),...e.stack?{stack:V(e.stack)}:{}}:e&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,r])=>[t,us.test(t)?"[REDACTED]":Me(r)])):e}function Ye(e){return e?Me(e):void 0}var Lt=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",Ie=Lt?m.join(Lt,"current-progress.json"):"",Ut=Promise.resolve();function Ot(e){return e.includes("crawl")?"crawl":e.includes("deploy")?"deploy":e.includes("invalidate")?"invalidate":e}function cs(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 ls(e,t,r){Ie&&(Ut=Ut.then(async()=>{let s=new Date,n=s.toISOString();await C.mkdir(m.dirname(Ie),{recursive:true});let i=await C.readFile(Ie,"utf8").then(h=>JSON.parse(h)).catch(()=>null),o=i&&typeof i.details=="object"&&i.details?i.details:{},c=Ot(e),a=i?.currentStep||Ot(i?.source||""),l=i?.startedAt||n,u={...i?.stepDurationsSec??{}},p=i?.stepStartedAt||n;if(a&&a!==c&&i?.stepStartedAt){let h=Math.max(0,Math.round((s.getTime()-new Date(i.stepStartedAt).getTime())/1e3));u[a]=(u[a]??0)+h,p=n;}let d=Math.max(0,Math.round((s.getTime()-new Date(p).getTime())/1e3)),S=Math.max(0,Math.round((s.getTime()-new Date(l).getTime())/1e3)),w=V(t),P=Ye(r)??{},g={checkedAt:n,source:e,message:w,details:cs(o,P),startedAt:l,currentStep:c,stepStartedAt:p,stepElapsedSec:d,totalElapsedSec:S,stepDurationsSec:u};await C.writeFile(Ie,JSON.stringify(g,null,2),"utf8");}).catch(()=>{}));}async function ds(e,t){await C.mkdir(m.dirname(e),{recursive:true}),await C.appendFile(e,`${JSON.stringify(Me(t))}
5
+ `,"utf8");}function ps(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 gs(e,t,r){let s=Ye(r);return {checkedAt:new Date().toISOString(),currentStep:ps(e,s),level:e,message:V(t),details:s??{}}}var le=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 m.join(this.logDir,"crawl.log.jsonl")}get currentEventPath(){return m.join(this.logDir,"current-crawl-event.json")}get rejectedPath(){return m.join(this.logDir,"rejected.jsonl")}get ignoredPath(){return m.join(this.logDir,"ignored.jsonl")}get skippedPath(){return m.join(this.logDir,"skipped-http.jsonl")}get errorsPath(){return m.join(this.logDir,"errors.jsonl")}get timingsPath(){return m.join(this.logDir,"timings.jsonl")}ensureLogFileReady(){return this.initPromise||(this.initPromise=(async()=>{await C.mkdir(this.logDir,{recursive:true}),await C.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 C.appendFile(this.logPath,`${t}
6
+ `,"utf8");});}enqueueJsonLine(t,r){this.enqueueTask(()=>ds(t,r));}updateCurrentEvent(t,r,s){let n=gs(t,r,s);this.enqueueTask(async()=>{await C.mkdir(this.logDir,{recursive:true}),await C.writeFile(this.currentEventPath,JSON.stringify(n,null,2),"utf8");});}push(t,r,s){let n=V(r),i=Ye(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||""):(se[this.level]>=se.debug||["summary","page","sitemap","asset","timing"].includes(t))&&console.log(n);}info(t,r){this.push("info",t,r);}debug(t,r){se[this.level]<se.debug||this.push("debug",t,r);}progress(t,r){ls("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),se[this.level]>=se.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),se[this.level]>=se.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 Xe="(?: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 Dt(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 Et(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]&&Dt(i[1])&&r.push({index:i.index??0,value:i[1]});for(let i of e.matchAll(n))i[1]&&Dt(i[1])&&r.push({index:i.index??0,value:i[1]});for(let i of r.sort((o,c)=>o.index-c.index))t.add(i.value);return [...t]}function Ft(e,t){return typeof e=="string"&&e.length>0&&t?.supported===true&&typeof t.token=="string"&&t.token.length>0&&e===t.token}function jt(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 Nt(e){let t=String(e??"").toLowerCase();return t==="strict"?"Strict":t==="lax"?"Lax":t==="none"?"None":"Unspecified"}function hs(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 _t(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(P=>P<=" "||"=;,".includes(P)))return null;let c=r.hostname.toLowerCase(),a=hs(r),l=null,u=true,p=false,d=false,S="Unspecified",m=false;for(let P of s){let g=P.indexOf("="),h=(g<0?P:P.slice(0,g)).trim().toLowerCase(),f=g<0?"":P.slice(g+1).trim();if(h==="domain"&&f)c=f.toLowerCase();else if(h==="path"&&f.startsWith("/"))a=f;else if(h==="expires"){let R=Date.parse(f);Number.isFinite(R)&&(l=Math.floor(R/1e3),u=false);}else if(h==="max-age"&&/^-?\d+$/u.test(f)){let R=Number.parseInt(f,10);l=Math.floor(Date.now()/1e3)+R,u=false;}else h==="secure"?p=true:h==="httponly"?d=true:h==="samesite"?S=Nt(f):h==="partitioned"&&(m=true);}return {name:o,domain:c,path:a,expires:l,session:u,secure:p,httpOnly:d,sameSite:S,partitioned:m}}function ms(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:Nt(e.sameSite),partitioned:e.partitioned===true}}function Wt(e,t){let r=new Map(e.map(s=>[Pe(s),s.value]));return t.filter(s=>r.get(Pe(s))!==s.value).map(ms)}function ws(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 $e=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?ws(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 Le(e,t){await C.mkdir(w.dirname(e),{recursive:true});let r=`${e}.${process.pid}.tmp`;await C.writeFile(r,`${JSON.stringify(t,null,2)}
9
- `,{encoding:"utf8",mode:384}),await C.rename(r,e);}var bs=["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"],tr=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"]),rr=new Set(["",".html",".htm"]),vs=new Set([".css",".xml",".xsl",".svg",".json",".html",".htm",".txt",".enc",".jws"]),Cs=["/wp-content/","/wp-includes/","/wp-admin/","/static/","/assets/","/build/","/_next/"];function Rs(e){let t=[],r="full",s="full",n=false,i=false,o="";for(let c=0;c<e.length;c++){let a=e[c];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[++c];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[++c];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[++c];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[++c];if(!l)throw new Error("--content-sync-plan requires a file path");r="content-sync",s="incremental",n=true,o=w.resolve(l);}else a.startsWith("--content-sync-plan=")&&(r="content-sync",s="incremental",n=true,o=w.resolve(a.slice(20)));}return {mode:r,crawlMode:s,urls:t,preserveOutput:n,resumeRewrite:i,contentSyncPlanPath:o}}function qe(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?w.resolve(e):""}function As(){let e=qe();return e?w.join(e,"privacy","cookie-observations.json"):null}function ks(){let e=qe();return e?w.resolve(e,".."):""}function xs(){let e=process.env.STATIC_PUBLISHER_WP_ROOT||process.env.WPSUITE_STATIC_PUBLISHER_WP_ROOT||"";return e.trim()?w.resolve(e):""}function Ts(e){let t=e.trim(),r=[{alias:"@storage-root",root:ks(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@runtime",root:qe(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@wp-root",root:xs(),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?w.resolve(s.root,n):s.root,alias:s.alias}}return {resolvedPath:w.resolve(t)}}function sr(e){let t=String(process.env.STATIC_PUBLISHER_CRAWL_MANIFEST_PATH||"").trim();if(t)return w.resolve(t);let r=qe();return r?w.join(r,"crawl-manifest.json"):w.join(e.outputDir,".crawl-manifest.json")}function nr(){return {schemaVersion:5,updatedAt:"",pages:{},assets:{}}}function Bt(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 Is(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 rt(e){let t=e?.["content-type"]?.trim();return t||null}function Ms(){return {rewriteTargets:new Set,changedFiles:new Set,deletedFiles:new Set}}function W(e,t,r){let s=ee(t.outputDir,r);s&&(e.changedFiles.add(s),e.deletedFiles.delete(s));}function Qt(e,t,r){let s=ee(t.outputDir,r);s&&(e.deletedFiles.add(s),e.changedFiles.delete(s));}function ue(e,t){e.rewriteTargets.add(w.resolve(t));}async function $s(e){try{let t=await C.readFile(sr(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,Bt(n)])),assets:Object.fromEntries(Object.entries(r.assets).map(([s,n])=>[s,Is(n)]))};if(r.schemaVersion===1)return {schemaVersion:5,updatedAt:String(r.updatedAt||""),pages:Object.fromEntries(Object.entries(r.pages).map(([s,n])=>[s,Bt(n)])),assets:{}}}}catch{}return nr()}function st(e){return JSON.parse(JSON.stringify(e))}async function Ls(e,t){let r=sr(e);await C.mkdir(w.dirname(r),{recursive:true}),await C.writeFile(r,JSON.stringify(t,null,2),"utf8");}async function ne(e,t){if(!t.trackManifest)return;let r=async()=>{let s=st(t.manifest);s.updatedAt=new Date().toISOString(),t.manifest.updatedAt=s.updatedAt,await Ls(e,s);};t.manifestSaveChain=t.manifestSaveChain.then(r,r),await t.manifestSaveChain;}function be(e){if(!e)return null;let t=e.trim();return t||null}function Us(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 ir(e,t,r,s){let n=[...new Set(r.map(c=>c.trim()).filter(Boolean))],i=String(e.wpsuite?.runtimeToken||"").trim();if(n.length===0||!i)return new Map;let o=new URL("/wp-json/smartcloud-static-publisher/v1/change-tokens",e.sourceOrigin).toString();try{let c=await t.post(o,{timeout:3e4,failOnStatusCode:!1,headers:{"content-type":"application/json","x-static-publisher-token":i},data:JSON.stringify({urls:n})});if(!c.ok())return s.warn(`Change token lookup failed with HTTP ${c.status()}`,{endpoint:o,status:c.status()}),new Map;let a=await c.json().catch(()=>null);if(!a||!Array.isArray(a.items))return new Map;let l=new Map;for(let u of a.items)!u||typeof u.url!="string"||l.set(u.url,u);return l}catch(c){return s.warn("Change token lookup failed; falling back to sitemap metadata",{endpoint:o,error:c instanceof Error?`${c.name}: ${c.message.split(/\r?\n/u,1)[0]}`:"Unknown change-token request failure"}),new Map}}async function Ee(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 ir(e,t,[s],n)).get(s)??null;return ct(e,s)&&(!o||o.supported!==true||!o.token)&&(o=await Ds(e,t,s,n)),o=or(e,o),r.changeTokenCache.set(s,o),o}async function Os(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 c=i.slice(o,o+250),a=await ir(e,t,c,n);for(let l of c)r.changeTokenCache.set(l,or(e,a.get(l)??null));}}function Es(e){return `subscriber=${e.wpsuite?.siteSettings?.subscriber===true?"1":"0"}`}function or(e,t){if(!t?.supported||!t.token||t.tokenSource==="wp-media-file")return t;let r=Es(e);return {...t,token:ye(`${t.token}
10
- ${r}`,40),tokenSource:t.tokenSource?`${t.tokenSource}+site-subscriber`:"site-subscriber"}}async function Ds(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}
8
+ ${e.path}`}function _t(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(P=>P<=" "||"=;,".includes(P)))return null;let c=r.hostname.toLowerCase(),a=hs(r),l=null,u=true,p=false,d=false,S="Unspecified",w=false;for(let P of s){let g=P.indexOf("="),h=(g<0?P:P.slice(0,g)).trim().toLowerCase(),f=g<0?"":P.slice(g+1).trim();if(h==="domain"&&f)c=f.toLowerCase();else if(h==="path"&&f.startsWith("/"))a=f;else if(h==="expires"){let R=Date.parse(f);Number.isFinite(R)&&(l=Math.floor(R/1e3),u=false);}else if(h==="max-age"&&/^-?\d+$/u.test(f)){let R=Number.parseInt(f,10);l=Math.floor(Date.now()/1e3)+R,u=false;}else h==="secure"?p=true:h==="httponly"?d=true:h==="samesite"?S=Nt(f):h==="partitioned"&&(w=true);}return {name:o,domain:c,path:a,expires:l,session:u,secure:p,httpOnly:d,sameSite:S,partitioned:w}}function ms(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:Nt(e.sameSite),partitioned:e.partitioned===true}}function Wt(e,t){let r=new Map(e.map(s=>[Pe(s),s.value]));return t.filter(s=>r.get(Pe(s))!==s.value).map(ms)}function ws(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 $e=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?ws(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 Le(e,t){await C.mkdir(m.dirname(e),{recursive:true});let r=`${e}.${process.pid}.tmp`;await C.writeFile(r,`${JSON.stringify(t,null,2)}
9
+ `,{encoding:"utf8",mode:384}),await C.rename(r,e);}var bs=["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"],tr=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"]),rr=new Set(["",".html",".htm"]),vs=new Set([".css",".xml",".xsl",".svg",".json",".html",".htm",".txt",".enc",".jws"]),Cs=["/wp-content/","/wp-includes/","/wp-admin/","/static/","/assets/","/build/","/_next/"];function Rs(e){let t=[],r="full",s="full",n=false,i=false,o="";for(let c=0;c<e.length;c++){let a=e[c];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[++c];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[++c];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[++c];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[++c];if(!l)throw new Error("--content-sync-plan requires a file path");r="content-sync",s="incremental",n=true,o=m.resolve(l);}else a.startsWith("--content-sync-plan=")&&(r="content-sync",s="incremental",n=true,o=m.resolve(a.slice(20)));}return {mode:r,crawlMode:s,urls:t,preserveOutput:n,resumeRewrite:i,contentSyncPlanPath:o}}function qe(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?m.resolve(e):""}function As(){let e=qe();return e?m.join(e,"privacy","cookie-observations.json"):null}function ks(){let e=qe();return e?m.resolve(e,".."):""}function xs(){let e=process.env.STATIC_PUBLISHER_WP_ROOT||process.env.WPSUITE_STATIC_PUBLISHER_WP_ROOT||"";return e.trim()?m.resolve(e):""}function Ts(e){let t=e.trim(),r=[{alias:"@storage-root",root:ks(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@runtime",root:qe(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@wp-root",root:xs(),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?m.resolve(s.root,n):s.root,alias:s.alias}}return {resolvedPath:m.resolve(t)}}function sr(e){let t=String(process.env.STATIC_PUBLISHER_CRAWL_MANIFEST_PATH||"").trim();if(t)return m.resolve(t);let r=qe();return r?m.join(r,"crawl-manifest.json"):m.join(e.outputDir,".crawl-manifest.json")}function nr(){return {schemaVersion:5,updatedAt:"",pages:{},assets:{}}}function Bt(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 Is(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 rt(e){let t=e?.["content-type"]?.trim();return t||null}function Ms(){return {rewriteTargets:new Set,changedFiles:new Set,deletedFiles:new Set}}function W(e,t,r){let s=ee(t.outputDir,r);s&&(e.changedFiles.add(s),e.deletedFiles.delete(s));}function Qt(e,t,r){let s=ee(t.outputDir,r);s&&(e.deletedFiles.add(s),e.changedFiles.delete(s));}function ue(e,t){e.rewriteTargets.add(m.resolve(t));}async function $s(e){try{let t=await C.readFile(sr(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,Bt(n)])),assets:Object.fromEntries(Object.entries(r.assets).map(([s,n])=>[s,Is(n)]))};if(r.schemaVersion===1)return {schemaVersion:5,updatedAt:String(r.updatedAt||""),pages:Object.fromEntries(Object.entries(r.pages).map(([s,n])=>[s,Bt(n)])),assets:{}}}}catch{}return nr()}function st(e){return JSON.parse(JSON.stringify(e))}async function Ls(e,t){let r=sr(e);await C.mkdir(m.dirname(r),{recursive:true}),await C.writeFile(r,JSON.stringify(t,null,2),"utf8");}async function ne(e,t){if(!t.trackManifest)return;let r=async()=>{let s=st(t.manifest);s.updatedAt=new Date().toISOString(),t.manifest.updatedAt=s.updatedAt,await Ls(e,s);};t.manifestSaveChain=t.manifestSaveChain.then(r,r),await t.manifestSaveChain;}function be(e){if(!e)return null;let t=e.trim();return t||null}function Us(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 ir(e,t,r,s){let n=[...new Set(r.map(c=>c.trim()).filter(Boolean))],i=String(e.wpsuite?.runtimeToken||"").trim();if(n.length===0||!i)return new Map;let o=new URL("/wp-json/smartcloud-static-publisher/v1/change-tokens",e.sourceOrigin).toString();try{let c=await t.post(o,{timeout:3e4,failOnStatusCode:!1,headers:{"content-type":"application/json","x-static-publisher-token":i},data:JSON.stringify({urls:n})});if(!c.ok())return s.warn(`Change token lookup failed with HTTP ${c.status()}`,{endpoint:o,status:c.status()}),new Map;let a=await c.json().catch(()=>null);if(!a||!Array.isArray(a.items))return new Map;let l=new Map;for(let u of a.items)!u||typeof u.url!="string"||l.set(u.url,u);return l}catch(c){return s.warn("Change token lookup failed; falling back to sitemap metadata",{endpoint:o,error:c instanceof Error?`${c.name}: ${c.message.split(/\r?\n/u,1)[0]}`:"Unknown change-token request failure"}),new Map}}async function De(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 ir(e,t,[s],n)).get(s)??null;return ct(e,s)&&(!o||o.supported!==true||!o.token)&&(o=await Es(e,t,s,n)),o=or(e,o),r.changeTokenCache.set(s,o),o}async function Os(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 c=i.slice(o,o+250),a=await ir(e,t,c,n);for(let l of c)r.changeTokenCache.set(l,or(e,a.get(l)??null));}}function Ds(e){return `subscriber=${e.wpsuite?.siteSettings?.subscriber===true?"1":"0"}`}function or(e,t){if(!t?.supported||!t.token||t.tokenSource==="wp-media-file")return t;let r=Ds(e);return {...t,token:ye(`${t.token}
10
+ ${r}`,40),tokenSource:t.tokenSource?`${t.tokenSource}+site-subscriber`:"site-subscriber"}}async function Es(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 Fs(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 js(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 js(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 qs(e,t,r,s,n){let i=Ht(r.previousManifest,void 0,s,"previous-manifest"),o=0;for(let[d,S]of Object.entries(r.manifest.pages))if(!r.seenPages.has(d)){Qt(n,e,S.outputPath);try{await C.unlink(S.outputPath);}catch(m){(m.code||"")!=="ENOENT"&&s.warn(`Failed to remove stale incremental page output for ${d}`,{url:d,outputPath:S.outputPath,error:String(m)});}delete r.manifest.pages[d],o++;}let c=Ht(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 m=ge(e,t.assetMap,d);m&&l.add(m);}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(qt(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,m=r.previousManifest.assets[d]?.outputPath;m&&S.add(m);let P=ge(e,t.assetMap,d);if(!c.has(d)&&P)S.add(P);else if(!c.has(d)){let g=rn(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)){Qt(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 Ht(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 zt(e,t,r){for(let s of t)for(let n of ve(e,s))if(r.has(n))return true;return false}function Ns(e,t,r,s,n){let i=new Set(r.rewriteTargets);for(let c of Object.values(t.manifest.pages))c.rewriteComplete||i.add(w.resolve(c.outputPath));for(let c of Object.values(t.manifest.assets))c.isText&&!c.rewriteComplete&&i.add(w.resolve(c.outputPath));let o=Us(s,n);if(o.size===0)return [...i];for(let c of Object.values(t.manifest.pages))zt(e,c.discoveredAssets,o)&&i.add(w.resolve(c.outputPath));for(let[c,a]of Object.entries(t.manifest.assets)){a.isText&&zt(e,a.discoveredAssets,o)&&i.add(w.resolve(a.outputPath));for(let l of ve(e,c))if(o.has(l)){W(r,e,a.outputPath),a.isText&&i.add(w.resolve(a.outputPath));break}}return [...i]}function _s(e,t){let r=t?new Set(Array.from(t,n=>w.resolve(n))):null,s=n=>r===null||r.has(w.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 Ws(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 Bs(e,t,r,s,n){let i=[...s.deletedFiles].sort(),o=Ws(e,t,r),c=0;for(let u of [...o].sort()){try{if((await C.stat(w.join(e.outputDir,u))).isFile())continue}catch{}c++,n.warn(`Active output is missing after crawl: ${u}`,{phase:"deploy-plan",file:u,outputPath:w.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=w.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 Qs(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 ar(e,t){let r=e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/"?e.targetOrigin:"https://relative.invalid/";try{let s=new URL(t,r);return w.join(e.outputDir,ut(s.pathname))}catch{return null}}function Hs(e,t,r){for(let s of Qs(e,r)){let n=t[s];if(!n)continue;let i=ar(e,n);if(i)return {outputPath:i,publicUrl:n}}return null}function zs(e,t,r){for(let s of ve(e,r)){let n=t[s];if(!n)continue;let i=ar(e,n);if(i)return i}return null}function ge(e,t,r){let s=zs(e,t,r);if(s)return s;try{return Ne(e,r).originalFilePath}catch{return null}}function Js(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?w.join(w.resolve(e),"queue-runner-heartbeat.json"):""}async function Jt(e){let t=Js();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 Vs(e,t){let r=new Set;for(let s of t.donePages)r.add(w.resolve(K(e,s)));for(let s of t.doneAssets){let n=ge(e,t.assetMap,s);!n||!re(n)||r.add(w.resolve(n));}for(let s of t.doneSitemaps){let n=ge(e,t.assetMap,s);!n||!re(n)||r.add(w.resolve(n));}return [...r]}var Fe="re:",Ue=new Map;function Gs(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=Gs(t);return r?r.test(e):t.startsWith(Fe)?false:e.startsWith(t)}function Ks(e,t){return t.find(r=>at(e,r))}function ur(e,t){let r=Ks(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 Zs(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 Ys(e,t){return Zs(e).has(t.hostname)}function Xs(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 en(e){let t=J(e).replace(/\\\//g,"/").trim(),r=w.extname(t).toLowerCase();return tr.has(r)||rr.has(r)?false:/^(?:this|[A-Za-z_$][\w$]*)\.[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/.test(t)}function fe(e){return Cs.some(t=>e.pathname.startsWith(t))}function N(e,t,r=e.sourceOrigin,s,n="url"){let i=Xs(t);if(!i||i.startsWith("data:")||i.startsWith("blob:")||i.startsWith("mailto:")||i.startsWith("tel:")||i.startsWith("#"))return s?.ignore(n,t,"empty or unsupported scheme",r),null;if(nt(i))return s?.ignore(n,t,"looks like JavaScript/code fragment",r),null;if(en(i))return s?.ignore(n,t,"looks like JavaScript property access",r),null;try{let o=new URL(i,r);if(cr(o))return s?.reject(n,t,"malformed URL encoding",r),null;if(!["http:","https:"].includes(o.protocol))return s?.ignore(n,t,"unsupported protocol: ",r),null;if(!Ys(e,o))return s?.ignore(n,o.toString(),"host not allowed",r),null;let c=ur(e,o);if(c)return s?.reject(n,o.toString(),c,r),null;let a=new URL(e.sourceOrigin);return o.protocol=a.protocol,o.host=a.host,o.hash="",o}catch{return s?.reject(n,t,"invalid URL",r),null}}function cr(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 cr(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 lr(e){return tr.has(w.extname(e.pathname).toLowerCase())}function oe(e){return fe(e)?false:rr.has(w.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))||lr(t)||!oe(t)&&!fe(t))}function K(e,t){let r=new URL(t),s=ut(r.pathname);return s.endsWith("/")?s+="index.html":w.extname(s)||(s+="/index.html"),w.join(e.outputDir,s)}function ut(e){try{return decodeURIComponent(e)}catch{return e}}function tn(e){if(!e.generated404RequestPath)return null;try{let t=new URL(e.generated404RequestPath,e.sourceOrigin);return !t.pathname.endsWith("/")&&w.extname(t.pathname)===""&&(t.pathname+="/"),t.hash="",t.toString()}catch{return null}}function ct(e,t){let r=tn(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=w.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=w.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:w.join(e.outputDir,p),hashedPublicUrl:Ve(e.targetOrigin,p)}}function rn(e,t,r,s){let n=ie(t,r,"asset",s);return n?Ne(e,n.toString()):null}function sn(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 dr(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 nn(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 pr(e){let t=String(e["last-modified"]||"").trim();if(!t)return null;let r=Date.parse(t);return Number.isFinite(r)?r:null}function on(e,t){let r=pr(t),s=nn(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 an(e,t){if(!t)return;let r=pr(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 Vt(e,t){let r=w.extname(e.pathname).toLowerCase(),s=t["content-type"]||"";return vs.has(r)||bs.some(n=>s.includes(n))&&!s.startsWith("image/")&&!s.includes("font")}function un(e){try{let t=w.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 cn(e){return ye(e.toString("base64"),40)}function ln(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 dn(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=cn(s),l=c.originalFilePath,u=c.originalPublicUrlWithSearch;if(c.preferQueryHashed&&c.hashedFilePath&&c.hashedPublicUrl&&ln(n,c.originalFilePath,a)){let m=Hs(e,t,r);m?(l=m.outputPath,u=m.publicUrl):(l=c.hashedFilePath,u=c.hashedPublicUrl);}sn(e,t,r,u,c.originalPublicUrl);let p=re(l)?Buffer.from(Ze(s.toString("utf8"),e,t,l),"utf8"):s,d=await dr(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}),dn(n,c.originalFilePath,a),await an(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)||lr(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 pn(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 gn(e){return e.split(",").map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function fn(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 hn(e){return e.replace(/<script\b[^>]*>[\s\S]*?<\/script\s*>/gi,"")}function mn(e,t){if(t==="dom-style")return true;let r=(()=>{try{return w.extname(new URL(e).pathname).toLowerCase()}catch{return ""}})();return !(r===".js"||r===".mjs"||r===".map"||t.includes("javascript"))}function tt(e){return e.trim().replace(/\\/g,"/").replace(/^https?:\/\/[^/]+/i,"").replace(/^\/+/,"")}async function gr(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=w.join(e,o.name),a=w.join(t,o.name);if(o.isDirectory()){n.push(...await gr(c,a,r,s));continue}await fr(c,a,r,s)&&n.push(a);}return n}async function wn(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 fr(e,t,r,s){let n=w.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 wn(e,t)?(s.debug("Skipped unchanged post-crawl copy target",{phase:"copy-extra-paths",sourcePath:e,targetPath:t}),false):(await C.mkdir(w.dirname(t),{recursive:true}),await C.copyFile(e,t),true)}async function yn(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=>w.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=Ts(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 m=w.resolve(e.outputDir,d);if(S.isDirectory()){let f=await gr(p,m,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=w.basename(p),g=l.endsWith("/")?w.join(m,P):m;await fr(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"?hn(o):o,a=mn(t,n);if(a){for(let u of fn(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"&&un(t))for(let u of Dt(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 Sn(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&&(ur(e,a)||oe(a)&&!fe(a)&&!L(e,a)&&n.add(a.toString()));}return [...n]}async function Gt(e,t,r,s,n,i,o=false,c=[]){let a=new Set(c),l=0,u=new Map,p=(d,S)=>{let m=[S],P=new Set;for(;m.length>0;){let g=m.pop();if(g===d)return true;P.has(g)||(P.add(g),m.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 m=S.toString();if(r.doneSitemaps.has(m))continue;r.doneSitemaps.add(m),s.sitemap(`Fetching sitemap ${m}`,{url:m});let P=true;try{let g=await t.get(m,{timeout:6e4});if(P=!1,!g.ok()){if(s.skip("sitemap",m,g.status()),o&&!a.has(m))throw new Error(`Required child content-sync sitemap returned HTTP ${g.status()}: ${m}`);continue}let h=await g.body(),f=g.url()||m,R=ie(f,s,"sitemap-response",m);if(!R)continue;let v=R.toString();r.successfulSitemaps.add(m),r.successfulSitemaps.add(v),a.has(m)&&(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 pn(U)){let k=N(e,$.loc,v,s,"sitemap-loc");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 ${m}`,{url:m,error:String(g)});let h=o&&a.has(m)&&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 Pn(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=Ft(l?.changeToken,u),S=i.strictTargeted&&(!u?.supported||!u.token)&&jt(e.sourceOrigin,a),m=i.strictTargeted?i.manifest.assets[a]:void 0;if(m?.lastSeenRunId===i.runId&&await pe(m.outputPath)){r.doneAssets.add(a);for(let g of m.discoveredAssets||[])q(e,r,g,n,a);W(o,e,m.outputPath),m.isText&&ue(o,m.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()&&on(h,y)){let A=await dr(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=Vt(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 $=Vt(c,T),k=[];if($){let _=R.toString("utf8");k=Re(e,U,_,n,`asset:${w.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 bn(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 Pn(e,t,r,a,s,n,i));}});await Promise.all(c);}function vn(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 Cn(e){return Math.max(15e3,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+1e4)}function lt(e){return e.stats.pagesCompleted}function hr(e){let r=e.options?.browserProcess;return {pid:typeof r?.process?.pid=="number"?r.process.pid:null,kill:typeof r?.kill=="function"?r.kill.bind(r):null}}async function Rn(e,t,r){let s=hr(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 ${vn(t)}.`));},t);})])}finally{s!==void 0&&globalThis.clearTimeout(s);}}async function An(e,t){let r=Cn(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 kn(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 An(e,t),await t.waitForTimeout(e.readiness.fallbackWaitMs);}async function xn(e,t){await t.waitForLoadState("domcontentloaded",{timeout:e.readiness.timeoutMs}).catch(()=>{}),await t.waitForLoadState("load",{timeout:e.readiness.timeoutMs}).catch(()=>{}),e.readiness.waitForSelector&&await t.waitForSelector(e.readiness.waitForSelector,{timeout:e.readiness.timeoutMs}).catch(()=>{}),await t.waitForTimeout(e.readiness.fallbackWaitMs);}function Tn(e,t){return e.noJavaScriptRenderPathPrefixes.some(r=>at(t,r))}async function In(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(m=>{for(let g of l){let h=m.getAttribute(g);h&&a.add(h);}for(let g of p){let h=m.getAttribute(g);h&&h.split(",").forEach(f=>{let R=f.trim().split(/\s+/)[0];R&&a.add(R);});}let P=m.getAttribute("style");P&&u.add(P),m.shadowRoot&&d(m.shadowRoot);});};return d(document),{attrs:[...a],styles:[...u]}});for(let a of c.attrs)for(let l of gn(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 Kt(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 Mn(e){let t=lt(e);return t%5===0||t===1||t===e.stats.pagesQueued}function $n(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 Ln(e){await e.addInitScript(()=>{Object.defineProperty(window,"__WPSUITE_STATIC_EXPORT__",{value:true,writable:false,configurable:true});let t=r=>{if(r==null||String(r)==="")return true;try{let s=new URL(String(r),window.location.href),n=new URL(window.location.href);return s.hash="",n.hash="",s.href===n.href}catch{return false}};try{let r=window.location.assign.bind(window.location),s=window.location.replace.bind(window.location),n=window.location.reload.bind(window.location);Object.defineProperty(window.location,"assign",{configurable:!0,value:i=>{if(t(i)){console.warn("[smartcloud-static-publisher] blocked same-page location.assign",i??"");return}return r(i)}}),Object.defineProperty(window.location,"replace",{configurable:!0,value:i=>{if(t(i)){console.warn("[smartcloud-static-publisher] blocked same-page location.replace",i??"");return}return s(i)}}),Object.defineProperty(window.location,"reload",{configurable:!0,value:()=>{console.warn("[smartcloud-static-publisher] blocked location.reload");}});}catch{}});}async function Un(e,t,r){let s=await e.newContext({viewport:t.viewport,userAgent:"WPSuiteStaticPublisher/0.8 Playwright SitemapOnly",ignoreHTTPSErrors:t.ignoreHttpsErrors,...r?{javaScriptEnabled:false}:{}});return r||await Ln(s),s}async function On(e,t,r,s,n,i,o,c){let a=await chromium.launch({headless:true}),l=hr(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=[],m=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=Tn(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 Fs(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),()=>Un(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(_t(E,b.url()));}).catch(()=>{}).then(()=>{});m.add(x),x.finally(()=>m.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),()=>xn(e,d))):await j(`wait for rendered page ${u}`,G(e),()=>kn(e,d)),t.stats.pagesRendered++;let $=await j(`extract rendered assets ${u}`,G(e),()=>In(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?Sn(e,u,_,r):[];if(s!=="single-url"&&s!=="content-sync"&&!h)for(let b of y)Ce(e,t,b,r,u);await Kt(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 Kt(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(m.size>0&&await Promise.allSettled([...m]),p)try{let P=await p.cookies();c.addAll(Wt(S,P));}catch{}t.stats.pagesCompleted++,Mn(t)&&$n(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)}),Rn(a,r,"browser.close timeout")));}}async function En(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 Zt(e){let t=String(e||"").toLowerCase();return t.includes("timeout")||t.includes("timed out")||t.includes("navigation timeout")}function Dn(e){let t=String(e?.job?.command||"").trim(),r=String(e?.job?.crawlMode||"full").trim();return t!=="publish"&&t!=="crawl"?false:r!=="incremental"}function Fn(e){let t=[e?.archivedAt,e?.job?.endedAt,e?.job?.startedAt];for(let r of t){let s=Date.parse(String(r||""));if(Number.isFinite(s))return s}return 0}async function mr(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 Yt(e){let t=String(e.originalFileName||"").toLowerCase();return t.endsWith("errors.jsonl")?0:t.endsWith("errors.json")?1:2}function jn(e,t){let r=Array.isArray(t?.artifacts)?t.artifacts.filter(s=>String(s?.role||"").trim()==="errors"&&String(s?.storedFileName||"").trim()!=="").sort((s,n)=>Yt(s)-Yt(n)).map(s=>w.join(e,String(s.storedFileName))):[];return [...new Set([...r,w.join(e,"errors.jsonl"),w.join(e,"errors.json"),w.join(e,"errors.jsonl.gz"),w.join(e,"errors.json.gz")])]}async function Xt(e){let t=await mr(w.join(e,"job.json"));for(let r of jn(e,t)){let s=await En(r);if(s.length>0)return s}return []}async function qn(e){let t=w.join(e.logDir,"archive"),r;try{r=await C.readdir(t);}catch{return ""}let s="",n=0;for(let i of r){let o=w.join(t,i);if(!(await C.stat(o).catch(()=>null))?.isDirectory())continue;let a=await mr(w.join(o,"job.json"));if(!Dn(a))continue;let l=Fn(a);l>=n&&(n=l,s=o);}return s}async function Nn(e){let t=await qn(e),r=t!==""?await Xt(t):await Xt(e.logDir),s=new Set;for(let n of r)if(Zt(n.error)||Zt(n.message)){let i=n.url;typeof i=="string"&&i&&s.add(i);}return [...s]}async function _n(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 Wn(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 Bn(e,t){let r;try{r=new URL(e);}catch{return false}return t.archiveFamilies.some(s=>{let n=new URL(s.url);if(r.origin!==n.origin)return false;if(r.toString()===n.toString())return true;if(r.searchParams.has("paged")&&r.pathname===n.pathname)return /^\d+$/.test(r.searchParams.get("paged")||"");let i=n.pathname.replace(/\/+$/,""),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=w.resolve(i.outputPath);Object.entries(t.manifest.pages).some(([l,u])=>l!==s&&!n.has(l)&&w.resolve(u.outputPath)===c)||(await C.rm(i.outputPath,{force:true}),r.deletedFiles.add(o)),delete t.manifest.pages[s];}function Qn(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 Hn(e,t,r,s,n){let i=Qn(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 zn(e){try{let t=await C.readFile(w.join(e.outputDir,"asset-map.json"),"utf8");return JSON.parse(t)}catch{return {}}}async function Jn(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(w.join(e,r));}catch(s){if(s.code!=="ENOENT")throw s}}));}function er(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 wr(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=Rs(e),o=i.mode==="content-sync"?await Wn(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 Nn(r)),i.mode==="single-url"&&(c=await _n(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 zn(r):{},S=l||i.mode==="single-url"||i.mode==="content-sync"?await $s(r):nr(),m=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))Bn(y,o)&&!m.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:m,deleteOnMissingUrls:P};await Jn(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=Ms(),v=new $e,O=As();if(O&&!i.resumeRewrite&&await Le(O,v.artifact()),await ht(r),await mt(r,{startedAt:new Date().toISOString(),outputDir:w.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 Gt(r,y,f,h,R,g),r.seedPaths.forEach(b=>er(r,f,b,h,"seed-path")),r.generated404RequestPath&&Ce(r,f,r.generated404RequestPath,h,"generated-404-request-path")):(c.forEach(b=>er(r,f,b,h,"cli")),o?.sitemapUrls.forEach(b=>je(r,f,b,h,"content-sync-impact")),await Gt(r,y,f,h,R,g,i.mode==="content-sync",o?.sitemapUrls??[]),o&&await Hn(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)},()=>On(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 Os(r,y,g,[...f.assetQueue],h),await bn(r,y,f,h,g,R),h.endMark("download-assets",{assets:f.doneAssets.size}),g.enabled&&r.maxPages===0&&await qs(r,f,g,h,R),i.mode==="full"){let b=await yn(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(w.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,w.join(r.outputDir,"asset-map.json"));let U=i.mode==="single-url"||i.mode==="content-sync"?Vs(r,f):g.enabled&&!i.resumeRewrite?Ns(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 Jt(T);let F=Date.now(),$=await $t(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,w.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 Jt(Z);}});g.trackManifest&&(_s(g,U),await ne(r,g)),h.endMark("rewrite-text",{changedTextFiles:$});let k=o?[...R.deletedFiles].sort():g.enabled&&!i.resumeRewrite?await Bs(r,f,g,R,h):[],_=[...new Set((U||[]).map(y=>ee(r.outputDir,w.isAbsolute(y)?y:w.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:w.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:w.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();}wr().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 Fs(e,t,r,s,n,i){let o=ct(e,n);if(!s.enabled)return {action:"render",changeToken:s.trackManifest?await De(e,t,s,n,i):null};let c=s.manifest.pages[n];if(!c)return {action:"render",changeToken:await De(e,t,s,n,i)};let a=await De(e,t,s,n,i);if(a?.supported&&a.token)return c.changeToken===a.token?o&&!await js(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 js(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 qs(e,t,r,s,n){let i=Ht(r.previousManifest,void 0,s,"previous-manifest"),o=0;for(let[d,S]of Object.entries(r.manifest.pages))if(!r.seenPages.has(d)){Qt(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=Ht(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(qt(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=rn(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)){Qt(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 Ht(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 zt(e,t,r){for(let s of t)for(let n of ve(e,s))if(r.has(n))return true;return false}function Ns(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=Us(s,n);if(o.size===0)return [...i];for(let c of Object.values(t.manifest.pages))zt(e,c.discoveredAssets,o)&&i.add(m.resolve(c.outputPath));for(let[c,a]of Object.entries(t.manifest.assets)){a.isText&&zt(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 _s(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 Ws(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 Bs(e,t,r,s,n){let i=[...s.deletedFiles].sort(),o=Ws(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 Qs(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 ar(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 Hs(e,t,r){for(let s of Qs(e,r)){let n=t[s];if(!n)continue;let i=ar(e,n);if(i)return {outputPath:i,publicUrl:n}}return null}function zs(e,t,r){for(let s of ve(e,r)){let n=t[s];if(!n)continue;let i=ar(e,n);if(i)return i}return null}function ge(e,t,r){let s=zs(e,t,r);if(s)return s;try{return Ne(e,r).originalFilePath}catch{return null}}function Js(){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 Jt(e){let t=Js();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 Vs(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 Gs(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=Gs(t);return r?r.test(e):t.startsWith(Fe)?false:e.startsWith(t)}function Ks(e,t){return t.find(r=>at(e,r))}function ur(e,t){let r=Ks(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 Zs(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 Ys(e,t){return Zs(e).has(t.hostname)}function Xs(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 en(e){let t=J(e).replace(/\\\//g,"/").trim(),r=m.extname(t).toLowerCase();return tr.has(r)||rr.has(r)?false:/^(?:this|[A-Za-z_$][\w$]*)\.[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/.test(t)}function fe(e){return Cs.some(t=>e.pathname.startsWith(t))}function N(e,t,r=e.sourceOrigin,s,n="url"){let i=Xs(t);if(!i||i.startsWith("data:")||i.startsWith("blob:")||i.startsWith("mailto:")||i.startsWith("tel:")||i.startsWith("#"))return s?.ignore(n,t,"empty or unsupported scheme",r),null;if(nt(i))return s?.ignore(n,t,"looks like JavaScript/code fragment",r),null;if(en(i))return s?.ignore(n,t,"looks like JavaScript property access",r),null;try{let o=new URL(i,r);if(cr(o))return s?.reject(n,t,"malformed URL encoding",r),null;if(!["http:","https:"].includes(o.protocol))return s?.ignore(n,t,"unsupported protocol: ",r),null;if(!Ys(e,o))return s?.ignore(n,o.toString(),"host not allowed",r),null;let c=ur(e,o);if(c)return s?.reject(n,o.toString(),c,r),null;let a=new URL(e.sourceOrigin);return o.protocol=a.protocol,o.host=a.host,o.hash="",o}catch{return s?.reject(n,t,"invalid URL",r),null}}function cr(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 cr(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 lr(e){return tr.has(m.extname(e.pathname).toLowerCase())}function oe(e){return fe(e)?false:rr.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))||lr(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 tn(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=tn(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 rn(e,t,r,s){let n=ie(t,r,"asset",s);return n?Ne(e,n.toString()):null}function sn(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 dr(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 nn(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 pr(e){let t=String(e["last-modified"]||"").trim();if(!t)return null;let r=Date.parse(t);return Number.isFinite(r)?r:null}function on(e,t){let r=pr(t),s=nn(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 an(e,t){if(!t)return;let r=pr(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 Vt(e,t){let r=m.extname(e.pathname).toLowerCase(),s=t["content-type"]||"";return vs.has(r)||bs.some(n=>s.includes(n))&&!s.startsWith("image/")&&!s.includes("font")}function un(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 cn(e){return ye(e.toString("base64"),40)}function ln(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 dn(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=cn(s),l=c.originalFilePath,u=c.originalPublicUrlWithSearch;if(c.preferQueryHashed&&c.hashedFilePath&&c.hashedPublicUrl&&ln(n,c.originalFilePath,a)){let w=Hs(e,t,r);w?(l=w.outputPath,u=w.publicUrl):(l=c.hashedFilePath,u=c.hashedPublicUrl);}sn(e,t,r,u,c.originalPublicUrl);let p=re(l)?Buffer.from(Ze(s.toString("utf8"),e,t,l),"utf8"):s,d=await dr(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}),dn(n,c.originalFilePath,a),await an(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)||lr(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 pn(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 gn(e){return e.split(",").map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function fn(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 hn(e){return e.replace(/<script\b[^>]*>[\s\S]*?<\/script\s*>/gi,"")}function mn(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 gr(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 gr(c,a,r,s));continue}await fr(c,a,r,s)&&n.push(a);}return n}async function wn(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 fr(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 wn(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 yn(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=Ts(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 gr(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 fr(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"?hn(o):o,a=mn(t,n);if(a){for(let u of fn(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"&&un(t))for(let u of Et(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 Sn(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&&(ur(e,a)||oe(a)&&!fe(a)&&!L(e,a)&&n.add(a.toString()));}return [...n]}async function Gt(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 pn(U)){let k=N(e,$.loc,v,s,"sitemap-loc");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 Pn(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 De(e,t,i,a,n):null,p=u?.token??null,d=Ft(l?.changeToken,u),S=i.strictTargeted&&(!u?.supported||!u.token)&&jt(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()&&on(h,y)){let A=await dr(g);if(A!==null){let b=_.url()||a,x=ie(b,n,"asset-response",a);if(!x)return;let M=x.toString(),D=await it(e,r.assetMap,M,A,r,n,y);D.wroteFile&&(W(o,e,D.outputPath),re(D.outputPath)&&ue(o,D.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=Vt(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:D.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 $=Vt(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 bn(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 Pn(e,t,r,a,s,n,i));}});await Promise.all(c);}function vn(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 Ee(e){return Math.max(15e3,Math.min(6e4,G(e)))}function Cn(e){return Math.max(15e3,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+1e4)}function lt(e){return e.stats.pagesCompleted}function hr(e){let r=e.options?.browserProcess;return {pid:typeof r?.process?.pid=="number"?r.process.pid:null,kill:typeof r?.kill=="function"?r.kill.bind(r):null}}async function Rn(e,t,r){let s=hr(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 ${vn(t)}.`));},t);})])}finally{s!==void 0&&globalThis.clearTimeout(s);}}async function An(e,t){let r=Cn(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 kn(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 An(e,t),await t.waitForTimeout(e.readiness.fallbackWaitMs);}async function xn(e,t){await t.waitForLoadState("domcontentloaded",{timeout:e.readiness.timeoutMs}).catch(()=>{}),await t.waitForLoadState("load",{timeout:e.readiness.timeoutMs}).catch(()=>{}),e.readiness.waitForSelector&&await t.waitForSelector(e.readiness.waitForSelector,{timeout:e.readiness.timeoutMs}).catch(()=>{}),await t.waitForTimeout(e.readiness.fallbackWaitMs);}function Tn(e,t){return e.noJavaScriptRenderPathPrefixes.some(r=>at(t,r))}async function In(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 gn(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 Kt(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 Mn(e){let t=lt(e);return t%5===0||t===1||t===e.stats.pagesQueued}function $n(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 Ln(e){await e.addInitScript(()=>{Object.defineProperty(window,"__WPSUITE_STATIC_EXPORT__",{value:true,writable:false,configurable:true});let t=r=>{if(r==null||String(r)==="")return true;try{let s=new URL(String(r),window.location.href),n=new URL(window.location.href);return s.hash="",n.hash="",s.href===n.href}catch{return false}};try{let r=window.location.assign.bind(window.location),s=window.location.replace.bind(window.location),n=window.location.reload.bind(window.location);Object.defineProperty(window.location,"assign",{configurable:!0,value:i=>{if(t(i)){console.warn("[smartcloud-static-publisher] blocked same-page location.assign",i??"");return}return r(i)}}),Object.defineProperty(window.location,"replace",{configurable:!0,value:i=>{if(t(i)){console.warn("[smartcloud-static-publisher] blocked same-page location.replace",i??"");return}return s(i)}}),Object.defineProperty(window.location,"reload",{configurable:!0,value:()=>{console.warn("[smartcloud-static-publisher] blocked location.reload");}});}catch{}});}async function Un(e,t,r){let s=await e.newContext({viewport:t.viewport,userAgent:"WPSuiteStaticPublisher/0.8 Playwright SitemapOnly",ignoreHTTPSErrors:t.ignoreHttpsErrors,...r?{javaScriptEnabled:false}:{}});return r||await Ln(s),s}async function On(e,t,r,s,n,i,o,c){let a=await chromium.launch({headless:true}),l=hr(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=Tn(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 Fs(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),()=>Un(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()),D=new URL(g);if(M.hash="",D.hash="",M.href===D.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 D of M)c.add(_t(D,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),()=>xn(e,d))):await j(`wait for rendered page ${u}`,G(e),()=>kn(e,d)),t.stats.pagesRendered++;let $=await j(`extract rendered assets ${u}`,G(e),()=>In(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?Sn(e,u,_,r):[];if(s!=="single-url"&&s!=="content-sync"&&!h)for(let b of y)Ce(e,t,b,r,u);await Kt(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 Kt(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(Wt(S,P));}catch{}t.stats.pagesCompleted++,Mn(t)&&$n(t,r),d&&await j(`close page ${u}`,Ee(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}`,Ee(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",Ee(e),()=>a.close()).catch(u=>(r.warn("Timed out while closing crawl worker browser",{browserPid:l.pid,error:String(u)}),Rn(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 Zt(e){let t=String(e||"").toLowerCase();return t.includes("timeout")||t.includes("timed out")||t.includes("navigation timeout")}function En(e){let t=String(e?.job?.command||"").trim(),r=String(e?.job?.crawlMode||"full").trim();return t!=="publish"&&t!=="crawl"?false:r!=="incremental"}function Fn(e){let t=[e?.archivedAt,e?.job?.endedAt,e?.job?.startedAt];for(let r of t){let s=Date.parse(String(r||""));if(Number.isFinite(s))return s}return 0}async function mr(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 Yt(e){let t=String(e.originalFileName||"").toLowerCase();return t.endsWith("errors.jsonl")?0:t.endsWith("errors.json")?1:2}function jn(e,t){let r=Array.isArray(t?.artifacts)?t.artifacts.filter(s=>String(s?.role||"").trim()==="errors"&&String(s?.storedFileName||"").trim()!=="").sort((s,n)=>Yt(s)-Yt(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 Xt(e){let t=await mr(m.join(e,"job.json"));for(let r of jn(e,t)){let s=await Dn(r);if(s.length>0)return s}return []}async function qn(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 mr(m.join(o,"job.json"));if(!En(a))continue;let l=Fn(a);l>=n&&(n=l,s=o);}return s}async function Nn(e){let t=await qn(e),r=t!==""?await Xt(t):await Xt(e.logDir),s=new Set;for(let n of r)if(Zt(n.error)||Zt(n.message)){let i=n.url;typeof i=="string"&&i&&s.add(i);}return [...s]}async function _n(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 Wn(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 Bn(e,t){let r;try{r=new URL(e);}catch{return false}return t.archiveFamilies.some(s=>{let n=new URL(s.url);if(r.origin!==n.origin)return false;if(r.toString()===n.toString())return true;if(r.searchParams.has("paged")&&r.pathname===n.pathname)return /^\d+$/.test(r.searchParams.get("paged")||"");let i=n.pathname.replace(/\/+$/,""),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 Qn(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 Hn(e,t,r,s,n){let i=Qn(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 zn(e){try{let t=await C.readFile(m.join(e.outputDir,"asset-map.json"),"utf8");return JSON.parse(t)}catch{return {}}}async function Jn(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 er(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 wr(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=Rs(e),o=i.mode==="content-sync"?await Wn(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 Nn(r)),i.mode==="single-url"&&(c=await _n(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 zn(r):{},S=l||i.mode==="single-url"||i.mode==="content-sync"?await $s(r):nr(),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))Bn(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 Jn(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=Ms(),v=new $e,O=As();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 Gt(r,y,f,h,R,g),r.seedPaths.forEach(b=>er(r,f,b,h,"seed-path")),r.generated404RequestPath&&Ce(r,f,r.generated404RequestPath,h,"generated-404-request-path")):(c.forEach(b=>er(r,f,b,h,"cli")),o?.sitemapUrls.forEach(b=>je(r,f,b,h,"content-sync-impact")),await Gt(r,y,f,h,R,g,i.mode==="content-sync",o?.sitemapUrls??[]),o&&await Hn(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)},()=>On(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 Os(r,y,g,[...f.assetQueue],h),await bn(r,y,f,h,g,R),h.endMark("download-assets",{assets:f.doneAssets.size}),g.enabled&&r.maxPages===0&&await qs(r,f,g,h,R),i.mode==="full"){let b=await yn(r,f,h);for(let x of b)W(R,r,x);}}finally{await j("dispose crawl request context",Ee(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"?Vs(r,f):g.enabled&&!i.resumeRewrite?Ns(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 Jt(T);let F=Date.now(),$=await $t(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 D=Date.now();if(!(y===1||y===A||y%50===0||D-F>=5e3))return;F=D;let Z=`Rewriting text files: ${y}/${A}`;h.progress(Z,{phase:"rewrite-text",index:y,totalFiles:A,changedTextFiles:b,file:x}),await Jt(Z);}});g.trackManifest&&(_s(g,U),await ne(r,g)),h.endMark("rewrite-text",{changedTextFiles:$});let k=o?[...R.deletedFiles].sort():g.enabled&&!i.resumeRewrite?await Bs(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))),D=new Set([...f.sitemapIndexUrls].map(I=>Oe(r,I,"asset")).filter(I=>!!I&&A.has(I))),me=new Set([...b,...x,...M,...D]),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:[...D].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();}wr().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);});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smart-cloud/publisher-exporter",
3
- "version": "1.1.52",
3
+ "version": "1.1.53",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "description": "Headless Playwright static publisher for WordPress/Elementor sites with sitemap-only page discovery, strict asset capture, escaped URL rewrite, structured logs, and targeted retry modes.",