@smart-cloud/publisher-exporter 1.1.34 → 1.1.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -67,6 +67,17 @@ If you need to repair existing exported HTML after a rewrite bug, prefer `--resu
67
67
 
68
68
  During `--resume-rewrite`, the terminal can be quieter than a full crawl. Progress still updates in `runtime/current-progress.json` and the live crawl event snapshot under the configured log directory.
69
69
 
70
+ ### Crawl integrity and deployment safety
71
+
72
+ Every crawl creates an incomplete-crawl marker before it changes the output.
73
+ The marker is removed only after final rewrite and deploy-plan generation complete.
74
+ `deploy` refuses to upload while that marker exists, so stopping a crawl cannot
75
+ fall back to scanning and uploading a partial or unre-written output tree.
76
+
77
+ If a crawl was stopped during final rewrite, run `crawl --resume-rewrite`; for
78
+ an interrupted crawl at an earlier stage, run a new crawl. Do not delete the
79
+ marker manually to bypass this protection.
80
+
70
81
  ## Direct CLI With Runtime-Managed Config
71
82
 
72
83
  When the WordPress plugin already wrote `runtime/config.json` into shared publisher storage, direct CLI invocation still needs both the config path and the runtime directory.
@@ -163,7 +174,7 @@ Prune old archive directories with `publisher-exporter prune-logs --runtime-dir
163
174
  - If `--resume-rewrite` appears to stop after the initial resume message, check `runtime/current-progress.json` and `<logDir>/current-crawl-event.json` before assuming it is stuck. That phase can stay mostly quiet on stdout while it rewrites files.
164
175
  - If direct CLI execution seems to ignore the expected runtime state, verify that `PUBLISHER_CONFIG` and `STATIC_PUBLISHER_RUNTIME_DIR` both point at the same runtime tree. A mismatched config path and runtime dir can make the run look idle or incomplete.
165
176
  - Prefer incremental crawl when the existing manifest is trusted and you only need a fast recrawl of changed pages or assets. Prefer a full crawl when discovery rules changed, the manifest is missing or suspect, or you want a clean end-to-end rebuild.
166
- - Text-asset discovery resolves quoted relative dependencies against the owning JavaScript, CSS, JSON, or other text asset. This includes stable lazy chunk names such as `custom-block-parser.js` that may not be requested before the browser readiness window closes.
177
+ - JavaScript bundle discovery follows only explicit dynamic `import()` calls and fixed Webpack chunk-filename mappings such as `runtime.u = () => "custom-block-parser.js"`. It does not infer dependencies from arbitrary quoted paths or application-specific loader calls; add those manually as extra assets when needed.
167
178
  - In `sdk-upload-delete` mode, remote-only S3 objects are protected unless the crawl deploy plan contains an explicit manifest-backed deletion tombstone. Protected keys are listed in `deploy-diff.json` and the deploy log. This intentionally favors availability over automatically removing an unverified remote-only object.
168
179
  - `queue-runner-heartbeat.json` reports both the exporter package version and the installed `@smart-cloud/wpsuite-core` version. Crawl logs also report the runtime `virtualAssetBaseUrl`, remote config loader status, and resolved subscription type without logging the runtime token. Legacy runtime input using `uploadUrl` is accepted during migration but normalized to `virtualAssetBaseUrl`.
169
180
  - For generated 404 capture, set `generated404RequestPath` to a path that really returns HTTP 404 from the origin. The exporter validates that response before reusing it as the generated 404 page.
package/dist/crawl.js CHANGED
@@ -1,9 +1,9 @@
1
- import {request,chromium}from'playwright';import b from'fs/promises';import f from'path';import {gunzipSync}from'zlib';import _t from'http';import Ht from'https';import tt from'crypto';import nr from'fast-glob';import {availableParallelism}from'os';import {Worker}from'worker_threads';var Ut=".deploy-plan.json",qt="deploy-plan.json";function Qt(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?f.resolve(e):""}function ze(e){let t=String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").trim();return !t||t==="."||t.startsWith("../")||t===".."?null:t}function Se(e){return [...new Set(e.map(ze).filter(t=>t!==null))]}function Wt(e,t){return {schemaVersion:1,generatedAt:String(t.generatedAt||new Date().toISOString()),outputDir:f.resolve(e.outputDir),runMode:t.runMode,crawlMode:t.crawlMode,fullSyncRequired:!!t.fullSyncRequired,changedFiles:Se(t.changedFiles||[]),deletedFiles:Se(t.deletedFiles||[]),rewriteTargets:Se(t.rewriteTargets||[])}}function Nt(e){let t=f.join(f.resolve(e.outputDir),Ut),r=Qt();return r?[f.join(r,qt),t]:[t]}function ee(e,t){let r=f.resolve(e),s=f.resolve(t),n=f.relative(r,s).replace(/\\/g,"/");return ze(n)}async function Je(e,t){let r=Wt(e,t);for(let s of Nt(e))await b.mkdir(f.dirname(s),{recursive:true}),await b.writeFile(s,JSON.stringify(r,null,2),"utf8");}function Ve(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function zt(e){let t=String(e??"").trim();if(!t)return "";let r=t;if(/^https?:\/\//i.test(r))try{r=new URL(r).pathname;}catch{return ""}if(r=r.split(/[?#]/,1)[0]?.replace(/\\/g,"/").trim()??"",!r)return "";let s=r.endsWith("/"),n=r.replace(/^\/+/,"").split("/").map(u=>u.replace(/[^A-Za-z0-9._-]/g,"")).filter(u=>u.length>0&&u!=="."&&u!=="..");if(n.length===0)return "";let i=`/${n.join("/")}`;return s&&f.extname(i)===""&&(i+="/"),i==="/"?"":i}function ye(e){return !e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).map(([t,r])=>[t.trim(),String(r??"")]).filter(([t])=>t.length>0))}function Jt(e){if(!e||typeof e!="object")return {};let t={};for(let[r,s]of Object.entries(e)){let n=r.trim();if(!n||!s||typeof s!="object")continue;let i=s,u={};if(typeof i.targetOrigin=="string"){let o=Ve(i.targetOrigin);o&&(u.targetOrigin=o);}let l=ye(i.extraReplacements);if(Object.keys(l).length>0&&(u.extraReplacements=l),i.s3&&typeof i.s3=="object"){let o={},a=i.s3;typeof a.bucket=="string"&&(o.bucket=a.bucket.trim()),typeof a.prefix=="string"&&(o.prefix=a.prefix.trim()),typeof a.region=="string"&&(o.region=a.region.trim()),typeof a.htmlCacheControl=="string"&&(o.htmlCacheControl=a.htmlCacheControl.trim()),typeof a.assetCacheControl=="string"&&(o.assetCacheControl=a.assetCacheControl.trim()),Object.keys(o).length>0&&(u.s3=o);}if(i.cloudFront&&typeof i.cloudFront=="object"){let o={},a=i.cloudFront;typeof a.distributionId=="string"&&(o.distributionId=a.distributionId.trim()),Array.isArray(a.invalidationPaths)&&(o.invalidationPaths=a.invalidationPaths.map(g=>String(g??"").trim()).filter(g=>g.length>0)),Object.keys(o).length>0&&(u.cloudFront=o);}t[n]=u;}return t}function Re(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function Gt(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")return null;let n=Number.parseInt(String(r.intervalMinutes??"0"),10);if(!Number.isFinite(n)||n<1)return null;let i=String(r.id??`${s}-${t+1}`).trim();if(!i)return null;let u=String(r.deploymentProfile??"").trim(),l=String(r.url??"").trim();return {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")&&u?{deploymentProfile:u}:{},...l?{url:l}:{}}}function Ye(e){let t=e&&typeof e=="object"?e:{},r=Array.isArray(t.rules)?t.rules.map((s,n)=>Gt(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 Vt(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 Ce(e){let t=e&&typeof e=="object"?e:{},r=String(t.accountId??"").trim(),s=String(t.siteId??"").trim(),n=t.subscriber===true,i=Vt(t.siteSettings),u={...i??{},...r?{accountId:i?.accountId??r}:{},...s?{siteId:i?.siteId??s}:{},...i?.subscriber===true||n?{subscriber:true}:{}},l={},o=String(t.apiBase??"").trim();o&&(l.apiBase=o);let a=String(t.runtimeToken??t.nonce??"").trim();a&&(l.runtimeToken=a);let g=String(t.virtualAssetBaseUrl??t.uploadUrl??"").trim();g&&(l.virtualAssetBaseUrl=g),Object.keys(u).length>0&&(l.siteSettings=u);let d=Re(t.subscriptionType);return d&&(l.subscriptionType=d),l}function Yt(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function Ze(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function Zt(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 Ke(e,t,r=5){let s=new URL(Ze(e)),n=String(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase(),i=s.protocol==="http:"?_t:Ht,u=Zt(e,t);return await new Promise((l,o)=>{let a=i.request(s,{method:n,headers:Object.fromEntries(u.entries()),...s.protocol==="https:"?{rejectUnauthorized:false}:{}},g=>{let d=[];g.on("data",c=>{d.push(Buffer.isBuffer(c)?c:Buffer.from(c));}),g.on("error",o),g.on("end",()=>{let c=g.statusCode??0,p=g.headers.location;if(r>0&&p&&[301,302,303,307,308].includes(c)){l(Ke(new URL(p,s),{method:c===303?"GET":n},r-1));return}let h=new Headers;for(let[m,w]of Object.entries(g.headers))Array.isArray(w)?h.set(m,w.join(", ")):typeof w=="string"&&h.set(m,w);l(new Response(Buffer.concat(d),{status:c,statusText:g.statusMessage??"",headers:h}));});});a.on("error",o),a.end();})}function Kt(e){let t=Ce(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;Yt(e.sourceOrigin);let u=globalThis,o={...u.WpSuite??{},siteSettings:r,uploadUrl:i};return t.apiBase&&(o.apiBase=t.apiBase),u.WpSuite=o,true}async function Xt(e){let t=String(e.wpsuite?.virtualAssetBaseUrl??e.wpsuite?.uploadUrl??"").trim();if(!Kt(e)){let n=e.wpsuite?.siteSettings,i=[String(n?.accountId??"").trim()?"":"accountId",String(n?.siteId??"").trim()?"":"siteId",t?"":"virtualAssetBaseUrl"].filter(Boolean);return {remote:null,diagnostic:{status:"invalid-runtime",virtualAssetBaseUrl:t,subscriptionType:null,error:`Missing WP Suite runtime field(s): ${i.join(", ")}.`,requests:[]}}}let r=globalThis.fetch,s=[];try{typeof r=="function"&&/^https?:\/\//i.test(t)&&(globalThis.fetch=(async(o,a)=>{let g=Ze(o);if(g.startsWith(t)){let d=(()=>{try{return new URL(g).pathname}catch{return g}})();try{let c=e.ignoreHttpsErrors&&g.startsWith("https://")?await Ke(o,a):await r(o,a);return s.push({path:d,status:c.status,ok:c.ok,error:null}),c}catch(c){throw s.push({path:d,status:null,ok:!1,error:c instanceof Error?c.message:String(c)}),c}}return r(o,a)}));let{getConfig:n}=await import('@smart-cloud/wpsuite-core'),i=await n("publisher"),u=i&&typeof i=="object"?i:null,l=Re(u?.subscriptionType);return {remote:u,diagnostic:{status:u?"loaded":"unavailable",virtualAssetBaseUrl:t,subscriptionType:l??null,error:u?null:"WP Suite publisher config loader returned no configuration.",requests:s}}}catch(n){return {remote:null,diagnostic:{status:"unavailable",virtualAssetBaseUrl:t,subscriptionType:null,error:n instanceof Error?n.message:String(n),requests:s}}}finally{typeof r=="function"&&(globalThis.fetch=r);}}function er(e,t){let r=Jt(t?.deploymentProfiles),s=String(t?.defaultDeploymentProfile??"").trim(),n=r[s]?s:"",i=Re(t?.subscriptionType),u=Ce(e.wpsuite);return {...e,scheduler:Ye(t?.scheduler),deploymentProfiles:r,defaultDeploymentProfile:n,...i?{subscriptionType:i}:{},wpsuite:{...u,...u.siteSettings||i?{siteSettings:{...u.siteSettings??{},...u.siteSettings?.subscriber===true||i==="PROFESSIONAL"||i==="AGENCY"?{subscriber:true}:{}}}:{},...i?{subscriptionType:i}:{}}}}function ve(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 tr(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?f.resolve(e):""}function Ge(e,t,r){let s=String(t||"").trim();return s&&f.isAbsolute(s)?f.resolve(s):f.resolve(e,ve(s,r))}async function xe(e,t={}){let r=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",s=await b.readFile(r,"utf8"),n=JSON.parse(s);n.sourceOrigin=n.sourceOrigin.replace(/\/$/,""),n.targetOrigin=Ve(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=zt(n.generated404RequestPath),n.sitemapPaths||=["/sitemap_index.xml","/sitemap.xml"],n.allowedAssetHosts||=[],n.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],n.blockedPathPrefixes||=[],n.blockedSearchFragments||=[],n.concurrency||=1,n.maxPages||=0,n.extraReplacements=ye(n.extraReplacements),n.postCrawlCopyMap=ye(n.postCrawlCopyMap),n.logDir=String(n.logDir||"logs").trim()||"logs",n.verbose??=false,n.logLevel||=n.verbose?"debug":"info",n.s3SyncMode||="sdk-upload-delete",n.readiness||={waitForSelector:null,waitForFunction:null,timeoutMs:1500,fallbackWaitMs:1500},n.readiness.timeoutMs??=1500,n.readiness.fallbackWaitMs??=1500,n.viewport||={width:1440,height:1200},n.navigationTimeoutMs||=3e4,n.assetDownloadConcurrency=Number(n.assetDownloadConcurrency)>0?Number(n.assetDownloadConcurrency):n.concurrency,n.rewriteConcurrency=Number(n.rewriteConcurrency)>0?Number(n.rewriteConcurrency):n.assetDownloadConcurrency,n.wpsuite=Ce(n.wpsuite),n.scheduler=Ye(void 0),n.deploymentProfiles={},n.defaultDeploymentProfile="",n.deploymentTargetOverride=String(n.deploymentTargetOverride??"").trim();let i=await Xt(n);t.onRemotePublisherConfigDiagnostic?.(i.diagnostic);let u=er(n,i.remote),l=tr(),o=l?f.resolve(l,".."):"";return o?(u.outputDir=Ge(o,u.outputDir,"export"),u.logDir=Ge(o,u.logDir,"logs")):(f.isAbsolute(u.outputDir)||(u.outputDir=ve(u.outputDir,"export")),f.isAbsolute(u.logDir)||(u.logDir=ve(u.logDir,"logs"))),u}function re(e,t=10){return tt.createHash("sha1").update(e).digest("hex").slice(0,t)}async function rr(e){await b.mkdir(f.dirname(e),{recursive:true});}async function se(e,t,r){await rr(e);let s=f.join(f.dirname(e),`.${f.basename(e)}.${process.pid}.${Date.now()}.${tt.randomBytes(6).toString("hex")}.tmp`);try{typeof t=="string"?await b.writeFile(s,t,r??"utf8"):await b.writeFile(s,t),await b.rename(s,e);}catch(n){throw await b.unlink(s).catch(()=>{}),n}}function z(e){return [".html",".htm",".css",".js",".mjs",".json",".xml",".xsl",".txt",".svg",".map",".enc",".jws"].includes(f.extname(e).toLowerCase())}function U(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 V(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function pe(e){return e.replace(/\//g,"\\/")}function Xe(e){return e.replace(/\//g,"\\\\/")}function sr(e){try{let t=new URL(e);if(t.protocol!=="http:"&&t.protocol!=="https:")return null;let r=t.pathname==="/"&&!t.search&&!t.hash?"":`${t.pathname}${t.search}${t.hash}`;return `//${t.host}${r}`}catch{return null}}function et(e,t,r){if(!t)return;e[t]=r;let s=pe(t),n=pe(r);e[s]=n;let i=Xe(t),u=Xe(r);e[i]=u;let l=V(t),o=V(r);e[l]=o;let a=V(s),g=V(n);e[a]=g;let d=V(i),c=V(u);e[d]=c;}function ge(e,t,r){et(e,t,r);let s=sr(t);s&&s!==t&&et(e,s,r);}function ke(e,t){let r=t.startsWith("/")?t:`/${t}`,s=(e||"").replace(/\/$/,"");return !s||s==="."||s==="/"?r:`${s}${r}`}function rt(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function st(e,t,r){if(!t)return r;let s=f.dirname(f.resolve(t)),n=f.resolve(e,r.replace(/^\/+/,"")),i=f.relative(s,n).replace(/\\/g,"/");return i?(i.startsWith(".")||(i=`./${i}`),i):"."}var ur=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],lr=new Set([".html",".htm"]),nt="WPSuite.io Static Publisher",cr=nt.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function dr(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function pr(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function gr(e,t,r){return pr(t)?e.replace(new RegExp(`(?<!:)${dr(t)}`,"g"),r):e.split(t).join(r)}function fr(e,t,r){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let n=f.extname(r).toLowerCase();return lr.has(n)?/<head\b|<html\b|<!doctype html/i.test(t):false}function hr(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${cr}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${nt}" />`;if(e.match(/(\r?\n)([ \t]*)<\/head>/i))return e.replace(/(\r?\n)([ \t]*)<\/head>/i,`$1$2${t}$1$2</head>`);let s=e.includes(`\r
1
+ import {request,chromium}from'playwright';import b from'fs/promises';import f from'path';import {gunzipSync}from'zlib';import Yt from'http';import Kt from'https';import at from'crypto';import dr from'fast-glob';import {availableParallelism}from'os';import {Worker}from'worker_threads';var Ht=".deploy-plan.json",zt="deploy-plan.json",Jt=".crawl-incomplete.json",Vt="crawl-incomplete.json";function ze(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?f.resolve(e):""}function Je(e){let t=String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").trim();return !t||t==="."||t.startsWith("../")||t===".."?null:t}function ye(e){return [...new Set(e.map(Je).filter(t=>t!==null))]}function Gt(e,t){return {schemaVersion:1,generatedAt:String(t.generatedAt||new Date().toISOString()),outputDir:f.resolve(e.outputDir),runMode:t.runMode,crawlMode:t.crawlMode,fullSyncRequired:!!t.fullSyncRequired,changedFiles:ye(t.changedFiles||[]),deletedFiles:ye(t.deletedFiles||[]),rewriteTargets:ye(t.rewriteTargets||[])}}function Ve(e){let t=f.join(f.resolve(e.outputDir),Ht),r=ze();return r?[f.join(r,zt),t]:[t]}function Ge(e){let t=f.join(f.resolve(e.outputDir),Jt),r=ze();return r?[f.join(r,Vt),t]:[t]}function te(e,t){let r=f.resolve(e),s=f.resolve(t),n=f.relative(r,s).replace(/\\/g,"/");return Je(n)}async function Ze(e,t){let r=Gt(e,t);for(let s of Ve(e))await b.mkdir(f.dirname(s),{recursive:true}),await b.writeFile(s,JSON.stringify(r,null,2),"utf8");}async function Ye(e){for(let t of Ve(e))try{await b.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}async function Ke(e,t){let r={schemaVersion:1,startedAt:String(t.startedAt||new Date().toISOString()),outputDir:f.resolve(e.outputDir)};for(let s of Ge(e)){await b.mkdir(f.dirname(s),{recursive:true});let n=`${s}.${process.pid}.tmp`;await b.writeFile(n,JSON.stringify(r,null,2),"utf8"),await b.rename(n,s);}}async function Xe(e){for(let t of Ge(e))try{await b.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}function tt(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function Xt(e){let t=String(e??"").trim();if(!t)return "";let r=t;if(/^https?:\/\//i.test(r))try{r=new URL(r).pathname;}catch{return ""}if(r=r.split(/[?#]/,1)[0]?.replace(/\\/g,"/").trim()??"",!r)return "";let s=r.endsWith("/"),n=r.replace(/^\/+/,"").split("/").map(u=>u.replace(/[^A-Za-z0-9._-]/g,"")).filter(u=>u.length>0&&u!=="."&&u!=="..");if(n.length===0)return "";let i=`/${n.join("/")}`;return s&&f.extname(i)===""&&(i+="/"),i==="/"?"":i}function ve(e){return !e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).map(([t,r])=>[t.trim(),String(r??"")]).filter(([t])=>t.length>0))}function er(e){if(!e||typeof e!="object")return {};let t={};for(let[r,s]of Object.entries(e)){let n=r.trim();if(!n||!s||typeof s!="object")continue;let i=s,u={};if(typeof i.targetOrigin=="string"){let o=tt(i.targetOrigin);o&&(u.targetOrigin=o);}let l=ve(i.extraReplacements);if(Object.keys(l).length>0&&(u.extraReplacements=l),i.s3&&typeof i.s3=="object"){let o={},a=i.s3;typeof a.bucket=="string"&&(o.bucket=a.bucket.trim()),typeof a.prefix=="string"&&(o.prefix=a.prefix.trim()),typeof a.region=="string"&&(o.region=a.region.trim()),typeof a.htmlCacheControl=="string"&&(o.htmlCacheControl=a.htmlCacheControl.trim()),typeof a.assetCacheControl=="string"&&(o.assetCacheControl=a.assetCacheControl.trim()),Object.keys(o).length>0&&(u.s3=o);}if(i.cloudFront&&typeof i.cloudFront=="object"){let o={},a=i.cloudFront;typeof a.distributionId=="string"&&(o.distributionId=a.distributionId.trim()),Array.isArray(a.invalidationPaths)&&(o.invalidationPaths=a.invalidationPaths.map(p=>String(p??"").trim()).filter(p=>p.length>0)),Object.keys(o).length>0&&(u.cloudFront=o);}t[n]=u;}return t}function Re(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function tr(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")return null;let n=Number.parseInt(String(r.intervalMinutes??"0"),10);if(!Number.isFinite(n)||n<1)return null;let i=String(r.id??`${s}-${t+1}`).trim();if(!i)return null;let u=String(r.deploymentProfile??"").trim(),l=String(r.url??"").trim();return {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")&&u?{deploymentProfile:u}:{},...l?{url:l}:{}}}function rt(e){let t=e&&typeof e=="object"?e:{},r=Array.isArray(t.rules)?t.rules.map((s,n)=>tr(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 rr(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 ke(e){let t=e&&typeof e=="object"?e:{},r=String(t.accountId??"").trim(),s=String(t.siteId??"").trim(),n=t.subscriber===true,i=rr(t.siteSettings),u={...i??{},...r?{accountId:i?.accountId??r}:{},...s?{siteId:i?.siteId??s}:{},...i?.subscriber===true||n?{subscriber:true}:{}},l={},o=String(t.apiBase??"").trim();o&&(l.apiBase=o);let a=String(t.runtimeToken??t.nonce??"").trim();a&&(l.runtimeToken=a);let p=String(t.virtualAssetBaseUrl??t.uploadUrl??"").trim();p&&(l.virtualAssetBaseUrl=p),Object.keys(u).length>0&&(l.siteSettings=u);let d=Re(t.subscriptionType);return d&&(l.subscriptionType=d),l}function sr(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function st(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function nr(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 nt(e,t,r=5){let s=new URL(st(e)),n=String(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase(),i=s.protocol==="http:"?Yt:Kt,u=nr(e,t);return await new Promise((l,o)=>{let a=i.request(s,{method:n,headers:Object.fromEntries(u.entries()),...s.protocol==="https:"?{rejectUnauthorized:false}:{}},p=>{let d=[];p.on("data",c=>{d.push(Buffer.isBuffer(c)?c:Buffer.from(c));}),p.on("error",o),p.on("end",()=>{let c=p.statusCode??0,g=p.headers.location;if(r>0&&g&&[301,302,303,307,308].includes(c)){l(nt(new URL(g,s),{method:c===303?"GET":n},r-1));return}let h=new Headers;for(let[m,w]of Object.entries(p.headers))Array.isArray(w)?h.set(m,w.join(", ")):typeof w=="string"&&h.set(m,w);l(new Response(Buffer.concat(d),{status:c,statusText:p.statusMessage??"",headers:h}));});});a.on("error",o),a.end();})}function ir(e){let t=ke(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;sr(e.sourceOrigin);let u=globalThis,o={...u.WpSuite??{},siteSettings:r,uploadUrl:i};return t.apiBase&&(o.apiBase=t.apiBase),u.WpSuite=o,true}async function or(e){let t=String(e.wpsuite?.virtualAssetBaseUrl??e.wpsuite?.uploadUrl??"").trim();if(!ir(e)){let n=e.wpsuite?.siteSettings,i=[String(n?.accountId??"").trim()?"":"accountId",String(n?.siteId??"").trim()?"":"siteId",t?"":"virtualAssetBaseUrl"].filter(Boolean);return {remote:null,diagnostic:{status:"invalid-runtime",virtualAssetBaseUrl:t,subscriptionType:null,error:`Missing WP Suite runtime field(s): ${i.join(", ")}.`,requests:[]}}}let r=globalThis.fetch,s=[];try{typeof r=="function"&&/^https?:\/\//i.test(t)&&(globalThis.fetch=(async(o,a)=>{let p=st(o);if(p.startsWith(t)){let d=(()=>{try{return new URL(p).pathname}catch{return p}})();try{let c=e.ignoreHttpsErrors&&p.startsWith("https://")?await nt(o,a):await r(o,a);return s.push({path:d,status:c.status,ok:c.ok,error:null}),c}catch(c){throw s.push({path:d,status:null,ok:!1,error:c instanceof Error?c.message:String(c)}),c}}return r(o,a)}));let{getConfig:n}=await import('@smart-cloud/wpsuite-core'),i=await n("publisher"),u=i&&typeof i=="object"?i:null,l=Re(u?.subscriptionType);return {remote:u,diagnostic:{status:u?"loaded":"unavailable",virtualAssetBaseUrl:t,subscriptionType:l??null,error:u?null:"WP Suite publisher config loader returned no configuration.",requests:s}}}catch(n){return {remote:null,diagnostic:{status:"unavailable",virtualAssetBaseUrl:t,subscriptionType:null,error:n instanceof Error?n.message:String(n),requests:s}}}finally{typeof r=="function"&&(globalThis.fetch=r);}}function ar(e,t){let r=er(t?.deploymentProfiles),s=String(t?.defaultDeploymentProfile??"").trim(),n=r[s]?s:"",i=Re(t?.subscriptionType),u=ke(e.wpsuite);return {...e,scheduler:rt(t?.scheduler),deploymentProfiles:r,defaultDeploymentProfile:n,...i?{subscriptionType:i}:{},wpsuite:{...u,...u.siteSettings||i?{siteSettings:{...u.siteSettings??{},...u.siteSettings?.subscriber===true||i==="PROFESSIONAL"||i==="AGENCY"?{subscriber:true}:{}}}:{},...i?{subscriptionType:i}:{}}}}function Ce(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 ur(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?f.resolve(e):""}function et(e,t,r){let s=String(t||"").trim();return s&&f.isAbsolute(s)?f.resolve(s):f.resolve(e,Ce(s,r))}async function xe(e,t={}){let r=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",s=await b.readFile(r,"utf8"),n=JSON.parse(s);n.sourceOrigin=n.sourceOrigin.replace(/\/$/,""),n.targetOrigin=tt(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=Xt(n.generated404RequestPath),n.sitemapPaths||=["/sitemap_index.xml","/sitemap.xml"],n.allowedAssetHosts||=[],n.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],n.blockedPathPrefixes||=[],n.blockedSearchFragments||=[],n.concurrency||=1,n.maxPages||=0,n.extraReplacements=ve(n.extraReplacements),n.postCrawlCopyMap=ve(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=ke(n.wpsuite),n.scheduler=rt(void 0),n.deploymentProfiles={},n.defaultDeploymentProfile="",n.deploymentTargetOverride=String(n.deploymentTargetOverride??"").trim();let i=await or(n);t.onRemotePublisherConfigDiagnostic?.(i.diagnostic);let u=ar(n,i.remote),l=ur(),o=l?f.resolve(l,".."):"";return o?(u.outputDir=et(o,u.outputDir,"export"),u.logDir=et(o,u.logDir,"logs")):(f.isAbsolute(u.outputDir)||(u.outputDir=Ce(u.outputDir,"export")),f.isAbsolute(u.logDir)||(u.logDir=Ce(u.logDir,"logs"))),u}function se(e,t=10){return at.createHash("sha1").update(e).digest("hex").slice(0,t)}async function lr(e){await b.mkdir(f.dirname(e),{recursive:true});}async function ne(e,t,r){await lr(e);let s=f.join(f.dirname(e),`.${f.basename(e)}.${process.pid}.${Date.now()}.${at.randomBytes(6).toString("hex")}.tmp`);try{typeof t=="string"?await b.writeFile(s,t,r??"utf8"):await b.writeFile(s,t),await b.rename(s,e);}catch(n){throw await b.unlink(s).catch(()=>{}),n}}function J(e){return [".html",".htm",".css",".js",".mjs",".json",".xml",".xsl",".txt",".svg",".map",".enc",".jws"].includes(f.extname(e).toLowerCase())}function U(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 Z(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function ge(e){return e.replace(/\//g,"\\/")}function it(e){return e.replace(/\//g,"\\\\/")}function cr(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 ot(e,t,r){if(!t)return;e[t]=r;let s=ge(t),n=ge(r);e[s]=n;let i=it(t),u=it(r);e[i]=u;let l=Z(t),o=Z(r);e[l]=o;let a=Z(s),p=Z(n);e[a]=p;let d=Z(i),c=Z(u);e[d]=c;}function fe(e,t,r){ot(e,t,r);let s=cr(t);s&&s!==t&&ot(e,s,r);}function Te(e,t){let r=t.startsWith("/")?t:`/${t}`,s=(e||"").replace(/\/$/,"");return !s||s==="."||s==="/"?r:`${s}${r}`}function ut(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function lt(e,t,r){if(!t)return r;let s=f.dirname(f.resolve(t)),n=f.resolve(e,r.replace(/^\/+/,"")),i=f.relative(s,n).replace(/\\/g,"/");return i?(i.startsWith(".")||(i=`./${i}`),i):"."}var hr=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],mr=new Set([".html",".htm"]),ct="WPSuite.io Static Publisher",wr=ct.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function Pr(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function br(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function Sr(e,t,r){return br(t)?e.replace(new RegExp(`(?<!:)${Pr(t)}`,"g"),r):e.split(t).join(r)}function yr(e,t,r){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let n=f.extname(r).toLowerCase();return mr.has(n)?/<head\b|<html\b|<!doctype html/i.test(t):false}function vr(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${wr}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${ct}" />`;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 mr(e){let t=U(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function wr(e,t){let r=[...new Set(t)].filter(i=>i.includes("/")&&!/\\+\//.test(i)).map(i=>[i,pe(i)]).filter(([i,u])=>i!==u).sort((i,u)=>u[0].length-i[0].length);if(!r.length)return e;let s=i=>{let u=i;for(let[l,o]of r)u=u.split(l).join(o);return u},n=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(i,u,l,o)=>`${u}${s(l)}${o}`);return n=n.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(i,u,l,o,a)=>mr(o)?`${u}${s(o)}${a}`:i),n}function Pr(e,t){if(!t)return null;let r=f.dirname(f.resolve(t)),s=f.resolve(e.outputDir),n=f.relative(r,s).replace(/\\/g,"/");return n?(n.startsWith(".")||(n=`./${n}`),n.endsWith("/")?n:`${n}/`):"./"}function br(e,t,r){let s=Pr(t,r);if(!s)return e;let n=e;for(let i of ur){let u=i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),l=new RegExp(`(?:\\.{1,}/)+${u}`,"g"),o=new RegExp(`(?<!\\.)/${u}`,"g");n=n.replace(l,`${s}${i}`).replace(o,`${s}${i}`);let a=i.replace(/\//g,"\\/"),g=s.replace(/\//g,"\\/"),d=a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),c=new RegExp(`(?:\\.{1,}\\\\/)+${d}`,"g"),p=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${d}`,"g"),h=new RegExp(`(?<![\\.\\\\])\\/${d}`,"g");n=n.replace(c,`${g}${a}`).replace(p,`${g}${a}`).replace(h,`${g}${a}`);}return n}function Ae(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:rt(t,e.targetOrigin),i=s?`${s.search}${s.hash}`:"";return e.urlRewriteMode==="root-relative"?`${n}${i}`:`${st(e.outputDir,r,n)}${i}`}function Te(e,t,r,s,n){ge(e,r,Ae(t,s,n));}function Sr(e,t,r,s,n){if(!r||r===s)return;ge(e,r,s);let i=Ae(t,r,n),u=Ae(t,s,n);ge(e,i,u);}function Me(e,t,r,s,n={}){let i=e,u={};Te(u,t,t.sourceOrigin,t.targetOrigin,s);for(let[o,a]of Object.entries(t.extraReplacements))Te(u,t,o,a,s);for(let[o,a]of Object.entries(r))Te(u,t,o,a,s);for(let[o,a]of Object.entries(n)){let g=r[o];!g||g===a||Sr(u,t,a,g,s);}let l=Object.entries(u).sort((o,a)=>a[0].length-o[0].length);for(let[o,a]of l)i=gr(i,o,a);return t.urlRewriteMode!=="absolute"&&(i=br(i,t,s)),i=wr(i,l.map(([,o])=>o)),fr(t,i,s)&&(i=hr(i)),i}async function yr(e,t,r,s){let n=f.join(e.outputDir,s),i=f.extname(n).toLowerCase(),u;try{u=await b.readFile(n,"utf8");}catch(a){if(a.code!=="ENOENT")throw a;return {changed:false}}let o=Me(u,e,t,i===".js"||i===".mjs"?void 0:n,r);return o!==u?(await se(n,o,"utf8"),{changed:true}):{changed:false}}async function vr(e,t){return await new Promise((r,s)=>{let n=o=>{if(l(),o?.error){s(new Error(o.error));return}r({changed:!!o?.changed});},i=o=>{l(),s(o);},u=o=>{l(),o!==0&&s(new Error(`Rewrite worker exited with code ${o}.`));},l=()=>{e.off("message",n),e.off("error",i),e.off("exit",u);};e.on("message",n),e.on("error",i),e.on("exit",u),e.postMessage({file:t});})}async function it(e,t,r={}){let n=(r.files?[...new Set(r.files)].map(c=>f.resolve(c)).filter(c=>c.startsWith(f.resolve(e.outputDir))).map(c=>f.relative(e.outputDir,c).replace(/\\/g,"/")).filter(c=>c.length>0):await nr(["**/*"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(c=>c!=="asset-map.json"&&z(c)),i=0;if(n.length===0)return 0;let u=Math.max(1,Number(e.rewriteConcurrency||e.assetDownloadConcurrency||1)),l=Math.max(1,Math.min(u,n.length,availableParallelism()));await r.onStart?.({totalFiles:n.length,workerCount:l});let o=0,a=0,g=null;if(l===1){for(let c of n){let p=await yr(e,t,r.previousAssetMap??{},c);p.changed&&(i+=1),a+=1,await r.onProgress?.({index:a,totalFiles:n.length,changedTextFiles:i,file:c,changed:p.changed});}return i}let d=Array.from({length:l},async()=>{let c=new Worker(new URL("./rewrite-worker.js",import.meta.url),{workerData:{config:e,assetMap:t,previousAssetMap:r.previousAssetMap??{}}});try{for(;!g;){let p=o;if(p>=n.length)return;o+=1;let h=n[p],m=await vr(c,h);m.changed&&(i+=1),a+=1,await r.onProgress?.({index:a,totalFiles:n.length,changedTextFiles:i,file:h,changed:m.changed});}}catch(p){throw g=p instanceof Error?p:new Error(String(p)),g}finally{await c.terminate().catch(()=>{});}});return await Promise.all(d),i}var _={error:0,warn:1,info:2,debug:3},ot=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",fe=ot?f.join(ot,"current-progress.json"):"",at=Promise.resolve();function ut(e){return e.includes("crawl")?"crawl":e.includes("deploy")?"deploy":e.includes("invalidate")?"invalidate":e}function Rr(e,t){let r={...e},s=new Set(["pagesQueued","pagesRendered","assetsQueued","sitemapsQueued","pagesDiscovered","assetsDiscovered","sitemapsDiscovered","pagesSaved","assetsSaved","donePages","doneAssets","doneSitemaps","changedTextFiles","uploaded","failed","index","totalFiles","pageQueue","assetQueue","sitemapQueue"]);for(let[n,i]of Object.entries(t)){let u=r[n];if(typeof u=="number"&&typeof i=="number"&&s.has(n)){r[n]=Math.max(u,i);continue}r[n]=i;}return r}function Cr(e,t,r){fe&&(at=at.then(async()=>{let s=new Date,n=s.toISOString();await b.mkdir(f.dirname(fe),{recursive:true});let i=await b.readFile(fe,"utf8").then(m=>JSON.parse(m)).catch(()=>null),u=i&&typeof i.details=="object"&&i.details?i.details:{},l=ut(e),o=i?.currentStep||ut(i?.source||""),a=i?.startedAt||n,g={...i?.stepDurationsSec??{}},d=i?.stepStartedAt||n;if(o&&o!==l&&i?.stepStartedAt){let m=Math.max(0,Math.round((s.getTime()-new Date(i.stepStartedAt).getTime())/1e3));g[o]=(g[o]??0)+m,d=n;}let c=Math.max(0,Math.round((s.getTime()-new Date(d).getTime())/1e3)),p=Math.max(0,Math.round((s.getTime()-new Date(a).getTime())/1e3)),h={checkedAt:n,source:e,message:t,details:Rr(u,r??{}),startedAt:a,currentStep:l,stepStartedAt:d,stepElapsedSec:c,totalElapsedSec:p,stepDurationsSec:g};await b.writeFile(fe,JSON.stringify(h,null,2),"utf8");}).catch(()=>{}));}async function xr(e,t){await b.mkdir(f.dirname(e),{recursive:true}),await b.appendFile(e,`${JSON.stringify(t)}
5
- `,"utf8");}function kr(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 Tr(e,t,r){return {checkedAt:new Date().toISOString(),currentStep:kr(e,r),level:e,message:t,details:r??{}}}var ne=class{constructor(t,r="info"){this.logDir=t;this.level=typeof r=="boolean"?r?"debug":"info":r,this.ensureLogFileReady();}logDir;startedAt=Date.now();marks=new Map;initPromise=null;writeQueue=Promise.resolve();writeError=null;level;get logPath(){return f.join(this.logDir,"crawl.log.jsonl")}get currentEventPath(){return f.join(this.logDir,"current-crawl-event.json")}get rejectedPath(){return f.join(this.logDir,"rejected.jsonl")}get ignoredPath(){return f.join(this.logDir,"ignored.jsonl")}get skippedPath(){return f.join(this.logDir,"skipped-http.jsonl")}get errorsPath(){return f.join(this.logDir,"errors.jsonl")}get timingsPath(){return f.join(this.logDir,"timings.jsonl")}ensureLogFileReady(){return this.initPromise||(this.initPromise=(async()=>{await b.mkdir(this.logDir,{recursive:true}),await b.writeFile(this.logPath,"","utf8");})()),this.initPromise}enqueueTask(t){this.writeQueue=this.writeQueue.then(t).catch(r=>{this.writeError=r instanceof Error?r:new Error(String(r));});}enqueueLine(t){this.enqueueTask(async()=>{await this.ensureLogFileReady(),await b.appendFile(this.logPath,`${t}
6
- `,"utf8");});}enqueueJsonLine(t,r){this.enqueueTask(()=>xr(t,r));}updateCurrentEvent(t,r,s){let n=Tr(t,r,s);this.enqueueTask(async()=>{await b.mkdir(this.logDir,{recursive:true}),await b.writeFile(this.currentEventPath,JSON.stringify(n,null,2),"utf8");});}push(t,r,s){let n=JSON.stringify({time:new Date().toISOString(),level:t,message:r,...s||{}});this.enqueueLine(n),this.updateCurrentEvent(t,r,s),t==="error"?console.error(r,s||""):t==="warn"?console.warn(r,s||""):(_[this.level]>=_.debug||["summary","page","sitemap","asset","timing"].includes(t))&&console.log(r);}info(t,r){this.push("info",t,r);}debug(t,r){_[this.level]<_.debug||this.push("debug",t,r);}progress(t,r){Cr("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),_[this.level]>=_.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),_[this.level]>=_.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 he="(?: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 lt(e){let t=new Set,r=new RegExp(`["'\\x60]((?:\\.{1,2}/)?[a-z0-9@_][^"'\\x60\\s<>\\\\]*\\.${he}(?:\\?[^"'\\x60\\s<>\\\\]*)?)["'\\x60]`,"gi");for(let s of e.matchAll(r)){let n=s[1];!n||n.startsWith("/")||n.startsWith("//")||/^[a-z][a-z0-9+.-]*:/i.test(n)||t.add(n);}return [...t]}var Ir=["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","application/octet-stream"],vt=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"]),Rt=new Set(["",".html",".htm"]),$r=new Set([".css",".xml",".xsl",".svg",".json",".html",".htm",".txt",".enc",".jws"]),Dr=["/wp-content/","/wp-includes/","/wp-admin/","/static/","/assets/","/build/","/_next/"];function Or(e){let t=[],r="full",s="full",n=false,i=false;for(let u=0;u<e.length;u++){let l=e[u];if(l==="--retry-timeouts")r="retry-timeouts",n=true;else if(l==="--resume")n=true;else if(l==="--resume-rewrite")n=true,i=true;else if(l==="--crawl-mode"){let o=e[++u];if(!o)throw new Error("--crawl-mode requires a value");s=o==="incremental"?"incremental":"full",n||=s==="incremental";}else if(l.startsWith("--crawl-mode="))s=l.slice(13)==="incremental"?"incremental":"full",n||=s==="incremental";else if(l==="--incremental")s="incremental",n=true;else if(l==="--url"){let o=e[++u];if(!o)throw new Error("--url requires a value");r="single-url",n=true,t.push(o);}else if(l.startsWith("--url="))r="single-url",n=true,t.push(l.slice(6));else if(l==="--urls"){let o=e[++u];if(!o)throw new Error("--urls requires a file path");r="single-url",n=true,t.push(`@${o}`);}}return {mode:r,crawlMode:s,urls:t,preserveOutput:n,resumeRewrite:i}}function Ee(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?f.resolve(e):""}function Fr(){let e=Ee();return e?f.resolve(e,".."):""}function jr(){let e=process.env.STATIC_PUBLISHER_WP_ROOT||process.env.WPSUITE_STATIC_PUBLISHER_WP_ROOT||"";return e.trim()?f.resolve(e):""}function Er(e){let t=e.trim(),r=[{alias:"@storage-root",root:Fr(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@runtime",root:Ee(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@wp-root",root:jr(),requiredEnv:"STATIC_PUBLISHER_WP_ROOT or WPSUITE_STATIC_PUBLISHER_WP_ROOT"}];for(let s of r){if(t!==s.alias&&!t.startsWith(`${s.alias}/`))continue;if(!s.root)return {resolvedPath:null,alias:s.alias,requiredEnv:s.requiredEnv};let n=t.slice(s.alias.length).replace(/^\/+/,"");return {resolvedPath:n?f.resolve(s.root,n):s.root,alias:s.alias}}return {resolvedPath:f.resolve(t)}}function Ct(e){let t=Ee();return t?f.join(t,"crawl-manifest.json"):f.join(e.outputDir,".crawl-manifest.json")}function xt(){return {schemaVersion:3,updatedAt:"",pages:{},assets:{}}}function ct(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 Ur(e){let t=e.isText===true;return {url:String(e.url||""),outputPath:String(e.outputPath||""),isText:t,contentType:typeof e.contentType=="string"&&e.contentType?e.contentType:null,discoveredAssets:Array.isArray(e.discoveredAssets)?e.discoveredAssets.map(r=>String(r)):[],lastCrawledAt:String(e.lastCrawledAt||""),lastSeenRunId:String(e.lastSeenRunId||""),rewriteComplete:e.rewriteComplete===true||!t}}function De(e){let t=e?.["content-type"]?.trim();return t||null}function qr(){return {rewriteTargets:new Set,changedFiles:new Set,deletedFiles:new Set}}function Q(e,t,r){let s=ee(t.outputDir,r);s&&(e.changedFiles.add(s),e.deletedFiles.delete(s));}function dt(e,t,r){let s=ee(t.outputDir,r);s&&(e.deletedFiles.add(s),e.changedFiles.delete(s));}function oe(e,t){e.rewriteTargets.add(f.resolve(t));}async function Qr(e){try{let t=await b.readFile(Ct(e),"utf8"),r=JSON.parse(t);if(r&&typeof r=="object"&&r.pages&&typeof r.pages=="object"){if((r.schemaVersion===2||r.schemaVersion===3)&&r.assets&&typeof r.assets=="object")return {schemaVersion:3,updatedAt:String(r.updatedAt||""),pages:Object.fromEntries(Object.entries(r.pages).map(([s,n])=>[s,ct(n)])),assets:Object.fromEntries(Object.entries(r.assets).map(([s,n])=>[s,Ur(n)]))};if(r.schemaVersion===1)return {schemaVersion:3,updatedAt:String(r.updatedAt||""),pages:Object.fromEntries(Object.entries(r.pages).map(([s,n])=>[s,ct(n)])),assets:{}}}}catch{}return xt()}function Oe(e){return JSON.parse(JSON.stringify(e))}async function Wr(e,t){let r=Ct(e);await b.mkdir(f.dirname(r),{recursive:true}),await b.writeFile(r,JSON.stringify(t,null,2),"utf8");}async function Y(e,t){if(!t.trackManifest)return;let r=async()=>{let s=Oe(t.manifest);s.updatedAt=new Date().toISOString(),t.manifest.updatedAt=s.updatedAt,await Wr(e,s);};t.manifestSaveChain=t.manifestSaveChain.then(r,r),await t.manifestSaveChain;}function ie(e){if(!e)return null;let t=e.trim();return t||null}function Nr(e,t){let r=new Set,s=new Set([...Object.keys(e),...Object.keys(t)]);for(let n of s){let i=e[n],u=t[n];!i||!u||i===u||r.add(n);}return r}async function Br(e,t,r,s){let n=[...new Set(r.map(l=>l.trim()).filter(Boolean))],i=String(e.wpsuite?.runtimeToken||"").trim();if(n.length===0||!i)return new Map;let u=new URL("/wp-json/smartcloud-static-publisher/v1/change-tokens",e.sourceOrigin).toString();try{let l=await t.post(u,{timeout:3e4,failOnStatusCode:!1,headers:{"content-type":"application/json","x-static-publisher-token":i},data:JSON.stringify({urls:n})});if(!l.ok())return s.warn(`Change token lookup failed with HTTP ${l.status()}`,{endpoint:u,status:l.status()}),new Map;let o=await l.json().catch(()=>null);if(!o||!Array.isArray(o.items))return new Map;let a=new Map;for(let g of o.items)!g||typeof g.url!="string"||a.set(g.url,g);return a}catch(l){return s.warn("Change token lookup failed; falling back to sitemap metadata",{endpoint:u,error:String(l)}),new Map}}async function Le(e,t,r,s,n){if(!r.enabled&&!r.trackManifest)return null;if(r.changeTokenCache.has(s))return r.changeTokenCache.get(s)??null;let u=(await Br(e,t,[s],n)).get(s)??null;return Qe(e,s)&&(!u||u.supported!==true||!u.token)&&(u=await zr(e,t,s,n)),u=Hr(e,u),r.changeTokenCache.set(s,u),u}function _r(e){return `subscriber=${e.wpsuite?.siteSettings?.subscriber===true?"1":"0"}`}function Hr(e,t){if(!t?.supported||!t.token)return t;let r=_r(e);return {...t,token:re(`${t.token}
7
- ${r}`,40),tokenSource:t.tokenSource?`${t.tokenSource}+site-subscriber`:"site-subscriber"}}async function zr(e,t,r,s){try{let n=await t.get(r,{timeout:Math.min(e.navigationTimeoutMs,15e3),failOnStatusCode:!1});if(n.status()!==404)return s.warn(`Generated 404 fallback token skipped for ${r}`,{url:r,status:n.status(),requestPath:e.generated404RequestPath,source:"generated-404-change-token-fallback"}),null;let i=await n.text().catch(()=>""),u=re(`${r}
4
+ `;return e.replace(/<head\b[^>]*>/i,n=>`${n}${s} ${t}`)}function Cr(e){let t=U(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function Rr(e,t){let r=[...new Set(t)].filter(i=>i.includes("/")&&!/\\+\//.test(i)).map(i=>[i,ge(i)]).filter(([i,u])=>i!==u).sort((i,u)=>u[0].length-i[0].length);if(!r.length)return e;let s=i=>{let u=i;for(let[l,o]of r)u=u.split(l).join(o);return u},n=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(i,u,l,o)=>`${u}${s(l)}${o}`);return n=n.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(i,u,l,o,a)=>Cr(o)?`${u}${s(o)}${a}`:i),n}function kr(e,t){if(!t)return null;let r=f.dirname(f.resolve(t)),s=f.resolve(e.outputDir),n=f.relative(r,s).replace(/\\/g,"/");return n?(n.startsWith(".")||(n=`./${n}`),n.endsWith("/")?n:`${n}/`):"./"}function xr(e,t,r){let s=kr(t,r);if(!s)return e;let n=e;for(let i of hr){let u=i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),l=new RegExp(`(?:\\.{1,}/)+${u}`,"g"),o=new RegExp(`(?<!\\.)/${u}`,"g");n=n.replace(l,`${s}${i}`).replace(o,`${s}${i}`);let a=i.replace(/\//g,"\\/"),p=s.replace(/\//g,"\\/"),d=a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),c=new RegExp(`(?:\\.{1,}\\\\/)+${d}`,"g"),g=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${d}`,"g"),h=new RegExp(`(?<![\\.\\\\])\\/${d}`,"g");n=n.replace(c,`${p}${a}`).replace(g,`${p}${a}`).replace(h,`${p}${a}`);}return n}function Me(e,t,r){if(e.urlRewriteMode==="absolute")return t;let s=(()=>{try{return new URL(t,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin)}catch{return null}})(),n=s?s.pathname:ut(t,e.targetOrigin),i=s?`${s.search}${s.hash}`:"";return e.urlRewriteMode==="root-relative"?`${n}${i}`:`${lt(e.outputDir,r,n)}${i}`}function Ae(e,t,r,s,n){fe(e,r,Me(t,s,n));}function Tr(e,t,r,s,n){if(!r||r===s)return;fe(e,r,s);let i=Me(t,r,n),u=Me(t,s,n);fe(e,i,u);}function Ie(e,t,r,s,n={}){let i=e,u={};Ae(u,t,t.sourceOrigin,t.targetOrigin,s);for(let[o,a]of Object.entries(t.extraReplacements))Ae(u,t,o,a,s);for(let[o,a]of Object.entries(r))Ae(u,t,o,a,s);for(let[o,a]of Object.entries(n)){let p=r[o];!p||p===a||Tr(u,t,a,p,s);}let l=Object.entries(u).sort((o,a)=>a[0].length-o[0].length);for(let[o,a]of l)i=Sr(i,o,a);return t.urlRewriteMode!=="absolute"&&(i=xr(i,t,s)),i=Rr(i,l.map(([,o])=>o)),yr(t,i,s)&&(i=vr(i)),i}async function Ar(e,t,r,s){let n=f.join(e.outputDir,s),i=f.extname(n).toLowerCase(),u;try{u=await b.readFile(n,"utf8");}catch(a){if(a.code!=="ENOENT")throw a;return {changed:false}}let o=Ie(u,e,t,i===".js"||i===".mjs"?void 0:n,r);return o!==u?(await ne(n,o,"utf8"),{changed:true}):{changed:false}}async function Mr(e,t){return await new Promise((r,s)=>{let n=o=>{if(l(),o?.error){s(new Error(o.error));return}r({changed:!!o?.changed});},i=o=>{l(),s(o);},u=o=>{l(),o!==0&&s(new Error(`Rewrite worker exited with code ${o}.`));},l=()=>{e.off("message",n),e.off("error",i),e.off("exit",u);};e.on("message",n),e.on("error",i),e.on("exit",u),e.postMessage({file:t});})}async function dt(e,t,r={}){let n=(r.files?[...new Set(r.files)].map(c=>f.resolve(c)).filter(c=>c.startsWith(f.resolve(e.outputDir))).map(c=>f.relative(e.outputDir,c).replace(/\\/g,"/")).filter(c=>c.length>0):await dr(["**/*"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(c=>c!=="asset-map.json"&&J(c)),i=0;if(n.length===0)return 0;let u=Math.max(1,Number(e.rewriteConcurrency||e.assetDownloadConcurrency||1)),l=Math.max(1,Math.min(u,n.length,availableParallelism()));await r.onStart?.({totalFiles:n.length,workerCount:l});let o=0,a=0,p=null;if(l===1){for(let c of n){let g=await Ar(e,t,r.previousAssetMap??{},c);g.changed&&(i+=1),a+=1,await r.onProgress?.({index:a,totalFiles:n.length,changedTextFiles:i,file:c,changed:g.changed});}return i}let d=Array.from({length:l},async()=>{let c=new Worker(new URL("./rewrite-worker.js",import.meta.url),{workerData:{config:e,assetMap:t,previousAssetMap:r.previousAssetMap??{}}});try{for(;!p;){let g=o;if(g>=n.length)return;o+=1;let h=n[g],m=await Mr(c,h);m.changed&&(i+=1),a+=1,await r.onProgress?.({index:a,totalFiles:n.length,changedTextFiles:i,file:h,changed:m.changed});}}catch(g){throw p=g instanceof Error?g:new Error(String(g)),p}finally{await c.terminate().catch(()=>{});}});return await Promise.all(d),i}var B={error:0,warn:1,info:2,debug:3},pt=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",he=pt?f.join(pt,"current-progress.json"):"",gt=Promise.resolve();function ft(e){return e.includes("crawl")?"crawl":e.includes("deploy")?"deploy":e.includes("invalidate")?"invalidate":e}function Ir(e,t){let r={...e},s=new Set(["pagesQueued","pagesRendered","assetsQueued","sitemapsQueued","pagesDiscovered","assetsDiscovered","sitemapsDiscovered","pagesSaved","assetsSaved","donePages","doneAssets","doneSitemaps","changedTextFiles","uploaded","failed","index","totalFiles","pageQueue","assetQueue","sitemapQueue"]);for(let[n,i]of Object.entries(t)){let u=r[n];if(typeof u=="number"&&typeof i=="number"&&s.has(n)){r[n]=Math.max(u,i);continue}r[n]=i;}return r}function Lr(e,t,r){he&&(gt=gt.then(async()=>{let s=new Date,n=s.toISOString();await b.mkdir(f.dirname(he),{recursive:true});let i=await b.readFile(he,"utf8").then(m=>JSON.parse(m)).catch(()=>null),u=i&&typeof i.details=="object"&&i.details?i.details:{},l=ft(e),o=i?.currentStep||ft(i?.source||""),a=i?.startedAt||n,p={...i?.stepDurationsSec??{}},d=i?.stepStartedAt||n;if(o&&o!==l&&i?.stepStartedAt){let m=Math.max(0,Math.round((s.getTime()-new Date(i.stepStartedAt).getTime())/1e3));p[o]=(p[o]??0)+m,d=n;}let c=Math.max(0,Math.round((s.getTime()-new Date(d).getTime())/1e3)),g=Math.max(0,Math.round((s.getTime()-new Date(a).getTime())/1e3)),h={checkedAt:n,source:e,message:t,details:Ir(u,r??{}),startedAt:a,currentStep:l,stepStartedAt:d,stepElapsedSec:c,totalElapsedSec:g,stepDurationsSec:p};await b.writeFile(he,JSON.stringify(h,null,2),"utf8");}).catch(()=>{}));}async function $r(e,t){await b.mkdir(f.dirname(e),{recursive:true}),await b.appendFile(e,`${JSON.stringify(t)}
5
+ `,"utf8");}function Dr(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 Or(e,t,r){return {checkedAt:new Date().toISOString(),currentStep:Dr(e,r),level:e,message:t,details:r??{}}}var ie=class{constructor(t,r="info"){this.logDir=t;this.level=typeof r=="boolean"?r?"debug":"info":r,this.ensureLogFileReady();}logDir;startedAt=Date.now();marks=new Map;initPromise=null;writeQueue=Promise.resolve();writeError=null;level;get logPath(){return f.join(this.logDir,"crawl.log.jsonl")}get currentEventPath(){return f.join(this.logDir,"current-crawl-event.json")}get rejectedPath(){return f.join(this.logDir,"rejected.jsonl")}get ignoredPath(){return f.join(this.logDir,"ignored.jsonl")}get skippedPath(){return f.join(this.logDir,"skipped-http.jsonl")}get errorsPath(){return f.join(this.logDir,"errors.jsonl")}get timingsPath(){return f.join(this.logDir,"timings.jsonl")}ensureLogFileReady(){return this.initPromise||(this.initPromise=(async()=>{await b.mkdir(this.logDir,{recursive:true}),await b.writeFile(this.logPath,"","utf8");})()),this.initPromise}enqueueTask(t){this.writeQueue=this.writeQueue.then(t).catch(r=>{this.writeError=r instanceof Error?r:new Error(String(r));});}enqueueLine(t){this.enqueueTask(async()=>{await this.ensureLogFileReady(),await b.appendFile(this.logPath,`${t}
6
+ `,"utf8");});}enqueueJsonLine(t,r){this.enqueueTask(()=>$r(t,r));}updateCurrentEvent(t,r,s){let n=Or(t,r,s);this.enqueueTask(async()=>{await b.mkdir(this.logDir,{recursive:true}),await b.writeFile(this.currentEventPath,JSON.stringify(n,null,2),"utf8");});}push(t,r,s){let n=JSON.stringify({time:new Date().toISOString(),level:t,message:r,...s||{}});this.enqueueLine(n),this.updateCurrentEvent(t,r,s),t==="error"?console.error(r,s||""):t==="warn"?console.warn(r,s||""):(B[this.level]>=B.debug||["summary","page","sitemap","asset","timing"].includes(t))&&console.log(r);}info(t,r){this.push("info",t,r);}debug(t,r){B[this.level]<B.debug||this.push("debug",t,r);}progress(t,r){Lr("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),B[this.level]>=B.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),B[this.level]>=B.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 Le="(?: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 ht(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 mt(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]&&ht(i[1])&&r.push({index:i.index??0,value:i[1]});for(let i of e.matchAll(n))i[1]&&ht(i[1])&&r.push({index:i.index??0,value:i[1]});for(let i of r.sort((u,l)=>u.index-l.index))t.add(i.value);return [...t]}var Ur=["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"],Mt=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"]),It=new Set(["",".html",".htm"]),qr=new Set([".css",".xml",".xsl",".svg",".json",".html",".htm",".txt",".enc",".jws"]),Nr=["/wp-content/","/wp-includes/","/wp-admin/","/static/","/assets/","/build/","/_next/"];function Qr(e){let t=[],r="full",s="full",n=false,i=false;for(let u=0;u<e.length;u++){let l=e[u];if(l==="--retry-timeouts")r="retry-timeouts",n=true;else if(l==="--resume")n=true;else if(l==="--resume-rewrite")n=true,i=true;else if(l==="--crawl-mode"){let o=e[++u];if(!o)throw new Error("--crawl-mode requires a value");s=o==="incremental"?"incremental":"full",n||=s==="incremental";}else if(l.startsWith("--crawl-mode="))s=l.slice(13)==="incremental"?"incremental":"full",n||=s==="incremental";else if(l==="--incremental")s="incremental",n=true;else if(l==="--url"){let o=e[++u];if(!o)throw new Error("--url requires a value");r="single-url",n=true,t.push(o);}else if(l.startsWith("--url="))r="single-url",n=true,t.push(l.slice(6));else if(l==="--urls"){let o=e[++u];if(!o)throw new Error("--urls requires a file path");r="single-url",n=true,t.push(`@${o}`);}}return {mode:r,crawlMode:s,urls:t,preserveOutput:n,resumeRewrite:i}}function Ue(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?f.resolve(e):""}function Wr(){let e=Ue();return e?f.resolve(e,".."):""}function _r(){let e=process.env.STATIC_PUBLISHER_WP_ROOT||process.env.WPSUITE_STATIC_PUBLISHER_WP_ROOT||"";return e.trim()?f.resolve(e):""}function Br(e){let t=e.trim(),r=[{alias:"@storage-root",root:Wr(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@runtime",root:Ue(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@wp-root",root:_r(),requiredEnv:"STATIC_PUBLISHER_WP_ROOT or WPSUITE_STATIC_PUBLISHER_WP_ROOT"}];for(let s of r){if(t!==s.alias&&!t.startsWith(`${s.alias}/`))continue;if(!s.root)return {resolvedPath:null,alias:s.alias,requiredEnv:s.requiredEnv};let n=t.slice(s.alias.length).replace(/^\/+/,"");return {resolvedPath:n?f.resolve(s.root,n):s.root,alias:s.alias}}return {resolvedPath:f.resolve(t)}}function Lt(e){let t=Ue();return t?f.join(t,"crawl-manifest.json"):f.join(e.outputDir,".crawl-manifest.json")}function $t(){return {schemaVersion:3,updatedAt:"",pages:{},assets:{}}}function wt(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 Hr(e){let t=e.isText===true;return {url:String(e.url||""),outputPath:String(e.outputPath||""),isText:t,contentType:typeof e.contentType=="string"&&e.contentType?e.contentType:null,discoveredAssets:Array.isArray(e.discoveredAssets)?e.discoveredAssets.map(r=>String(r)):[],lastCrawledAt:String(e.lastCrawledAt||""),lastSeenRunId:String(e.lastSeenRunId||""),rewriteComplete:e.rewriteComplete===true||!t}}function Oe(e){let t=e?.["content-type"]?.trim();return t||null}function zr(){return {rewriteTargets:new Set,changedFiles:new Set,deletedFiles:new Set}}function N(e,t,r){let s=te(t.outputDir,r);s&&(e.changedFiles.add(s),e.deletedFiles.delete(s));}function Pt(e,t,r){let s=te(t.outputDir,r);s&&(e.deletedFiles.add(s),e.changedFiles.delete(s));}function ae(e,t){e.rewriteTargets.add(f.resolve(t));}async function Jr(e){try{let t=await b.readFile(Lt(e),"utf8"),r=JSON.parse(t);if(r&&typeof r=="object"&&r.pages&&typeof r.pages=="object"){if((r.schemaVersion===2||r.schemaVersion===3)&&r.assets&&typeof r.assets=="object")return {schemaVersion:3,updatedAt:String(r.updatedAt||""),pages:Object.fromEntries(Object.entries(r.pages).map(([s,n])=>[s,wt(n)])),assets:Object.fromEntries(Object.entries(r.assets).map(([s,n])=>[s,Hr(n)]))};if(r.schemaVersion===1)return {schemaVersion:3,updatedAt:String(r.updatedAt||""),pages:Object.fromEntries(Object.entries(r.pages).map(([s,n])=>[s,wt(n)])),assets:{}}}}catch{}return $t()}function Ee(e){return JSON.parse(JSON.stringify(e))}async function Vr(e,t){let r=Lt(e);await b.mkdir(f.dirname(r),{recursive:true}),await b.writeFile(r,JSON.stringify(t,null,2),"utf8");}async function Y(e,t){if(!t.trackManifest)return;let r=async()=>{let s=Ee(t.manifest);s.updatedAt=new Date().toISOString(),t.manifest.updatedAt=s.updatedAt,await Vr(e,s);};t.manifestSaveChain=t.manifestSaveChain.then(r,r),await t.manifestSaveChain;}function oe(e){if(!e)return null;let t=e.trim();return t||null}function Gr(e,t){let r=new Set,s=new Set([...Object.keys(e),...Object.keys(t)]);for(let n of s){let i=e[n],u=t[n];!i||!u||i===u||r.add(n);}return r}async function Zr(e,t,r,s){let n=[...new Set(r.map(l=>l.trim()).filter(Boolean))],i=String(e.wpsuite?.runtimeToken||"").trim();if(n.length===0||!i)return new Map;let u=new URL("/wp-json/smartcloud-static-publisher/v1/change-tokens",e.sourceOrigin).toString();try{let l=await t.post(u,{timeout:3e4,failOnStatusCode:!1,headers:{"content-type":"application/json","x-static-publisher-token":i},data:JSON.stringify({urls:n})});if(!l.ok())return s.warn(`Change token lookup failed with HTTP ${l.status()}`,{endpoint:u,status:l.status()}),new Map;let o=await l.json().catch(()=>null);if(!o||!Array.isArray(o.items))return new Map;let a=new Map;for(let p of o.items)!p||typeof p.url!="string"||a.set(p.url,p);return a}catch(l){return s.warn("Change token lookup failed; falling back to sitemap metadata",{endpoint:u,error:String(l)}),new Map}}async function $e(e,t,r,s,n){if(!r.enabled&&!r.trackManifest)return null;if(r.changeTokenCache.has(s))return r.changeTokenCache.get(s)??null;let u=(await Zr(e,t,[s],n)).get(s)??null;return Qe(e,s)&&(!u||u.supported!==true||!u.token)&&(u=await Xr(e,t,s,n)),u=Kr(e,u),r.changeTokenCache.set(s,u),u}function Yr(e){return `subscriber=${e.wpsuite?.siteSettings?.subscriber===true?"1":"0"}`}function Kr(e,t){if(!t?.supported||!t.token)return t;let r=Yr(e);return {...t,token:se(`${t.token}
7
+ ${r}`,40),tokenSource:t.tokenSource?`${t.tokenSource}+site-subscriber`:"site-subscriber"}}async function Xr(e,t,r,s){try{let n=await t.get(r,{timeout:Math.min(e.navigationTimeoutMs,15e3),failOnStatusCode:!1});if(n.status()!==404)return s.warn(`Generated 404 fallback token skipped for ${r}`,{url:r,status:n.status(),requestPath:e.generated404RequestPath,source:"generated-404-change-token-fallback"}),null;let i=await n.text().catch(()=>""),u=se(`${r}
8
8
  404
9
- ${i}`,40);return s.info(`Using generated 404 fallback change token for ${r}`,{url:r,requestPath:e.generated404RequestPath,source:"generated-404-change-token-fallback"}),{url:r,supported:!0,token:u,tokenSource:"generated-404-response-hash",postId:null,dependencyPostIds:[],reason:null}}catch(n){return s.warn(`Generated 404 fallback token lookup failed for ${r}`,{url:r,error:String(n),requestPath:e.generated404RequestPath,source:"generated-404-change-token-fallback"}),null}}async function Jr(e,t,r,s,n,i){let u=Qe(e,n);if(!s.enabled)return {action:"render",changeToken:s.trackManifest?await Le(e,t,s,n,i):null};let l=s.manifest.pages[n];if(!l)return {action:"render",changeToken:await Le(e,t,s,n,i)};let o=await Le(e,t,s,n,i);if(o?.supported&&o.token)return l.changeToken===o.token?u&&!await Gr(e,t,n,i)?{action:"render",changeToken:o}:{action:"reuse",changeToken:o}:{action:"render",changeToken:o};let a=ie(r.sitemapLastmodByPage[n]);return a&&l.sitemapLastmod&&l.sitemapLastmod===a?{action:"reuse",changeToken:o}:{action:"render",changeToken:o}}async function Gr(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 Vr(e,t,r,s,n){let i=pt(r.previousManifest,void 0,s,"previous-manifest"),u=0;for(let[c,p]of Object.entries(r.manifest.pages))if(!r.seenPages.has(c)){dt(n,e,p.outputPath);try{await b.unlink(p.outputPath);}catch(h){(h.code||"")!=="ENOENT"&&s.warn(`Failed to remove stale incremental page output for ${c}`,{url:c,outputPath:p.outputPath,error:String(h)});}delete r.manifest.pages[c],u++;}let l=pt(r.manifest,r.runId,s,"active-manifest"),o=new Set,a=new Set;for(let c of l){for(let m of ae(e,c))o.add(m);let p=r.manifest.assets[c]?.outputPath;p&&a.add(p);let h=ue(e,t.assetMap,c);h&&a.add(h);}for(let c of Object.keys(r.manifest.assets))l.has(c)||delete r.manifest.assets[c];let g=0,d=0;for(let c of i){let p=new Set,h=r.previousManifest.assets[c]?.outputPath;h&&p.add(h);let m=ue(e,t.assetMap,c);if(!l.has(c)&&m)p.add(m);else if(!l.has(c)){let w=ps(e,c,s,"incremental-cleanup");w&&(p.add(w.originalFilePath),w.hashedFilePath&&p.add(w.hashedFilePath));}for(let w of p)if(!a.has(w)){dt(n,e,w);try{await b.unlink(w),g++;}catch(T){(T.code||"")!=="ENOENT"&&s.warn(`Failed to remove stale incremental asset output for ${c}`,{url:c,outputPath:w,error:String(T)});}}for(let w of ae(e,c))o.has(w)||Object.prototype.hasOwnProperty.call(t.assetMap,w)&&(delete t.assetMap[w],d++);}(u>0||g>0||d>0)&&s.info(`Incremental cleanup removed ${u} stale pages, ${g} stale assets, ${d} stale asset mappings`,{removedPages:u,removedAssets:g,removedAssetMappings:d,phase:"incremental-cleanup"});}function pt(e,t,r,s){let n=new Set,i=u=>{let l=u.trim();if(l){if(r){let o=J(l,r,"asset",s??"manifest");if(!o)return;n.add(o.toString());return}n.add(l);}};for(let u of Object.values(e.pages))for(let l of u.discoveredAssets||[])i(l);for(let[u,l]of Object.entries(e.assets||{}))t&&l.lastSeenRunId!==t||i(u);return n}function gt(e,t,r){for(let s of t)for(let n of ae(e,s))if(r.has(n))return true;return false}function Yr(e,t,r,s,n){let i=new Set(r.rewriteTargets);for(let l of Object.values(t.manifest.pages))l.rewriteComplete||i.add(f.resolve(l.outputPath));for(let l of Object.values(t.manifest.assets))l.isText&&!l.rewriteComplete&&i.add(f.resolve(l.outputPath));let u=Nr(s,n);if(u.size===0)return [...i];for(let l of Object.values(t.manifest.pages))gt(e,l.discoveredAssets,u)&&i.add(f.resolve(l.outputPath));for(let[l,o]of Object.entries(t.manifest.assets)){o.isText&&gt(e,o.discoveredAssets,u)&&i.add(f.resolve(o.outputPath));for(let a of ae(e,l))if(u.has(a)){Q(r,e,o.outputPath),o.isText&&i.add(f.resolve(o.outputPath));break}}return [...i]}function Zr(e,t){let r=t?new Set(Array.from(t,n=>f.resolve(n))):null,s=n=>r===null||r.has(f.resolve(n));for(let n of Object.values(e.manifest.pages))s(n.outputPath)&&(n.rewriteComplete=true);for(let n of Object.values(e.manifest.assets)){if(!n.isText){n.rewriteComplete=true;continue}s(n.outputPath)&&(n.rewriteComplete=true);}}function Kr(e,t,r){let s=new Set,n=i=>{if(!i)return;let u=ee(e.outputDir,i);u&&s.add(u);};for(let i of t.donePages)n(H(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(ue(e,t.assetMap,i));for(let i of Object.values(r.manifest.assets))i.lastSeenRunId===r.runId&&n(i.outputPath);return s}async function Xr(e,t,r,s,n){let i=[...s.deletedFiles].sort(),u=Kr(e,t,r),l=0;for(let g of [...u].sort()){try{if((await b.stat(f.join(e.outputDir,g))).isFile())continue}catch{}l++,n.warn(`Active output is missing after crawl: ${g}`,{phase:"deploy-plan",file:g,outputPath:f.join(e.outputDir,g)});}if(l>0&&n.warn(`Detected ${l} active output file(s) missing before deploy plan save.`,{phase:"deploy-plan",missingActiveOutputs:l}),i.length===0)return [];let o=[],a=0;for(let g of i){if(!u.has(g)){o.push(g);continue}a++;let d=f.join(e.outputDir,g),c;try{c=(await b.stat(d)).isFile();}catch{c=false;}n.warn(`Deploy plan protected active output from deletion: ${g}`,{phase:"deploy-plan",file:g,outputPath:d,exists:c});}return a>0&&n.info(`Deploy plan skipped ${a} active output deletion(s).`,{phase:"deploy-plan",protectedDeletes:a,deletedFiles:o.length}),o}function ae(e,t){let r=new Set([t]);try{let s=new URL(t),i=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{i.push(new URL(e.targetOrigin).origin);}catch{}for(let u of i)try{r.add(new URL(u).origin+s.pathname+s.search);}catch{}r.add(s.pathname+s.search),r.add(s.pathname);}catch{}return [...r]}function es(e,t){let r=new Set([t]);try{let s=new URL(t),i=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{i.push(new URL(e.targetOrigin).origin);}catch{}for(let u of i)try{r.add(new URL(u).origin+s.pathname+s.search);}catch{}r.add(s.pathname+s.search);}catch{}return [...r]}function kt(e,t){let r=e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/"?e.targetOrigin:"https://relative.invalid/";try{let s=new URL(t,r);return f.join(e.outputDir,qe(s.pathname))}catch{return null}}function ts(e,t,r){for(let s of es(e,r)){let n=t[s];if(!n)continue;let i=kt(e,n);if(i)return {outputPath:i,publicUrl:n}}return null}function rs(e,t,r){for(let s of ae(e,r)){let n=t[s];if(!n)continue;let i=kt(e,n);if(i)return i}return null}function ue(e,t,r){let s=rs(e,t,r);if(s)return s;try{return We(e,r).originalFilePath}catch{return null}}function ss(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?f.join(f.resolve(e),"queue-runner-heartbeat.json"):""}async function ft(e){let t=ss();if(t)try{let r=await b.readFile(t,"utf8"),s=JSON.parse(r);if(!s||typeof s!="object")return;await b.writeFile(t,JSON.stringify({...s,checkedAt:new Date().toISOString(),status:"running",currentStep:"rewrite",message:e},null,2),"utf8");}catch{}}function ns(e,t){let r=new Set;for(let s of t.donePages)r.add(f.resolve(H(e,s)));for(let s of t.doneAssets){let n=ue(e,t.assetMap,s);!n||!z(n)||r.add(f.resolve(n));}return [...r]}var Pe="re:",me=new Map;function is(e){if(!e.startsWith(Pe))return null;let t=me.get(e);if(t!==void 0)return t||null;let r=e.slice(Pe.length).trim();if(!r)return me.set(e,false),null;try{let s=new RegExp(r);return me.set(e,s),s}catch{return console.warn(`[crawl] Ignoring invalid path matcher regex: ${e}`),me.set(e,false),null}}function Ue(e,t){let r=is(t);return r?r.test(e):t.startsWith(Pe)?false:e.startsWith(t)}function os(e,t){return t.find(r=>Ue(e,r))}function Tt(e,t){let r=os(t.pathname,e.blockedPathPrefixes);if(r)return r.startsWith(Pe)?`blocked path regex: ${r}`:`blocked path prefix: ${r}`;let s=e.blockedSearchFragments.find(n=>t.search.includes(n));return s?`blocked search fragment: ${s}`:null}function as(e){let t=new URL(e.sourceOrigin),r=new Set([t.hostname,...e.allowedAssetHosts]);if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{r.add(new URL(e.targetOrigin).hostname);}catch{}for(let s of Object.keys(e.extraReplacements||{}))try{r.add(new URL(s).hostname);}catch{}return r}function us(e,t){return as(e).has(t.hostname)}function ls(e){let t=U(e.trim()).replace(/\\\//g,"/").replace(/^['"]|['"]$/g,"").trim();return t=t.replace(/[)]+$/g,"").trim(),t=t.replace(/;.*$/g,"").trim(),t}function Fe(e){let t=U(e).replace(/\\\//g,"/");return /[{}]|\bwindow\.|\blocation\.|\bincludes\(|\?\?null|\+|%7B|%7D|%22|<|>|\s/.test(t)||/[()[\]'"]/.test(t)}function cs(e){let t=U(e).replace(/\\\//g,"/").trim(),r=f.extname(t).toLowerCase();return vt.has(r)||Rt.has(r)?false:/^(?:this|[A-Za-z_$][\w$]*)\.[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/.test(t)}function Z(e){return Dr.some(t=>e.pathname.startsWith(t))}function M(e,t,r=e.sourceOrigin,s,n="url"){let i=ls(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(Fe(i))return s?.ignore(n,t,"looks like JavaScript/code fragment",r),null;if(cs(i))return s?.ignore(n,t,"looks like JavaScript property access",r),null;try{let u=new URL(i,r);if(At(u))return s?.reject(n,t,"malformed URL encoding",r),null;if(!["http:","https:"].includes(u.protocol))return s?.ignore(n,t,"unsupported protocol: ",r),null;if(!us(e,u))return s?.ignore(n,u.toString(),"host not allowed",r),null;let l=Tt(e,u);if(l)return s?.reject(n,u.toString(),l,r),null;let o=new URL(e.sourceOrigin);return u.protocol=o.protocol,u.host=o.host,u.hash="",u}catch{return s?.reject(n,t,"invalid URL",r),null}}function At(e){try{return decodeURIComponent(e.pathname),decodeURIComponent(e.search),decodeURIComponent(e.hash),!1}catch{return true}}function J(e,t,r,s){try{let n=new URL(e);return At(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 Mt(e){return vt.has(f.extname(e.pathname).toLowerCase())}function G(e){return Z(e)?false:Rt.has(f.extname(e.pathname).toLowerCase())}function de(e){let t=e.pathname.toLowerCase();return t.endsWith(".xml")&&(t.includes("sitemap")||t.endsWith("/sitemap.xml"))}function A(e,t){return !!(de(t)||t.pathname==="/robots.txt"||t.pathname==="/llms.txt"||t.pathname.toLowerCase().endsWith(".xsl")||e.assetPathPrefixes.length>0&&e.assetPathPrefixes.some(r=>Ue(t.pathname,r))||Mt(t)||!G(t)&&!Z(t))}function H(e,t){let r=new URL(t),s=qe(r.pathname);return s.endsWith("/")?s+="index.html":f.extname(s)||(s+="/index.html"),f.join(e.outputDir,s)}function qe(e){try{return decodeURIComponent(e)}catch{return e}}function ds(e){if(!e.generated404RequestPath)return null;try{let t=new URL(e.generated404RequestPath,e.sourceOrigin);return !t.pathname.endsWith("/")&&f.extname(t.pathname)===""&&(t.pathname+="/"),t.hash="",t.toString()}catch{return null}}function Qe(e,t){let r=ds(e);if(!r)return false;try{return new URL(t,e.sourceOrigin).toString()===r}catch{return false}}function We(e,t){let r=new URL(t),s=qe(r.pathname);s.endsWith("/")&&(s+="index.html");let n=!!r.search,i=s,u=f.join(e.outputDir,i),l=ke(e.targetOrigin,i),o=`${l}${r.search}`;if(!n)return {originalPathname:i,originalFilePath:u,originalPublicUrl:l,originalPublicUrlWithSearch:o,preferQueryHashed:n};let a=f.extname(s),d=`${a?s.slice(0,-a.length):s}.${re(r.search)}${a||".bin"}`;return {originalPathname:i,originalFilePath:u,originalPublicUrl:l,originalPublicUrlWithSearch:o,preferQueryHashed:n,hashedPathname:d,hashedFilePath:f.join(e.outputDir,d),hashedPublicUrl:ke(e.targetOrigin,d)}}function ps(e,t,r,s){let n=J(t,r,"asset",s);return n?We(e,n.toString()):null}function gs(e,t,r,s,n){t[r]=s;try{let i=new URL(r),l=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{l.push(new URL(e.targetOrigin).origin);}catch{}for(let o of l)try{let a=new URL(o);t[a.origin+i.pathname+i.search]=s;}catch{}try{let o=(()=>{let a=new URL(s,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin);return `${a.pathname}${a.search}`})();t[i.pathname+i.search]=o;}catch{}try{let o=new URL(s,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[i.pathname]=o;}catch{}try{let o=new URL(n,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[i.pathname]=o;}catch{}}catch{}}async function Lt(e){try{return await b.readFile(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}async function It(e){try{return await b.stat(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}function fs(e){let t=String(e["content-length"]||"").trim();if(!t)return null;let r=Number.parseInt(t,10);return Number.isFinite(r)&&r>=0?r:null}function $t(e){let t=String(e["last-modified"]||"").trim();if(!t)return null;let r=Date.parse(t);return Number.isFinite(r)?r:null}function hs(e,t){let r=$t(t),s=fs(t),n=e?.mtime.getTime();return r!==null&&Math.abs((n??0)-r)>=1e3||s!==null&&e?.size!==s?false:r!==null||s!==null}async function ms(e,t){if(!t)return;let r=$t(t);if(r===null)return;let s=await It(e);if(!s)return;let n=new Date(r);await b.utimes(e,s.atime,n).catch(()=>{});}function ht(e,t){let r=f.extname(e.pathname).toLowerCase(),s=t["content-type"]||"";return $r.has(r)||Ir.some(n=>s.includes(n))&&!s.startsWith("image/")&&!s.includes("font")}function Ie(e,t){(e.doneAssets.size%25===0||e.doneAssets.size===1||e.doneAssets.size===e.stats.assetsQueued)&&t.progress(`Asset download progress: downloaded ${e.doneAssets.size}, discovered ${e.stats.assetsQueued}.`,{doneAssets:e.doneAssets.size,assetsQueued:e.stats.assetsQueued,phase:"download-assets"});}function ws(e){return re(e.toString("base64"),40)}function Ps(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 bs(e,t,r){let s=e.assetVariantDigestsByOriginalPath.get(t);s||(s=new Set,e.assetVariantDigestsByOriginalPath.set(t,s)),s.add(r);}async function je(e,t,r,s,n,i,u){let l=We(e,r),o=ws(s),a=l.originalFilePath,g=l.originalPublicUrlWithSearch;if(l.preferQueryHashed&&l.hashedFilePath&&l.hashedPublicUrl&&Ps(n,l.originalFilePath,o)){let h=ts(e,t,r);h?(a=h.outputPath,g=h.publicUrl):(a=l.hashedFilePath,g=l.hashedPublicUrl);}gs(e,t,r,g,l.originalPublicUrl);let d=z(a)?Buffer.from(Me(s.toString("utf8"),e,t,a),"utf8"):s,c=await Lt(a),p=false;return (c===null||!c.equals(d))&&(await se(a,d),p=true),i?.debug(`${p?"Saved":"Skipped unchanged"} asset output ${r}`,{phase:"download-assets",url:r,outputPath:a,bytes:d.length,wroteFile:p}),bs(n,l.originalFilePath,o),await ms(a,u),n.stats.assetsSaved++,i&&(n.stats.assetsSaved%50===0||n.stats.assetsSaved===1)&&i.progress(`Asset progress: saved ${n.stats.assetsSaved}, discovered ${n.stats.assetsQueued}, pending ${n.assetQueue.length}.`,{assetsSaved:n.stats.assetsSaved,assetsQueued:n.stats.assetsQueued,assetQueue:n.assetQueue.length,phase:"download-assets"}),{outputPath:a,publicUrl:g,wroteFile:p}}function le(e,t,r,s,n){let i=()=>{let d=String(n??"").trim();if(!d)return {discoveredFrom:"",discoveredFromType:"unknown"};if(d==="seed-path"||d==="cli"||d==="generated-404-request-path")return {discoveredFrom:d,discoveredFromType:d};if(/^https?:\/\//i.test(d))try{let c=new URL(d);return de(c)?{discoveredFrom:d,discoveredFromType:"sitemap"}:A(e,c)?{discoveredFrom:d,discoveredFromType:"asset"}:G(c)&&!Z(c)?{discoveredFrom:d,discoveredFromType:"page"}:{discoveredFrom:d,discoveredFromType:"url"}}catch{return {discoveredFrom:d,discoveredFromType:"url"}}return {discoveredFrom:d,discoveredFromType:"url"}},u=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,l=M(e,r,u,s,"page");if(!l)return;if(!G(l)||Mt(l)){if(A(e,l)){s.info(`Seeded/non-page URL queued as asset: ${l.toString()}`,{url:l.toString(),source:n}),I(e,t,l.toString(),s,n);return}s.reject("page",l.toString(),Z(l)?"asset/internal path cannot be page":"not page-like",n);return}let o=l.toString(),{discoveredFrom:a,discoveredFromType:g}=i();a&&!t.pageDiscoverySources.has(o)&&t.pageDiscoverySources.set(o,a),!t.donePages.has(o)&&!t.queuedPages.has(o)&&(t.queuedPages.add(o),t.pageQueue.push(o),t.stats.pagesQueued++,s.debug(`Queued discovered page ${o}`,{phase:"discovery",url:o,discoveredFrom:a,discoveredFromType:g,outputPath:H(e,o)}),(t.stats.pagesQueued%25===0||t.stats.pagesQueued===1)&&s.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,pageQueue:t.pageQueue.length,phase:"discovery"}));}function I(e,t,r,s,n){let i=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,u=M(e,r,i,s,"asset");if(!u)return;if(!A(e,u)){s.reject("asset",u.toString(),"not a safe asset path/prefix",n);return}let l=u.toString();!t.doneAssets.has(l)&&!t.queuedAssets.has(l)&&(t.queuedAssets.add(l),t.assetQueue.push(l),t.stats.assetsQueued++,(t.stats.assetsQueued%100===0||t.stats.assetsQueued===1)&&s.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,assetQueue:t.assetQueue.length,phase:"discovery"}));}function Ne(e,t,r,s,n){let i=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,u=M(e,r,i,s,"sitemap");if(!u)return;if(!de(u)){s.reject("sitemap",u.toString(),"not sitemap-like",n);return}let l=u.toString();!t.doneSitemaps.has(l)&&!t.queuedSitemaps.has(l)&&(t.queuedSitemaps.add(l),t.sitemapQueue.push(l),t.stats.sitemapsQueued++,(t.stats.sitemapsQueued%10===0||t.stats.sitemapsQueued===1)&&s.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,sitemapQueue:t.sitemapQueue.length,phase:"discovery"}));}function Ss(e){let t=U(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:ie(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 ys(e){return e.split(",").map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function vs(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 Rs(e){return e.replace(/<script\b[^>]*>[\s\S]*?<\/script\s*>/gi,"")}function Cs(e,t){if(t==="dom-style")return true;let r=(()=>{try{return f.extname(new URL(e).pathname).toLowerCase()}catch{return ""}})();return !(r===".js"||r===".mjs"||r===".map"||t.includes("javascript"))}function $e(e){return e.trim().replace(/\\/g,"/").replace(/^https?:\/\/[^/]+/i,"").replace(/^\/+/,"")}async function Dt(e,t,r,s){let n=[];await b.mkdir(t,{recursive:true});let i=await b.readdir(e,{withFileTypes:true});for(let u of i){let l=f.join(e,u.name),o=f.join(t,u.name);if(u.isDirectory()){n.push(...await Dt(l,o,r,s));continue}await Ot(l,o,r,s)&&n.push(o);}return n}async function xs(e,t){try{let[r,s]=await Promise.all([b.stat(e),b.stat(t)]);if(r.size!==s.size)return !1;let[n,i]=await Promise.all([b.readFile(e),b.readFile(t)]);return n.equals(i)}catch{return false}}async function Ot(e,t,r,s){let n=f.resolve(t);return r.has(n)?(s.debug("Skipped post-crawl copy over crawled page output",{phase:"copy-extra-paths",sourcePath:e,targetPath:t}),false):await xs(e,t)?(s.debug("Skipped unchanged post-crawl copy target",{phase:"copy-extra-paths",sourcePath:e,targetPath:t}),false):(await b.mkdir(f.dirname(t),{recursive:true}),await b.copyFile(e,t),true)}async function ks(e,t,r){let s=Object.entries(e.postCrawlCopyMap||{}).map(([l,o])=>({sourcePath:l.trim(),prefix:String(o||"").trim()}));if(s.length===0)return [];let n=0,i=[],u=new Set([...t.donePages].map(l=>f.resolve(H(e,l))));r.mark("copy-extra-paths");for(let l of s){let o=l.sourcePath,a=l.prefix;if(!o||!a){r.warn("Skipped post-crawl copy mapping with empty key/value",{sourcePath:o,prefixPath:a});continue}let g=Er(o);if(!g.resolvedPath){r.warn("Skipped post-crawl copy source because alias root is not configured",{sourcePath:o,alias:g.alias||"",requiredEnv:g.requiredEnv||"",prefixPath:a});continue}let d=g.resolvedPath,c=$e(a);if(!c){r.warn("Skipped post-crawl copy mapping with invalid export prefix",{sourcePath:o,prefixPath:a});continue}let p;try{p=await b.stat(d);}catch{r.warn("Skipped post-crawl copy source because it does not exist",{sourcePath:o,sourceAbs:d,prefixPath:a});continue}let h=f.resolve(e.outputDir,c);if(p.isDirectory()){let x=await Dt(d,h,u,r);i.push(...x),n+=x.length,x.length>0&&r.progress(`Copied static directory to export: ${d} -> /${c}`,{phase:"copy-extra-paths",sourcePath:d,targetPath:`/${c}`,copiedItems:n,changedFiles:x.length});continue}let m=f.basename(d),w=a.endsWith("/")?f.join(h,m):h;await Ot(d,w,u,r)&&(i.push(w),n++,r.progress(`Copied static file to export: ${d} -> /${$e(a.endsWith("/")?`${a}${m}`:a)}`,{phase:"copy-extra-paths",sourcePath:d,targetPath:`/${$e(a.endsWith("/")?`${a}${m}`:a)}`,copiedItems:n}));}return r.endMark("copy-extra-paths",{mappedSources:s.length,copiedItems:n}),i}function ce(e,t,r,s,n){let i=new Set,u=U(r).replace(/\\\//g,"/"),l=n==="page-html"?Rs(u):u,o=Cs(t,n);if(o){for(let g of vs(l)){let d=M(e,g,t,s,`${n}:css-url`);d&&A(e,d)&&i.add(d.toString());}for(let g of l.matchAll(/@import\s+(?:url\()?\s*['"]?([^'"\s;]+)['"]?\s*\)?/gi)){let d=M(e,g[1],t,s,`${n}:css-import`);d&&A(e,d)&&i.add(d.toString());}}if(o||n==="page-html")for(let g of l.matchAll(/<\?xml-stylesheet[^>]+href=["']([^"']+)["'][^>]*\?>/gi)){let d=M(e,g[1],t,s,`${n}:xml-stylesheet`);d&&A(e,d)&&i.add(d.toString());}let a=new RegExp(`(?:https?:)?//[^\\s'"<>\\);]+\\.${he}(?:\\?[^\\s'"<>\\);]*)?|(?<!\\.)/[^\\s'"<>\\);]+\\.${he}(?:\\?[^\\s'"<>\\);]*)?`,"gi");for(let g of u.matchAll(a)){let d=g[0].startsWith("//")?`${new URL(e.sourceOrigin).protocol}${g[0]}`:g[0];if(Fe(d)){s.ignore(`${n}:serialized-url`,d,"looks like JavaScript/code fragment",t);continue}let c=M(e,d,t,s,`${n}:serialized-url`);c&&A(e,c)?i.add(c.toString()):c&&s.ignore("asset",c.toString(),"serialized URL did not pass safe asset path filter",t);}if(n!=="page-html")for(let g of lt(u)){if(Fe(g))continue;let d=M(e,g,t,s,`${n}:relative-asset`);d&&A(e,d)&&i.add(d.toString());}return [...i]}function Ts(e,t,r,s){let n=new Set,i=U(r);for(let u of i.matchAll(/href=["']([^"'#\s][^"']*?)["']/gi)){let l=u[1],o=M(e,l,t,s,"page-link");o&&(Tt(e,o)||G(o)&&!Z(o)&&!A(e,o)&&n.add(o.toString()));}return [...n]}async function mt(e,t,r,s,n){for(;r.sitemapQueue.length>0;){let i=r.sitemapQueue.shift();r.queuedSitemaps.delete(i);let u=J(i,s,"sitemap","sitemap-queue");if(!u)continue;let l=u.toString();if(!r.doneSitemaps.has(l)){r.doneSitemaps.add(l),s.sitemap(`Fetching sitemap ${l}`,{url:l});try{let o=await t.get(l,{timeout:6e4});if(!o.ok()){s.skip("sitemap",l,o.status());continue}let a=await o.body(),g=o.url()||l,d=J(g,s,"sitemap-response",l);if(!d)continue;let c=d.toString(),p=await je(e,r.assetMap,c,a,r,s);Q(n,e,p.outputPath),oe(n,p.outputPath);let h=a.toString("utf8");for(let m of ce(e,c,h,s,"sitemap"))I(e,r,m,s,c);for(let m of Ss(h)){let w=M(e,m.loc,c,s,"sitemap-loc");w&&(de(w)?Ne(e,r,w.toString(),s,c):A(e,w)?I(e,r,w.toString(),s,c):G(w)?(m.lastmod&&(r.sitemapLastmodByPage[w.toString()]=m.lastmod),le(e,r,w.toString(),s,c)):s.reject("sitemap-loc",w.toString(),"not page/sitemap/asset-like",c));}}catch(o){s.error(`Failed sitemap ${l}`,{url:l,error:String(o)});}}}}async function As(e,t,r,s,n,i,u){let l=M(e,s,e.sourceOrigin,n,"asset-fetch");if(!l||!A(e,l))return;let o=l.toString();if(r.doneAssets.has(o))return;let a=i.enabled?i.previousManifest.assets[o]:void 0,g=(d,c={})=>{if(!a)return false;i.manifest.assets[o]={...a,discoveredAssets:[...a.discoveredAssets||[]],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId},delete i.manifest.pages[o],r.doneAssets.add(o);for(let p of a.discoveredAssets||[])I(e,r,p,n,o);return n.warn(`Keeping previous incremental asset ${o} after fetch issue.`,{url:o,reason:d,preservedFromPreviousManifest:true,...c,phase:"download-assets"}),Ie(r,n),true};n.asset(`Fetching asset ${o}`,{url:o});try{let d=ue(e,r.assetMap,o),c=d?await It(d):null;if(d&&c)try{let R=await t.head(o,{timeout:6e4}),C=R.headers();if(R.ok()&&hs(c,C)){let $=await Lt(d);if($!==null){let W=R.url()||o,S=J(W,n,"asset-response",o);if(!S)return;let v=S.toString(),N=await je(e,r.assetMap,v,$,r,n,C);N.wroteFile&&(Q(u,e,N.outputPath),z(N.outputPath)&&oe(u,N.outputPath)),r.doneAssets.add(o),n.info(`Reused existing asset ${o} based on response headers.`,{url:o,filePath:d,lastModified:C["last-modified"]||"",contentLength:C["content-length"]||"",phase:"download-assets"}),Ie(r,n);let K=ht(l,C),be=a?.discoveredAssets?[...a.discoveredAssets]:[];if(K||a?.isText){let X=$.toString("utf8"),_e=ce(e,v,X,n,"asset:cached");(_e.length>0||!a)&&(be=_e);for(let Et of be)I(e,r,Et,n,v);}if(i.trackManifest){let X=K||!!a?.isText;i.manifest.assets[o]={url:o,outputPath:N.outputPath,isText:X,contentType:De(C)||a?.contentType||null,discoveredAssets:be,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!X},delete i.manifest.pages[o],i.enabled&&X&&await Y(e,i);}return}}}catch{}let p=await t.get(o,{timeout:6e4});if(!p.ok()){if(g(`http-${p.status()}`,{status:p.status()}))return;n.skip("asset",o,p.status());return}let h=await p.body(),m=p.url()||o,w=J(m,n,"asset-response",o);if(!w)return;let T=w.toString(),x=p.headers(),k=await je(e,r.assetMap,T,h,r,n,x);k.wroteFile&&(Q(u,e,k.outputPath),z(k.outputPath)&&oe(u,k.outputPath)),r.doneAssets.add(o),Ie(r,n);let P=ht(l,x),y=[];if(P){let R=h.toString("utf8");y=ce(e,T,R,n,`asset:${f.extname(l.pathname).toLowerCase()||x["content-type"]||"unknown"}`);for(let C of y)I(e,r,C,n,T);}i.trackManifest&&(i.manifest.assets[o]={url:o,outputPath:k.outputPath,isText:P,contentType:De(x),discoveredAssets:y,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!P},delete i.manifest.pages[o],i.enabled&&P&&await Y(e,i));}catch(d){if(g("fetch-error",{error:String(d)}))return;n.error(`Failed asset ${o}`,{url:o,error:String(d)});}}async function Ms(e,t,r,s,n,i){let u=Math.max(1,Number(e.assetDownloadConcurrency||e.concurrency||1)),l=Array.from({length:u},async()=>{for(;r.assetQueue.length>0;){let o=r.assetQueue.shift();o&&(r.queuedAssets.delete(o),await As(e,t,r,o,s,n,i));}});await Promise.all(l);}function Ls(e){let t=Math.ceil(e/1e3);return `${t} second${t===1?"":"s"}`}function q(e){return Math.max(6e4,e.navigationTimeoutMs*2,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+15e3)}function we(e){return Math.max(15e3,Math.min(6e4,q(e)))}function Is(e){return Math.max(15e3,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+1e4)}function Be(e){return e.stats.pagesCompleted}function Ft(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 $s(e,t,r){let s=Ft(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 L(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 ${Ls(t)}.`));},t);})])}finally{s!==void 0&&globalThis.clearTimeout(s);}}async function Ds(e,t){let r=Is(e);await t.evaluate(async s=>{await new Promise(n=>{let i=0,u=700,l=Date.now(),o=()=>{window.clearInterval(a),window.scrollTo(0,0),n();},a=window.setInterval(()=>{if(Date.now()-l>=s.maxDurationMs){o();return}window.scrollBy(0,u),i+=u;let g=document.body?.scrollHeight||0,d=document.documentElement?.scrollHeight||0,c=Math.max(g,d);i>=c+window.innerHeight&&o();},120);});},{maxDurationMs:r});}async function Os(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 Ds(e,t),await t.waitForTimeout(e.readiness.fallbackWaitMs);}async function Fs(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 js(e,t){return e.noJavaScriptRenderPathPrefixes.some(r=>Ue(t,r))}async function Es(e,t,r,s,n=true){let i=new Set;if(n){let l=await t.evaluate(()=>{let o=new Set,a=["href","src","poster","data-src","data-lazy-src","data-original","data-bg","data-background","data-href"],g=new Set,d=["srcset","data-srcset","data-lazy-srcset"];return document.querySelectorAll("*").forEach(c=>{for(let h of a){let m=c.getAttribute(h);m&&o.add(m);}for(let h of d){let m=c.getAttribute(h);m&&m.split(",").forEach(w=>{let T=w.trim().split(/\s+/)[0];T&&o.add(T);});}let p=c.getAttribute("style");p&&g.add(p);}),{attrs:[...o],styles:[...g]}});for(let o of l.attrs)for(let a of ys(o)){let g=M(e,a,r,s,"dom-attr");g&&A(e,g)&&i.add(g.toString());}for(let o of l.styles)for(let a of ce(e,r,o,s,"dom-style"))i.add(a);}let u=await t.content();for(let l of ce(e,r,u,s,"page-html"))i.add(l);return [...i]}async function wt(e,t,r,s,n){let i=H(e,t);await se(i,r,"utf8");let u=await b.stat(i);n?.debug(`Saved page output ${t}`,{phase:"save-pages",url:t,outputPath:i,bytes:u.size}),s.stats.pagesSaved++;let l=Math.min(s.stats.pagesQueued,Be(s)+1);n&&(s.stats.pagesSaved%10===0||s.stats.pagesSaved===1)&&n.progress(`Page progress: processed ${l}, rendered ${s.stats.pagesRendered}, saved ${s.stats.pagesSaved}, discovered ${s.stats.pagesQueued}.`,{donePages:l,claimedPages:s.donePages.size,pagesRendered:s.stats.pagesRendered,pagesSaved:s.stats.pagesSaved,pagesQueued:s.stats.pagesQueued,pageQueue:s.pageQueue.length,phase:"save-pages"});}function Us(e){let t=Be(e);return t%5===0||t===1||t===e.stats.pagesQueued}function qs(e,t){let r=Be(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 Qs(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 Ws(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 Qs(s),s}async function Ns(e,t,r,s,n,i,u){let l=await chromium.launch({headless:true}),o=Ft(l);o.pid!==null&&r.debug(`Launched crawl worker browser PID ${o.pid}`,{browserPid:o.pid});try{for(;t.pageQueue.length>0&&!(e.maxPages>0&&t.donePages.size>=e.maxPages);){let a=t.pageQueue.shift();if(!a)break;t.queuedPages.delete(a);let g=null,d=null;try{let c=J(a,r,"page","page-queue");if(!c)continue;let p=c.toString();if(a=p,t.queuedPages.delete(a),t.donePages.has(a))continue;t.donePages.add(a),i.enabled&&i.seenPages.add(a);let h=Qe(e,a),m=js(e,c.pathname);if(!G(c)||A(e,c)||Z(c)){if(A(e,c)){r.info(`Worker redirected non-page URL to asset queue: ${a}`,{url:a,source:"worker-guard"}),I(e,t,a,r,"worker-guard");continue}r.reject("page",a,"guard rejected non-page URL before rendering","worker");continue}let w=await Jr(e,n,t,i,a,r);if(i.enabled&&s!=="single-url"){let S=i.manifest.pages[a];if(w.action==="reuse"&&S){for(let v of S.discoveredAssets)I(e,t,v,r,a);for(let v of S.discoveredPages)le(e,t,v,r,a);S.lastSeenRunId=i.runId,S.sitemapLastmod=ie(t.sitemapLastmodByPage[a])??S.sitemapLastmod,w.changeToken?.supported&&(S.changeToken=w.changeToken.token,S.tokenSource=w.changeToken.tokenSource??S.tokenSource),r.info(`Incremental reuse skipped unchanged page ${a}`,{url:a,mode:"incremental",reason:w.changeToken?.supported===!0?"change-token-match":"sitemap-lastmod-match"});continue}}g=await L(`create page context ${a}`,q(e),()=>Ws(l,e,m)),d=await L(`create page ${a}`,q(e),()=>g.newPage());let T=!1,x=new Set;await d.route("**/*",async S=>{let v=S.request();if(v.isNavigationRequest()&&v.frame()===d.mainFrame())try{let N=new URL(v.url()),K=new URL(p);if(N.hash="",K.hash="",N.href===K.href){if(T){r.warn(`Blocked same-page navigation/reload for ${a}`,{url:a,requestUrl:v.url()}),await S.abort("aborted");return}T=!0;}}catch{}await S.continue();}),d.on("response",S=>{try{let v=M(e,S.url(),e.sourceOrigin,r,"network-response");v&&A(e,v)&&(x.add(v.toString()),I(e,t,v.toString(),r,a));}catch{}}),r.page(`Rendering ${a}`,{url:a});let k=null,P=null;try{if(k=await d.goto(a,{waitUntil:"domcontentloaded",timeout:e.navigationTimeoutMs}),k&&k.ok())try{P=await L(`read response body ${a}`,q(e),()=>k.text());}catch{P=null;}}catch(S){r.warn(`Navigation issue for ${a}; saving current DOM if available`,{url:a,error:String(S)});}if(h){let S=k?.status()??null;if(S!==404){r.error(`Generated 404 request path returned unexpected status for ${a}`,{url:a,expectedStatus:404,status:S,requestPath:e.generated404RequestPath});continue}r.info(`Capturing rendered 404 page for ${a}`,{url:a,status:S,outputPath:H(e,a)});}else if(k&&!k.ok()){r.skip("page",a,k.status(),t.pageDiscoverySources.get(a)),await d.close();continue}m?(r.info(`Rendering without JS execution for ${a}`,{url:a,mode:"no-js"}),await L(`wait for rendered page ${a}`,q(e),()=>Fs(e,d))):await L(`wait for rendered page ${a}`,q(e),()=>Os(e,d)),t.stats.pagesRendered++;let y=await L(`extract rendered assets ${a}`,q(e),()=>Es(e,d,p,r,!m));for(let S of y)I(e,t,S,r,a);let R=[...new Set([...y,...x])],C=P??await L(`capture rendered html ${a}`,q(e),()=>d.content()),$=s!=="single-url"&&!h?Ts(e,a,C,r):[];if(s!=="single-url"&&!h)for(let S of $)le(e,t,S,r,a);await wt(e,a,C,t,r);let W=H(e,a);if(Q(u,e,W),oe(u,W),i.trackManifest){let S=k?.headers();i.manifest.pages[a]={url:a,outputPath:W,contentType:De(S),changeToken:w.changeToken?.supported?w.changeToken.token:null,tokenSource:w.changeToken?.supported?w.changeToken.tokenSource??null:null,sitemapLastmod:ie(t.sitemapLastmodByPage[a])??null,discoveredPages:$,discoveredAssets:R,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!1},i.enabled&&await Y(e,i);}}catch(c){try{let p=d?await L(`capture partial html ${a}`,q(e),()=>d.content()):"";if(p&&p.trim()){await wt(e,a,p,t,r);let h=H(e,a);if(Q(u,e,h),oe(u,h),i.trackManifest){let m=i.manifest.pages[a]??i.previousManifest.pages[a];i.manifest.pages[a]={url:a,outputPath:h,contentType:m?.contentType??null,changeToken:null,tokenSource:null,sitemapLastmod:ie(t.sitemapLastmodByPage[a])??m?.sitemapLastmod??null,discoveredPages:m?.discoveredPages?[...m.discoveredPages]:[],discoveredAssets:m?.discoveredAssets?[...m.discoveredAssets]:[],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!1},i.enabled&&await Y(e,i);}r.warn(`Saved partial DOM for ${a}`,{url:a,error:String(c)});}}catch(p){r.error(`Could not save partial DOM for ${a}`,{url:a,error:String(p)});}r.error(`Failed page ${a}`,{url:a,error:String(c)});}finally{t.stats.pagesCompleted++,Us(t)&&qs(t,r),d&&await L(`close page ${a}`,we(e),()=>d.close()).catch(c=>{r.warn(`Timed out while closing page ${a}`,{url:a,browserPid:o.pid,error:String(c)});}),g&&await L(`close page context ${a}`,we(e),()=>g.close()).catch(c=>{r.warn(`Timed out while closing page context for ${a}`,{url:a,browserPid:o.pid,error:String(c)});});}}}finally{await L("close worker browser",we(e),()=>l.close()).catch(a=>(r.warn("Timed out while closing crawl worker browser",{browserPid:o.pid,error:String(a)}),$s(l,r,"browser.close timeout")));}}async function Bs(e){try{let t=await b.readFile(e),s=(e.endsWith(".gz")?gunzipSync(t):t).toString("utf8").trim();if(!s)return [];try{let n=JSON.parse(s);if(Array.isArray(n))return n;if(n&&typeof n=="object")return [n]}catch{return s.split(/\r?\n/).map(n=>n.trim()).filter(Boolean).map(n=>{try{let i=JSON.parse(n);return i&&typeof i=="object"?i:null}catch{return null}}).filter(n=>n!==null)}return []}catch{return []}}function Pt(e){let t=String(e||"").toLowerCase();return t.includes("timeout")||t.includes("timed out")||t.includes("navigation timeout")}function _s(e){let t=String(e?.job?.command||"").trim(),r=String(e?.job?.crawlMode||"full").trim();return t!=="publish"&&t!=="crawl"?false:r!=="incremental"}function Hs(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 jt(e){try{let t=await b.readFile(e,"utf8"),r=JSON.parse(t);return r&&typeof r=="object"&&!Array.isArray(r)?r:null}catch{return null}}function bt(e){let t=String(e.originalFileName||"").toLowerCase();return t.endsWith("errors.jsonl")?0:t.endsWith("errors.json")?1:2}function zs(e,t){let r=Array.isArray(t?.artifacts)?t.artifacts.filter(s=>String(s?.role||"").trim()==="errors"&&String(s?.storedFileName||"").trim()!=="").sort((s,n)=>bt(s)-bt(n)).map(s=>f.join(e,String(s.storedFileName))):[];return [...new Set([...r,f.join(e,"errors.jsonl"),f.join(e,"errors.json"),f.join(e,"errors.jsonl.gz"),f.join(e,"errors.json.gz")])]}async function St(e){let t=await jt(f.join(e,"job.json"));for(let r of zs(e,t)){let s=await Bs(r);if(s.length>0)return s}return []}async function Js(e){let t=f.join(e.logDir,"archive"),r;try{r=await b.readdir(t);}catch{return ""}let s="",n=0;for(let i of r){let u=f.join(t,i);if(!(await b.stat(u).catch(()=>null))?.isDirectory())continue;let o=await jt(f.join(u,"job.json"));if(!_s(o))continue;let a=Hs(o);a>=n&&(n=a,s=u);}return s}async function Gs(e){let t=await Js(e),r=t!==""?await St(t):await St(e.logDir),s=new Set;for(let n of r)if(Pt(n.error)||Pt(n.message)){let i=n.url;typeof i=="string"&&i&&s.add(i);}return [...s]}async function Vs(e){let t=[];for(let r of e)if(r.startsWith("@")){let s=r.slice(1),n=await b.readFile(s,"utf8");t.push(...n.split(/\r?\n/).map(i=>i.trim()).filter(i=>i&&!i.startsWith("#")));}else t.push(r);return t}async function Ys(e){try{let t=await b.readFile(f.join(e.outputDir,"asset-map.json"),"utf8");return JSON.parse(t)}catch{return {}}}async function Zs(e){let t=["crawl.log.jsonl","current-crawl-event.json","rejected.jsonl","ignored.jsonl","skipped-http.jsonl","errors.jsonl","timings.jsonl","rejected.json","ignored.json","skipped-http.json","errors.json","timings.json"];await b.mkdir(e,{recursive:true}),await Promise.all(t.map(async r=>{try{await b.unlink(f.join(e,r));}catch(s){if(s.code!=="ENOENT")throw s}}));}function yt(e,t,r,s,n){let i=M(e,r,e.sourceOrigin,s,"manual-url");i&&(de(i)?Ne(e,t,i.toString(),s,n):A(e,i)?I(e,t,i.toString(),s,n):G(i)?le(e,t,i.toString(),s,n):s.reject("manual-url",i.toString(),"not page/sitemap/asset-like",n));}async function Ks(){let e=[],t=await xe(void 0,{onRemotePublisherConfigDiagnostic:P=>{e.push(P);}}),r=e.at(-1)??null,s=Or(process.argv.slice(2));if(s.resumeRewrite&&s.mode!=="full")throw new Error("--resume-rewrite is only supported for full crawl/publish jobs.");let n=[];s.mode==="retry-timeouts"&&(n=await Gs(t)),s.mode==="single-url"&&(n=await Vs(s.urls));let i=s.crawlMode==="incremental"&&s.mode==="full",u=i&&typeof t.subscriptionType=="string"&&t.subscriptionType.trim()!=="",l=(s.mode==="full"||s.mode==="single-url")&&!s.resumeRewrite,o=s.mode!=="full"||s.resumeRewrite||u,a=o?await Ys(t):{},g=u||s.mode==="single-url"?await Qr(t):xt(),d={enabled:u,trackManifest:l,manifest:Oe(g),previousManifest:Oe(g),runId:`${Date.now()}`,seenPages:new Set,changeTokenCache:new Map,manifestSaveChain:Promise.resolve()};await Zs(t.logDir);let c=new ne(t.logDir,t.logLevel);if(r){let P={status:r.status,virtualAssetBaseUrl:r.virtualAssetBaseUrl,subscriptionType:r.subscriptionType??null,error:r.error,requests:r.requests,source:"remote-publisher-config"};r.status==="loaded"&&r.subscriptionType?c.info("Loaded remote WP Suite publisher configuration.",P):c.warn("Remote WP Suite publisher configuration is unavailable or has no active subscription type.",P);}if(i&&!u){let P="Incremental crawl requires an active remote publisher subscription; refusing to fall back to a destructive full crawl.";throw c.error(P,{requestedMode:s.crawlMode,subscriptionType:t.subscriptionType??null,source:"incremental-subscription-guard"}),await c.flush(),new Error(P)}let p={pageQueue:[],queuedPages:new Set,donePages:new Set,pageDiscoverySources:new Map,assetQueue:[],queuedAssets:new Set,doneAssets:new Set,sitemapQueue:[],queuedSitemaps:new Set,doneSitemaps:new Set,sitemapLastmodByPage:{},assetMap:{...a},assetVariantDigestsByOriginalPath:new Map,stats:{pagesQueued:0,pagesRendered:0,pagesCompleted:0,assetsQueued:0,sitemapsQueued:0,assetsSaved:0,pagesSaved:0}},h=qr();if(o||await b.rm(t.outputDir,{recursive:true,force:true}),await b.mkdir(t.outputDir,{recursive:true}),s.resumeRewrite)c.info("Resuming final rewrite from existing output.",{phase:"rewrite-text",mode:s.mode,crawlMode:s.crawlMode});else {let P=await request.newContext({ignoreHTTPSErrors:t.ignoreHttpsErrors});try{if(c.mark("discovery"),s.mode==="full"?(t.sitemapPaths.forEach(R=>Ne(t,p,R,c)),await mt(t,P,p,c,h),t.seedPaths.forEach(R=>yt(t,p,R,c,"seed-path")),t.generated404RequestPath&&le(t,p,t.generated404RequestPath,c,"generated-404-request-path")):(n.forEach(R=>yt(t,p,R,c,"cli")),await mt(t,P,p,c,h)),c.endMark("discovery",{pages:p.pageQueue.length,assets:p.assetQueue.length,sitemaps:p.sitemapQueue.length}),c.summary(`Queued ${p.pageQueue.length} pages, ${p.assetQueue.length} assets, ${p.sitemapQueue.length} sitemaps.`,{mode:s.mode,crawlMode:s.crawlMode,queuedPages:p.pageQueue.length,queuedAssets:p.assetQueue.length,queuedSitemaps:p.sitemapQueue.length}),s.mode==="retry-timeouts"&&p.pageQueue.length===0&&p.assetQueue.length===0&&p.sitemapQueue.length===0){c.summary("No timed-out URLs were queued. Skipping retry crawl.",{mode:s.mode,crawlMode:s.crawlMode,queuedPages:0,queuedAssets:0,queuedSitemaps:0}),await c.flush();return}c.mark("render-pages");let y=Array.from({length:Math.max(1,t.concurrency)},()=>Ns(t,p,c,s.mode,P,d,h));if(await Promise.all(y),c.endMark("render-pages",{pages:p.stats.pagesCompleted}),c.mark("download-assets"),c.progress("Asset download phase started.",{phase:"download-assets",doneAssets:p.doneAssets.size,assetsQueued:p.stats.assetsQueued,assetQueue:p.assetQueue.length}),await Ms(t,P,p,c,d,h),c.endMark("download-assets",{assets:p.doneAssets.size}),d.enabled&&t.maxPages===0&&await Vr(t,p,d,c,h),s.mode==="full"){let R=await ks(t,p,c);for(let C of R)Q(h,t,C);}}finally{await L("dispose crawl request context",we(t),()=>P.dispose()).catch(y=>{c.warn("Timed out while disposing crawl request context",{error:String(y)});});}}d.trackManifest&&await Y(t,d),await b.writeFile(f.join(t.outputDir,"asset-map.json"),JSON.stringify(p.assetMap,null,2),"utf8"),JSON.stringify(a,null,2)!==JSON.stringify(p.assetMap,null,2)&&Q(h,t,f.join(t.outputDir,"asset-map.json"));let m=s.mode==="single-url"?ns(t,p):d.enabled&&!s.resumeRewrite?Yr(t,d,h,a,p.assetMap):void 0;c.mark("rewrite-text");let w=s.mode==="single-url"?`Rewriting text files touched by URL crawl: 0/${m?.length??0}`:"Rewriting text files...";c.progress(w,{phase:"rewrite-text",index:0,totalFiles:m?.length,changedTextFiles:0}),await ft(w);let T=Date.now(),x=await it(t,p.assetMap,{files:m,previousAssetMap:a,onStart:({totalFiles:P,workerCount:y})=>{c.info(`Rewrite phase scanning ${P} text files.`,{phase:"rewrite-text",totalFiles:P,workerCount:y});},onProgress:async({index:P,totalFiles:y,changedTextFiles:R,file:C,changed:$})=>{$&&Q(h,t,f.join(t.outputDir,C)),c.checkpoint(`Rewriting text file ${P}/${y}`,{phase:"rewrite-text",index:P,totalFiles:y,changedTextFiles:R,file:C}),c.debug(`${$?"Rewrote":"Checked unchanged"} text file ${P}/${y}: ${C}`,{phase:"rewrite-text",index:P,totalFiles:y,changedTextFiles:R,file:C,changed:$});let W=Date.now();if(!(P===1||P===y||P%50===0||W-T>=5e3))return;T=W;let v=`Rewriting text files: ${P}/${y}`;c.progress(v,{phase:"rewrite-text",index:P,totalFiles:y,changedTextFiles:R,file:C}),await ft(v);}});d.trackManifest&&(Zr(d,m),await Y(t,d)),c.endMark("rewrite-text",{changedTextFiles:x});let k=d.enabled&&!s.resumeRewrite?await Xr(t,p,d,h,c):[];await Je(t,{generatedAt:new Date().toISOString(),outputDir:f.resolve(t.outputDir),runMode:s.mode,crawlMode:s.crawlMode,fullSyncRequired:!(d.enabled&&!s.resumeRewrite),changedFiles:d.enabled&&!s.resumeRewrite?[...h.changedFiles].sort():[],deletedFiles:d.enabled&&!s.resumeRewrite?k:[],rewriteTargets:d.enabled&&!s.resumeRewrite?[...new Set((m||[]).map(P=>ee(t.outputDir,f.isAbsolute(P)?P:f.join(t.outputDir,P))).filter(P=>P!==null))].sort():[]}),c.summary(s.resumeRewrite?`Done. Resumed final rewrite over existing output and changed ${x} text files.`:`Done. Rendered ${p.stats.pagesRendered} pages, processed ${p.doneSitemaps.size} sitemaps, downloaded ${p.doneAssets.size} assets.`,{mode:s.mode,crawlMode:s.crawlMode,resumeRewrite:s.resumeRewrite,...p.stats,pagesRendered:p.stats.pagesRendered,donePages:p.stats.pagesCompleted,claimedPages:p.donePages.size,doneSitemaps:p.doneSitemaps.size,doneAssets:p.doneAssets.size,changedTextFiles:x}),await c.flush();}Ks().catch(async e=>{console.error(e);try{let r=(await xe().catch(()=>null))?.logDir??"logs",s=new ne(r,"debug");s.error(`Unhandled error: ${e instanceof Error?e.message:String(e)}`,e instanceof Error?{stack:e.stack}:void 0),await s.flush();}catch{}process.exit(1);});
9
+ ${i}`,40);return s.info(`Using generated 404 fallback change token for ${r}`,{url:r,requestPath:e.generated404RequestPath,source:"generated-404-change-token-fallback"}),{url:r,supported:!0,token:u,tokenSource:"generated-404-response-hash",postId:null,dependencyPostIds:[],reason:null}}catch(n){return s.warn(`Generated 404 fallback token lookup failed for ${r}`,{url:r,error:String(n),requestPath:e.generated404RequestPath,source:"generated-404-change-token-fallback"}),null}}async function es(e,t,r,s,n,i){let u=Qe(e,n);if(!s.enabled)return {action:"render",changeToken:s.trackManifest?await $e(e,t,s,n,i):null};let l=s.manifest.pages[n];if(!l)return {action:"render",changeToken:await $e(e,t,s,n,i)};let o=await $e(e,t,s,n,i);if(o?.supported&&o.token)return l.changeToken===o.token?u&&!await ts(e,t,n,i)?{action:"render",changeToken:o}:{action:"reuse",changeToken:o}:{action:"render",changeToken:o};let a=oe(r.sitemapLastmodByPage[n]);return a&&l.sitemapLastmod&&l.sitemapLastmod===a?{action:"reuse",changeToken:o}:{action:"render",changeToken:o}}async function ts(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 rs(e,t,r,s,n){let i=bt(r.previousManifest,void 0,s,"previous-manifest"),u=0;for(let[c,g]of Object.entries(r.manifest.pages))if(!r.seenPages.has(c)){Pt(n,e,g.outputPath);try{await b.unlink(g.outputPath);}catch(h){(h.code||"")!=="ENOENT"&&s.warn(`Failed to remove stale incremental page output for ${c}`,{url:c,outputPath:g.outputPath,error:String(h)});}delete r.manifest.pages[c],u++;}let l=bt(r.manifest,r.runId,s,"active-manifest"),o=new Set,a=new Set;for(let c of l){for(let m of ue(e,c))o.add(m);let g=r.manifest.assets[c]?.outputPath;g&&a.add(g);let h=le(e,t.assetMap,c);h&&a.add(h);}for(let c of Object.keys(r.manifest.assets))l.has(c)||delete r.manifest.assets[c];let p=0,d=0;for(let c of i){let g=new Set,h=r.previousManifest.assets[c]?.outputPath;h&&g.add(h);let m=le(e,t.assetMap,c);if(!l.has(c)&&m)g.add(m);else if(!l.has(c)){let w=bs(e,c,s,"incremental-cleanup");w&&(g.add(w.originalFilePath),w.hashedFilePath&&g.add(w.hashedFilePath));}for(let w of g)if(!a.has(w)){Pt(n,e,w);try{await b.unlink(w),p++;}catch(T){(T.code||"")!=="ENOENT"&&s.warn(`Failed to remove stale incremental asset output for ${c}`,{url:c,outputPath:w,error:String(T)});}}for(let w of ue(e,c))o.has(w)||Object.prototype.hasOwnProperty.call(t.assetMap,w)&&(delete t.assetMap[w],d++);}(u>0||p>0||d>0)&&s.info(`Incremental cleanup removed ${u} stale pages, ${p} stale assets, ${d} stale asset mappings`,{removedPages:u,removedAssets:p,removedAssetMappings:d,phase:"incremental-cleanup"});}function bt(e,t,r,s){let n=new Set,i=u=>{let l=u.trim();if(l){if(r){let o=V(l,r,"asset",s??"manifest");if(!o)return;n.add(o.toString());return}n.add(l);}};for(let u of Object.values(e.pages))for(let l of u.discoveredAssets||[])i(l);for(let[u,l]of Object.entries(e.assets||{}))t&&l.lastSeenRunId!==t||i(u);return n}function St(e,t,r){for(let s of t)for(let n of ue(e,s))if(r.has(n))return true;return false}function ss(e,t,r,s,n){let i=new Set(r.rewriteTargets);for(let l of Object.values(t.manifest.pages))l.rewriteComplete||i.add(f.resolve(l.outputPath));for(let l of Object.values(t.manifest.assets))l.isText&&!l.rewriteComplete&&i.add(f.resolve(l.outputPath));let u=Gr(s,n);if(u.size===0)return [...i];for(let l of Object.values(t.manifest.pages))St(e,l.discoveredAssets,u)&&i.add(f.resolve(l.outputPath));for(let[l,o]of Object.entries(t.manifest.assets)){o.isText&&St(e,o.discoveredAssets,u)&&i.add(f.resolve(o.outputPath));for(let a of ue(e,l))if(u.has(a)){N(r,e,o.outputPath),o.isText&&i.add(f.resolve(o.outputPath));break}}return [...i]}function ns(e,t){let r=t?new Set(Array.from(t,n=>f.resolve(n))):null,s=n=>r===null||r.has(f.resolve(n));for(let n of Object.values(e.manifest.pages))s(n.outputPath)&&(n.rewriteComplete=true);for(let n of Object.values(e.manifest.assets)){if(!n.isText){n.rewriteComplete=true;continue}s(n.outputPath)&&(n.rewriteComplete=true);}}function is(e,t,r){let s=new Set,n=i=>{if(!i)return;let u=te(e.outputDir,i);u&&s.add(u);};for(let i of t.donePages)n(H(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(le(e,t.assetMap,i));for(let i of Object.values(r.manifest.assets))i.lastSeenRunId===r.runId&&n(i.outputPath);return s}async function os(e,t,r,s,n){let i=[...s.deletedFiles].sort(),u=is(e,t,r),l=0;for(let p of [...u].sort()){try{if((await b.stat(f.join(e.outputDir,p))).isFile())continue}catch{}l++,n.warn(`Active output is missing after crawl: ${p}`,{phase:"deploy-plan",file:p,outputPath:f.join(e.outputDir,p)});}if(l>0&&n.warn(`Detected ${l} active output file(s) missing before deploy plan save.`,{phase:"deploy-plan",missingActiveOutputs:l}),i.length===0)return [];let o=[],a=0;for(let p of i){if(!u.has(p)){o.push(p);continue}a++;let d=f.join(e.outputDir,p),c;try{c=(await b.stat(d)).isFile();}catch{c=false;}n.warn(`Deploy plan protected active output from deletion: ${p}`,{phase:"deploy-plan",file:p,outputPath:d,exists:c});}return a>0&&n.info(`Deploy plan skipped ${a} active output deletion(s).`,{phase:"deploy-plan",protectedDeletes:a,deletedFiles:o.length}),o}function ue(e,t){let r=new Set([t]);try{let s=new URL(t),i=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{i.push(new URL(e.targetOrigin).origin);}catch{}for(let u of i)try{r.add(new URL(u).origin+s.pathname+s.search);}catch{}r.add(s.pathname+s.search),r.add(s.pathname);}catch{}return [...r]}function as(e,t){let r=new Set([t]);try{let s=new URL(t),i=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{i.push(new URL(e.targetOrigin).origin);}catch{}for(let u of i)try{r.add(new URL(u).origin+s.pathname+s.search);}catch{}r.add(s.pathname+s.search);}catch{}return [...r]}function Dt(e,t){let r=e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/"?e.targetOrigin:"https://relative.invalid/";try{let s=new URL(t,r);return f.join(e.outputDir,Ne(s.pathname))}catch{return null}}function us(e,t,r){for(let s of as(e,r)){let n=t[s];if(!n)continue;let i=Dt(e,n);if(i)return {outputPath:i,publicUrl:n}}return null}function ls(e,t,r){for(let s of ue(e,r)){let n=t[s];if(!n)continue;let i=Dt(e,n);if(i)return i}return null}function le(e,t,r){let s=ls(e,t,r);if(s)return s;try{return We(e,r).originalFilePath}catch{return null}}function cs(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?f.join(f.resolve(e),"queue-runner-heartbeat.json"):""}async function yt(e){let t=cs();if(t)try{let r=await b.readFile(t,"utf8"),s=JSON.parse(r);if(!s||typeof s!="object")return;await b.writeFile(t,JSON.stringify({...s,checkedAt:new Date().toISOString(),status:"running",currentStep:"rewrite",message:e},null,2),"utf8");}catch{}}function ds(e,t){let r=new Set;for(let s of t.donePages)r.add(f.resolve(H(e,s)));for(let s of t.doneAssets){let n=le(e,t.assetMap,s);!n||!J(n)||r.add(f.resolve(n));}return [...r]}var be="re:",me=new Map;function ps(e){if(!e.startsWith(be))return null;let t=me.get(e);if(t!==void 0)return t||null;let r=e.slice(be.length).trim();if(!r)return me.set(e,false),null;try{let s=new RegExp(r);return me.set(e,s),s}catch{return console.warn(`[crawl] Ignoring invalid path matcher regex: ${e}`),me.set(e,false),null}}function qe(e,t){let r=ps(t);return r?r.test(e):t.startsWith(be)?false:e.startsWith(t)}function gs(e,t){return t.find(r=>qe(e,r))}function Ot(e,t){let r=gs(t.pathname,e.blockedPathPrefixes);if(r)return r.startsWith(be)?`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 fs(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 hs(e,t){return fs(e).has(t.hostname)}function ms(e){let t=U(e.trim()).replace(/\\\//g,"/").replace(/^['"]|['"]$/g,"").trim();return t=t.replace(/[)]+$/g,"").trim(),t=t.replace(/;.*$/g,"").trim(),t}function je(e){let t=U(e).replace(/\\\//g,"/");return /[{}]|\bwindow\.|\blocation\.|\bincludes\(|\?\?null|\+|%7B|%7D|%22|<|>|\s/.test(t)||/[()[\]'"]/.test(t)}function ws(e){let t=U(e).replace(/\\\//g,"/").trim(),r=f.extname(t).toLowerCase();return Mt.has(r)||It.has(r)?false:/^(?:this|[A-Za-z_$][\w$]*)\.[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/.test(t)}function K(e){return Nr.some(t=>e.pathname.startsWith(t))}function L(e,t,r=e.sourceOrigin,s,n="url"){let i=ms(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(je(i))return s?.ignore(n,t,"looks like JavaScript/code fragment",r),null;if(ws(i))return s?.ignore(n,t,"looks like JavaScript property access",r),null;try{let u=new URL(i,r);if(Et(u))return s?.reject(n,t,"malformed URL encoding",r),null;if(!["http:","https:"].includes(u.protocol))return s?.ignore(n,t,"unsupported protocol: ",r),null;if(!hs(e,u))return s?.ignore(n,u.toString(),"host not allowed",r),null;let l=Ot(e,u);if(l)return s?.reject(n,u.toString(),l,r),null;let o=new URL(e.sourceOrigin);return u.protocol=o.protocol,u.host=o.host,u.hash="",u}catch{return s?.reject(n,t,"invalid URL",r),null}}function Et(e){try{return decodeURIComponent(e.pathname),decodeURIComponent(e.search),decodeURIComponent(e.hash),!1}catch{return true}}function V(e,t,r,s){try{let n=new URL(e);return Et(n)?(t.reject(r,e,"malformed URL encoding",s),null):n.protocol!=="http:"&&n.protocol!=="https:"?(t.reject(r,e,`unsupported protocol: ${n.protocol}`,s),null):n}catch{return t.reject(r,e,"invalid URL",s),null}}function jt(e){return Mt.has(f.extname(e.pathname).toLowerCase())}function G(e){return K(e)?false:It.has(f.extname(e.pathname).toLowerCase())}function pe(e){let t=e.pathname.toLowerCase();return t.endsWith(".xml")&&(t.includes("sitemap")||t.endsWith("/sitemap.xml"))}function A(e,t){return !!(pe(t)||t.pathname==="/robots.txt"||t.pathname==="/llms.txt"||t.pathname.toLowerCase().endsWith(".xsl")||e.assetPathPrefixes.length>0&&e.assetPathPrefixes.some(r=>qe(t.pathname,r))||jt(t)||!G(t)&&!K(t))}function H(e,t){let r=new URL(t),s=Ne(r.pathname);return s.endsWith("/")?s+="index.html":f.extname(s)||(s+="/index.html"),f.join(e.outputDir,s)}function Ne(e){try{return decodeURIComponent(e)}catch{return e}}function Ps(e){if(!e.generated404RequestPath)return null;try{let t=new URL(e.generated404RequestPath,e.sourceOrigin);return !t.pathname.endsWith("/")&&f.extname(t.pathname)===""&&(t.pathname+="/"),t.hash="",t.toString()}catch{return null}}function Qe(e,t){let r=Ps(e);if(!r)return false;try{return new URL(t,e.sourceOrigin).toString()===r}catch{return false}}function We(e,t){let r=new URL(t),s=Ne(r.pathname);s.endsWith("/")&&(s+="index.html");let n=!!r.search,i=s,u=f.join(e.outputDir,i),l=Te(e.targetOrigin,i),o=`${l}${r.search}`;if(!n)return {originalPathname:i,originalFilePath:u,originalPublicUrl:l,originalPublicUrlWithSearch:o,preferQueryHashed:n};let a=f.extname(s),d=`${a?s.slice(0,-a.length):s}.${se(r.search)}${a||".bin"}`;return {originalPathname:i,originalFilePath:u,originalPublicUrl:l,originalPublicUrlWithSearch:o,preferQueryHashed:n,hashedPathname:d,hashedFilePath:f.join(e.outputDir,d),hashedPublicUrl:Te(e.targetOrigin,d)}}function bs(e,t,r,s){let n=V(t,r,"asset",s);return n?We(e,n.toString()):null}function Ss(e,t,r,s,n){t[r]=s;try{let i=new URL(r),l=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{l.push(new URL(e.targetOrigin).origin);}catch{}for(let o of l)try{let a=new URL(o);t[a.origin+i.pathname+i.search]=s;}catch{}try{let o=(()=>{let a=new URL(s,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin);return `${a.pathname}${a.search}`})();t[i.pathname+i.search]=o;}catch{}try{let o=new URL(s,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[i.pathname]=o;}catch{}try{let o=new URL(n,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[i.pathname]=o;}catch{}}catch{}}async function Ft(e){try{return await b.readFile(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}async function Ut(e){try{return await b.stat(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}function ys(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 qt(e){let t=String(e["last-modified"]||"").trim();if(!t)return null;let r=Date.parse(t);return Number.isFinite(r)?r:null}function vs(e,t){let r=qt(t),s=ys(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 Cs(e,t){if(!t)return;let r=qt(t);if(r===null)return;let s=await Ut(e);if(!s)return;let n=new Date(r);await b.utimes(e,s.atime,n).catch(()=>{});}function vt(e,t){let r=f.extname(e.pathname).toLowerCase(),s=t["content-type"]||"";return qr.has(r)||Ur.some(n=>s.includes(n))&&!s.startsWith("image/")&&!s.includes("font")}function Rs(e){try{let t=f.extname(new URL(e).pathname).toLowerCase();return t===".js"||t===".mjs"}catch{return false}}function we(e,t){(e.doneAssets.size%25===0||e.doneAssets.size===1||e.doneAssets.size===e.stats.assetsQueued)&&t.progress(`Asset download progress: processed ${e.doneAssets.size}, discovered ${e.stats.assetsQueued}.`,{doneAssets:e.doneAssets.size,assetsQueued:e.stats.assetsQueued,phase:"download-assets"});}function ks(e){return se(e.toString("base64"),40)}function xs(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 Ts(e,t,r){let s=e.assetVariantDigestsByOriginalPath.get(t);s||(s=new Set,e.assetVariantDigestsByOriginalPath.set(t,s)),s.add(r);}async function Fe(e,t,r,s,n,i,u){let l=We(e,r),o=ks(s),a=l.originalFilePath,p=l.originalPublicUrlWithSearch;if(l.preferQueryHashed&&l.hashedFilePath&&l.hashedPublicUrl&&xs(n,l.originalFilePath,o)){let h=us(e,t,r);h?(a=h.outputPath,p=h.publicUrl):(a=l.hashedFilePath,p=l.hashedPublicUrl);}Ss(e,t,r,p,l.originalPublicUrl);let d=J(a)?Buffer.from(Ie(s.toString("utf8"),e,t,a),"utf8"):s,c=await Ft(a),g=false;return (c===null||!c.equals(d))&&(await ne(a,d),g=true),i?.debug(`${g?"Saved":"Skipped unchanged"} asset output ${r}`,{phase:"download-assets",url:r,outputPath:a,bytes:d.length,wroteFile:g}),Ts(n,l.originalFilePath,o),await Cs(a,u),n.stats.assetsSaved++,i&&(n.stats.assetsSaved%50===0||n.stats.assetsSaved===1)&&i.progress(`Asset progress: saved ${n.stats.assetsSaved}, discovered ${n.stats.assetsQueued}, pending ${n.assetQueue.length}.`,{assetsSaved:n.stats.assetsSaved,assetsQueued:n.stats.assetsQueued,assetQueue:n.assetQueue.length,phase:"download-assets"}),{outputPath:a,publicUrl:p,wroteFile:g}}function ce(e,t,r,s,n){let i=()=>{let d=String(n??"").trim();if(!d)return {discoveredFrom:"",discoveredFromType:"unknown"};if(d==="seed-path"||d==="cli"||d==="generated-404-request-path")return {discoveredFrom:d,discoveredFromType:d};if(/^https?:\/\//i.test(d))try{let c=new URL(d);return pe(c)?{discoveredFrom:d,discoveredFromType:"sitemap"}:A(e,c)?{discoveredFrom:d,discoveredFromType:"asset"}:G(c)&&!K(c)?{discoveredFrom:d,discoveredFromType:"page"}:{discoveredFrom:d,discoveredFromType:"url"}}catch{return {discoveredFrom:d,discoveredFromType:"url"}}return {discoveredFrom:d,discoveredFromType:"url"}},u=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,l=L(e,r,u,s,"page");if(!l)return;if(!G(l)||jt(l)){if(A(e,l)){s.info(`Seeded/non-page URL queued as asset: ${l.toString()}`,{url:l.toString(),source:n}),$(e,t,l.toString(),s,n);return}s.reject("page",l.toString(),K(l)?"asset/internal path cannot be page":"not page-like",n);return}let o=l.toString(),{discoveredFrom:a,discoveredFromType:p}=i();a&&!t.pageDiscoverySources.has(o)&&t.pageDiscoverySources.set(o,a),!t.donePages.has(o)&&!t.queuedPages.has(o)&&(t.queuedPages.add(o),t.pageQueue.push(o),t.stats.pagesQueued++,s.debug(`Queued discovered page ${o}`,{phase:"discovery",url:o,discoveredFrom:a,discoveredFromType:p,outputPath:H(e,o)}),(t.stats.pagesQueued%25===0||t.stats.pagesQueued===1)&&s.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,pageQueue:t.pageQueue.length,phase:"discovery"}));}function $(e,t,r,s,n){let i=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,u=L(e,r,i,s,"asset");if(!u)return;if(!A(e,u)){s.reject("asset",u.toString(),"not a safe asset path/prefix",n);return}let l=u.toString();!t.doneAssets.has(l)&&!t.queuedAssets.has(l)&&(t.queuedAssets.add(l),t.assetQueue.push(l),t.stats.assetsQueued++,(t.stats.assetsQueued%100===0||t.stats.assetsQueued===1)&&s.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,assetQueue:t.assetQueue.length,phase:"discovery"}));}function _e(e,t,r,s,n){let i=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,u=L(e,r,i,s,"sitemap");if(!u)return;if(!pe(u)){s.reject("sitemap",u.toString(),"not sitemap-like",n);return}let l=u.toString();!t.doneSitemaps.has(l)&&!t.queuedSitemaps.has(l)&&(t.queuedSitemaps.add(l),t.sitemapQueue.push(l),t.stats.sitemapsQueued++,(t.stats.sitemapsQueued%10===0||t.stats.sitemapsQueued===1)&&s.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,sitemapQueue:t.sitemapQueue.length,phase:"discovery"}));}function As(e){let t=U(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:oe(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 Ms(e){return e.split(",").map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function Is(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 Ls(e){return e.replace(/<script\b[^>]*>[\s\S]*?<\/script\s*>/gi,"")}function $s(e,t){if(t==="dom-style")return true;let r=(()=>{try{return f.extname(new URL(e).pathname).toLowerCase()}catch{return ""}})();return !(r===".js"||r===".mjs"||r===".map"||t.includes("javascript"))}function De(e){return e.trim().replace(/\\/g,"/").replace(/^https?:\/\/[^/]+/i,"").replace(/^\/+/,"")}async function Nt(e,t,r,s){let n=[];await b.mkdir(t,{recursive:true});let i=await b.readdir(e,{withFileTypes:true});for(let u of i){let l=f.join(e,u.name),o=f.join(t,u.name);if(u.isDirectory()){n.push(...await Nt(l,o,r,s));continue}await Qt(l,o,r,s)&&n.push(o);}return n}async function Ds(e,t){try{let[r,s]=await Promise.all([b.stat(e),b.stat(t)]);if(r.size!==s.size)return !1;let[n,i]=await Promise.all([b.readFile(e),b.readFile(t)]);return n.equals(i)}catch{return false}}async function Qt(e,t,r,s){let n=f.resolve(t);return r.has(n)?(s.debug("Skipped post-crawl copy over crawled page output",{phase:"copy-extra-paths",sourcePath:e,targetPath:t}),false):await Ds(e,t)?(s.debug("Skipped unchanged post-crawl copy target",{phase:"copy-extra-paths",sourcePath:e,targetPath:t}),false):(await b.mkdir(f.dirname(t),{recursive:true}),await b.copyFile(e,t),true)}async function Os(e,t,r){let s=Object.entries(e.postCrawlCopyMap||{}).map(([l,o])=>({sourcePath:l.trim(),prefix:String(o||"").trim()}));if(s.length===0)return [];let n=0,i=[],u=new Set([...t.donePages].map(l=>f.resolve(H(e,l))));r.mark("copy-extra-paths");for(let l of s){let o=l.sourcePath,a=l.prefix;if(!o||!a){r.warn("Skipped post-crawl copy mapping with empty key/value",{sourcePath:o,prefixPath:a});continue}let p=Br(o);if(!p.resolvedPath){r.warn("Skipped post-crawl copy source because alias root is not configured",{sourcePath:o,alias:p.alias||"",requiredEnv:p.requiredEnv||"",prefixPath:a});continue}let d=p.resolvedPath,c=De(a);if(!c){r.warn("Skipped post-crawl copy mapping with invalid export prefix",{sourcePath:o,prefixPath:a});continue}let g;try{g=await b.stat(d);}catch{r.warn("Skipped post-crawl copy source because it does not exist",{sourcePath:o,sourceAbs:d,prefixPath:a});continue}let h=f.resolve(e.outputDir,c);if(g.isDirectory()){let k=await Nt(d,h,u,r);i.push(...k),n+=k.length,k.length>0&&r.progress(`Copied static directory to export: ${d} -> /${c}`,{phase:"copy-extra-paths",sourcePath:d,targetPath:`/${c}`,copiedItems:n,changedFiles:k.length});continue}let m=f.basename(d),w=a.endsWith("/")?f.join(h,m):h;await Qt(d,w,u,r)&&(i.push(w),n++,r.progress(`Copied static file to export: ${d} -> /${De(a.endsWith("/")?`${a}${m}`:a)}`,{phase:"copy-extra-paths",sourcePath:d,targetPath:`/${De(a.endsWith("/")?`${a}${m}`:a)}`,copiedItems:n}));}return r.endMark("copy-extra-paths",{mappedSources:s.length,copiedItems:n}),i}function de(e,t,r,s,n){let i=new Set,u=U(r).replace(/\\\//g,"/"),l=n==="page-html"?Ls(u):u,o=$s(t,n);if(o){for(let p of Is(l)){let d=L(e,p,t,s,`${n}:css-url`);d&&A(e,d)&&i.add(d.toString());}for(let p of l.matchAll(/@import\s+(?:url\()?\s*['"]?([^'"\s;]+)['"]?\s*\)?/gi)){let d=L(e,p[1],t,s,`${n}:css-import`);d&&A(e,d)&&i.add(d.toString());}}if(o||n==="page-html")for(let p of l.matchAll(/<\?xml-stylesheet[^>]+href=["']([^"']+)["'][^>]*\?>/gi)){let d=L(e,p[1],t,s,`${n}:xml-stylesheet`);d&&A(e,d)&&i.add(d.toString());}let a=new RegExp(`(?:https?:)?//[^\\s'"<>\\);]+\\.${Le}(?:\\?[^\\s'"<>\\);]*)?|(?<!\\.)/[^\\s'"<>\\);]+\\.${Le}(?:\\?[^\\s'"<>\\);]*)?`,"gi");if(n==="page-html")for(let p of u.matchAll(a)){let d=p[0].startsWith("//")?`${new URL(e.sourceOrigin).protocol}${p[0]}`:p[0];if(je(d)){s.ignore(`${n}:serialized-url`,d,"looks like JavaScript/code fragment",t);continue}let c=L(e,d,t,s,`${n}:serialized-url`);c&&A(e,c)?i.add(c.toString()):c&&s.ignore("asset",c.toString(),"serialized URL did not pass safe asset path filter",t);}if(n!=="page-html"&&Rs(t))for(let p of mt(u)){if(je(p)||!/\.(?:js|mjs)(?:[?#]|$)/i.test(p))continue;let d=L(e,p,t,s,`${n}:relative-asset`);d&&A(e,d)&&i.add(d.toString());}return [...i]}function Es(e,t,r,s){let n=new Set,i=U(r);for(let u of i.matchAll(/href=["']([^"'#\s][^"']*?)["']/gi)){let l=u[1],o=L(e,l,t,s,"page-link");o&&(Ot(e,o)||G(o)&&!K(o)&&!A(e,o)&&n.add(o.toString()));}return [...n]}async function Ct(e,t,r,s,n){for(;r.sitemapQueue.length>0;){let i=r.sitemapQueue.shift();r.queuedSitemaps.delete(i);let u=V(i,s,"sitemap","sitemap-queue");if(!u)continue;let l=u.toString();if(!r.doneSitemaps.has(l)){r.doneSitemaps.add(l),s.sitemap(`Fetching sitemap ${l}`,{url:l});try{let o=await t.get(l,{timeout:6e4});if(!o.ok()){s.skip("sitemap",l,o.status());continue}let a=await o.body(),p=o.url()||l,d=V(p,s,"sitemap-response",l);if(!d)continue;let c=d.toString(),g=await Fe(e,r.assetMap,c,a,r,s);N(n,e,g.outputPath),ae(n,g.outputPath);let h=a.toString("utf8");for(let m of de(e,c,h,s,"sitemap"))$(e,r,m,s,c);for(let m of As(h)){let w=L(e,m.loc,c,s,"sitemap-loc");w&&(pe(w)?_e(e,r,w.toString(),s,c):A(e,w)?$(e,r,w.toString(),s,c):G(w)?(m.lastmod&&(r.sitemapLastmodByPage[w.toString()]=m.lastmod),ce(e,r,w.toString(),s,c)):s.reject("sitemap-loc",w.toString(),"not page/sitemap/asset-like",c));}}catch(o){s.error(`Failed sitemap ${l}`,{url:l,error:String(o)});}}}}async function js(e,t,r,s,n,i,u){let l=L(e,s,e.sourceOrigin,n,"asset-fetch");if(!l||!A(e,l))return;let o=l.toString();if(r.doneAssets.has(o))return;let a=i.enabled?i.previousManifest.assets[o]:void 0,p=(d,c={})=>{if(!a)return false;i.manifest.assets[o]={...a,discoveredAssets:[...a.discoveredAssets||[]],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId},delete i.manifest.pages[o],r.doneAssets.add(o);for(let g of a.discoveredAssets||[])$(e,r,g,n,o);return n.warn(`Keeping previous incremental asset ${o} after fetch issue.`,{url:o,reason:d,preservedFromPreviousManifest:true,...c,phase:"download-assets"}),we(r,n),true};n.asset(`Fetching asset ${o}`,{url:o});try{let d=le(e,r.assetMap,o),c=d?await Ut(d):null;if(d&&c)try{let C=await M(`fetch asset headers ${o}`,6e4,()=>t.head(o,{timeout:6e4})),R=C.headers();if(C.ok()&&vs(c,R)){let D=await Ft(d);if(D!==null){let Q=C.url()||o,S=V(Q,n,"asset-response",o);if(!S)return;let v=S.toString(),W=await Fe(e,r.assetMap,v,D,r,n,R);W.wroteFile&&(N(u,e,W.outputPath),J(W.outputPath)&&ae(u,W.outputPath)),r.doneAssets.add(o),n.info(`Reused existing asset ${o} based on response headers.`,{url:o,filePath:d,lastModified:R["last-modified"]||"",contentLength:R["content-length"]||"",phase:"download-assets"}),we(r,n);let X=vt(l,R),Se=a?.discoveredAssets?[...a.discoveredAssets]:[];if(X||a?.isText){let ee=D.toString("utf8"),He=de(e,v,ee,n,"asset:cached");(He.length>0||!a)&&(Se=He);for(let Bt of Se)$(e,r,Bt,n,v);}if(i.trackManifest){let ee=X||!!a?.isText;i.manifest.assets[o]={url:o,outputPath:W.outputPath,isText:ee,contentType:Oe(R)||a?.contentType||null,discoveredAssets:Se,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!ee},delete i.manifest.pages[o],i.enabled&&ee&&await Y(e,i);}return}}}catch{}let g=await M(`fetch asset ${o}`,6e4,()=>t.get(o,{timeout:6e4}));if(!g.ok()){if(p(`http-${g.status()}`,{status:g.status()}))return;n.skip("asset",o,g.status());return}let h=await M(`read asset response ${o}`,6e4,()=>g.body()),m=g.url()||o,w=V(m,n,"asset-response",o);if(!w)return;let T=w.toString(),k=g.headers(),x=await Fe(e,r.assetMap,T,h,r,n,k);x.wroteFile&&(N(u,e,x.outputPath),J(x.outputPath)&&ae(u,x.outputPath)),r.doneAssets.add(o),we(r,n);let P=vt(l,k),y=[];if(P){let C=h.toString("utf8");y=de(e,T,C,n,`asset:${f.extname(l.pathname).toLowerCase()||k["content-type"]||"unknown"}`);for(let R of y)$(e,r,R,n,T);}i.trackManifest&&(i.manifest.assets[o]={url:o,outputPath:x.outputPath,isText:P,contentType:Oe(k),discoveredAssets:y,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!P},delete i.manifest.pages[o],i.enabled&&P&&await Y(e,i));}catch(d){if(p("fetch-error",{error:String(d)}))return;n.error(`Failed asset ${o}`,{url:o,error:String(d)});}finally{r.doneAssets.has(o)||(r.doneAssets.add(o),we(r,n));}}async function Fs(e,t,r,s,n,i){let u=Math.max(1,Number(e.assetDownloadConcurrency||e.concurrency||1)),l=Array.from({length:u},async()=>{for(;r.assetQueue.length>0;){let o=r.assetQueue.shift();o&&(r.queuedAssets.delete(o),await js(e,t,r,o,s,n,i));}});await Promise.all(l);}function Us(e){let t=Math.ceil(e/1e3);return `${t} second${t===1?"":"s"}`}function q(e){return Math.max(6e4,e.navigationTimeoutMs*2,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+15e3)}function Pe(e){return Math.max(15e3,Math.min(6e4,q(e)))}function qs(e){return Math.max(15e3,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+1e4)}function Be(e){return e.stats.pagesCompleted}function Wt(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 Ns(e,t,r){let s=Wt(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 M(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 ${Us(t)}.`));},t);})])}finally{s!==void 0&&globalThis.clearTimeout(s);}}async function Qs(e,t){let r=qs(e);await t.evaluate(async s=>{await new Promise(n=>{let i=0,u=700,l=Date.now(),o=()=>{window.clearInterval(a),window.scrollTo(0,0),n();},a=window.setInterval(()=>{if(Date.now()-l>=s.maxDurationMs){o();return}window.scrollBy(0,u),i+=u;let p=document.body?.scrollHeight||0,d=document.documentElement?.scrollHeight||0,c=Math.max(p,d);i>=c+window.innerHeight&&o();},120);});},{maxDurationMs:r});}async function Ws(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 Qs(e,t),await t.waitForTimeout(e.readiness.fallbackWaitMs);}async function _s(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 Bs(e,t){return e.noJavaScriptRenderPathPrefixes.some(r=>qe(t,r))}async function Hs(e,t,r,s,n=true){let i=new Set;if(n){let l=await t.evaluate(()=>{let o=new Set,a=["href","src","poster","data-src","data-lazy-src","data-original","data-bg","data-background","data-href"],p=new Set,d=["srcset","data-srcset","data-lazy-srcset"];return document.querySelectorAll("*").forEach(c=>{for(let h of a){let m=c.getAttribute(h);m&&o.add(m);}for(let h of d){let m=c.getAttribute(h);m&&m.split(",").forEach(w=>{let T=w.trim().split(/\s+/)[0];T&&o.add(T);});}let g=c.getAttribute("style");g&&p.add(g);}),{attrs:[...o],styles:[...p]}});for(let o of l.attrs)for(let a of Ms(o)){let p=L(e,a,r,s,"dom-attr");p&&A(e,p)&&i.add(p.toString());}for(let o of l.styles)for(let a of de(e,r,o,s,"dom-style"))i.add(a);}let u=await t.content();for(let l of de(e,r,u,s,"page-html"))i.add(l);return [...i]}async function Rt(e,t,r,s,n){let i=H(e,t);await ne(i,r,"utf8");let u=await b.stat(i);n?.debug(`Saved page output ${t}`,{phase:"save-pages",url:t,outputPath:i,bytes:u.size}),s.stats.pagesSaved++;let l=Math.min(s.stats.pagesQueued,Be(s)+1);n&&(s.stats.pagesSaved%10===0||s.stats.pagesSaved===1)&&n.progress(`Page progress: processed ${l}, rendered ${s.stats.pagesRendered}, saved ${s.stats.pagesSaved}, discovered ${s.stats.pagesQueued}.`,{donePages:l,claimedPages:s.donePages.size,pagesRendered:s.stats.pagesRendered,pagesSaved:s.stats.pagesSaved,pagesQueued:s.stats.pagesQueued,pageQueue:s.pageQueue.length,phase:"save-pages"});}function zs(e){let t=Be(e);return t%5===0||t===1||t===e.stats.pagesQueued}function Js(e,t){let r=Be(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 Vs(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 Gs(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 Vs(s),s}async function Zs(e,t,r,s,n,i,u){let l=await chromium.launch({headless:true}),o=Wt(l);o.pid!==null&&r.debug(`Launched crawl worker browser PID ${o.pid}`,{browserPid:o.pid});try{for(;t.pageQueue.length>0&&!(e.maxPages>0&&t.donePages.size>=e.maxPages);){let a=t.pageQueue.shift();if(!a)break;t.queuedPages.delete(a);let p=null,d=null;try{let c=V(a,r,"page","page-queue");if(!c)continue;let g=c.toString();if(a=g,t.queuedPages.delete(a),t.donePages.has(a))continue;t.donePages.add(a),i.enabled&&i.seenPages.add(a);let h=Qe(e,a),m=Bs(e,c.pathname);if(!G(c)||A(e,c)||K(c)){if(A(e,c)){r.info(`Worker redirected non-page URL to asset queue: ${a}`,{url:a,source:"worker-guard"}),$(e,t,a,r,"worker-guard");continue}r.reject("page",a,"guard rejected non-page URL before rendering","worker");continue}let w=await es(e,n,t,i,a,r);if(i.enabled&&s!=="single-url"){let S=i.manifest.pages[a];if(w.action==="reuse"&&S){for(let v of S.discoveredAssets)$(e,t,v,r,a);for(let v of S.discoveredPages)ce(e,t,v,r,a);S.lastSeenRunId=i.runId,S.sitemapLastmod=oe(t.sitemapLastmodByPage[a])??S.sitemapLastmod,w.changeToken?.supported&&(S.changeToken=w.changeToken.token,S.tokenSource=w.changeToken.tokenSource??S.tokenSource),r.info(`Incremental reuse skipped unchanged page ${a}`,{url:a,mode:"incremental",reason:w.changeToken?.supported===!0?"change-token-match":"sitemap-lastmod-match"});continue}}p=await M(`create page context ${a}`,q(e),()=>Gs(l,e,m)),d=await M(`create page ${a}`,q(e),()=>p.newPage());let T=!1,k=new Set;await d.route("**/*",async S=>{let v=S.request();if(v.isNavigationRequest()&&v.frame()===d.mainFrame())try{let W=new URL(v.url()),X=new URL(g);if(W.hash="",X.hash="",W.href===X.href){if(T){r.warn(`Blocked same-page navigation/reload for ${a}`,{url:a,requestUrl:v.url()}),await S.abort("aborted");return}T=!0;}}catch{}await S.continue();}),d.on("response",S=>{try{let v=L(e,S.url(),e.sourceOrigin,r,"network-response");v&&A(e,v)&&(k.add(v.toString()),$(e,t,v.toString(),r,a));}catch{}}),r.page(`Rendering ${a}`,{url:a});let x=null,P=null;try{if(x=await d.goto(a,{waitUntil:"domcontentloaded",timeout:e.navigationTimeoutMs}),x&&x.ok())try{P=await M(`read response body ${a}`,q(e),()=>x.text());}catch{P=null;}}catch(S){r.warn(`Navigation issue for ${a}; saving current DOM if available`,{url:a,error:String(S)});}if(h){let S=x?.status()??null;if(S!==404){r.error(`Generated 404 request path returned unexpected status for ${a}`,{url:a,expectedStatus:404,status:S,requestPath:e.generated404RequestPath});continue}r.info(`Capturing rendered 404 page for ${a}`,{url:a,status:S,outputPath:H(e,a)});}else if(x&&!x.ok()){r.skip("page",a,x.status(),t.pageDiscoverySources.get(a)),await d.close();continue}m?(r.info(`Rendering without JS execution for ${a}`,{url:a,mode:"no-js"}),await M(`wait for rendered page ${a}`,q(e),()=>_s(e,d))):await M(`wait for rendered page ${a}`,q(e),()=>Ws(e,d)),t.stats.pagesRendered++;let y=await M(`extract rendered assets ${a}`,q(e),()=>Hs(e,d,g,r,!m));for(let S of y)$(e,t,S,r,a);let C=[...new Set([...y,...k])],R=P??await M(`capture rendered html ${a}`,q(e),()=>d.content()),D=s!=="single-url"&&!h?Es(e,a,R,r):[];if(s!=="single-url"&&!h)for(let S of D)ce(e,t,S,r,a);await Rt(e,a,R,t,r);let Q=H(e,a);if(N(u,e,Q),ae(u,Q),i.trackManifest){let S=x?.headers();i.manifest.pages[a]={url:a,outputPath:Q,contentType:Oe(S),changeToken:w.changeToken?.supported?w.changeToken.token:null,tokenSource:w.changeToken?.supported?w.changeToken.tokenSource??null:null,sitemapLastmod:oe(t.sitemapLastmodByPage[a])??null,discoveredPages:D,discoveredAssets:C,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!1},i.enabled&&await Y(e,i);}}catch(c){try{let g=d?await M(`capture partial html ${a}`,q(e),()=>d.content()):"";if(g&&g.trim()){await Rt(e,a,g,t,r);let h=H(e,a);if(N(u,e,h),ae(u,h),i.trackManifest){let m=i.manifest.pages[a]??i.previousManifest.pages[a];i.manifest.pages[a]={url:a,outputPath:h,contentType:m?.contentType??null,changeToken:null,tokenSource:null,sitemapLastmod:oe(t.sitemapLastmodByPage[a])??m?.sitemapLastmod??null,discoveredPages:m?.discoveredPages?[...m.discoveredPages]:[],discoveredAssets:m?.discoveredAssets?[...m.discoveredAssets]:[],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!1},i.enabled&&await Y(e,i);}r.warn(`Saved partial DOM for ${a}`,{url:a,error:String(c)});}}catch(g){r.error(`Could not save partial DOM for ${a}`,{url:a,error:String(g)});}r.error(`Failed page ${a}`,{url:a,error:String(c)});}finally{t.stats.pagesCompleted++,zs(t)&&Js(t,r),d&&await M(`close page ${a}`,Pe(e),()=>d.close()).catch(c=>{r.warn(`Timed out while closing page ${a}`,{url:a,browserPid:o.pid,error:String(c)});}),p&&await M(`close page context ${a}`,Pe(e),()=>p.close()).catch(c=>{r.warn(`Timed out while closing page context for ${a}`,{url:a,browserPid:o.pid,error:String(c)});});}}}finally{await M("close worker browser",Pe(e),()=>l.close()).catch(a=>(r.warn("Timed out while closing crawl worker browser",{browserPid:o.pid,error:String(a)}),Ns(l,r,"browser.close timeout")));}}async function Ys(e){try{let t=await b.readFile(e),s=(e.endsWith(".gz")?gunzipSync(t):t).toString("utf8").trim();if(!s)return [];try{let n=JSON.parse(s);if(Array.isArray(n))return n;if(n&&typeof n=="object")return [n]}catch{return s.split(/\r?\n/).map(n=>n.trim()).filter(Boolean).map(n=>{try{let i=JSON.parse(n);return i&&typeof i=="object"?i:null}catch{return null}}).filter(n=>n!==null)}return []}catch{return []}}function kt(e){let t=String(e||"").toLowerCase();return t.includes("timeout")||t.includes("timed out")||t.includes("navigation timeout")}function Ks(e){let t=String(e?.job?.command||"").trim(),r=String(e?.job?.crawlMode||"full").trim();return t!=="publish"&&t!=="crawl"?false:r!=="incremental"}function Xs(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 _t(e){try{let t=await b.readFile(e,"utf8"),r=JSON.parse(t);return r&&typeof r=="object"&&!Array.isArray(r)?r:null}catch{return null}}function xt(e){let t=String(e.originalFileName||"").toLowerCase();return t.endsWith("errors.jsonl")?0:t.endsWith("errors.json")?1:2}function en(e,t){let r=Array.isArray(t?.artifacts)?t.artifacts.filter(s=>String(s?.role||"").trim()==="errors"&&String(s?.storedFileName||"").trim()!=="").sort((s,n)=>xt(s)-xt(n)).map(s=>f.join(e,String(s.storedFileName))):[];return [...new Set([...r,f.join(e,"errors.jsonl"),f.join(e,"errors.json"),f.join(e,"errors.jsonl.gz"),f.join(e,"errors.json.gz")])]}async function Tt(e){let t=await _t(f.join(e,"job.json"));for(let r of en(e,t)){let s=await Ys(r);if(s.length>0)return s}return []}async function tn(e){let t=f.join(e.logDir,"archive"),r;try{r=await b.readdir(t);}catch{return ""}let s="",n=0;for(let i of r){let u=f.join(t,i);if(!(await b.stat(u).catch(()=>null))?.isDirectory())continue;let o=await _t(f.join(u,"job.json"));if(!Ks(o))continue;let a=Xs(o);a>=n&&(n=a,s=u);}return s}async function rn(e){let t=await tn(e),r=t!==""?await Tt(t):await Tt(e.logDir),s=new Set;for(let n of r)if(kt(n.error)||kt(n.message)){let i=n.url;typeof i=="string"&&i&&s.add(i);}return [...s]}async function sn(e){let t=[];for(let r of e)if(r.startsWith("@")){let s=r.slice(1),n=await b.readFile(s,"utf8");t.push(...n.split(/\r?\n/).map(i=>i.trim()).filter(i=>i&&!i.startsWith("#")));}else t.push(r);return t}async function nn(e){try{let t=await b.readFile(f.join(e.outputDir,"asset-map.json"),"utf8");return JSON.parse(t)}catch{return {}}}async function on(e){let t=["crawl.log.jsonl","current-crawl-event.json","rejected.jsonl","ignored.jsonl","skipped-http.jsonl","errors.jsonl","timings.jsonl","rejected.json","ignored.json","skipped-http.json","errors.json","timings.json"];await b.mkdir(e,{recursive:true}),await Promise.all(t.map(async r=>{try{await b.unlink(f.join(e,r));}catch(s){if(s.code!=="ENOENT")throw s}}));}function At(e,t,r,s,n){let i=L(e,r,e.sourceOrigin,s,"manual-url");i&&(pe(i)?_e(e,t,i.toString(),s,n):A(e,i)?$(e,t,i.toString(),s,n):G(i)?ce(e,t,i.toString(),s,n):s.reject("manual-url",i.toString(),"not page/sitemap/asset-like",n));}async function an(){let e=[],t=await xe(void 0,{onRemotePublisherConfigDiagnostic:P=>{e.push(P);}}),r=e.at(-1)??null,s=Qr(process.argv.slice(2));if(s.resumeRewrite&&s.mode!=="full")throw new Error("--resume-rewrite is only supported for full crawl/publish jobs.");let n=[];s.mode==="retry-timeouts"&&(n=await rn(t)),s.mode==="single-url"&&(n=await sn(s.urls));let i=s.crawlMode==="incremental"&&s.mode==="full",u=i&&typeof t.subscriptionType=="string"&&t.subscriptionType.trim()!=="",l=(s.mode==="full"||s.mode==="single-url")&&!s.resumeRewrite,o=s.mode!=="full"||s.resumeRewrite||u,a=o?await nn(t):{},p=u||s.mode==="single-url"?await Jr(t):$t(),d={enabled:u,trackManifest:l,manifest:Ee(p),previousManifest:Ee(p),runId:`${Date.now()}`,seenPages:new Set,changeTokenCache:new Map,manifestSaveChain:Promise.resolve()};await on(t.logDir);let c=new ie(t.logDir,t.logLevel);if(r){let P={status:r.status,virtualAssetBaseUrl:r.virtualAssetBaseUrl,subscriptionType:r.subscriptionType??null,error:r.error,requests:r.requests,source:"remote-publisher-config"};r.status==="loaded"&&r.subscriptionType?c.info("Loaded remote WP Suite publisher configuration.",P):c.warn("Remote WP Suite publisher configuration is unavailable or has no active subscription type.",P);}if(i&&!u){let P="Incremental crawl requires an active remote publisher subscription; refusing to fall back to a destructive full crawl.";throw c.error(P,{requestedMode:s.crawlMode,subscriptionType:t.subscriptionType??null,source:"incremental-subscription-guard"}),await c.flush(),new Error(P)}let g={pageQueue:[],queuedPages:new Set,donePages:new Set,pageDiscoverySources:new Map,assetQueue:[],queuedAssets:new Set,doneAssets:new Set,sitemapQueue:[],queuedSitemaps:new Set,doneSitemaps:new Set,sitemapLastmodByPage:{},assetMap:{...a},assetVariantDigestsByOriginalPath:new Map,stats:{pagesQueued:0,pagesRendered:0,pagesCompleted:0,assetsQueued:0,sitemapsQueued:0,assetsSaved:0,pagesSaved:0}},h=zr();if(await Ye(t),await Ke(t,{startedAt:new Date().toISOString(),outputDir:f.resolve(t.outputDir)}),o||await b.rm(t.outputDir,{recursive:true,force:true}),await b.mkdir(t.outputDir,{recursive:true}),s.resumeRewrite)c.info("Resuming final rewrite from existing output.",{phase:"rewrite-text",mode:s.mode,crawlMode:s.crawlMode});else {let P=await request.newContext({ignoreHTTPSErrors:t.ignoreHttpsErrors});try{if(c.mark("discovery"),s.mode==="full"?(t.sitemapPaths.forEach(C=>_e(t,g,C,c)),await Ct(t,P,g,c,h),t.seedPaths.forEach(C=>At(t,g,C,c,"seed-path")),t.generated404RequestPath&&ce(t,g,t.generated404RequestPath,c,"generated-404-request-path")):(n.forEach(C=>At(t,g,C,c,"cli")),await Ct(t,P,g,c,h)),c.endMark("discovery",{pages:g.pageQueue.length,assets:g.assetQueue.length,sitemaps:g.sitemapQueue.length}),c.summary(`Queued ${g.pageQueue.length} pages, ${g.assetQueue.length} assets, ${g.sitemapQueue.length} sitemaps.`,{mode:s.mode,crawlMode:s.crawlMode,queuedPages:g.pageQueue.length,queuedAssets:g.assetQueue.length,queuedSitemaps:g.sitemapQueue.length}),s.mode==="retry-timeouts"&&g.pageQueue.length===0&&g.assetQueue.length===0&&g.sitemapQueue.length===0){c.summary("No timed-out URLs were queued. Skipping retry crawl.",{mode:s.mode,crawlMode:s.crawlMode,queuedPages:0,queuedAssets:0,queuedSitemaps:0}),await c.flush();return}c.mark("render-pages");let y=Array.from({length:Math.max(1,t.concurrency)},()=>Zs(t,g,c,s.mode,P,d,h));if(await Promise.all(y),c.endMark("render-pages",{pages:g.stats.pagesCompleted}),c.mark("download-assets"),c.progress("Asset download phase started.",{phase:"download-assets",doneAssets:g.doneAssets.size,assetsQueued:g.stats.assetsQueued,assetQueue:g.assetQueue.length}),await Fs(t,P,g,c,d,h),c.endMark("download-assets",{assets:g.doneAssets.size}),d.enabled&&t.maxPages===0&&await rs(t,g,d,c,h),s.mode==="full"){let C=await Os(t,g,c);for(let R of C)N(h,t,R);}}finally{await M("dispose crawl request context",Pe(t),()=>P.dispose()).catch(y=>{c.warn("Timed out while disposing crawl request context",{error:String(y)});});}}d.trackManifest&&await Y(t,d),await b.writeFile(f.join(t.outputDir,"asset-map.json"),JSON.stringify(g.assetMap,null,2),"utf8"),JSON.stringify(a,null,2)!==JSON.stringify(g.assetMap,null,2)&&N(h,t,f.join(t.outputDir,"asset-map.json"));let m=s.mode==="single-url"?ds(t,g):d.enabled&&!s.resumeRewrite?ss(t,d,h,a,g.assetMap):void 0;c.mark("rewrite-text");let w=s.mode==="single-url"?`Rewriting text files touched by URL crawl: 0/${m?.length??0}`:"Rewriting text files...";c.progress(w,{phase:"rewrite-text",index:0,totalFiles:m?.length,changedTextFiles:0}),await yt(w);let T=Date.now(),k=await dt(t,g.assetMap,{files:m,previousAssetMap:a,onStart:({totalFiles:P,workerCount:y})=>{c.info(`Rewrite phase scanning ${P} text files.`,{phase:"rewrite-text",totalFiles:P,workerCount:y});},onProgress:async({index:P,totalFiles:y,changedTextFiles:C,file:R,changed:D})=>{D&&N(h,t,f.join(t.outputDir,R)),c.checkpoint(`Rewriting text file ${P}/${y}`,{phase:"rewrite-text",index:P,totalFiles:y,changedTextFiles:C,file:R}),c.debug(`${D?"Rewrote":"Checked unchanged"} text file ${P}/${y}: ${R}`,{phase:"rewrite-text",index:P,totalFiles:y,changedTextFiles:C,file:R,changed:D});let Q=Date.now();if(!(P===1||P===y||P%50===0||Q-T>=5e3))return;T=Q;let v=`Rewriting text files: ${P}/${y}`;c.progress(v,{phase:"rewrite-text",index:P,totalFiles:y,changedTextFiles:C,file:R}),await yt(v);}});d.trackManifest&&(ns(d,m),await Y(t,d)),c.endMark("rewrite-text",{changedTextFiles:k});let x=d.enabled&&!s.resumeRewrite?await os(t,g,d,h,c):[];await Ze(t,{generatedAt:new Date().toISOString(),outputDir:f.resolve(t.outputDir),runMode:s.mode,crawlMode:s.crawlMode,fullSyncRequired:!(d.enabled&&!s.resumeRewrite),changedFiles:d.enabled&&!s.resumeRewrite?[...h.changedFiles].sort():[],deletedFiles:d.enabled&&!s.resumeRewrite?x:[],rewriteTargets:d.enabled&&!s.resumeRewrite?[...new Set((m||[]).map(P=>te(t.outputDir,f.isAbsolute(P)?P:f.join(t.outputDir,P))).filter(P=>P!==null))].sort():[]}),await Xe(t),c.summary(s.resumeRewrite?`Done. Resumed final rewrite over existing output and changed ${k} text files.`:`Done. Rendered ${g.stats.pagesRendered} pages, processed ${g.doneSitemaps.size} sitemaps, downloaded ${g.doneAssets.size} assets.`,{mode:s.mode,crawlMode:s.crawlMode,resumeRewrite:s.resumeRewrite,...g.stats,pagesRendered:g.stats.pagesRendered,donePages:g.stats.pagesCompleted,claimedPages:g.donePages.size,doneSitemaps:g.doneSitemaps.size,doneAssets:g.doneAssets.size,changedTextFiles:k}),await c.flush();}an().catch(async e=>{console.error(e);try{let r=(await xe().catch(()=>null))?.logDir??"logs",s=new ie(r,"debug");s.error(`Unhandled error: ${e instanceof Error?e.message:String(e)}`,e instanceof Error?{stack:e.stack}:void 0),await s.flush();}catch{}process.exit(1);});
package/dist/deploy.js CHANGED
@@ -1,6 +1,6 @@
1
- import {S3Client,HeadObjectCommand,GetObjectCommand,DeleteObjectsCommand,ListObjectsV2Command}from'@aws-sdk/client-s3';import {Upload}from'@aws-sdk/lib-storage';import It,{createHash}from'crypto';import Ft from'fast-glob';import $ from'fs/promises';import w from'path';import ur from'mime-types';import lt from'http';import ut from'https';import {availableParallelism}from'os';import {Worker}from'worker_threads';function xe(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function ct(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 i=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 s=`/${n.join("/")}`;return i&&w.extname(s)===""&&(s+="/"),s==="/"?"":s}function le(e){return !e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).map(([t,r])=>[t.trim(),String(r??"")]).filter(([t])=>t.length>0))}function gt(e){if(!e||typeof e!="object")return {};let t={};for(let[r,i]of Object.entries(e)){let n=r.trim();if(!n||!i||typeof i!="object")continue;let s=i,o={};if(typeof s.targetOrigin=="string"){let a=xe(s.targetOrigin);a&&(o.targetOrigin=a);}let u=le(s.extraReplacements);if(Object.keys(u).length>0&&(o.extraReplacements=u),s.s3&&typeof s.s3=="object"){let a={},c=s.s3;typeof c.bucket=="string"&&(a.bucket=c.bucket.trim()),typeof c.prefix=="string"&&(a.prefix=c.prefix.trim()),typeof c.region=="string"&&(a.region=c.region.trim()),typeof c.htmlCacheControl=="string"&&(a.htmlCacheControl=c.htmlCacheControl.trim()),typeof c.assetCacheControl=="string"&&(a.assetCacheControl=c.assetCacheControl.trim()),Object.keys(a).length>0&&(o.s3=a);}if(s.cloudFront&&typeof s.cloudFront=="object"){let a={},c=s.cloudFront;typeof c.distributionId=="string"&&(a.distributionId=c.distributionId.trim()),Array.isArray(c.invalidationPaths)&&(a.invalidationPaths=c.invalidationPaths.map(l=>String(l??"").trim()).filter(l=>l.length>0)),Object.keys(a).length>0&&(o.cloudFront=a);}t[n]=o;}return t}function ce(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function pt(e,t){if(!e||typeof e!="object")return null;let r=e,i=r.command;if(i!=="publish"&&i!=="crawl"&&i!=="deploy"&&i!=="invalidate"&&i!=="retry-timeouts"&&i!=="url")return null;let n=Number.parseInt(String(r.intervalMinutes??"0"),10);if(!Number.isFinite(n)||n<1)return null;let s=String(r.id??`${i}-${t+1}`).trim();if(!s)return null;let o=String(r.deploymentProfile??"").trim(),u=String(r.url??"").trim();return {id:s,enabled:r.enabled!==false,command:i,intervalMinutes:n,...i==="publish"||i==="crawl"?{crawlMode:r.crawlMode==="incremental"?"incremental":"full"}:{},...(i==="publish"||i==="deploy"||i==="invalidate")&&o?{deploymentProfile:o}:{},...u?{url:u}:{}}}function De(e){let t=e&&typeof e=="object"?e:{},r=Array.isArray(t.rules)?t.rules.map((i,n)=>pt(i,n)).filter(i=>!!i):[];return {enabled:t.enabled===true,timezone:typeof t.timezone=="string"&&t.timezone.trim()!==""?t.timezone.trim():"UTC",rules:r}}function dt(e){if(!e||typeof e!="object")return;let t=e,r={};for(let n of ["accountId","siteId"]){let s=t[n];typeof s=="string"&&s.trim()!==""&&(r[n]=s.trim());}let i=Number(t.lastUpdate??0);return Number.isFinite(i)&&i>0&&(r.lastUpdate=Math.floor(i)),t.subscriber===true&&(r.subscriber=true),Object.keys(r).length>0?r:void 0}function ge(e){let t=e&&typeof e=="object"?e:{},r=String(t.accountId??"").trim(),i=String(t.siteId??"").trim(),n=t.subscriber===true,s=dt(t.siteSettings),o={...s??{},...r?{accountId:s?.accountId??r}:{},...i?{siteId:s?.siteId??i}:{},...s?.subscriber===true||n?{subscriber:true}:{}},u={},a=String(t.apiBase??"").trim();a&&(u.apiBase=a);let c=String(t.runtimeToken??t.nonce??"").trim();c&&(u.runtimeToken=c);let l=String(t.virtualAssetBaseUrl??t.uploadUrl??"").trim();l&&(u.virtualAssetBaseUrl=l),Object.keys(o).length>0&&(u.siteSettings=o);let p=ce(t.subscriptionType);return p&&(u.subscriptionType=p),u}function ft(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function Te(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function mt(e,t){let r=new Headers(e instanceof Request?e.headers:void 0);if(t?.headers)for(let[i,n]of new Headers(t.headers).entries())r.set(i,n);return r}async function Ce(e,t,r=5){let i=new URL(Te(e)),n=String(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase(),s=i.protocol==="http:"?lt:ut,o=mt(e,t);return await new Promise((u,a)=>{let c=s.request(i,{method:n,headers:Object.fromEntries(o.entries()),...i.protocol==="https:"?{rejectUnauthorized:false}:{}},l=>{let p=[];l.on("data",g=>{p.push(Buffer.isBuffer(g)?g:Buffer.from(g));}),l.on("error",a),l.on("end",()=>{let g=l.statusCode??0,f=l.headers.location;if(r>0&&f&&[301,302,303,307,308].includes(g)){u(Ce(new URL(f,i),{method:g===303?"GET":n},r-1));return}let m=new Headers;for(let[b,P]of Object.entries(l.headers))Array.isArray(P)?m.set(b,P.join(", ")):typeof P=="string"&&m.set(b,P);u(new Response(Buffer.concat(p),{status:g,statusText:l.statusMessage??"",headers:m}));});});c.on("error",a),c.end();})}function ht(e){let t=ge(e.wpsuite),r={...t.siteSettings??{},...t.siteSettings?.subscriber===true||t.subscriptionType==="PROFESSIONAL"||t.subscriptionType==="AGENCY"?{subscriber:true}:{}},i=String(r.accountId??"").trim(),n=String(r.siteId??"").trim(),s=String(t.virtualAssetBaseUrl??t.uploadUrl??"").trim();if(e.wpsuite={...t.apiBase?{apiBase:t.apiBase}:{},...t.runtimeToken?{runtimeToken:t.runtimeToken}:{},...s?{virtualAssetBaseUrl:s}:{},...Object.keys(r).length>0?{siteSettings:r}:{},...t.subscriptionType?{subscriptionType:t.subscriptionType}:{}},!i||!n||!s)return false;ft(e.sourceOrigin);let o=globalThis,a={...o.WpSuite??{},siteSettings:r,uploadUrl:s};return t.apiBase&&(a.apiBase=t.apiBase),o.WpSuite=a,true}async function yt(e){let t=String(e.wpsuite?.virtualAssetBaseUrl??e.wpsuite?.uploadUrl??"").trim();if(!ht(e)){let n=e.wpsuite?.siteSettings,s=[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): ${s.join(", ")}.`,requests:[]}}}let r=globalThis.fetch,i=[];try{typeof r=="function"&&/^https?:\/\//i.test(t)&&(globalThis.fetch=(async(a,c)=>{let l=Te(a);if(l.startsWith(t)){let p=(()=>{try{return new URL(l).pathname}catch{return l}})();try{let g=e.ignoreHttpsErrors&&l.startsWith("https://")?await Ce(a,c):await r(a,c);return i.push({path:p,status:g.status,ok:g.ok,error:null}),g}catch(g){throw i.push({path:p,status:null,ok:!1,error:g instanceof Error?g.message:String(g)}),g}}return r(a,c)}));let{getConfig:n}=await import('@smart-cloud/wpsuite-core'),s=await n("publisher"),o=s&&typeof s=="object"?s:null,u=ce(o?.subscriptionType);return {remote:o,diagnostic:{status:o?"loaded":"unavailable",virtualAssetBaseUrl:t,subscriptionType:u??null,error:o?null:"WP Suite publisher config loader returned no configuration.",requests:i}}}catch(n){return {remote:null,diagnostic:{status:"unavailable",virtualAssetBaseUrl:t,subscriptionType:null,error:n instanceof Error?n.message:String(n),requests:i}}}finally{typeof r=="function"&&(globalThis.fetch=r);}}function wt(e,t){let r=gt(t?.deploymentProfiles),i=String(t?.defaultDeploymentProfile??"").trim(),n=r[i]?i:"",s=ce(t?.subscriptionType),o=ge(e.wpsuite);return {...e,scheduler:De(t?.scheduler),deploymentProfiles:r,defaultDeploymentProfile:n,...s?{subscriptionType:s}:{},wpsuite:{...o,...o.siteSettings||s?{siteSettings:{...o.siteSettings??{},...o.siteSettings?.subscriber===true||s==="PROFESSIONAL"||s==="AGENCY"?{subscriber:true}:{}}}:{},...s?{subscriptionType:s}:{}}}}function ue(e,t){let i=String(e||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!i)return t;let n=i.split("/").map(s=>s.trim()).filter(s=>s.length>0&&s!=="."&&s!=="..");return n.length>0?n.join("/"):t}function bt(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?w.resolve(e):""}function $e(e,t,r){let i=String(t||"").trim();return i&&w.isAbsolute(i)?w.resolve(i):w.resolve(e,ue(i,r))}async function pe(e,t={}){let r=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",i=await $.readFile(r,"utf8"),n=JSON.parse(i);n.sourceOrigin=n.sourceOrigin.replace(/\/$/,""),n.targetOrigin=xe(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=ct(n.generated404RequestPath),n.sitemapPaths||=["/sitemap_index.xml","/sitemap.xml"],n.allowedAssetHosts||=[],n.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],n.blockedPathPrefixes||=[],n.blockedSearchFragments||=[],n.concurrency||=1,n.maxPages||=0,n.extraReplacements=le(n.extraReplacements),n.postCrawlCopyMap=le(n.postCrawlCopyMap),n.logDir=String(n.logDir||"logs").trim()||"logs",n.verbose??=false,n.logLevel||=n.verbose?"debug":"info",n.s3SyncMode||="sdk-upload-delete",n.readiness||={waitForSelector:null,waitForFunction:null,timeoutMs:1500,fallbackWaitMs:1500},n.readiness.timeoutMs??=1500,n.readiness.fallbackWaitMs??=1500,n.viewport||={width:1440,height:1200},n.navigationTimeoutMs||=3e4,n.assetDownloadConcurrency=Number(n.assetDownloadConcurrency)>0?Number(n.assetDownloadConcurrency):n.concurrency,n.rewriteConcurrency=Number(n.rewriteConcurrency)>0?Number(n.rewriteConcurrency):n.assetDownloadConcurrency,n.wpsuite=ge(n.wpsuite),n.scheduler=De(void 0),n.deploymentProfiles={},n.defaultDeploymentProfile="",n.deploymentTargetOverride=String(n.deploymentTargetOverride??"").trim();let s=await yt(n);t.onRemotePublisherConfigDiagnostic?.(s.diagnostic);let o=wt(n,s.remote),u=bt(),a=u?w.resolve(u,".."):"";return a?(o.outputDir=$e(a,o.outputDir,"export"),o.logDir=$e(a,o.logDir,"logs")):(w.isAbsolute(o.outputDir)||(o.outputDir=ue(o.outputDir,"export")),w.isAbsolute(o.logDir)||(o.logDir=ue(o.logDir,"logs"))),o}function Pt(e){let t=e/6e4;if(Number.isInteger(t)&&t>=1)return `${t} minute${t===1?"":"s"}`;let r=Math.ceil(e/1e3);return `${r} second${r===1?"":"s"}`}async function L(e,t,r){let i=new AbortController,n=globalThis.setTimeout(()=>{i.abort(new Error(`${e} timed out after ${Pt(t)}.`));},t);try{return await r({abortController:i,httpOptions:{abortSignal:i.signal,requestTimeout:t}})}finally{globalThis.clearTimeout(n);}}var St=".deploy-plan.json",vt="deploy-plan.json";function Rt(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?w.resolve(e):""}function $t(e){let t=String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").trim();return !t||t==="."||t.startsWith("../")||t===".."?null:t}function de(e){return [...new Set(e.map($t).filter(t=>t!==null))]}function xt(e,t){return {schemaVersion:1,generatedAt:String(t.generatedAt||new Date().toISOString()),outputDir:w.resolve(e.outputDir),runMode:t.runMode,crawlMode:t.crawlMode,fullSyncRequired:!!t.fullSyncRequired,changedFiles:de(t.changedFiles||[]),deletedFiles:de(t.deletedFiles||[]),rewriteTargets:de(t.rewriteTargets||[])}}function Dt(e){if(!e||typeof e!="object")return false;let t=e;return t.schemaVersion===1&&typeof t.generatedAt=="string"&&typeof t.outputDir=="string"&&(t.runMode==="full"||t.runMode==="retry-timeouts"||t.runMode==="single-url")&&(t.crawlMode==="full"||t.crawlMode==="incremental")&&typeof t.fullSyncRequired=="boolean"&&Array.isArray(t.changedFiles)&&Array.isArray(t.deletedFiles)&&Array.isArray(t.rewriteTargets)}function Me(e){let t=w.join(w.resolve(e.outputDir),St),r=Rt();return r?[w.join(r,vt),t]:[t]}async function ke(e){let t=w.resolve(e.outputDir);for(let r of Me(e))try{let i=await $.readFile(r,"utf8"),n=JSON.parse(i);if(!Dt(n)||w.resolve(n.outputDir)!==t)continue;return xt(e,n)}catch{}return null}async function Le(e){for(let t of Me(e))try{await $.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}function Tt(e){return typeof e.subscriptionType=="string"&&e.subscriptionType.trim()!==""}function Ie(e){let t="";for(let i=0;i<e.length;i++){let n=e[i];if(n==="--profile"){let s=(e[i+1]||"").trim();if(!s)throw new Error("Missing value for --profile.");t=s,i+=1;}else if(n.startsWith("--profile=")){let s=n.slice(10).trim();if(!s)throw new Error("Missing value for --profile.");t=s;}}let r=String(process.env.PUBLISHER_DEPLOY_PROFILE||process.env.PUBLISHER_DEPLOYMENT_PROFILE||"").trim();return t||r||null}function Ct(e,t){return {...e,...t??{}}}function Et(e,t){return {...e,...t??{},invalidationPaths:[...(t?.invalidationPaths??e.invalidationPaths)||[]]}}function Oe(e,t){let r=String(t??e.deploymentTargetOverride??"").trim();if(!Tt(e)){if(r)throw new Error(`Deployment target "${r}" requires an active WPSuite subscription and remote publisher config.`);return {name:null,profile:null,config:e}}let i=String(r||e.defaultDeploymentProfile||"").trim();if(!i)return {name:null,profile:null,config:e};let n=e.deploymentProfiles?.[i];if(!n)throw new Error(`Unknown deployment profile "${i}". Check the linked WPSuite publisher configuration.`);return {name:i,profile:n,config:{...e,targetOrigin:n.targetOrigin??e.targetOrigin,s3:Ct(e.s3,n.s3),cloudFront:Et(e.cloudFront,n.cloudFront)}}}var je={error:0,warn:1,info:2,debug:3},Fe=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",Y=Fe?w.join(Fe,"current-progress.json"):"",Ae=Promise.resolve();function _e(e){return e.includes("crawl")?"crawl":e.includes("deploy")?"deploy":e.includes("invalidate")?"invalidate":e}function Mt(e,t){let r={...e},i=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,s]of Object.entries(t)){let o=r[n];if(typeof o=="number"&&typeof s=="number"&&i.has(n)){r[n]=Math.max(o,s);continue}r[n]=s;}return r}function kt(e,t,r){Y&&(Ae=Ae.then(async()=>{let i=new Date,n=i.toISOString();await $.mkdir(w.dirname(Y),{recursive:true});let s=await $.readFile(Y,"utf8").then(b=>JSON.parse(b)).catch(()=>null),o=s&&typeof s.details=="object"&&s.details?s.details:{},u=_e(e),a=s?.currentStep||_e(s?.source||""),c=s?.startedAt||n,l={...s?.stepDurationsSec??{}},p=s?.stepStartedAt||n;if(a&&a!==u&&s?.stepStartedAt){let b=Math.max(0,Math.round((i.getTime()-new Date(s.stepStartedAt).getTime())/1e3));l[a]=(l[a]??0)+b,p=n;}let g=Math.max(0,Math.round((i.getTime()-new Date(p).getTime())/1e3)),f=Math.max(0,Math.round((i.getTime()-new Date(c).getTime())/1e3)),m={checkedAt:n,source:e,message:t,details:Mt(o,r??{}),startedAt:c,currentStep:u,stepStartedAt:p,stepElapsedSec:g,totalElapsedSec:f,stepDurationsSec:l};await $.writeFile(Y,JSON.stringify(m,null,2),"utf8");}).catch(()=>{}));}async function Lt(e,t){await $.mkdir(w.dirname(e),{recursive:true}),await $.appendFile(e,`${JSON.stringify(t)}
2
- `,"utf8");}var K=class{constructor(t,r,i="info"){this.logDir=t;this.logFile=r;this.level=i;this.ensureLogFileReady();}logDir;logFile;level;startedAt=Date.now();marks=new Map;initPromise=null;writeQueue=Promise.resolve();writeError=null;get logPath(){return w.join(this.logDir,this.logFile)}artifactPath(t){return this.logFile.endsWith(".log.jsonl")?w.join(this.logDir,this.logFile.replace(/\.log\.jsonl$/u,`${t}.jsonl`)):w.join(this.logDir,`${this.logFile}${t}.jsonl`)}get errorsPath(){return this.artifactPath(".errors")}get rejectedPath(){return this.artifactPath(".rejected")}ensureLogFileReady(){return this.initPromise||(this.initPromise=(async()=>{await $.mkdir(this.logDir,{recursive:true}),await $.writeFile(this.logPath,"","utf8");})()),this.initPromise}enqueueTask(t){this.writeQueue=this.writeQueue.then(t).catch(r=>{this.writeError=r instanceof Error?r:new Error(String(r));});}enqueueLine(t){this.enqueueTask(async()=>{await this.ensureLogFileReady(),await $.appendFile(this.logPath,`${t}
3
- `,"utf8");});}enqueueJsonLine(t,r){this.enqueueTask(()=>Lt(t,r));}accepts(t){return je[t]<=je[this.level]}push(t,r,i){if(!this.accepts(t))return;let n=JSON.stringify({time:new Date().toISOString(),level:t,message:r,...i||{}});this.enqueueLine(n),t==="error"?console.error(`[ERROR] ${r}`,i?JSON.stringify(i):""):t==="warn"?console.warn(`[WARN] ${r}`,i?JSON.stringify(i):""):console.log(`[${t.toUpperCase().padEnd(5)}] ${r}`);}info(t,r){this.push("info",t,r);}progress(t,r){kt(this.logFile,t,r);}debug(t,r){this.push("debug",t,r);}warn(t,r){this.push("warn",t,r);}reject(t,r,i,n,s){let o={kind:t,url:r,reason:i,...n?{source:n}:{},...s||{}};this.enqueueJsonLine(this.rejectedPath,o),this.accepts("debug")&&this.push("debug",`Rejected ${t} ${r}: ${i}`,o);}error(t,r){this.enqueueJsonLine(this.errorsPath,{message:t,...r||{}}),this.push("error",t,r);}mark(t){this.marks.set(t,Date.now());}endMark(t,r){let i=this.marks.get(t);if(!i)return;let n=Date.now()-i,s=Number((n/1e3).toFixed(2));this.push("info",`Timing ${t}: ${s}s`,{name:t,ms:n,seconds:s,...r||{}});}async flush(){let t=Date.now()-this.startedAt,r=Number((t/1e3).toFixed(2));if(this.push("info",`Total time: ${r}s`,{name:"total",ms:t,seconds:r}),await this.writeQueue,this.writeError)throw this.writeError}};async function Ot(e){await $.mkdir(w.dirname(e),{recursive:true});}async function We(e,t,r){await Ot(e);let i=w.join(w.dirname(e),`.${w.basename(e)}.${process.pid}.${Date.now()}.${It.randomBytes(6).toString("hex")}.tmp`);try{typeof t=="string"?await $.writeFile(i,t,r??"utf8"):await $.writeFile(i,t),await $.rename(i,e);}catch(n){throw await $.unlink(i).catch(()=>{}),n}}function ze(e){return [".html",".htm",".css",".js",".mjs",".json",".xml",".xsl",".txt",".svg",".map",".enc",".jws"].includes(w.extname(e).toLowerCase())}function Be(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 W(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function Z(e){return e.replace(/\//g,"\\/")}function Ue(e){return e.replace(/\//g,"\\\\/")}function jt(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 Ne(e,t,r){if(!t)return;e[t]=r;let i=Z(t),n=Z(r);e[i]=n;let s=Ue(t),o=Ue(r);e[s]=o;let u=W(t),a=W(r);e[u]=a;let c=W(i),l=W(n);e[c]=l;let p=W(s),g=W(o);e[p]=g;}function X(e,t,r){Ne(e,t,r);let i=jt(t);i&&i!==t&&Ne(e,i,r);}function qe(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function He(e,t,r){if(!t)return r;let i=w.dirname(w.resolve(t)),n=w.resolve(e,r.replace(/^\/+/,"")),s=w.relative(i,n).replace(/\\/g,"/");return s?(s.startsWith(".")||(s=`./${s}`),s):"."}var Nt=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],Wt=new Set([".html",".htm"]),Je="WPSuite.io Static Publisher",zt=Je.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function Bt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function qt(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function Ht(e,t,r){return qt(t)?e.replace(new RegExp(`(?<!:)${Bt(t)}`,"g"),r):e.split(t).join(r)}function Jt(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 Wt.has(n)?/<head\b|<html\b|<!doctype html/i.test(t):false}function Kt(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${zt}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${Je}" />`;if(e.match(/(\r?\n)([ \t]*)<\/head>/i))return e.replace(/(\r?\n)([ \t]*)<\/head>/i,`$1$2${t}$1$2</head>`);let i=e.includes(`\r
1
+ import {S3Client,HeadObjectCommand,GetObjectCommand,DeleteObjectsCommand,ListObjectsV2Command}from'@aws-sdk/client-s3';import {Upload}from'@aws-sdk/lib-storage';import _t,{createHash}from'crypto';import Wt from'fast-glob';import D from'fs/promises';import b from'path';import fr from'mime-types';import gt from'http';import pt from'https';import {availableParallelism}from'os';import {Worker}from'worker_threads';function Te(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function dt(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 i=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 s=`/${n.join("/")}`;return i&&b.extname(s)===""&&(s+="/"),s==="/"?"":s}function ue(e){return !e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).map(([t,r])=>[t.trim(),String(r??"")]).filter(([t])=>t.length>0))}function ft(e){if(!e||typeof e!="object")return {};let t={};for(let[r,i]of Object.entries(e)){let n=r.trim();if(!n||!i||typeof i!="object")continue;let s=i,o={};if(typeof s.targetOrigin=="string"){let a=Te(s.targetOrigin);a&&(o.targetOrigin=a);}let l=ue(s.extraReplacements);if(Object.keys(l).length>0&&(o.extraReplacements=l),s.s3&&typeof s.s3=="object"){let a={},u=s.s3;typeof u.bucket=="string"&&(a.bucket=u.bucket.trim()),typeof u.prefix=="string"&&(a.prefix=u.prefix.trim()),typeof u.region=="string"&&(a.region=u.region.trim()),typeof u.htmlCacheControl=="string"&&(a.htmlCacheControl=u.htmlCacheControl.trim()),typeof u.assetCacheControl=="string"&&(a.assetCacheControl=u.assetCacheControl.trim()),Object.keys(a).length>0&&(o.s3=a);}if(s.cloudFront&&typeof s.cloudFront=="object"){let a={},u=s.cloudFront;typeof u.distributionId=="string"&&(a.distributionId=u.distributionId.trim()),Array.isArray(u.invalidationPaths)&&(a.invalidationPaths=u.invalidationPaths.map(c=>String(c??"").trim()).filter(c=>c.length>0)),Object.keys(a).length>0&&(o.cloudFront=a);}t[n]=o;}return t}function ge(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function mt(e,t){if(!e||typeof e!="object")return null;let r=e,i=r.command;if(i!=="publish"&&i!=="crawl"&&i!=="deploy"&&i!=="invalidate"&&i!=="retry-timeouts"&&i!=="url")return null;let n=Number.parseInt(String(r.intervalMinutes??"0"),10);if(!Number.isFinite(n)||n<1)return null;let s=String(r.id??`${i}-${t+1}`).trim();if(!s)return null;let o=String(r.deploymentProfile??"").trim(),l=String(r.url??"").trim();return {id:s,enabled:r.enabled!==false,command:i,intervalMinutes:n,...i==="publish"||i==="crawl"?{crawlMode:r.crawlMode==="incremental"?"incremental":"full"}:{},...(i==="publish"||i==="deploy"||i==="invalidate")&&o?{deploymentProfile:o}:{},...l?{url:l}:{}}}function Ce(e){let t=e&&typeof e=="object"?e:{},r=Array.isArray(t.rules)?t.rules.map((i,n)=>mt(i,n)).filter(i=>!!i):[];return {enabled:t.enabled===true,timezone:typeof t.timezone=="string"&&t.timezone.trim()!==""?t.timezone.trim():"UTC",rules:r}}function ht(e){if(!e||typeof e!="object")return;let t=e,r={};for(let n of ["accountId","siteId"]){let s=t[n];typeof s=="string"&&s.trim()!==""&&(r[n]=s.trim());}let i=Number(t.lastUpdate??0);return Number.isFinite(i)&&i>0&&(r.lastUpdate=Math.floor(i)),t.subscriber===true&&(r.subscriber=true),Object.keys(r).length>0?r:void 0}function pe(e){let t=e&&typeof e=="object"?e:{},r=String(t.accountId??"").trim(),i=String(t.siteId??"").trim(),n=t.subscriber===true,s=ht(t.siteSettings),o={...s??{},...r?{accountId:s?.accountId??r}:{},...i?{siteId:s?.siteId??i}:{},...s?.subscriber===true||n?{subscriber:true}:{}},l={},a=String(t.apiBase??"").trim();a&&(l.apiBase=a);let u=String(t.runtimeToken??t.nonce??"").trim();u&&(l.runtimeToken=u);let c=String(t.virtualAssetBaseUrl??t.uploadUrl??"").trim();c&&(l.virtualAssetBaseUrl=c),Object.keys(o).length>0&&(l.siteSettings=o);let p=ge(t.subscriptionType);return p&&(l.subscriptionType=p),l}function wt(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function Ee(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function yt(e,t){let r=new Headers(e instanceof Request?e.headers:void 0);if(t?.headers)for(let[i,n]of new Headers(t.headers).entries())r.set(i,n);return r}async function Me(e,t,r=5){let i=new URL(Ee(e)),n=String(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase(),s=i.protocol==="http:"?gt:pt,o=yt(e,t);return await new Promise((l,a)=>{let u=s.request(i,{method:n,headers:Object.fromEntries(o.entries()),...i.protocol==="https:"?{rejectUnauthorized:false}:{}},c=>{let p=[];c.on("data",g=>{p.push(Buffer.isBuffer(g)?g:Buffer.from(g));}),c.on("error",a),c.on("end",()=>{let g=c.statusCode??0,d=c.headers.location;if(r>0&&d&&[301,302,303,307,308].includes(g)){l(Me(new URL(d,i),{method:g===303?"GET":n},r-1));return}let w=new Headers;for(let[y,v]of Object.entries(c.headers))Array.isArray(v)?w.set(y,v.join(", ")):typeof v=="string"&&w.set(y,v);l(new Response(Buffer.concat(p),{status:g,statusText:c.statusMessage??"",headers:w}));});});u.on("error",a),u.end();})}function bt(e){let t=pe(e.wpsuite),r={...t.siteSettings??{},...t.siteSettings?.subscriber===true||t.subscriptionType==="PROFESSIONAL"||t.subscriptionType==="AGENCY"?{subscriber:true}:{}},i=String(r.accountId??"").trim(),n=String(r.siteId??"").trim(),s=String(t.virtualAssetBaseUrl??t.uploadUrl??"").trim();if(e.wpsuite={...t.apiBase?{apiBase:t.apiBase}:{},...t.runtimeToken?{runtimeToken:t.runtimeToken}:{},...s?{virtualAssetBaseUrl:s}:{},...Object.keys(r).length>0?{siteSettings:r}:{},...t.subscriptionType?{subscriptionType:t.subscriptionType}:{}},!i||!n||!s)return false;wt(e.sourceOrigin);let o=globalThis,a={...o.WpSuite??{},siteSettings:r,uploadUrl:s};return t.apiBase&&(a.apiBase=t.apiBase),o.WpSuite=a,true}async function Pt(e){let t=String(e.wpsuite?.virtualAssetBaseUrl??e.wpsuite?.uploadUrl??"").trim();if(!bt(e)){let n=e.wpsuite?.siteSettings,s=[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): ${s.join(", ")}.`,requests:[]}}}let r=globalThis.fetch,i=[];try{typeof r=="function"&&/^https?:\/\//i.test(t)&&(globalThis.fetch=(async(a,u)=>{let c=Ee(a);if(c.startsWith(t)){let p=(()=>{try{return new URL(c).pathname}catch{return c}})();try{let g=e.ignoreHttpsErrors&&c.startsWith("https://")?await Me(a,u):await r(a,u);return i.push({path:p,status:g.status,ok:g.ok,error:null}),g}catch(g){throw i.push({path:p,status:null,ok:!1,error:g instanceof Error?g.message:String(g)}),g}}return r(a,u)}));let{getConfig:n}=await import('@smart-cloud/wpsuite-core'),s=await n("publisher"),o=s&&typeof s=="object"?s:null,l=ge(o?.subscriptionType);return {remote:o,diagnostic:{status:o?"loaded":"unavailable",virtualAssetBaseUrl:t,subscriptionType:l??null,error:o?null:"WP Suite publisher config loader returned no configuration.",requests:i}}}catch(n){return {remote:null,diagnostic:{status:"unavailable",virtualAssetBaseUrl:t,subscriptionType:null,error:n instanceof Error?n.message:String(n),requests:i}}}finally{typeof r=="function"&&(globalThis.fetch=r);}}function St(e,t){let r=ft(t?.deploymentProfiles),i=String(t?.defaultDeploymentProfile??"").trim(),n=r[i]?i:"",s=ge(t?.subscriptionType),o=pe(e.wpsuite);return {...e,scheduler:Ce(t?.scheduler),deploymentProfiles:r,defaultDeploymentProfile:n,...s?{subscriptionType:s}:{},wpsuite:{...o,...o.siteSettings||s?{siteSettings:{...o.siteSettings??{},...o.siteSettings?.subscriber===true||s==="PROFESSIONAL"||s==="AGENCY"?{subscriber:true}:{}}}:{},...s?{subscriptionType:s}:{}}}}function ce(e,t){let i=String(e||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!i)return t;let n=i.split("/").map(s=>s.trim()).filter(s=>s.length>0&&s!=="."&&s!=="..");return n.length>0?n.join("/"):t}function vt(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?b.resolve(e):""}function xe(e,t,r){let i=String(t||"").trim();return i&&b.isAbsolute(i)?b.resolve(i):b.resolve(e,ce(i,r))}async function de(e,t={}){let r=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",i=await D.readFile(r,"utf8"),n=JSON.parse(i);n.sourceOrigin=n.sourceOrigin.replace(/\/$/,""),n.targetOrigin=Te(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=dt(n.generated404RequestPath),n.sitemapPaths||=["/sitemap_index.xml","/sitemap.xml"],n.allowedAssetHosts||=[],n.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],n.blockedPathPrefixes||=[],n.blockedSearchFragments||=[],n.concurrency||=1,n.maxPages||=0,n.extraReplacements=ue(n.extraReplacements),n.postCrawlCopyMap=ue(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=pe(n.wpsuite),n.scheduler=Ce(void 0),n.deploymentProfiles={},n.defaultDeploymentProfile="",n.deploymentTargetOverride=String(n.deploymentTargetOverride??"").trim();let s=await Pt(n);t.onRemotePublisherConfigDiagnostic?.(s.diagnostic);let o=St(n,s.remote),l=vt(),a=l?b.resolve(l,".."):"";return a?(o.outputDir=xe(a,o.outputDir,"export"),o.logDir=xe(a,o.logDir,"logs")):(b.isAbsolute(o.outputDir)||(o.outputDir=ce(o.outputDir,"export")),b.isAbsolute(o.logDir)||(o.logDir=ce(o.logDir,"logs"))),o}function Rt(e){let t=e/6e4;if(Number.isInteger(t)&&t>=1)return `${t} minute${t===1?"":"s"}`;let r=Math.ceil(e/1e3);return `${r} second${r===1?"":"s"}`}async function j(e,t,r){let i=new AbortController,n=globalThis.setTimeout(()=>{i.abort(new Error(`${e} timed out after ${Rt(t)}.`));},t);try{return await r({abortController:i,httpOptions:{abortSignal:i.signal,requestTimeout:t}})}finally{globalThis.clearTimeout(n);}}var $t=".deploy-plan.json",Dt="deploy-plan.json",xt=".crawl-incomplete.json",Tt="crawl-incomplete.json";function ke(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?b.resolve(e):""}function Ct(e){let t=String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").trim();return !t||t==="."||t.startsWith("../")||t===".."?null:t}function fe(e){return [...new Set(e.map(Ct).filter(t=>t!==null))]}function Et(e,t){return {schemaVersion:1,generatedAt:String(t.generatedAt||new Date().toISOString()),outputDir:b.resolve(e.outputDir),runMode:t.runMode,crawlMode:t.crawlMode,fullSyncRequired:!!t.fullSyncRequired,changedFiles:fe(t.changedFiles||[]),deletedFiles:fe(t.deletedFiles||[]),rewriteTargets:fe(t.rewriteTargets||[])}}function Mt(e){if(!e||typeof e!="object")return false;let t=e;return t.schemaVersion===1&&typeof t.generatedAt=="string"&&typeof t.outputDir=="string"&&(t.runMode==="full"||t.runMode==="retry-timeouts"||t.runMode==="single-url")&&(t.crawlMode==="full"||t.crawlMode==="incremental")&&typeof t.fullSyncRequired=="boolean"&&Array.isArray(t.changedFiles)&&Array.isArray(t.deletedFiles)&&Array.isArray(t.rewriteTargets)}function Ie(e){let t=b.join(b.resolve(e.outputDir),$t),r=ke();return r?[b.join(r,Dt),t]:[t]}function kt(e){let t=b.join(b.resolve(e.outputDir),xt),r=ke();return r?[b.join(r,Tt),t]:[t]}async function Le(e){let t=b.resolve(e.outputDir);for(let r of Ie(e))try{let i=await D.readFile(r,"utf8"),n=JSON.parse(i);if(!Mt(n)||b.resolve(n.outputDir)!==t)continue;return Et(e,n)}catch{}return null}async function Oe(e){for(let t of Ie(e))try{await D.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}async function je(e){let t=b.resolve(e.outputDir);for(let r of kt(e)){let i;try{i=await D.readFile(r,"utf8");}catch(s){if(s.code==="ENOENT")continue;throw s}let n;try{n=JSON.parse(i);}catch{throw new Error(`Invalid incomplete crawl marker: ${r}`)}if(n.schemaVersion!==1||typeof n.startedAt!="string"||typeof n.outputDir!="string"||b.resolve(n.outputDir)!==t)throw new Error(`Invalid incomplete crawl marker: ${r}`);return {schemaVersion:1,startedAt:n.startedAt,outputDir:t}}return null}function It(e){return typeof e.subscriptionType=="string"&&e.subscriptionType.trim()!==""}function Ae(e){let t="";for(let i=0;i<e.length;i++){let n=e[i];if(n==="--profile"){let s=(e[i+1]||"").trim();if(!s)throw new Error("Missing value for --profile.");t=s,i+=1;}else if(n.startsWith("--profile=")){let s=n.slice(10).trim();if(!s)throw new Error("Missing value for --profile.");t=s;}}let r=String(process.env.PUBLISHER_DEPLOY_PROFILE||process.env.PUBLISHER_DEPLOYMENT_PROFILE||"").trim();return t||r||null}function Lt(e,t){return {...e,...t??{}}}function Ot(e,t){return {...e,...t??{},invalidationPaths:[...(t?.invalidationPaths??e.invalidationPaths)||[]]}}function Fe(e,t){let r=String(t??e.deploymentTargetOverride??"").trim();if(!It(e)){if(r)throw new Error(`Deployment target "${r}" requires an active WPSuite subscription and remote publisher config.`);return {name:null,profile:null,config:e}}let i=String(r||e.defaultDeploymentProfile||"").trim();if(!i)return {name:null,profile:null,config:e};let n=e.deploymentProfiles?.[i];if(!n)throw new Error(`Unknown deployment profile "${i}". Check the linked WPSuite publisher configuration.`);return {name:i,profile:n,config:{...e,targetOrigin:n.targetOrigin??e.targetOrigin,s3:Lt(e.s3,n.s3),cloudFront:Ot(e.cloudFront,n.cloudFront)}}}var _e={error:0,warn:1,info:2,debug:3},Ue=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",Z=Ue?b.join(Ue,"current-progress.json"):"",Ne=Promise.resolve();function We(e){return e.includes("crawl")?"crawl":e.includes("deploy")?"deploy":e.includes("invalidate")?"invalidate":e}function jt(e,t){let r={...e},i=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,s]of Object.entries(t)){let o=r[n];if(typeof o=="number"&&typeof s=="number"&&i.has(n)){r[n]=Math.max(o,s);continue}r[n]=s;}return r}function At(e,t,r){Z&&(Ne=Ne.then(async()=>{let i=new Date,n=i.toISOString();await D.mkdir(b.dirname(Z),{recursive:true});let s=await D.readFile(Z,"utf8").then(y=>JSON.parse(y)).catch(()=>null),o=s&&typeof s.details=="object"&&s.details?s.details:{},l=We(e),a=s?.currentStep||We(s?.source||""),u=s?.startedAt||n,c={...s?.stepDurationsSec??{}},p=s?.stepStartedAt||n;if(a&&a!==l&&s?.stepStartedAt){let y=Math.max(0,Math.round((i.getTime()-new Date(s.stepStartedAt).getTime())/1e3));c[a]=(c[a]??0)+y,p=n;}let g=Math.max(0,Math.round((i.getTime()-new Date(p).getTime())/1e3)),d=Math.max(0,Math.round((i.getTime()-new Date(u).getTime())/1e3)),w={checkedAt:n,source:e,message:t,details:jt(o,r??{}),startedAt:u,currentStep:l,stepStartedAt:p,stepElapsedSec:g,totalElapsedSec:d,stepDurationsSec:c};await D.writeFile(Z,JSON.stringify(w,null,2),"utf8");}).catch(()=>{}));}async function Ft(e,t){await D.mkdir(b.dirname(e),{recursive:true}),await D.appendFile(e,`${JSON.stringify(t)}
2
+ `,"utf8");}var G=class{constructor(t,r,i="info"){this.logDir=t;this.logFile=r;this.level=i;this.ensureLogFileReady();}logDir;logFile;level;startedAt=Date.now();marks=new Map;initPromise=null;writeQueue=Promise.resolve();writeError=null;get logPath(){return b.join(this.logDir,this.logFile)}artifactPath(t){return this.logFile.endsWith(".log.jsonl")?b.join(this.logDir,this.logFile.replace(/\.log\.jsonl$/u,`${t}.jsonl`)):b.join(this.logDir,`${this.logFile}${t}.jsonl`)}get errorsPath(){return this.artifactPath(".errors")}get rejectedPath(){return this.artifactPath(".rejected")}ensureLogFileReady(){return this.initPromise||(this.initPromise=(async()=>{await D.mkdir(this.logDir,{recursive:true}),await D.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 D.appendFile(this.logPath,`${t}
3
+ `,"utf8");});}enqueueJsonLine(t,r){this.enqueueTask(()=>Ft(t,r));}accepts(t){return _e[t]<=_e[this.level]}push(t,r,i){if(!this.accepts(t))return;let n=JSON.stringify({time:new Date().toISOString(),level:t,message:r,...i||{}});this.enqueueLine(n),t==="error"?console.error(`[ERROR] ${r}`,i?JSON.stringify(i):""):t==="warn"?console.warn(`[WARN] ${r}`,i?JSON.stringify(i):""):console.log(`[${t.toUpperCase().padEnd(5)}] ${r}`);}info(t,r){this.push("info",t,r);}progress(t,r){At(this.logFile,t,r);}debug(t,r){this.push("debug",t,r);}warn(t,r){this.push("warn",t,r);}reject(t,r,i,n,s){let o={kind:t,url:r,reason:i,...n?{source:n}:{},...s||{}};this.enqueueJsonLine(this.rejectedPath,o),this.accepts("debug")&&this.push("debug",`Rejected ${t} ${r}: ${i}`,o);}error(t,r){this.enqueueJsonLine(this.errorsPath,{message:t,...r||{}}),this.push("error",t,r);}mark(t){this.marks.set(t,Date.now());}endMark(t,r){let i=this.marks.get(t);if(!i)return;let n=Date.now()-i,s=Number((n/1e3).toFixed(2));this.push("info",`Timing ${t}: ${s}s`,{name:t,ms:n,seconds:s,...r||{}});}async flush(){let t=Date.now()-this.startedAt,r=Number((t/1e3).toFixed(2));if(this.push("info",`Total time: ${r}s`,{name:"total",ms:t,seconds:r}),await this.writeQueue,this.writeError)throw this.writeError}};async function Ut(e){await D.mkdir(b.dirname(e),{recursive:true});}async function qe(e,t,r){await Ut(e);let i=b.join(b.dirname(e),`.${b.basename(e)}.${process.pid}.${Date.now()}.${_t.randomBytes(6).toString("hex")}.tmp`);try{typeof t=="string"?await D.writeFile(i,t,r??"utf8"):await D.writeFile(i,t),await D.rename(i,e);}catch(n){throw await D.unlink(i).catch(()=>{}),n}}function He(e){return [".html",".htm",".css",".js",".mjs",".json",".xml",".xsl",".txt",".svg",".map",".enc",".jws"].includes(b.extname(e).toLowerCase())}function Je(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 z(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function X(e){return e.replace(/\//g,"\\/")}function ze(e){return e.replace(/\//g,"\\\\/")}function Nt(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 Be(e,t,r){if(!t)return;e[t]=r;let i=X(t),n=X(r);e[i]=n;let s=ze(t),o=ze(r);e[s]=o;let l=z(t),a=z(r);e[l]=a;let u=z(i),c=z(n);e[u]=c;let p=z(s),g=z(o);e[p]=g;}function ee(e,t,r){Be(e,t,r);let i=Nt(t);i&&i!==t&&Be(e,i,r);}function Ke(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function Ge(e,t,r){if(!t)return r;let i=b.dirname(b.resolve(t)),n=b.resolve(e,r.replace(/^\/+/,"")),s=b.relative(i,n).replace(/\\/g,"/");return s?(s.startsWith(".")||(s=`./${s}`),s):"."}var Ht=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],Jt=new Set([".html",".htm"]),Ve="WPSuite.io Static Publisher",Kt=Ve.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function Gt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Vt(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function Qt(e,t,r){return Vt(t)?e.replace(new RegExp(`(?<!:)${Gt(t)}`,"g"),r):e.split(t).join(r)}function Yt(e,t,r){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let n=b.extname(r).toLowerCase();return Jt.has(n)?/<head\b|<html\b|<!doctype html/i.test(t):false}function Zt(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${Kt}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${Ve}" />`;if(e.match(/(\r?\n)([ \t]*)<\/head>/i))return e.replace(/(\r?\n)([ \t]*)<\/head>/i,`$1$2${t}$1$2</head>`);let i=e.includes(`\r
4
4
  `)?`\r
5
5
  `:`
6
- `;return e.replace(/<head\b[^>]*>/i,n=>`${n}${i} ${t}`)}function Gt(e){let t=Be(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function Qt(e,t){let r=[...new Set(t)].filter(s=>s.includes("/")&&!/\\+\//.test(s)).map(s=>[s,Z(s)]).filter(([s,o])=>s!==o).sort((s,o)=>o[0].length-s[0].length);if(!r.length)return e;let i=s=>{let o=s;for(let[u,a]of r)o=o.split(u).join(a);return o},n=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(s,o,u,a)=>`${o}${i(u)}${a}`);return n=n.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(s,o,u,a,c)=>Gt(a)?`${o}${i(a)}${c}`:s),n}function Vt(e,t){if(!t)return null;let r=w.dirname(w.resolve(t)),i=w.resolve(e.outputDir),n=w.relative(r,i).replace(/\\/g,"/");return n?(n.startsWith(".")||(n=`./${n}`),n.endsWith("/")?n:`${n}/`):"./"}function Yt(e,t,r){let i=Vt(t,r);if(!i)return e;let n=e;for(let s of Nt){let o=s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),u=new RegExp(`(?:\\.{1,}/)+${o}`,"g"),a=new RegExp(`(?<!\\.)/${o}`,"g");n=n.replace(u,`${i}${s}`).replace(a,`${i}${s}`);let c=s.replace(/\//g,"\\/"),l=i.replace(/\//g,"\\/"),p=c.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),g=new RegExp(`(?:\\.{1,}\\\\/)+${p}`,"g"),f=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${p}`,"g"),m=new RegExp(`(?<![\\.\\\\])\\/${p}`,"g");n=n.replace(g,`${l}${c}`).replace(f,`${l}${c}`).replace(m,`${l}${c}`);}return n}function me(e,t,r){if(e.urlRewriteMode==="absolute")return t;let i=(()=>{try{return new URL(t,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin)}catch{return null}})(),n=i?i.pathname:qe(t,e.targetOrigin),s=i?`${i.search}${i.hash}`:"";return e.urlRewriteMode==="root-relative"?`${n}${s}`:`${He(e.outputDir,r,n)}${s}`}function fe(e,t,r,i,n){X(e,r,me(t,i,n));}function Zt(e,t,r,i,n){if(!r||r===i)return;X(e,r,i);let s=me(t,r,n),o=me(t,i,n);X(e,s,o);}function Xt(e,t,r,i,n={}){let s=e,o={};fe(o,t,t.sourceOrigin,t.targetOrigin,i);for(let[a,c]of Object.entries(t.extraReplacements))fe(o,t,a,c,i);for(let[a,c]of Object.entries(r))fe(o,t,a,c,i);for(let[a,c]of Object.entries(n)){let l=r[a];!l||l===c||Zt(o,t,c,l,i);}let u=Object.entries(o).sort((a,c)=>c[0].length-a[0].length);for(let[a,c]of u)s=Ht(s,a,c);return t.urlRewriteMode!=="absolute"&&(s=Yt(s,t,i)),s=Qt(s,u.map(([,a])=>a)),Jt(t,s,i)&&(s=Kt(s)),s}async function er(e,t,r,i){let n=w.join(e.outputDir,i),s=w.extname(n).toLowerCase(),o;try{o=await $.readFile(n,"utf8");}catch(c){if(c.code!=="ENOENT")throw c;return {changed:false}}let a=Xt(o,e,t,s===".js"||s===".mjs"?void 0:n,r);return a!==o?(await We(n,a,"utf8"),{changed:true}):{changed:false}}async function tr(e,t){return await new Promise((r,i)=>{let n=a=>{if(u(),a?.error){i(new Error(a.error));return}r({changed:!!a?.changed});},s=a=>{u(),i(a);},o=a=>{u(),a!==0&&i(new Error(`Rewrite worker exited with code ${a}.`));},u=()=>{e.off("message",n),e.off("error",s),e.off("exit",o);};e.on("message",n),e.on("error",s),e.on("exit",o),e.postMessage({file:t});})}async function Ke(e,t,r={}){let n=(r.files?[...new Set(r.files)].map(g=>w.resolve(g)).filter(g=>g.startsWith(w.resolve(e.outputDir))).map(g=>w.relative(e.outputDir,g).replace(/\\/g,"/")).filter(g=>g.length>0):await Ft(["**/*"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(g=>g!=="asset-map.json"&&ze(g)),s=0;if(n.length===0)return 0;let o=Math.max(1,Number(e.rewriteConcurrency||e.assetDownloadConcurrency||1)),u=Math.max(1,Math.min(o,n.length,availableParallelism()));await r.onStart?.({totalFiles:n.length,workerCount:u});let a=0,c=0,l=null;if(u===1){for(let g of n){let f=await er(e,t,r.previousAssetMap??{},g);f.changed&&(s+=1),c+=1,await r.onProgress?.({index:c,totalFiles:n.length,changedTextFiles:s,file:g,changed:f.changed});}return s}let p=Array.from({length:u},async()=>{let g=new Worker(new URL("./rewrite-worker.js",import.meta.url),{workerData:{config:e,assetMap:t,previousAssetMap:r.previousAssetMap??{}}});try{for(;!l;){let f=a;if(f>=n.length)return;a+=1;let m=n[f],b=await tr(g,m);b.changed&&(s+=1),c+=1,await r.onProgress?.({index:c,totalFiles:n.length,changedTextFiles:s,file:m,changed:b.changed});}}catch(f){throw l=f instanceof Error?f:new Error(String(f)),l}finally{await g.terminate().catch(()=>{});}});return await Promise.all(p),s}var Ye="wpsuite-sha256",Ze="wpsuite-normalized-sha256",cr=/(?:^|[-_:.])(id|uid|nonce|token|hash|instance)(?:$|[-_:.])/i,Se=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,gr=["SIGINT","SIGTERM"],re=new Set,ee=new Map,Ge=null;function pr(e){re.add(e);let t=false;return ()=>{t||(t=true,re.delete(e));}}async function dr(){let e=[...re];e.length!==0&&await Promise.allSettled(e.map(async t=>{re.delete(t),await $.rm(t,{recursive:true,force:true});}));}function fr(){if(!(ee.size>0))for(let e of gr){let t=()=>{Ge||(Ge=dr().finally(()=>{for(let[r,i]of ee)process.off(r,i);ee.clear(),process.exit(1);}));};ee.set(e,t),process.on(e,t);}}fr();function mr(e,t){let r=t.trim();return r?w.join(w.resolve(r),"crawl-manifest.json"):w.join(w.resolve(e),".crawl-manifest.json")}function Xe(e){return w.normalize(e).split(w.sep).join("/")}function Qe(e,t){let r=w.relative(w.resolve(e),w.resolve(t));return !r||r.startsWith("..")||w.isAbsolute(r)?null:Xe(r)}async function hr(e,t,r){let i=mr(e.outputDir,t),n;try{n=await $.readFile(i,"utf8");}catch(l){return l.code==="ENOENT"?(r.warn("Deploy rewrite guard disabled because the crawl manifest is missing.",{manifestPath:i,source:"deploy-guard"}),null):(r.warn("Deploy rewrite guard disabled because the crawl manifest could not be read.",{manifestPath:i,error:l instanceof Error?l.message:String(l),source:"deploy-guard"}),null)}let s;try{s=JSON.parse(n);}catch(l){return r.warn("Deploy rewrite guard disabled because the crawl manifest is invalid JSON.",{manifestPath:i,error:l instanceof Error?l.message:String(l),source:"deploy-guard"}),null}let o=new Map,u=new Map,a=0,c=0;for(let[l,p]of Object.entries(s.pages||{})){let g=String(p?.outputPath||"").trim(),f=g?Qe(e.outputDir,g):null;if(f){let m=typeof p?.contentType=="string"&&p.contentType?p.contentType:null;m&&u.set(f,m);}!g||p?.rewriteComplete===true||f&&(a++,o.has(f)||o.set(f,{kind:"page",sourceUrl:l,outputPath:w.resolve(g),relativePath:f}));}for(let[l,p]of Object.entries(s.assets||{})){let g=String(p?.outputPath||"").trim(),f=p?.isText===true,m=g?Qe(e.outputDir,g):null;if(m){let b=typeof p?.contentType=="string"&&p.contentType?p.contentType:null;b&&u.set(m,b);}!g||!f||p?.rewriteComplete===true||m&&(c++,o.has(m)||o.set(m,{kind:"asset",sourceUrl:l,outputPath:w.resolve(g),relativePath:m}));}return {manifestPath:i,byRelativePath:o,contentTypeByRelativePath:u,pendingPages:a,pendingTextAssets:c}}function yr(e){return e&&(Se.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 ye(e){return e.split(/([_:.\-/=?&#]+)/g).map((t,r)=>r%2===1?t:yr(t)).join("")}function wr(e){return e.split(/([_:.\-/=?&#]+)/g).map((t,r)=>r%2===1?t:Se.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 ne(e,t){return Array.isArray(e)?e.map(r=>ne(r,t)):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([r,i])=>[r,ne(i,r)])):typeof e!="string"?e:t&&cr.test(t)?wr(e):Se.test(e)?"__uuid__":/^[0-9a-f]{6,}$/i.test(e)||/^[0-9]{8,}$/.test(e)?ye(e):e}function br(e){return e.replace(/((?:https?:\/\/[^"'\s>]+|\/)(?:wp-content|wp-includes)\/[^"'\s>?]+)\?ver=[A-Za-z0-9._-]+(?=$|[#"'])/gi,"$1")}function Pr(e,t){let r=t.trim();if((r.startsWith("{")||r.startsWith("[")||r.startsWith('"'))&&e.startsWith("data-"))try{let n=JSON.parse(r);return JSON.stringify(ne(n))}catch{}if(e.startsWith("data-")&&/^[A-Za-z0-9+/=]+$/.test(r))try{let n=Buffer.from(r,"base64").toString("utf8"),s=JSON.parse(n),o=JSON.stringify(ne(s));return Buffer.from(o,"utf8").toString("base64")}catch{}return t}function Sr(e,t){let r=e.toLowerCase();return r==="class"?t.split(/(\s+)/).map((i,n)=>n%2===1?i:ye(i)).join(""):r==="id"||r==="for"||r==="aria-controls"||r==="aria-labelledby"||r==="aria-describedby"||r==="aria-owns"||r==="aria-activedescendant"||r==="name"?ye(t):r==="href"||r==="src"?br(t):Pr(r,t)}function vr(e){return e.replace(/<([a-z][^\s/>]*)([^<>]*?)>/gi,(t,r,i)=>{if(r.startsWith("/"))return t;let n=i.replace(/\s([:@a-zA-Z_][-:.a-zA-Z0-9_]*?)=(['"])([\s\S]*?)\2/g,(s,o,u,a)=>{let c=Sr(o,a);return ` ${o}=${u}${c}${u}`});return `<${r}${n}>`})}function he(e){let t=w.extname(e).toLowerCase();return [".html",".htm",".xml",".xsl",".txt"].includes(t)||["robots.txt","sitemap.xml"].includes(w.basename(e))}function te(e,t){return [e.replace(/^\/+|\/+$/g,""),t.replace(/^\/+/,"")].filter(Boolean).join("/")}async function Rr(e,t,r,i){let n=new Map,s,o=0;do{o++;let u=await L(`S3 list objects page ${o} for s3://${t}/${r||""}`,3e5,({httpOptions:a})=>e.send(new ListObjectsV2Command({Bucket:t,Prefix:r||void 0,ContinuationToken:s}),a));for(let a of u.Contents||[]){if(!a.Key)continue;let c=(a.ETag||"").replace(/^"|"$/g,"").toLowerCase(),l=Number(a.Size??0);n.set(a.Key,{etag:c,size:l});}s=u.NextContinuationToken,i.debug(`Listed S3 keys page ${o}: ${n.size} keys so far`);}while(s);return n}async function $r(e,t,r,i){if(i.has(r))return i.get(r)??null;try{let n=await L(`S3 head object ${r}`,3e5,({httpOptions:o})=>e.send(new HeadObjectCommand({Bucket:t,Key:r}),o)),s={etag:(n.ETag||"").replace(/^"|"$/g,"").toLowerCase(),size:Number(n.ContentLength??0)};return i.set(r,s),s}catch{return i.set(r,null),null}}async function xr(e,t,r,i){let n=[...new Set(Array.from(r).filter(Boolean))];if(n.length===0)return i.info("No explicitly tombstoned S3 objects to delete."),[];i.info(`Deleting ${n.length} explicitly tombstoned S3 object(s)\u2026`);for(let s=0;s<n.length;s+=1e3){let o=n.slice(s,s+1e3);if(o.length!==0){await L(`S3 delete objects batch ${Math.floor(s/1e3)+1}`,3e5,({httpOptions:u})=>e.send(new DeleteObjectsCommand({Bucket:t,Delete:{Objects:o.map(a=>({Key:a}))}}),u)),i.info(`Deleted batch of ${o.length} object(s).`);for(let u of o)i.debug(` deleted: ${u}`);}}return n}function Dr(e){return createHash("md5").update(e).digest("hex")}function Ve(e){return createHash("sha256").update(e).digest("hex")}function we(e){return createHash("sha256").update(vr(e.toString("utf8"))).digest("hex")}async function Tr(e,t,r,i){if(i.has(r))return i.get(r)??null;try{let o=((await L(`S3 head object metadata ${r}`,3e5,({httpOptions:u})=>e.send(new HeadObjectCommand({Bucket:t,Key:r}),u))).Metadata?.[Ye]||"").trim().toLowerCase()||null;return i.set(r,o),o}catch{return i.set(r,null),null}}async function Cr(e,t,r,i,n){if(i.has(r))return i.get(r)??null;try{let o=((await L(`S3 head object normalized metadata ${r}`,3e5,({httpOptions:u})=>e.send(new HeadObjectCommand({Bucket:t,Key:r}),u))).Metadata?.[Ze]||"").trim().toLowerCase();if(o)return i.set(r,o),o}catch{return i.set(r,null),null}if(n.has(r)){let s=n.get(r)??null;return i.set(r,s),s}try{let o=await(await L(`S3 get object ${r}`,3e5,({httpOptions:a})=>e.send(new GetObjectCommand({Bucket:t,Key:r}),a))).Body?.transformToByteArray(),u=o?we(Buffer.from(o)):null;return n.set(r,u),i.set(r,u),u}catch{return n.set(r,null),i.set(r,null),null}}function Er(e){return e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")||"profile"}function Mr(e,t){let r=e,i=Object.entries(t).sort((n,s)=>s[0].length-n[0].length);for(let[n,s]of i)n&&(r=r.split(n).join(s));return r}async function kr(e,t,r,i){let n=w.join(e,"asset-map.json"),s;try{s=await $.readFile(n,"utf8");}catch(a){if(a.code==="ENOENT")return;throw a}let o=JSON.parse(s);if(!o||typeof o!="object")return;let u=Object.fromEntries(Object.entries(o).map(([a,c])=>{let l=String(c??"");return t.urlRewriteMode==="absolute"&&t.targetOrigin&&r.targetOrigin&&t.targetOrigin!==r.targetOrigin&&(l=l.split(t.targetOrigin).join(r.targetOrigin)),l=Mr(l,i),[a,l]}));await $.writeFile(n,JSON.stringify(u,null,2),"utf8");}async function Lr(e,t,r,i,n){let s=e.targetOrigin!==t.targetOrigin,o=Object.keys(i).length>0;if(!r||!s&&!o)return {outputDir:e.outputDir,cleanup:async()=>{}};if(s&&e.urlRewriteMode!=="absolute")throw new Error(`Deployment profile "${r}" changes targetOrigin, but the base crawl output must use urlRewriteMode "absolute" for multi-target redeploys.`);let u=w.join(w.dirname(e.outputDir),`.deploy-profile-${Er(r)}-${Date.now()}`),a=pr(u);n.info(`Preparing deployment profile "${r}" from existing crawl output to ${u}...`);try{await $.rm(u,{recursive:!0,force:!0}),await $.cp(e.outputDir,u,{recursive:!0});let c={...e,sourceOrigin:e.targetOrigin,targetOrigin:t.targetOrigin,extraReplacements:i,outputDir:u},l=1;n.info(`Rewriting text files for deployment profile "${r}"...`);let p=await Ke(c,{},{onStart:({totalFiles:g,workerCount:f})=>{l=f,n.info(`Rewriting ${g} text file(s) for deployment profile "${r}" with ${f} worker(s).`);},onProgress:({index:g,totalFiles:f,changedTextFiles:m,file:b,changed:P})=>{let R=`Rewriting [${g}/${f}] ${b} (${P?"rewrote":"checked"}; ${m} changed so far)`;f<=200||g<=5||g%10===0||g===f?(n.progress(R,{file:b,index:g,totalFiles:f,changed:P,changedTextFiles:m,workerCount:l}),n.info(R)):n.debug(R);}});return await kr(u,e,t,i),n.info(`Prepared deployment profile "${r}" in ${u} (${p} rewritten text file(s)).`),{outputDir:u,cleanup:async()=>{a(),await $.rm(u,{recursive:!0,force:!0});}}}catch(c){throw n.error(`Failed to prepare deployment profile "${r}" temporary output.`,{tempDir:u,outputDir:e.outputDir,error:c instanceof Error?c.message:String(c),...c instanceof Error&&c.stack?{stack:c.stack}:{}}),await $.rm(u,{recursive:true,force:true}).catch(()=>{}),a(),await n.flush().catch(()=>{}),c}}async function Ir(){let e=await pe(),t=Ie(process.argv.slice(2)),r=Oe(e,t),i=w.resolve(r.config.logDir||"logs"),n=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",s=n?w.join(w.resolve(n),"deploy-diff.json"):"",o=new K(i,"deploy.log.jsonl",r.config.logLevel??"info"),u=r.profile?.extraReplacements??{},a=async()=>{};try{let c=await Lr(e,r.config,r.name,u,o);a=c.cleanup;let l={...r.config,outputDir:c.outputDir},p=l.s3SyncMode??"sdk-upload-delete",g=await ke(e),f=c.outputDir!==e.outputDir&&(e.targetOrigin!==r.config.targetOrigin||Object.keys(u).length>0),m=!!g&&!g.fullSyncRequired&&!f;r.name&&o.info(`Using deployment profile: ${r.name}`),o.info(`Starting deploy \u2014 s3://${l.s3.bucket}/${l.s3.prefix||""} (region: ${l.s3.region})`),o.info(`S3 sync mode: ${p}`),g&&g.fullSyncRequired?o.info("Deploy plan requests a full sync; scanning the whole output tree."):g&&f?o.info("Ignoring incremental deploy plan because deployment-profile rewrites require a full sync."):m&&o.info(`Using incremental deploy plan: ${g.changedFiles.length} changed file(s), ${g.deletedFiles.length} deleted file(s).`),o.mark("deploy");let b=new S3Client({region:l.s3.region}),P=c.outputDir===e.outputDir?await hr(e,n,o):null,A=m?(await Promise.all(g.changedFiles.map(async y=>{try{return (await $.stat(w.join(l.outputDir,y))).isFile()?y:null}catch{return null}}))).filter(y=>y!==null):await Ft(["**/*"],{cwd:l.outputDir,onlyFiles:!0,dot:!0}),R=[],Q=[],h=A.filter(y=>{let D=P?.byRelativePath.get(Xe(y));if(!D)return !0;let d=te(l.s3.prefix,y);return R.push(y),Q.push(d),o.reject(D.kind,D.sourceUrl||y,"rewrite not completed; deploy upload blocked","deploy-guard",{file:y,key:d,outputPath:D.outputPath,manifestPath:P?.manifestPath}),!1}),ve=new Set((m?h:A).map(y=>te(l.s3.prefix,y)));P&&(P.pendingPages>0||P.pendingTextAssets>0)&&o.info(`Deploy rewrite guard loaded ${P.pendingPages} pending page(s) and ${P.pendingTextAssets} pending text asset(s) from crawl manifest.`,{manifestPath:P.manifestPath,pendingPages:P.pendingPages,pendingTextAssets:P.pendingTextAssets,source:"deploy-guard"}),R.length>0&&o.warn(`Deploy rewrite guard blocked ${R.length} file(s) from upload because final crawl rewrite is incomplete.`,{rejected:R.length,manifestPath:P?.manifestPath,source:"deploy-guard"}),m?o.info(`Using ${h.length} eligible planned changed file(s) from deploy plan for upload${R.length>0?` (${R.length} blocked by deploy rewrite guard)`:""}.`):o.info(`Found ${A.length} file(s) in output directory "${l.outputDir}"${R.length>0?`; ${h.length} remain eligible for upload after deploy rewrite guard filtering`:""}.`),o.progress("Deploy preflight: comparing local output with remote S3 state.",{phase:"deploy",mode:p,totalFiles:h.length,scannedFiles:A.length,rejected:R.length,deploymentProfile:r.name||"",s3Bucket:l.s3.bucket,s3Prefix:l.s3.prefix||"",targetedPlan:m,deployGuardEnabled:c.outputDir===e.outputDir});let x=0,v=0,O=0,ie=[],B=[],se=[],oe=[],j=[],_=new Map,et=new Map,tt=new Map,rt=new Map,nt=new Map;m||(o.info("Listing existing S3 objects to detect unchanged files..."),_=await Rr(b,l.s3.bucket,l.s3.prefix,o),o.info(`Found ${_.size} existing key(s) in S3.`));let it=async y=>_.has(y)?_.get(y)??null:m?$r(b,l.s3.bucket,y,et):null;for(let y of h){let D=w.join(l.outputDir,y),d=te(l.s3.prefix,y),T=P?.contentTypeByRelativePath.get(y),q=T&&T!=="application/octet-stream"?T:ur.lookup(y)||T||"application/octet-stream",st=he(y)?l.s3.htmlCacheControl:l.s3.assetCacheControl,S=x+v+O+1;h.length<=200||S<=5||S%10===0||S===h.length?(o.progress(`Uploading [${S}/${h.length}] ${d} (${q})`,{file:y,key:d,index:S,totalFiles:h.length,contentType:q,mode:p}),o.info(`Uploading [${S}/${h.length}] ${d} (${q})`)):o.debug(`Uploading [${S}/${h.length}] ${d} (${q})`);try{let C=await $.readFile(D),H=await it(d),J=null,U=null;if(H){let ae=C.byteLength;if(H.size===ae){let V=H.etag.includes("-");if(H.etag!==""&&!V){let ot=Dr(C);if(H.etag===ot){v++,h.length<=200||v<=5||v%25===0?(o.progress(`Skipped unchanged [${S}/${h.length}] ${d}`,{file:y,key:d,index:S,totalFiles:h.length,uploaded:x,skipped:v,failed:O,mode:p,reason:"etag-md5-match"}),o.info(`Skipped unchanged [${S}/${h.length}] ${d}`)):o.debug(`Skipped unchanged [${S}/${h.length}] ${d}`),B.push(d);continue}}J=Ve(C);let Re=await Tr(b,l.s3.bucket,d,tt);if(Re&&Re===J){v++,h.length<=200||v<=5||v%25===0?(o.progress(`Skipped unchanged [${S}/${h.length}] ${d}`,{file:y,key:d,index:S,totalFiles:h.length,uploaded:x,skipped:v,failed:O,mode:p,reason:"metadata-sha256-match"}),o.info(`Skipped unchanged [${S}/${h.length}] ${d}`)):o.debug(`Skipped unchanged [${S}/${h.length}] ${d}`),B.push(d);continue}}if(he(y)){U=we(C);let V=await Cr(b,l.s3.bucket,d,rt,nt);if(V&&V===U){v++,h.length<=200||v<=5||v%25===0?(o.progress(`Skipped semantically unchanged [${S}/${h.length}] ${d}`,{file:y,key:d,index:S,totalFiles:h.length,uploaded:x,skipped:v,failed:O,mode:p,reason:"normalized-html-match"}),o.info(`Skipped semantically unchanged [${S}/${h.length}] ${d}`)):o.debug(`Skipped semantically unchanged [${S}/${h.length}] ${d}`),B.push(d);continue}}}J=J??Ve(C),U=U??(he(y)?we(C):null),await L(`S3 upload ${d}`,9e5,({abortController:ae})=>new Upload({client:b,abortController:ae,params:{Bucket:l.s3.bucket,Key:d,Body:C,ContentType:q,CacheControl:st,Metadata:{[Ye]:J,...U?{[Ze]:U}:{}}}}).done()),x++,ie.push(d),(x%25===0||x===h.length)&&(o.progress(`Uploaded ${x}/${h.length} file(s)\u2026`,{uploaded:x,skipped:v,failed:O,totalFiles:h.length,mode:p}),o.info(`Uploaded ${x}/${h.length} file(s)\u2026`));}catch(C){O++,se.push(d),o.error(`Failed to upload ${d}: ${C.message}`,{key:d,error:String(C)});}}if(o.info(`Upload complete: ${x} uploaded, ${v} skipped unchanged, ${Q.length} rejected by guard, ${O} failed.`),p==="sdk-upload-delete"){let y=new Set((g?.deletedFiles??[]).map(d=>te(l.s3.prefix,d))),D=[...y].filter(d=>!ve.has(d));if(!m&&(j=[..._.keys()].filter(T=>!ve.has(T)).filter(T=>!y.has(T)),j.length>0)){o.warn(`Protected ${j.length} remote-only S3 object(s) from deletion because the crawl did not provide explicit tombstones.`,{protected:j.length,source:"deploy-delete-guard"});for(let T of j)o.debug(` protected remote-only object: ${T}`);}oe=await xr(b,l.s3.bucket,m?D:D.filter(d=>_.has(d)),o);}else o.info("Sync mode is sdk-upload-only \u2014 skipping stale object deletion.");s&&(await $.mkdir(w.dirname(s),{recursive:!0}),await $.writeFile(s,JSON.stringify({generatedAt:new Date().toISOString(),mode:p,summary:{totalFiles:A.length,eligibleFiles:h.length,uploaded:ie.length,skipped:B.length,rejected:Q.length,failed:se.length,deleted:oe.length,protected:j.length,...r.name?{profile:r.name}:{}},uploadedKeys:ie,skippedKeys:B,rejectedKeys:Q,failedKeys:se,deletedKeys:oe,protectedRemoteOnlyKeys:j},null,2),"utf8")),await Le(e),o.endMark("deploy"),await o.flush();}finally{await a().catch(()=>{});}}Ir().catch(async e=>{console.error(e);try{let r=(await pe().catch(()=>null))?.logDir??"logs",i=new K(r,"deploy.log.jsonl","debug");i.error(`Unhandled error: ${e instanceof Error?e.message:String(e)}`,e instanceof Error?{stack:e.stack}:void 0),await i.flush();}catch{}process.exit(1);});
6
+ `;return e.replace(/<head\b[^>]*>/i,n=>`${n}${i} ${t}`)}function Xt(e){let t=Je(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function er(e,t){let r=[...new Set(t)].filter(s=>s.includes("/")&&!/\\+\//.test(s)).map(s=>[s,X(s)]).filter(([s,o])=>s!==o).sort((s,o)=>o[0].length-s[0].length);if(!r.length)return e;let i=s=>{let o=s;for(let[l,a]of r)o=o.split(l).join(a);return o},n=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(s,o,l,a)=>`${o}${i(l)}${a}`);return n=n.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(s,o,l,a,u)=>Xt(a)?`${o}${i(a)}${u}`:s),n}function tr(e,t){if(!t)return null;let r=b.dirname(b.resolve(t)),i=b.resolve(e.outputDir),n=b.relative(r,i).replace(/\\/g,"/");return n?(n.startsWith(".")||(n=`./${n}`),n.endsWith("/")?n:`${n}/`):"./"}function rr(e,t,r){let i=tr(t,r);if(!i)return e;let n=e;for(let s of Ht){let o=s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),l=new RegExp(`(?:\\.{1,}/)+${o}`,"g"),a=new RegExp(`(?<!\\.)/${o}`,"g");n=n.replace(l,`${i}${s}`).replace(a,`${i}${s}`);let u=s.replace(/\//g,"\\/"),c=i.replace(/\//g,"\\/"),p=u.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),g=new RegExp(`(?:\\.{1,}\\\\/)+${p}`,"g"),d=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${p}`,"g"),w=new RegExp(`(?<![\\.\\\\])\\/${p}`,"g");n=n.replace(g,`${c}${u}`).replace(d,`${c}${u}`).replace(w,`${c}${u}`);}return n}function we(e,t,r){if(e.urlRewriteMode==="absolute")return t;let i=(()=>{try{return new URL(t,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin)}catch{return null}})(),n=i?i.pathname:Ke(t,e.targetOrigin),s=i?`${i.search}${i.hash}`:"";return e.urlRewriteMode==="root-relative"?`${n}${s}`:`${Ge(e.outputDir,r,n)}${s}`}function he(e,t,r,i,n){ee(e,r,we(t,i,n));}function nr(e,t,r,i,n){if(!r||r===i)return;ee(e,r,i);let s=we(t,r,n),o=we(t,i,n);ee(e,s,o);}function ir(e,t,r,i,n={}){let s=e,o={};he(o,t,t.sourceOrigin,t.targetOrigin,i);for(let[a,u]of Object.entries(t.extraReplacements))he(o,t,a,u,i);for(let[a,u]of Object.entries(r))he(o,t,a,u,i);for(let[a,u]of Object.entries(n)){let c=r[a];!c||c===u||nr(o,t,u,c,i);}let l=Object.entries(o).sort((a,u)=>u[0].length-a[0].length);for(let[a,u]of l)s=Qt(s,a,u);return t.urlRewriteMode!=="absolute"&&(s=rr(s,t,i)),s=er(s,l.map(([,a])=>a)),Yt(t,s,i)&&(s=Zt(s)),s}async function sr(e,t,r,i){let n=b.join(e.outputDir,i),s=b.extname(n).toLowerCase(),o;try{o=await D.readFile(n,"utf8");}catch(u){if(u.code!=="ENOENT")throw u;return {changed:false}}let a=ir(o,e,t,s===".js"||s===".mjs"?void 0:n,r);return a!==o?(await qe(n,a,"utf8"),{changed:true}):{changed:false}}async function or(e,t){return await new Promise((r,i)=>{let n=a=>{if(l(),a?.error){i(new Error(a.error));return}r({changed:!!a?.changed});},s=a=>{l(),i(a);},o=a=>{l(),a!==0&&i(new Error(`Rewrite worker exited with code ${a}.`));},l=()=>{e.off("message",n),e.off("error",s),e.off("exit",o);};e.on("message",n),e.on("error",s),e.on("exit",o),e.postMessage({file:t});})}async function Qe(e,t,r={}){let n=(r.files?[...new Set(r.files)].map(g=>b.resolve(g)).filter(g=>g.startsWith(b.resolve(e.outputDir))).map(g=>b.relative(e.outputDir,g).replace(/\\/g,"/")).filter(g=>g.length>0):await Wt(["**/*"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(g=>g!=="asset-map.json"&&He(g)),s=0;if(n.length===0)return 0;let o=Math.max(1,Number(e.rewriteConcurrency||e.assetDownloadConcurrency||1)),l=Math.max(1,Math.min(o,n.length,availableParallelism()));await r.onStart?.({totalFiles:n.length,workerCount:l});let a=0,u=0,c=null;if(l===1){for(let g of n){let d=await sr(e,t,r.previousAssetMap??{},g);d.changed&&(s+=1),u+=1,await r.onProgress?.({index:u,totalFiles:n.length,changedTextFiles:s,file:g,changed:d.changed});}return s}let p=Array.from({length:l},async()=>{let g=new Worker(new URL("./rewrite-worker.js",import.meta.url),{workerData:{config:e,assetMap:t,previousAssetMap:r.previousAssetMap??{}}});try{for(;!c;){let d=a;if(d>=n.length)return;a+=1;let w=n[d],y=await or(g,w);y.changed&&(s+=1),u+=1,await r.onProgress?.({index:u,totalFiles:n.length,changedTextFiles:s,file:w,changed:y.changed});}}catch(d){throw c=d instanceof Error?d:new Error(String(d)),c}finally{await g.terminate().catch(()=>{});}});return await Promise.all(p),s}var et="wpsuite-sha256",tt="wpsuite-normalized-sha256",mr=/(?:^|[-_:.])(id|uid|nonce|token|hash|instance)(?:$|[-_:.])/i,Re=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,hr=["SIGINT","SIGTERM"],ne=new Set,te=new Map,Ye=null;function wr(e){ne.add(e);let t=false;return ()=>{t||(t=true,ne.delete(e));}}async function yr(){let e=[...ne];e.length!==0&&await Promise.allSettled(e.map(async t=>{ne.delete(t),await D.rm(t,{recursive:true,force:true});}));}function br(){if(!(te.size>0))for(let e of hr){let t=()=>{Ye||(Ye=yr().finally(()=>{for(let[r,i]of te)process.off(r,i);te.clear(),process.exit(1);}));};te.set(e,t),process.on(e,t);}}br();function Pr(e,t){let r=t.trim();return r?b.join(b.resolve(r),"crawl-manifest.json"):b.join(b.resolve(e),".crawl-manifest.json")}function rt(e){return b.normalize(e).split(b.sep).join("/")}function Ze(e,t){let r=b.relative(b.resolve(e),b.resolve(t));return !r||r.startsWith("..")||b.isAbsolute(r)?null:rt(r)}async function Sr(e,t,r){let i=Pr(e.outputDir,t),n;try{n=await D.readFile(i,"utf8");}catch(c){return c.code==="ENOENT"?(r.warn("Deploy rewrite guard disabled because the crawl manifest is missing.",{manifestPath:i,source:"deploy-guard"}),null):(r.warn("Deploy rewrite guard disabled because the crawl manifest could not be read.",{manifestPath:i,error:c instanceof Error?c.message:String(c),source:"deploy-guard"}),null)}let s;try{s=JSON.parse(n);}catch(c){return r.warn("Deploy rewrite guard disabled because the crawl manifest is invalid JSON.",{manifestPath:i,error:c instanceof Error?c.message:String(c),source:"deploy-guard"}),null}let o=new Map,l=new Map,a=0,u=0;for(let[c,p]of Object.entries(s.pages||{})){let g=String(p?.outputPath||"").trim(),d=g?Ze(e.outputDir,g):null;if(d){let w=typeof p?.contentType=="string"&&p.contentType?p.contentType:null;w&&l.set(d,w);}!g||p?.rewriteComplete===true||d&&(a++,o.has(d)||o.set(d,{kind:"page",sourceUrl:c,outputPath:b.resolve(g),relativePath:d}));}for(let[c,p]of Object.entries(s.assets||{})){let g=String(p?.outputPath||"").trim(),d=p?.isText===true,w=g?Ze(e.outputDir,g):null;if(w){let y=typeof p?.contentType=="string"&&p.contentType?p.contentType:null;y&&l.set(w,y);}!g||!d||p?.rewriteComplete===true||w&&(u++,o.has(w)||o.set(w,{kind:"asset",sourceUrl:c,outputPath:b.resolve(g),relativePath:w}));}return {manifestPath:i,byRelativePath:o,contentTypeByRelativePath:l,pendingPages:a,pendingTextAssets:u}}function vr(e){return e&&(Re.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 be(e){return e.split(/([_:.\-/=?&#]+)/g).map((t,r)=>r%2===1?t:vr(t)).join("")}function Rr(e){return e.split(/([_:.\-/=?&#]+)/g).map((t,r)=>r%2===1?t:Re.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 ie(e,t){return Array.isArray(e)?e.map(r=>ie(r,t)):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([r,i])=>[r,ie(i,r)])):typeof e!="string"?e:t&&mr.test(t)?Rr(e):Re.test(e)?"__uuid__":/^[0-9a-f]{6,}$/i.test(e)||/^[0-9]{8,}$/.test(e)?be(e):e}function $r(e){return e.replace(/((?:https?:\/\/[^"'\s>]+|\/)(?:wp-content|wp-includes)\/[^"'\s>?]+)\?ver=[A-Za-z0-9._-]+(?=$|[#"'])/gi,"$1")}function Dr(e,t){let r=t.trim();if((r.startsWith("{")||r.startsWith("[")||r.startsWith('"'))&&e.startsWith("data-"))try{let n=JSON.parse(r);return JSON.stringify(ie(n))}catch{}if(e.startsWith("data-")&&/^[A-Za-z0-9+/=]+$/.test(r))try{let n=Buffer.from(r,"base64").toString("utf8"),s=JSON.parse(n),o=JSON.stringify(ie(s));return Buffer.from(o,"utf8").toString("base64")}catch{}return t}function xr(e,t){let r=e.toLowerCase();return r==="class"?t.split(/(\s+)/).map((i,n)=>n%2===1?i:be(i)).join(""):r==="id"||r==="for"||r==="aria-controls"||r==="aria-labelledby"||r==="aria-describedby"||r==="aria-owns"||r==="aria-activedescendant"||r==="name"?be(t):r==="href"||r==="src"?$r(t):Dr(r,t)}function Tr(e){return e.replace(/<([a-z][^\s/>]*)([^<>]*?)>/gi,(t,r,i)=>{if(r.startsWith("/"))return t;let n=i.replace(/\s([:@a-zA-Z_][-:.a-zA-Z0-9_]*?)=(['"])([\s\S]*?)\2/g,(s,o,l,a)=>{let u=xr(o,a);return ` ${o}=${l}${u}${l}`});return `<${r}${n}>`})}function ye(e){let t=b.extname(e).toLowerCase();return [".html",".htm",".xml",".xsl",".txt"].includes(t)||["robots.txt","sitemap.xml"].includes(b.basename(e))}function re(e,t){return [e.replace(/^\/+|\/+$/g,""),t.replace(/^\/+/,"")].filter(Boolean).join("/")}async function Cr(e,t,r,i){let n=new Map,s,o=0;do{o++;let l=await j(`S3 list objects page ${o} for s3://${t}/${r||""}`,3e5,({httpOptions:a})=>e.send(new ListObjectsV2Command({Bucket:t,Prefix:r||void 0,ContinuationToken:s}),a));for(let a of l.Contents||[]){if(!a.Key)continue;let u=(a.ETag||"").replace(/^"|"$/g,"").toLowerCase(),c=Number(a.Size??0);n.set(a.Key,{etag:u,size:c});}s=l.NextContinuationToken,i.debug(`Listed S3 keys page ${o}: ${n.size} keys so far`);}while(s);return n}async function Er(e,t,r,i){if(i.has(r))return i.get(r)??null;try{let n=await j(`S3 head object ${r}`,3e5,({httpOptions:o})=>e.send(new HeadObjectCommand({Bucket:t,Key:r}),o)),s={etag:(n.ETag||"").replace(/^"|"$/g,"").toLowerCase(),size:Number(n.ContentLength??0)};return i.set(r,s),s}catch{return i.set(r,null),null}}async function Mr(e,t,r,i){let n=[...new Set(Array.from(r).filter(Boolean))];if(n.length===0)return i.info("No explicitly tombstoned S3 objects to delete."),[];i.info(`Deleting ${n.length} explicitly tombstoned S3 object(s)\u2026`);for(let s=0;s<n.length;s+=1e3){let o=n.slice(s,s+1e3);if(o.length!==0){await j(`S3 delete objects batch ${Math.floor(s/1e3)+1}`,3e5,({httpOptions:l})=>e.send(new DeleteObjectsCommand({Bucket:t,Delete:{Objects:o.map(a=>({Key:a}))}}),l)),i.info(`Deleted batch of ${o.length} object(s).`);for(let l of o)i.debug(` deleted: ${l}`);}}return n}function kr(e){return createHash("md5").update(e).digest("hex")}function Xe(e){return createHash("sha256").update(e).digest("hex")}function Pe(e){return createHash("sha256").update(Tr(e.toString("utf8"))).digest("hex")}async function Ir(e,t,r,i){if(i.has(r))return i.get(r)??null;try{let o=((await j(`S3 head object metadata ${r}`,3e5,({httpOptions:l})=>e.send(new HeadObjectCommand({Bucket:t,Key:r}),l))).Metadata?.[et]||"").trim().toLowerCase()||null;return i.set(r,o),o}catch{return i.set(r,null),null}}async function Lr(e,t,r,i,n){if(i.has(r))return i.get(r)??null;try{let o=((await j(`S3 head object normalized metadata ${r}`,3e5,({httpOptions:l})=>e.send(new HeadObjectCommand({Bucket:t,Key:r}),l))).Metadata?.[tt]||"").trim().toLowerCase();if(o)return i.set(r,o),o}catch{return i.set(r,null),null}if(n.has(r)){let s=n.get(r)??null;return i.set(r,s),s}try{let o=await(await j(`S3 get object ${r}`,3e5,({httpOptions:a})=>e.send(new GetObjectCommand({Bucket:t,Key:r}),a))).Body?.transformToByteArray(),l=o?Pe(Buffer.from(o)):null;return n.set(r,l),i.set(r,l),l}catch{return n.set(r,null),i.set(r,null),null}}function Or(e){return e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")||"profile"}function jr(e,t){let r=e,i=Object.entries(t).sort((n,s)=>s[0].length-n[0].length);for(let[n,s]of i)n&&(r=r.split(n).join(s));return r}async function Ar(e,t,r,i){let n=b.join(e,"asset-map.json"),s;try{s=await D.readFile(n,"utf8");}catch(a){if(a.code==="ENOENT")return;throw a}let o=JSON.parse(s);if(!o||typeof o!="object")return;let l=Object.fromEntries(Object.entries(o).map(([a,u])=>{let c=String(u??"");return t.urlRewriteMode==="absolute"&&t.targetOrigin&&r.targetOrigin&&t.targetOrigin!==r.targetOrigin&&(c=c.split(t.targetOrigin).join(r.targetOrigin)),c=jr(c,i),[a,c]}));await D.writeFile(n,JSON.stringify(l,null,2),"utf8");}async function Fr(e,t,r,i,n){let s=e.targetOrigin!==t.targetOrigin,o=Object.keys(i).length>0;if(!r||!s&&!o)return {outputDir:e.outputDir,cleanup:async()=>{}};if(s&&e.urlRewriteMode!=="absolute")throw new Error(`Deployment profile "${r}" changes targetOrigin, but the base crawl output must use urlRewriteMode "absolute" for multi-target redeploys.`);let l=b.join(b.dirname(e.outputDir),`.deploy-profile-${Or(r)}-${Date.now()}`),a=wr(l);n.info(`Preparing deployment profile "${r}" from existing crawl output to ${l}...`);try{await D.rm(l,{recursive:!0,force:!0}),await D.cp(e.outputDir,l,{recursive:!0});let u={...e,sourceOrigin:e.targetOrigin,targetOrigin:t.targetOrigin,extraReplacements:i,outputDir:l},c=1;n.info(`Rewriting text files for deployment profile "${r}"...`);let p=await Qe(u,{},{onStart:({totalFiles:g,workerCount:d})=>{c=d,n.info(`Rewriting ${g} text file(s) for deployment profile "${r}" with ${d} worker(s).`);},onProgress:({index:g,totalFiles:d,changedTextFiles:w,file:y,changed:v})=>{let k=`Rewriting [${g}/${d}] ${y} (${v?"rewrote":"checked"}; ${w} changed so far)`;d<=200||g<=5||g%10===0||g===d?(n.progress(k,{file:y,index:g,totalFiles:d,changed:v,changedTextFiles:w,workerCount:c}),n.info(k)):n.debug(k);}});return await Ar(l,e,t,i),n.info(`Prepared deployment profile "${r}" in ${l} (${p} rewritten text file(s)).`),{outputDir:l,cleanup:async()=>{a(),await D.rm(l,{recursive:!0,force:!0});}}}catch(u){throw n.error(`Failed to prepare deployment profile "${r}" temporary output.`,{tempDir:l,outputDir:e.outputDir,error:u instanceof Error?u.message:String(u),...u instanceof Error&&u.stack?{stack:u.stack}:{}}),await D.rm(l,{recursive:true,force:true}).catch(()=>{}),a(),await n.flush().catch(()=>{}),u}}async function _r(){let e=await de(),t=Ae(process.argv.slice(2)),r=Fe(e,t),i=b.resolve(r.config.logDir||"logs"),n=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",s=n?b.join(b.resolve(n),"deploy-diff.json"):"",o=new G(i,"deploy.log.jsonl",r.config.logLevel??"info"),l=r.profile?.extraReplacements??{},a=async()=>{};try{let u=await je(e);if(u)throw new Error(`Deployment blocked: the crawl started at ${u.startedAt} did not complete its final rewrite. Run a successful crawl or resume the rewrite before deploying.`);let c=await Fr(e,r.config,r.name,l,o);a=c.cleanup;let p={...r.config,outputDir:c.outputDir},g=p.s3SyncMode??"sdk-upload-delete",d=await Le(e),w=c.outputDir!==e.outputDir&&(e.targetOrigin!==r.config.targetOrigin||Object.keys(l).length>0),y=!!d&&!d.fullSyncRequired&&!w;r.name&&o.info(`Using deployment profile: ${r.name}`),o.info(`Starting deploy \u2014 s3://${p.s3.bucket}/${p.s3.prefix||""} (region: ${p.s3.region})`),o.info(`S3 sync mode: ${g}`),d&&d.fullSyncRequired?o.info("Deploy plan requests a full sync; scanning the whole output tree."):d&&w?o.info("Ignoring incremental deploy plan because deployment-profile rewrites require a full sync."):y&&o.info(`Using incremental deploy plan: ${d.changedFiles.length} changed file(s), ${d.deletedFiles.length} deleted file(s).`),o.mark("deploy");let v=new S3Client({region:p.s3.region}),R=c.outputDir===e.outputDir?await Sr(e,n,o):null,k=y?(await Promise.all(d.changedFiles.map(async h=>{try{return (await D.stat(b.join(p.outputDir,h))).isFile()?h:null}catch{return null}}))).filter(h=>h!==null):await Wt(["**/*"],{cwd:p.outputDir,onlyFiles:!0,dot:!0}),L=[],Q=[],m=k.filter(h=>{let T=R?.byRelativePath.get(rt(h));if(!T)return !0;let f=re(p.s3.prefix,h);return L.push(h),Q.push(f),o.reject(T.kind,T.sourceUrl||h,"rewrite not completed; deploy upload blocked","deploy-guard",{file:h,key:f,outputPath:T.outputPath,manifestPath:R?.manifestPath}),!1}),$e=new Set((y?m:k).map(h=>re(p.s3.prefix,h)));R&&(R.pendingPages>0||R.pendingTextAssets>0)&&o.info(`Deploy rewrite guard loaded ${R.pendingPages} pending page(s) and ${R.pendingTextAssets} pending text asset(s) from crawl manifest.`,{manifestPath:R.manifestPath,pendingPages:R.pendingPages,pendingTextAssets:R.pendingTextAssets,source:"deploy-guard"}),L.length>0&&o.warn(`Deploy rewrite guard blocked ${L.length} file(s) from upload because final crawl rewrite is incomplete.`,{rejected:L.length,manifestPath:R?.manifestPath,source:"deploy-guard"}),y?o.info(`Using ${m.length} eligible planned changed file(s) from deploy plan for upload${L.length>0?` (${L.length} blocked by deploy rewrite guard)`:""}.`):o.info(`Found ${k.length} file(s) in output directory "${p.outputDir}"${L.length>0?`; ${m.length} remain eligible for upload after deploy rewrite guard filtering`:""}.`),o.progress("Deploy preflight: comparing local output with remote S3 state.",{phase:"deploy",mode:g,totalFiles:m.length,scannedFiles:k.length,rejected:L.length,deploymentProfile:r.name||"",s3Bucket:p.s3.bucket,s3Prefix:p.s3.prefix||"",targetedPlan:y,deployGuardEnabled:c.outputDir===e.outputDir});let x=0,S=0,F=0,se=[],q=[],oe=[],ae=[],_=[],U=new Map,nt=new Map,it=new Map,st=new Map,ot=new Map;y||(o.info("Listing existing S3 objects to detect unchanged files..."),U=await Cr(v,p.s3.bucket,p.s3.prefix,o),o.info(`Found ${U.size} existing key(s) in S3.`));let at=async h=>U.has(h)?U.get(h)??null:y?Er(v,p.s3.bucket,h,nt):null;for(let h of m){let T=b.join(p.outputDir,h),f=re(p.s3.prefix,h),C=R?.contentTypeByRelativePath.get(h),H=C&&C!=="application/octet-stream"?C:fr.lookup(h)||C||"application/octet-stream",lt=ye(h)?p.s3.htmlCacheControl:p.s3.assetCacheControl,P=x+S+F+1;m.length<=200||P<=5||P%10===0||P===m.length?(o.progress(`Uploading [${P}/${m.length}] ${f} (${H})`,{file:h,key:f,index:P,totalFiles:m.length,contentType:H,mode:g}),o.info(`Uploading [${P}/${m.length}] ${f} (${H})`)):o.debug(`Uploading [${P}/${m.length}] ${f} (${H})`);try{let E=await D.readFile(T),J=await at(f),K=null,N=null;if(J){let le=E.byteLength;if(J.size===le){let Y=J.etag.includes("-");if(J.etag!==""&&!Y){let ut=kr(E);if(J.etag===ut){S++,m.length<=200||S<=5||S%25===0?(o.progress(`Skipped unchanged [${P}/${m.length}] ${f}`,{file:h,key:f,index:P,totalFiles:m.length,uploaded:x,skipped:S,failed:F,mode:g,reason:"etag-md5-match"}),o.info(`Skipped unchanged [${P}/${m.length}] ${f}`)):o.debug(`Skipped unchanged [${P}/${m.length}] ${f}`),q.push(f);continue}}K=Xe(E);let De=await Ir(v,p.s3.bucket,f,it);if(De&&De===K){S++,m.length<=200||S<=5||S%25===0?(o.progress(`Skipped unchanged [${P}/${m.length}] ${f}`,{file:h,key:f,index:P,totalFiles:m.length,uploaded:x,skipped:S,failed:F,mode:g,reason:"metadata-sha256-match"}),o.info(`Skipped unchanged [${P}/${m.length}] ${f}`)):o.debug(`Skipped unchanged [${P}/${m.length}] ${f}`),q.push(f);continue}}if(ye(h)){N=Pe(E);let Y=await Lr(v,p.s3.bucket,f,st,ot);if(Y&&Y===N){S++,m.length<=200||S<=5||S%25===0?(o.progress(`Skipped semantically unchanged [${P}/${m.length}] ${f}`,{file:h,key:f,index:P,totalFiles:m.length,uploaded:x,skipped:S,failed:F,mode:g,reason:"normalized-html-match"}),o.info(`Skipped semantically unchanged [${P}/${m.length}] ${f}`)):o.debug(`Skipped semantically unchanged [${P}/${m.length}] ${f}`),q.push(f);continue}}}K=K??Xe(E),N=N??(ye(h)?Pe(E):null),await j(`S3 upload ${f}`,9e5,({abortController:le})=>new Upload({client:v,abortController:le,params:{Bucket:p.s3.bucket,Key:f,Body:E,ContentType:H,CacheControl:lt,Metadata:{[et]:K,...N?{[tt]:N}:{}}}}).done()),x++,se.push(f),(x%25===0||x===m.length)&&(o.progress(`Uploaded ${x}/${m.length} file(s)\u2026`,{uploaded:x,skipped:S,failed:F,totalFiles:m.length,mode:g}),o.info(`Uploaded ${x}/${m.length} file(s)\u2026`));}catch(E){F++,oe.push(f),o.error(`Failed to upload ${f}: ${E.message}`,{key:f,error:String(E)});}}if(o.info(`Upload complete: ${x} uploaded, ${S} skipped unchanged, ${Q.length} rejected by guard, ${F} failed.`),g==="sdk-upload-delete"){let h=new Set((d?.deletedFiles??[]).map(f=>re(p.s3.prefix,f))),T=[...h].filter(f=>!$e.has(f));if(!y&&(_=[...U.keys()].filter(C=>!$e.has(C)).filter(C=>!h.has(C)),_.length>0)){o.warn(`Protected ${_.length} remote-only S3 object(s) from deletion because the crawl did not provide explicit tombstones.`,{protected:_.length,source:"deploy-delete-guard"});for(let C of _)o.debug(` protected remote-only object: ${C}`);}ae=await Mr(v,p.s3.bucket,y?T:T.filter(f=>U.has(f)),o);}else o.info("Sync mode is sdk-upload-only \u2014 skipping stale object deletion.");s&&(await D.mkdir(b.dirname(s),{recursive:!0}),await D.writeFile(s,JSON.stringify({generatedAt:new Date().toISOString(),mode:g,summary:{totalFiles:k.length,eligibleFiles:m.length,uploaded:se.length,skipped:q.length,rejected:Q.length,failed:oe.length,deleted:ae.length,protected:_.length,...r.name?{profile:r.name}:{}},uploadedKeys:se,skippedKeys:q,rejectedKeys:Q,failedKeys:oe,deletedKeys:ae,protectedRemoteOnlyKeys:_},null,2),"utf8")),await Oe(e),o.endMark("deploy"),await o.flush();}finally{await a().catch(()=>{});}}_r().catch(async e=>{console.error(e);try{let r=(await de().catch(()=>null))?.logDir??"logs",i=new G(r,"deploy.log.jsonl","debug");i.error(`Unhandled error: ${e instanceof Error?e.message:String(e)}`,e instanceof Error?{stack:e.stack}:void 0),await i.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.34",
3
+ "version": "1.1.36",
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.",
@@ -45,6 +45,8 @@
45
45
  "@aws-sdk/lib-storage": "^3.1100.0",
46
46
  "@smart-cloud/publisher-core": "^1.1.5",
47
47
  "@smart-cloud/wpsuite-core": "^2.3.2",
48
+ "baseline-browser-mapping": "^2.11.12",
49
+ "caniuse-lite": "^1.0.30001809",
48
50
  "fast-glob": "^3.3.3",
49
51
  "jose": "^6.2.8",
50
52
  "mime-types": "^3.0.2",