@smart-cloud/publisher-exporter 1.1.5 → 1.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/crawl.js CHANGED
@@ -1,6 +1,6 @@
1
- import {chromium}from'playwright';import y from'fs/promises';import h from'path';import {gunzipSync}from'zlib';import {getConfig}from'@smart-cloud/wpsuite-core';import Ot from'crypto';import Et from'fast-glob';import {availableParallelism}from'os';import {Worker}from'worker_threads';var mt=".deploy-plan.json",wt="deploy-plan.json";function Pt(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?h.resolve(e):""}function Ae(e){let t=String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").trim();return !t||t==="."||t.startsWith("../")||t===".."?null:t}function ie(e){return [...new Set(e.map(Ae).filter(t=>t!==null))]}function St(e,t){return {schemaVersion:1,generatedAt:String(t.generatedAt||new Date().toISOString()),outputDir:h.resolve(e.outputDir),runMode:t.runMode,crawlMode:t.crawlMode,fullSyncRequired:!!t.fullSyncRequired,changedFiles:ie(t.changedFiles||[]),deletedFiles:ie(t.deletedFiles||[]),rewriteTargets:ie(t.rewriteTargets||[])}}function yt(e){let t=h.join(h.resolve(e.outputDir),mt),s=Pt();return s?[h.join(s,wt),t]:[t]}function V(e,t){let s=h.resolve(e),r=h.resolve(t),n=h.relative(s,r).replace(/\\/g,"/");return Ae(n)}async function Te(e,t){let s=St(e,t);for(let r of yt(e))await y.mkdir(h.dirname(r),{recursive:true}),await y.writeFile(r,JSON.stringify(s,null,2),"utf8");}function Le(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function Rt(e){let t=String(e??"").trim();if(!t)return "";let s=t;if(/^https?:\/\//i.test(s))try{s=new URL(s).pathname;}catch{return ""}if(s=s.split(/[?#]/,1)[0]?.replace(/\\/g,"/").trim()??"",!s)return "";let r=s.endsWith("/"),n=s.replace(/^\/+/,"").split("/").map(o=>o.replace(/[^A-Za-z0-9._-]/g,"")).filter(o=>o.length>0&&o!=="."&&o!=="..");if(n.length===0)return "";let i=`/${n.join("/")}`;return r&&h.extname(i)===""&&(i+="/"),i==="/"?"":i}function oe(e){return !e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).map(([t,s])=>[t.trim(),String(s??"")]).filter(([t])=>t.length>0))}function Ct(e){if(!e||typeof e!="object")return {};let t={};for(let[s,r]of Object.entries(e)){let n=s.trim();if(!n||!r||typeof r!="object")continue;let i=r,o={};if(typeof i.targetOrigin=="string"){let a=Le(i.targetOrigin);a&&(o.targetOrigin=a);}let l=oe(i.extraReplacements);if(Object.keys(l).length>0&&(o.extraReplacements=l),i.s3&&typeof i.s3=="object"){let a={},c=i.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(i.cloudFront&&typeof i.cloudFront=="object"){let a={},c=i.cloudFront;typeof c.distributionId=="string"&&(a.distributionId=c.distributionId.trim()),Array.isArray(c.invalidationPaths)&&(a.invalidationPaths=c.invalidationPaths.map(u=>String(u??"").trim()).filter(u=>u.length>0)),Object.keys(a).length>0&&(o.cloudFront=a);}t[n]=o;}return t}function Ie(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function xt(e,t){if(!e||typeof e!="object")return null;let s=e,r=s.command;if(r!=="publish"&&r!=="crawl"&&r!=="deploy"&&r!=="invalidate"&&r!=="retry-timeouts"&&r!=="url")return null;let n=Number.parseInt(String(s.intervalMinutes??"0"),10);if(!Number.isFinite(n)||n<1)return null;let i=String(s.id??`${r}-${t+1}`).trim();if(!i)return null;let o=String(s.deploymentProfile??"").trim(),l=String(s.url??"").trim();return {id:i,enabled:s.enabled!==false,command:r,intervalMinutes:n,...r==="publish"||r==="crawl"?{crawlMode:s.crawlMode==="incremental"?"incremental":"full"}:{},...(r==="publish"||r==="deploy"||r==="invalidate")&&o?{deploymentProfile:o}:{},...l?{url:l}:{}}}function Oe(e){let t=e&&typeof e=="object"?e:{},s=Array.isArray(t.rules)?t.rules.map((r,n)=>xt(r,n)).filter(r=>!!r):[];return {enabled:t.enabled===true,timezone:typeof t.timezone=="string"&&t.timezone.trim()!==""?t.timezone.trim():"UTC",rules:s}}function kt(e){if(!e||typeof e!="object")return;let t=e,s={};for(let n of ["accountId","siteId"]){let i=t[n];typeof i=="string"&&i.trim()!==""&&(s[n]=i.trim());}let r=Number(t.lastUpdate??0);return Number.isFinite(r)&&r>0&&(s.lastUpdate=Math.floor(r)),t.subscriber===true&&(s.subscriber=true),Object.keys(s).length>0?s:void 0}function ue(e){let t=e&&typeof e=="object"?e:{},s=String(t.accountId??"").trim(),r=String(t.siteId??"").trim(),n=t.subscriber===true,i=kt(t.siteSettings),o={...i??{},...s?{accountId:i?.accountId??s}:{},...r?{siteId:i?.siteId??r}:{},...i?.subscriber===true||n?{subscriber:true}:{}},l={},a=String(t.apiBase??"").trim();a&&(l.apiBase=a);let c=String(t.runtimeToken??t.nonce??"").trim();c&&(l.runtimeToken=c);let u=String(t.uploadUrl??"").trim();u&&(l.uploadUrl=u),Object.keys(o).length>0&&(l.siteSettings=o);let p=Ie(t.subscriptionType);return p&&(l.subscriptionType=p),l}function At(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function Tt(e){let t=ue(e.wpsuite),s={...t.siteSettings??{},...t.siteSettings?.subscriber===true||t.subscriptionType==="PROFESSIONAL"||t.subscriptionType==="AGENCY"?{subscriber:true}:{}},r=String(s.accountId??"").trim(),n=String(s.siteId??"").trim(),i=String(t.uploadUrl??"").trim();if(e.wpsuite={...t.apiBase?{apiBase:t.apiBase}:{},...t.runtimeToken?{runtimeToken:t.runtimeToken}:{},...i?{uploadUrl:i}:{},...Object.keys(s).length>0?{siteSettings:s}:{},...t.subscriptionType?{subscriptionType:t.subscriptionType}:{}},!r||!n||!i)return false;At(e.sourceOrigin);let o=globalThis,a={...o.WpSuite??{},siteSettings:s,uploadUrl:i};return t.apiBase&&(a.apiBase=t.apiBase),o.WpSuite=a,true}async function Mt(e){if(!Tt(e))return null;try{let t=await getConfig("publisher");return t&&typeof t=="object"?t:null}catch{return null}}function Lt(e,t){let s=Ct(t?.deploymentProfiles),r=String(t?.defaultDeploymentProfile??"").trim(),n=s[r]?r:"",i=Ie(t?.subscriptionType),o=ue(e.wpsuite);return {...e,scheduler:Oe(t?.scheduler),deploymentProfiles:s,defaultDeploymentProfile:n,...i?{subscriptionType:i}:{},wpsuite:{...o,...o.siteSettings||i?{siteSettings:{...o.siteSettings??{},...o.siteSettings?.subscriber===true||i==="PROFESSIONAL"||i==="AGENCY"?{subscriber:true}:{}}}:{},...i?{subscriptionType:i}:{}}}}function ae(e,t){let r=String(e||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!r)return t;let n=r.split("/").map(i=>i.trim()).filter(i=>i.length>0&&i!=="."&&i!=="..");return n.length>0?n.join("/"):t}function It(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?h.resolve(e):""}function Me(e,t,s){let r=String(t||"").trim();return r&&h.isAbsolute(r)?h.resolve(r):h.resolve(e,ae(r,s))}async function le(e){let t=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",s=await y.readFile(t,"utf8"),r=JSON.parse(s);r.sourceOrigin=r.sourceOrigin.replace(/\/$/,""),r.targetOrigin=Le(r.targetOrigin),r.ignoreHttpsErrors??=false,r.outputDir=String(r.outputDir||"export").trim()||"export",r.urlRewriteMode||=r.targetOrigin==="."?"relative":"absolute",r.noJavaScriptRenderPathPrefixes||=[],r.seedPaths||=[],r.generated404RequestPath=Rt(r.generated404RequestPath),r.sitemapPaths||=["/sitemap_index.xml","/sitemap.xml"],r.allowedAssetHosts||=[],r.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],r.blockedPathPrefixes||=[],r.blockedSearchFragments||=[],r.concurrency||=1,r.maxPages||=0,r.extraReplacements=oe(r.extraReplacements),r.postCrawlCopyMap=oe(r.postCrawlCopyMap),r.logDir=String(r.logDir||"logs").trim()||"logs",r.verbose??=false,r.logLevel||=r.verbose?"debug":"info",r.s3SyncMode||="sdk-upload-delete",r.readiness||={waitForSelector:null,waitForFunction:null,timeoutMs:1500,fallbackWaitMs:1500},r.readiness.timeoutMs??=1500,r.readiness.fallbackWaitMs??=1500,r.viewport||={width:1440,height:1200},r.navigationTimeoutMs||=3e4,r.assetDownloadConcurrency=Number(r.assetDownloadConcurrency)>0?Number(r.assetDownloadConcurrency):r.concurrency,r.rewriteConcurrency=Number(r.rewriteConcurrency)>0?Number(r.rewriteConcurrency):r.assetDownloadConcurrency,r.wpsuite=ue(r.wpsuite),r.scheduler=Oe(void 0),r.deploymentProfiles={},r.defaultDeploymentProfile="",r.deploymentTargetOverride=String(r.deploymentTargetOverride??"").trim();let n=Lt(r,await Mt(r)),i=It(),o=i?h.resolve(i,".."):"";return o?(n.outputDir=Me(o,n.outputDir,"export"),n.logDir=Me(o,n.logDir,"logs")):(h.isAbsolute(n.outputDir)||(n.outputDir=ae(n.outputDir,"export")),h.isAbsolute(n.logDir)||(n.logDir=ae(n.logDir,"logs"))),n}function ce(e,t=10){return Ot.createHash("sha1").update(e).digest("hex").slice(0,t)}async function de(e){await y.mkdir(h.dirname(e),{recursive:true});}function U(e){return [".html",".htm",".css",".js",".mjs",".json",".xml",".xsl",".txt",".svg",".map",".enc",".jws"].includes(h.extname(e).toLowerCase())}function j(e){return e.replace(/&quot;/g,'"').replace(/&#34;/g,'"').replace(/&apos;/g,"'").replace(/&#39;/g,"'").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">")}function Q(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function G(e){return e.replace(/\//g,"\\/")}function De(e){return e.replace(/\//g,"\\\\/")}function K(e,t,s){if(!t)return;e[t]=s;let r=G(t),n=G(s);e[r]=n;let i=De(t),o=De(s);e[i]=o;let l=Q(t),a=Q(s);e[l]=a;let c=Q(r),u=Q(n);e[c]=u;let p=Q(i),d=Q(o);e[p]=d;}function pe(e,t){let s=t.startsWith("/")?t:`/${t}`,r=(e||"").replace(/\/$/,"");return !r||r==="."||r==="/"?s:`${r}${s}`}function Ee(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function Fe(e,t,s){if(!t)return s;let r=h.dirname(h.resolve(t)),n=h.resolve(e,s.replace(/^\/+/,"")),i=h.relative(r,n).replace(/\\/g,"/");return i?(i.startsWith(".")||(i=`./${i}`),i):"."}var $t=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],Ut=new Set([".html",".htm"]),$e="WPSuite.io Static Publisher",Qt=$e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function Nt(e,t,s){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!s)return false;let n=h.extname(s).toLowerCase();return Ut.has(n)?/<head\b|<html\b|<!doctype html/i.test(t):false}function qt(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${Qt}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${$e}" />`;if(e.match(/(\r?\n)([ \t]*)<\/head>/i))return e.replace(/(\r?\n)([ \t]*)<\/head>/i,`$1$2${t}$1$2</head>`);let r=e.includes(`\r
1
+ import {chromium}from'playwright';import P from'fs/promises';import f from'path';import {gunzipSync}from'zlib';import {getConfig}from'@smart-cloud/wpsuite-core';import Ft from'crypto';import Ot from'fast-glob';import {availableParallelism}from'os';import {Worker}from'worker_threads';var mt=".deploy-plan.json",wt="deploy-plan.json";function Pt(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?f.resolve(e):""}function Te(e){let t=String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").trim();return !t||t==="."||t.startsWith("../")||t===".."?null:t}function ie(e){return [...new Set(e.map(Te).filter(t=>t!==null))]}function yt(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:ie(t.changedFiles||[]),deletedFiles:ie(t.deletedFiles||[]),rewriteTargets:ie(t.rewriteTargets||[])}}function St(e){let t=f.join(f.resolve(e.outputDir),mt),s=Pt();return s?[f.join(s,wt),t]:[t]}function G(e,t){let s=f.resolve(e),r=f.resolve(t),n=f.relative(s,r).replace(/\\/g,"/");return Te(n)}async function Ae(e,t){let s=yt(e,t);for(let r of St(e))await P.mkdir(f.dirname(r),{recursive:true}),await P.writeFile(r,JSON.stringify(s,null,2),"utf8");}function Le(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function Rt(e){let t=String(e??"").trim();if(!t)return "";let s=t;if(/^https?:\/\//i.test(s))try{s=new URL(s).pathname;}catch{return ""}if(s=s.split(/[?#]/,1)[0]?.replace(/\\/g,"/").trim()??"",!s)return "";let r=s.endsWith("/"),n=s.replace(/^\/+/,"").split("/").map(a=>a.replace(/[^A-Za-z0-9._-]/g,"")).filter(a=>a.length>0&&a!=="."&&a!=="..");if(n.length===0)return "";let i=`/${n.join("/")}`;return r&&f.extname(i)===""&&(i+="/"),i==="/"?"":i}function oe(e){return !e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).map(([t,s])=>[t.trim(),String(s??"")]).filter(([t])=>t.length>0))}function Ct(e){if(!e||typeof e!="object")return {};let t={};for(let[s,r]of Object.entries(e)){let n=s.trim();if(!n||!r||typeof r!="object")continue;let i=r,a={};if(typeof i.targetOrigin=="string"){let o=Le(i.targetOrigin);o&&(a.targetOrigin=o);}let u=oe(i.extraReplacements);if(Object.keys(u).length>0&&(a.extraReplacements=u),i.s3&&typeof i.s3=="object"){let o={},l=i.s3;typeof l.bucket=="string"&&(o.bucket=l.bucket.trim()),typeof l.prefix=="string"&&(o.prefix=l.prefix.trim()),typeof l.region=="string"&&(o.region=l.region.trim()),typeof l.htmlCacheControl=="string"&&(o.htmlCacheControl=l.htmlCacheControl.trim()),typeof l.assetCacheControl=="string"&&(o.assetCacheControl=l.assetCacheControl.trim()),Object.keys(o).length>0&&(a.s3=o);}if(i.cloudFront&&typeof i.cloudFront=="object"){let o={},l=i.cloudFront;typeof l.distributionId=="string"&&(o.distributionId=l.distributionId.trim()),Array.isArray(l.invalidationPaths)&&(o.invalidationPaths=l.invalidationPaths.map(c=>String(c??"").trim()).filter(c=>c.length>0)),Object.keys(o).length>0&&(a.cloudFront=o);}t[n]=a;}return t}function Ie(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function xt(e,t){if(!e||typeof e!="object")return null;let s=e,r=s.command;if(r!=="publish"&&r!=="crawl"&&r!=="deploy"&&r!=="invalidate"&&r!=="retry-timeouts"&&r!=="url")return null;let n=Number.parseInt(String(s.intervalMinutes??"0"),10);if(!Number.isFinite(n)||n<1)return null;let i=String(s.id??`${r}-${t+1}`).trim();if(!i)return null;let a=String(s.deploymentProfile??"").trim(),u=String(s.url??"").trim();return {id:i,enabled:s.enabled!==false,command:r,intervalMinutes:n,...r==="publish"||r==="crawl"?{crawlMode:s.crawlMode==="incremental"?"incremental":"full"}:{},...(r==="publish"||r==="deploy"||r==="invalidate")&&a?{deploymentProfile:a}:{},...u?{url:u}:{}}}function Fe(e){let t=e&&typeof e=="object"?e:{},s=Array.isArray(t.rules)?t.rules.map((r,n)=>xt(r,n)).filter(r=>!!r):[];return {enabled:t.enabled===true,timezone:typeof t.timezone=="string"&&t.timezone.trim()!==""?t.timezone.trim():"UTC",rules:s}}function kt(e){if(!e||typeof e!="object")return;let t=e,s={};for(let n of ["accountId","siteId"]){let i=t[n];typeof i=="string"&&i.trim()!==""&&(s[n]=i.trim());}let r=Number(t.lastUpdate??0);return Number.isFinite(r)&&r>0&&(s.lastUpdate=Math.floor(r)),t.subscriber===true&&(s.subscriber=true),Object.keys(s).length>0?s:void 0}function ue(e){let t=e&&typeof e=="object"?e:{},s=String(t.accountId??"").trim(),r=String(t.siteId??"").trim(),n=t.subscriber===true,i=kt(t.siteSettings),a={...i??{},...s?{accountId:i?.accountId??s}:{},...r?{siteId:i?.siteId??r}:{},...i?.subscriber===true||n?{subscriber:true}:{}},u={},o=String(t.apiBase??"").trim();o&&(u.apiBase=o);let l=String(t.runtimeToken??t.nonce??"").trim();l&&(u.runtimeToken=l);let c=String(t.uploadUrl??"").trim();c&&(u.uploadUrl=c),Object.keys(a).length>0&&(u.siteSettings=a);let p=Ie(t.subscriptionType);return p&&(u.subscriptionType=p),u}function Tt(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function At(e){let t=ue(e.wpsuite),s={...t.siteSettings??{},...t.siteSettings?.subscriber===true||t.subscriptionType==="PROFESSIONAL"||t.subscriptionType==="AGENCY"?{subscriber:true}:{}},r=String(s.accountId??"").trim(),n=String(s.siteId??"").trim(),i=String(t.uploadUrl??"").trim();if(e.wpsuite={...t.apiBase?{apiBase:t.apiBase}:{},...t.runtimeToken?{runtimeToken:t.runtimeToken}:{},...i?{uploadUrl:i}:{},...Object.keys(s).length>0?{siteSettings:s}:{},...t.subscriptionType?{subscriptionType:t.subscriptionType}:{}},!r||!n||!i)return false;Tt(e.sourceOrigin);let a=globalThis,o={...a.WpSuite??{},siteSettings:s,uploadUrl:i};return t.apiBase&&(o.apiBase=t.apiBase),a.WpSuite=o,true}async function Mt(e){if(!At(e))return null;try{let t=await getConfig("publisher");return t&&typeof t=="object"?t:null}catch{return null}}function Lt(e,t){let s=Ct(t?.deploymentProfiles),r=String(t?.defaultDeploymentProfile??"").trim(),n=s[r]?r:"",i=Ie(t?.subscriptionType),a=ue(e.wpsuite);return {...e,scheduler:Fe(t?.scheduler),deploymentProfiles:s,defaultDeploymentProfile:n,...i?{subscriptionType:i}:{},wpsuite:{...a,...a.siteSettings||i?{siteSettings:{...a.siteSettings??{},...a.siteSettings?.subscriber===true||i==="PROFESSIONAL"||i==="AGENCY"?{subscriber:true}:{}}}:{},...i?{subscriptionType:i}:{}}}}function ae(e,t){let r=String(e||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!r)return t;let n=r.split("/").map(i=>i.trim()).filter(i=>i.length>0&&i!=="."&&i!=="..");return n.length>0?n.join("/"):t}function It(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?f.resolve(e):""}function Me(e,t,s){let r=String(t||"").trim();return r&&f.isAbsolute(r)?f.resolve(r):f.resolve(e,ae(r,s))}async function le(e){let t=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",s=await P.readFile(t,"utf8"),r=JSON.parse(s);r.sourceOrigin=r.sourceOrigin.replace(/\/$/,""),r.targetOrigin=Le(r.targetOrigin),r.ignoreHttpsErrors??=false,r.outputDir=String(r.outputDir||"export").trim()||"export",r.urlRewriteMode||=r.targetOrigin==="."?"relative":"absolute",r.noJavaScriptRenderPathPrefixes||=[],r.seedPaths||=[],r.generated404RequestPath=Rt(r.generated404RequestPath),r.sitemapPaths||=["/sitemap_index.xml","/sitemap.xml"],r.allowedAssetHosts||=[],r.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],r.blockedPathPrefixes||=[],r.blockedSearchFragments||=[],r.concurrency||=1,r.maxPages||=0,r.extraReplacements=oe(r.extraReplacements),r.postCrawlCopyMap=oe(r.postCrawlCopyMap),r.logDir=String(r.logDir||"logs").trim()||"logs",r.verbose??=false,r.logLevel||=r.verbose?"debug":"info",r.s3SyncMode||="sdk-upload-delete",r.readiness||={waitForSelector:null,waitForFunction:null,timeoutMs:1500,fallbackWaitMs:1500},r.readiness.timeoutMs??=1500,r.readiness.fallbackWaitMs??=1500,r.viewport||={width:1440,height:1200},r.navigationTimeoutMs||=3e4,r.assetDownloadConcurrency=Number(r.assetDownloadConcurrency)>0?Number(r.assetDownloadConcurrency):r.concurrency,r.rewriteConcurrency=Number(r.rewriteConcurrency)>0?Number(r.rewriteConcurrency):r.assetDownloadConcurrency,r.wpsuite=ue(r.wpsuite),r.scheduler=Fe(void 0),r.deploymentProfiles={},r.defaultDeploymentProfile="",r.deploymentTargetOverride=String(r.deploymentTargetOverride??"").trim();let n=Lt(r,await Mt(r)),i=It(),a=i?f.resolve(i,".."):"";return a?(n.outputDir=Me(a,n.outputDir,"export"),n.logDir=Me(a,n.logDir,"logs")):(f.isAbsolute(n.outputDir)||(n.outputDir=ae(n.outputDir,"export")),f.isAbsolute(n.logDir)||(n.logDir=ae(n.logDir,"logs"))),n}function ce(e,t=10){return Ft.createHash("sha1").update(e).digest("hex").slice(0,t)}async function de(e){await P.mkdir(f.dirname(e),{recursive:true});}function U(e){return [".html",".htm",".css",".js",".mjs",".json",".xml",".xsl",".txt",".svg",".map",".enc",".jws"].includes(f.extname(e).toLowerCase())}function E(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 Q(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function K(e){return e.replace(/\//g,"\\/")}function De(e){return e.replace(/\//g,"\\\\/")}function Y(e,t,s){if(!t)return;e[t]=s;let r=K(t),n=K(s);e[r]=n;let i=De(t),a=De(s);e[i]=a;let u=Q(t),o=Q(s);e[u]=o;let l=Q(r),c=Q(n);e[l]=c;let p=Q(i),d=Q(a);e[p]=d;}function pe(e,t){let s=t.startsWith("/")?t:`/${t}`,r=(e||"").replace(/\/$/,"");return !r||r==="."||r==="/"?s:`${r}${s}`}function Oe(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function Ee(e,t,s){if(!t)return s;let r=f.dirname(f.resolve(t)),n=f.resolve(e,s.replace(/^\/+/,"")),i=f.relative(r,n).replace(/\\/g,"/");return i?(i.startsWith(".")||(i=`./${i}`),i):"."}var $t=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],Ut=new Set([".html",".htm"]),$e="WPSuite.io Static Publisher",Qt=$e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function Nt(e,t,s){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!s)return false;let n=f.extname(s).toLowerCase();return Ut.has(n)?/<head\b|<html\b|<!doctype html/i.test(t):false}function qt(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${Qt}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${$e}" />`;if(e.match(/(\r?\n)([ \t]*)<\/head>/i))return e.replace(/(\r?\n)([ \t]*)<\/head>/i,`$1$2${t}$1$2</head>`);let r=e.includes(`\r
2
2
  `)?`\r
3
3
  `:`
4
- `;return e.replace(/<head\b[^>]*>/i,n=>`${n}${r} ${t}`)}function Wt(e){let t=j(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function _t(e,t){let s=[...new Set(t)].filter(i=>i.includes("/")&&!/\\+\//.test(i)).map(i=>[i,G(i)]).filter(([i,o])=>i!==o).sort((i,o)=>o[0].length-i[0].length);if(!s.length)return e;let r=i=>{let o=i;for(let[l,a]of s)o=o.split(l).join(a);return o},n=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(i,o,l,a)=>`${o}${r(l)}${a}`);return n=n.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(i,o,l,a,c)=>Wt(a)?`${o}${r(a)}${c}`:i),n}function Bt(e,t){if(!t)return null;let s=h.dirname(h.resolve(t)),r=h.resolve(e.outputDir),n=h.relative(s,r).replace(/\\/g,"/");return n?(n.startsWith(".")||(n=`./${n}`),n.endsWith("/")?n:`${n}/`):"./"}function Ht(e,t,s){let r=Bt(t,s);if(!r)return e;let n=e;for(let i of $t){let o=i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),l=new RegExp(`(?:\\.{1,}/)+${o}`,"g"),a=new RegExp(`(?<!\\.)/${o}`,"g");n=n.replace(l,`${r}${i}`).replace(a,`${r}${i}`);let c=i.replace(/\//g,"\\/"),u=r.replace(/\//g,"\\/"),p=c.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),d=new RegExp(`(?:\\.{1,}\\\\/)+${p}`,"g"),g=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${p}`,"g"),f=new RegExp(`(?<![\\.\\\\])\\/${p}`,"g");n=n.replace(d,`${u}${c}`).replace(g,`${u}${c}`).replace(f,`${u}${c}`);}return n}function he(e,t,s){if(e.urlRewriteMode==="absolute")return t;let r=(()=>{try{return new URL(t,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin)}catch{return null}})(),n=r?r.pathname:Ee(t,e.targetOrigin),i=r?`${r.search}${r.hash}`:"";return e.urlRewriteMode==="root-relative"?`${n}${i}`:`${Fe(e.outputDir,s,n)}${i}`}function ge(e,t,s,r,n){K(e,s,he(t,r,n));}function zt(e,t,s,r,n){if(!s||s===r)return;K(e,s,r);let i=he(t,s,n),o=he(t,r,n);K(e,i,o);}function fe(e,t,s,r,n={}){let i=e,o={};ge(o,t,t.sourceOrigin,t.targetOrigin,r);for(let[a,c]of Object.entries(t.extraReplacements))ge(o,t,a,c,r);for(let[a,c]of Object.entries(s))ge(o,t,a,c,r);for(let[a,c]of Object.entries(n)){let u=s[a];!u||u===c||zt(o,t,c,u,r);}let l=Object.entries(o).sort((a,c)=>c[0].length-a[0].length);for(let[a,c]of l)i=i.split(a).join(c);return t.urlRewriteMode!=="absolute"&&(i=Ht(i,t,r)),i=_t(i,l.map(([,a])=>a)),Nt(t,i,r)&&(i=qt(i)),i}async function Jt(e,t,s,r){let n=h.join(e.outputDir,r),i=h.extname(n).toLowerCase(),o;try{o=await y.readFile(n,"utf8");}catch(c){if(c.code!=="ENOENT")throw c;return {changed:false}}let a=fe(o,e,t,i===".js"||i===".mjs"?void 0:n,s);return a!==o?(await y.writeFile(n,a,"utf8"),{changed:true}):{changed:false}}async function Vt(e,t){return await new Promise((s,r)=>{let n=a=>{if(l(),a?.error){r(new Error(a.error));return}s({changed:!!a?.changed});},i=a=>{l(),r(a);},o=a=>{l(),a!==0&&r(new Error(`Rewrite worker exited with code ${a}.`));},l=()=>{e.off("message",n),e.off("error",i),e.off("exit",o);};e.on("message",n),e.on("error",i),e.on("exit",o),e.postMessage({file:t});})}async function Ue(e,t,s={}){let n=(s.files?[...new Set(s.files)].map(d=>h.resolve(d)).filter(d=>d.startsWith(h.resolve(e.outputDir))).map(d=>h.relative(e.outputDir,d).replace(/\\/g,"/")).filter(d=>d.length>0):await Et(["**/*"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(d=>d!=="asset-map.json"&&U(d)),i=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 s.onStart?.({totalFiles:n.length,workerCount:l});let a=0,c=0,u=null;if(l===1){for(let d of n){let g=await Jt(e,t,s.previousAssetMap??{},d);g.changed&&(i+=1),c+=1,await s.onProgress?.({index:c,totalFiles:n.length,changedTextFiles:i,file:d,changed:g.changed});}return i}let p=Array.from({length:l},async()=>{let d=new Worker(new URL("./rewrite-worker.js",import.meta.url),{workerData:{config:e,assetMap:t,previousAssetMap:s.previousAssetMap??{}}});try{for(;!u;){let g=a;if(g>=n.length)return;a+=1;let f=n[g],w=await Vt(d,f);w.changed&&(i+=1),c+=1,await s.onProgress?.({index:c,totalFiles:n.length,changedTextFiles:i,file:f,changed:w.changed});}}catch(g){throw u=g instanceof Error?g:new Error(String(g)),u}finally{await d.terminate().catch(()=>{});}});return await Promise.all(p),i}var q={error:0,warn:1,info:2,debug:3},Qe=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",Y=Qe?h.join(Qe,"current-progress.json"):"",Ne=Promise.resolve();function qe(e){return e.includes("crawl")?"crawl":e.includes("deploy")?"deploy":e.includes("invalidate")?"invalidate":e}function Gt(e,t){let s={...e},r=new Set(["pagesQueued","pagesRendered","assetsQueued","sitemapsQueued","pagesDiscovered","assetsDiscovered","sitemapsDiscovered","pagesSaved","assetsSaved","donePages","doneAssets","doneSitemaps","changedTextFiles","uploaded","failed","index","totalFiles","pageQueue","assetQueue","sitemapQueue"]);for(let[n,i]of Object.entries(t)){let o=s[n];if(typeof o=="number"&&typeof i=="number"&&r.has(n)){s[n]=Math.max(o,i);continue}s[n]=i;}return s}function Kt(e,t,s){Y&&(Ne=Ne.then(async()=>{let r=new Date,n=r.toISOString();await y.mkdir(h.dirname(Y),{recursive:true});let i=await y.readFile(Y,"utf8").then(w=>JSON.parse(w)).catch(()=>null),o=i&&typeof i.details=="object"&&i.details?i.details:{},l=qe(e),a=i?.currentStep||qe(i?.source||""),c=i?.startedAt||n,u={...i?.stepDurationsSec??{}},p=i?.stepStartedAt||n;if(a&&a!==l&&i?.stepStartedAt){let w=Math.max(0,Math.round((r.getTime()-new Date(i.stepStartedAt).getTime())/1e3));u[a]=(u[a]??0)+w,p=n;}let d=Math.max(0,Math.round((r.getTime()-new Date(p).getTime())/1e3)),g=Math.max(0,Math.round((r.getTime()-new Date(c).getTime())/1e3)),f={checkedAt:n,source:e,message:t,details:Gt(o,s??{}),startedAt:c,currentStep:l,stepStartedAt:p,stepElapsedSec:d,totalElapsedSec:g,stepDurationsSec:u};await y.writeFile(Y,JSON.stringify(f,null,2),"utf8");}).catch(()=>{}));}async function Yt(e,t){await y.mkdir(h.dirname(e),{recursive:true}),await y.appendFile(e,`${JSON.stringify(t)}
5
- `,"utf8");}function Xt(e,t){let s=typeof t?.phase=="string"?t.phase.trim():"";return s||(e==="page"?"render-pages":e==="asset"?"download-assets":e==="sitemap"?"discovery":e==="timing"&&typeof t?.name=="string"&&t.name.trim()||"crawl")}function Zt(e,t,s){return {checkedAt:new Date().toISOString(),currentStep:Xt(e,s),level:e,message:t,details:s??{}}}var W=class{constructor(t,s="info"){this.logDir=t;this.level=typeof s=="boolean"?s?"debug":"info":s,this.ensureLogFileReady();}logDir;startedAt=Date.now();marks=new Map;initPromise=null;writeQueue=Promise.resolve();writeError=null;level;get logPath(){return h.join(this.logDir,"crawl.log.jsonl")}get currentEventPath(){return h.join(this.logDir,"current-crawl-event.json")}get rejectedPath(){return h.join(this.logDir,"rejected.jsonl")}get ignoredPath(){return h.join(this.logDir,"ignored.jsonl")}get skippedPath(){return h.join(this.logDir,"skipped-http.jsonl")}get errorsPath(){return h.join(this.logDir,"errors.jsonl")}get timingsPath(){return h.join(this.logDir,"timings.jsonl")}ensureLogFileReady(){return this.initPromise||(this.initPromise=(async()=>{await y.mkdir(this.logDir,{recursive:true}),await y.writeFile(this.logPath,"","utf8");})()),this.initPromise}enqueueTask(t){this.writeQueue=this.writeQueue.then(t).catch(s=>{this.writeError=s instanceof Error?s:new Error(String(s));});}enqueueLine(t){this.enqueueTask(async()=>{await this.ensureLogFileReady(),await y.appendFile(this.logPath,`${t}
6
- `,"utf8");});}enqueueJsonLine(t,s){this.enqueueTask(()=>Yt(t,s));}updateCurrentEvent(t,s,r){let n=Zt(t,s,r);this.enqueueTask(async()=>{await y.mkdir(this.logDir,{recursive:true}),await y.writeFile(this.currentEventPath,JSON.stringify(n,null,2),"utf8");});}push(t,s,r){let n=JSON.stringify({time:new Date().toISOString(),level:t,message:s,...r||{}});this.enqueueLine(n),this.updateCurrentEvent(t,s,r),t==="error"?console.error(s,r||""):t==="warn"?console.warn(s,r||""):(q[this.level]>=q.debug||["summary","page","sitemap","asset","timing"].includes(t))&&console.log(s);}info(t,s){this.push("info",t,s);}progress(t,s){Kt("crawl.log.jsonl",t,s),this.updateCurrentEvent("progress",t,s);}checkpoint(t,s){this.updateCurrentEvent("checkpoint",t,s);}page(t,s){this.push("page",t,s);}sitemap(t,s){this.push("sitemap",t,s);}asset(t,s){this.push("asset",t,s);}warn(t,s){this.push("warn",t,s);}error(t,s){this.enqueueJsonLine(this.errorsPath,{message:t,...s||{}}),this.push("error",t,s);}summary(t,s){this.push("summary",t,s);}mark(t){this.marks.set(t,Date.now());}endMark(t,s){let r=this.marks.get(t);if(!r)return;let n=Date.now()-r,i={name:t,ms:n,seconds:Number((n/1e3).toFixed(2)),...s||{}};this.enqueueJsonLine(this.timingsPath,i),this.push("timing",`Timing ${t}: ${i.seconds}s`,i);}reject(t,s,r,n){let i={kind:t,url:s,reason:r,source:n};this.enqueueJsonLine(this.rejectedPath,i),q[this.level]>=q.debug&&this.push("reject",`Rejected ${t} ${s}: ${r}`,i);}ignore(t,s,r,n){let i={kind:t,url:s,reason:r,source:n};this.enqueueJsonLine(this.ignoredPath,i),q[this.level]>=q.debug&&this.push("ignore",`Ignored ${t} ${s}: ${r}`,i);}skip(t,s,r,n){let i={kind:t,url:s,status:r,source:n};this.enqueueJsonLine(this.skippedPath,i),this.push("warn",`Skipped ${t} ${s}: HTTP ${r}`,i);}async flush(){let t=Date.now()-this.startedAt,s={name:"total",ms:t,seconds:Number((t/1e3).toFixed(2))};if(this.enqueueJsonLine(this.timingsPath,s),await this.writeQueue,this.writeError)throw this.writeError}};var tr=["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"],rr=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"]),sr=new Set(["",".html",".htm"]),nr=new Set([".css",".xml",".xsl",".svg",".json",".html",".htm",".txt",".enc",".jws"]),ir=["/wp-content/","/wp-includes/","/wp-admin/","/static/","/assets/","/build/","/_next/"];function or(e){let t=[],s="full",r="full",n=false,i=false;for(let o=0;o<e.length;o++){let l=e[o];if(l==="--retry-timeouts")s="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 a=e[++o];if(!a)throw new Error("--crawl-mode requires a value");r=a==="incremental"?"incremental":"full",n||=r==="incremental";}else if(l.startsWith("--crawl-mode="))r=l.slice(13)==="incremental"?"incremental":"full",n||=r==="incremental";else if(l==="--incremental")r="incremental",n=true;else if(l==="--url"){let a=e[++o];if(!a)throw new Error("--url requires a value");s="single-url",n=true,t.push(a);}else if(l.startsWith("--url="))s="single-url",n=true,t.push(l.slice(6));else if(l==="--urls"){let a=e[++o];if(!a)throw new Error("--urls requires a file path");s="single-url",n=true,t.push(`@${a}`);}}return {mode:s,crawlMode:r,urls:t,preserveOutput:n,resumeRewrite:i}}function be(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?h.resolve(e):""}function ar(){let e=be();return e?h.resolve(e,".."):""}function ur(){let e=process.env.STATIC_PUBLISHER_WP_ROOT||process.env.WPSUITE_STATIC_PUBLISHER_WP_ROOT||"";return e.trim()?h.resolve(e):""}function lr(e){let t=e.trim(),s=[{alias:"@storage-root",root:ar(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@runtime",root:be(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@wp-root",root:ur(),requiredEnv:"STATIC_PUBLISHER_WP_ROOT or WPSUITE_STATIC_PUBLISHER_WP_ROOT"}];for(let r of s){if(t!==r.alias&&!t.startsWith(`${r.alias}/`))continue;if(!r.root)return {resolvedPath:null,alias:r.alias,requiredEnv:r.requiredEnv};let n=t.slice(r.alias.length).replace(/^\/+/,"");return {resolvedPath:n?h.resolve(r.root,n):r.root,alias:r.alias}}return {resolvedPath:h.resolve(t)}}function rt(e){let t=be();return t?h.join(t,"crawl-manifest.json"):h.join(e.outputDir,".crawl-manifest.json")}function st(){return {schemaVersion:2,updatedAt:"",pages:{},assets:{}}}function cr(){return {rewriteTargets:new Set,changedFiles:new Set,deletedFiles:new Set}}function $(e,t,s){let r=V(t.outputDir,s);r&&(e.changedFiles.add(r),e.deletedFiles.delete(r));}function We(e,t,s){let r=V(t.outputDir,s);r&&(e.deletedFiles.add(r),e.changedFiles.delete(r));}function Z(e,t){e.rewriteTargets.add(h.resolve(t));}async function dr(e){try{let t=await y.readFile(rt(e),"utf8"),s=JSON.parse(t);if(s&&typeof s=="object"&&s.pages&&typeof s.pages=="object"){if(s.schemaVersion===2&&s.assets&&typeof s.assets=="object")return s;if(s.schemaVersion===1)return {schemaVersion:2,updatedAt:String(s.updatedAt||""),pages:s.pages,assets:{}}}}catch{}return st()}function _e(e){return JSON.parse(JSON.stringify(e))}async function pr(e,t){let s=rt(e);await y.mkdir(h.dirname(s),{recursive:true}),await y.writeFile(s,JSON.stringify(t,null,2),"utf8");}function ee(e){if(!e)return null;let t=e.trim();return t||null}function gr(e,t){let s=new Set,r=new Set([...Object.keys(e),...Object.keys(t)]);for(let n of r){let i=e[n],o=t[n];!i||!o||i===o||s.add(n);}return s}async function hr(e,t,s,r){let n=[...new Set(s.map(l=>l.trim()).filter(Boolean))],i=String(e.wpsuite?.runtimeToken||"").trim();if(n.length===0||!i)return new Map;let o=new URL("/wp-json/smartcloud-static-publisher/v1/change-tokens",e.sourceOrigin).toString();try{let l=await t.post(o,{timeout:3e4,failOnStatusCode:!1,headers:{"content-type":"application/json","x-static-publisher-token":i},data:JSON.stringify({urls:n})});if(!l.ok())return r.warn(`Change token lookup failed with HTTP ${l.status()}`,{endpoint:o,status:l.status()}),new Map;let a=await l.json().catch(()=>null);if(!a||!Array.isArray(a.items))return new Map;let c=new Map;for(let u of a.items)!u||typeof u.url!="string"||c.set(u.url,u);return c}catch(l){return r.warn("Change token lookup failed; falling back to sitemap metadata",{endpoint:o,error:String(l)}),new Map}}async function me(e,t,s,r,n){if(!s.enabled&&!s.trackManifest)return null;if(s.changeTokenCache.has(r))return s.changeTokenCache.get(r)??null;let o=(await hr(e,t,[r],n)).get(r)??null;return s.changeTokenCache.set(r,o),o}async function fr(e,t,s,r,n,i){if(ut(e,n))return {action:"render",changeToken:null};if(!r.enabled)return {action:"render",changeToken:r.trackManifest?await me(e,t,r,n,i):null};let o=r.manifest.pages[n];if(!o)return {action:"render",changeToken:await me(e,t,r,n,i)};let l=await me(e,t,r,n,i);if(l?.supported&&l.token)return o.changeToken===l.token?{action:"reuse",changeToken:l}:{action:"render",changeToken:l};let a=ee(s.sitemapLastmodByPage[n]);return a&&o.sitemapLastmod&&o.sitemapLastmod===a?{action:"reuse",changeToken:l}:{action:"render",changeToken:l}}async function mr(e,t,s,r,n){let i=Be(s.previousManifest),o=0;for(let[d,g]of Object.entries(s.manifest.pages))if(!s.seenPages.has(d)){We(n,e,g.outputPath);try{await y.unlink(g.outputPath);}catch(f){(f.code||"")!=="ENOENT"&&r.warn(`Failed to remove stale incremental page output for ${d}`,{url:d,outputPath:g.outputPath,error:String(f)});}delete s.manifest.pages[d],o++;}let l=Be(s.manifest,s.runId),a=new Set,c=new Set;for(let d of l){for(let w of B(e,d))a.add(w);let g=s.manifest.assets[d]?.outputPath;g&&c.add(g);let f=te(e,t.assetMap,d);f&&c.add(f);}for(let d of Object.keys(s.manifest.assets))l.has(d)||delete s.manifest.assets[d];let u=0,p=0;for(let d of i){let g=new Set,f=s.previousManifest.assets[d]?.outputPath;f&&g.add(f);let w=te(e,t.assetMap,d);if(!l.has(d)&&w)g.add(w);else if(!l.has(d)){let b=Re(e,d);g.add(b.originalFilePath),b.hashedFilePath&&g.add(b.hashedFilePath);}for(let b of g)if(!c.has(b)){We(n,e,b);try{await y.unlink(b),u++;}catch(S){(S.code||"")!=="ENOENT"&&r.warn(`Failed to remove stale incremental asset output for ${d}`,{url:d,outputPath:b,error:String(S)});}}for(let b of B(e,d))a.has(b)||Object.prototype.hasOwnProperty.call(t.assetMap,b)&&(delete t.assetMap[b],p++);}(o>0||u>0||p>0)&&r.info(`Incremental cleanup removed ${o} stale pages, ${u} stale assets, ${p} stale asset mappings`,{removedPages:o,removedAssets:u,removedAssetMappings:p,phase:"incremental-cleanup"});}function Be(e,t){let s=new Set;for(let r of Object.values(e.pages))for(let n of r.discoveredAssets||[]){let i=n.trim();i&&s.add(i);}for(let[r,n]of Object.entries(e.assets||{})){if(t&&n.lastSeenRunId!==t)continue;let i=r.trim();i&&s.add(i);}return s}function He(e,t,s){for(let r of t)for(let n of B(e,r))if(s.has(n))return true;return false}function wr(e,t,s,r,n){let i=new Set(s.rewriteTargets),o=gr(r,n);if(o.size===0)return [...i];for(let l of Object.values(t.manifest.pages))He(e,l.discoveredAssets,o)&&i.add(h.resolve(l.outputPath));for(let[l,a]of Object.entries(t.manifest.assets)){a.isText&&He(e,a.discoveredAssets,o)&&i.add(h.resolve(a.outputPath));for(let c of B(e,l))if(o.has(c)){$(s,e,a.outputPath),a.isText&&i.add(h.resolve(a.outputPath));break}}return [...i]}function B(e,t){let s=new Set([t]);try{let r=new URL(t),i=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{i.push(new URL(e.targetOrigin).origin);}catch{}for(let o of i)try{s.add(new URL(o).origin+r.pathname+r.search);}catch{}s.add(r.pathname+r.search),s.add(r.pathname);}catch{}return [...s]}function Pr(e,t){let s=new Set([t]);try{let r=new URL(t),i=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{i.push(new URL(e.targetOrigin).origin);}catch{}for(let o of i)try{s.add(new URL(o).origin+r.pathname+r.search);}catch{}s.add(r.pathname+r.search);}catch{}return [...s]}function nt(e,t){let s=e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/"?e.targetOrigin:"https://relative.invalid/";try{let r=new URL(t,s);return h.join(e.outputDir,decodeURIComponent(r.pathname))}catch{return null}}function Sr(e,t,s){for(let r of Pr(e,s)){let n=t[r];if(!n)continue;let i=nt(e,n);if(i)return {outputPath:i,publicUrl:n}}return null}function yr(e,t,s){for(let r of B(e,s)){let n=t[r];if(!n)continue;let i=nt(e,n);if(i)return i}return null}function te(e,t,s){let r=yr(e,t,s);return r||Re(e,s).originalFilePath}function br(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?h.join(h.resolve(e),"queue-runner-heartbeat.json"):""}async function ze(e){let t=br();if(t)try{let s=await y.readFile(t,"utf8"),r=JSON.parse(s);if(!r||typeof r!="object")return;await y.writeFile(t,JSON.stringify({...r,checkedAt:new Date().toISOString(),status:"running",currentStep:"rewrite",message:e},null,2),"utf8");}catch{}}function vr(e,t){let s=new Set;for(let r of t.donePages)s.add(h.resolve(_(e,r)));for(let r of t.doneAssets){let n=te(e,t.assetMap,r);!n||!U(n)||s.add(h.resolve(n));}return [...s]}var re="re:",X=new Map;function Rr(e){if(!e.startsWith(re))return null;let t=X.get(e);if(t!==void 0)return t||null;let s=e.slice(re.length).trim();if(!s)return X.set(e,false),null;try{let r=new RegExp(s);return X.set(e,r),r}catch{return console.warn(`[crawl] Ignoring invalid path matcher regex: ${e}`),X.set(e,false),null}}function ve(e,t){let s=Rr(t);return s?s.test(e):t.startsWith(re)?false:e.startsWith(t)}function Cr(e,t){return t.find(s=>ve(e,s))}function it(e,t){let s=Cr(t.pathname,e.blockedPathPrefixes);if(s)return s.startsWith(re)?`blocked path regex: ${s}`:`blocked path prefix: ${s}`;let r=e.blockedSearchFragments.find(n=>t.search.includes(n));return r?`blocked search fragment: ${r}`:null}function xr(e){let t=new URL(e.sourceOrigin),s=new Set([t.hostname,...e.allowedAssetHosts]);if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{s.add(new URL(e.targetOrigin).hostname);}catch{}for(let r of Object.keys(e.extraReplacements||{}))try{s.add(new URL(r).hostname);}catch{}return s}function kr(e,t){return xr(e).has(t.hostname)}function Ar(e){let t=j(e.trim()).replace(/\\\//g,"/").replace(/^['"]|['"]$/g,"").trim();return t=t.replace(/[)]+$/g,"").trim(),t=t.replace(/;.*$/g,"").trim(),t}function ot(e){let t=j(e).replace(/\\\//g,"/");return /[{}]|\bwindow\.|\blocation\.|\bincludes\(|\?\?null|\+|%7B|%7D|%22|<|>|\s/.test(t)}function se(e){return ir.some(t=>e.pathname.startsWith(t))}function k(e,t,s=e.sourceOrigin,r,n="url"){let i=Ar(t);if(!i||i.startsWith("data:")||i.startsWith("blob:")||i.startsWith("mailto:")||i.startsWith("tel:")||i.startsWith("#"))return r?.ignore(n,t,"empty or unsupported scheme",s),null;if(ot(i))return r?.ignore(n,t,"looks like JavaScript/code fragment",s),null;try{let o=new URL(i,s);if(!["http:","https:"].includes(o.protocol))return r?.ignore(n,t,"unsupported protocol: ",s),null;if(!kr(e,o))return r?.ignore(n,o.toString(),"host not allowed",s),null;let l=it(e,o);if(l)return r?.reject(n,o.toString(),l,s),null;let a=new URL(e.sourceOrigin);return o.protocol=a.protocol,o.host=a.host,o.hash="",o}catch{return r?.reject(n,t,"invalid URL",s),null}}function at(e){return rr.has(h.extname(e.pathname).toLowerCase())}function J(e){return se(e)?false:sr.has(h.extname(e.pathname).toLowerCase())}function ne(e){let t=e.pathname.toLowerCase();return t.endsWith(".xml")&&(t.includes("sitemap")||t.endsWith("/sitemap.xml"))}function C(e,t){return ne(t)||t.pathname==="/robots.txt"||t.pathname==="/llms.txt"||t.pathname.toLowerCase().endsWith(".xsl")?true:at(t)?e.assetPathPrefixes.length===0?true:e.assetPathPrefixes.some(s=>ve(t.pathname,s)):false}function _(e,t){let s=new URL(t),r=decodeURIComponent(s.pathname);return r.endsWith("/")?r+="index.html":h.extname(r)||(r+="/index.html"),h.join(e.outputDir,r)}function Tr(e){if(!e.generated404RequestPath)return null;try{return new URL(e.generated404RequestPath,e.sourceOrigin).toString()}catch{return null}}function ut(e,t){let s=Tr(e);if(!s)return false;try{return new URL(t,e.sourceOrigin).toString()===s}catch{return false}}function Re(e,t){let s=new URL(t),r=decodeURIComponent(s.pathname);r.endsWith("/")&&(r+="index.html");let n=!!s.search,i=r,o=h.join(e.outputDir,i),l=pe(e.targetOrigin,i),a=`${l}${s.search}`;if(!n)return {originalPathname:i,originalFilePath:o,originalPublicUrl:l,originalPublicUrlWithSearch:a,preferQueryHashed:n};let c=h.extname(r),p=`${c?r.slice(0,-c.length):r}.${ce(s.search)}${c||".bin"}`;return {originalPathname:i,originalFilePath:o,originalPublicUrl:l,originalPublicUrlWithSearch:a,preferQueryHashed:n,hashedPathname:p,hashedFilePath:h.join(e.outputDir,p),hashedPublicUrl:pe(e.targetOrigin,p)}}function Mr(e,t,s,r,n){t[s]=r;try{let i=new URL(s),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 a of l)try{let c=new URL(a);t[c.origin+i.pathname+i.search]=r;}catch{}try{let a=(()=>{let c=new URL(r,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin);return `${c.pathname}${c.search}`})();t[i.pathname+i.search]=a;}catch{}try{let a=new URL(r,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[i.pathname]=a;}catch{}try{let a=new URL(n,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[i.pathname]=a;}catch{}}catch{}}async function lt(e){try{return await y.readFile(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}async function ct(e){try{return await y.stat(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}function Lr(e){let t=String(e["content-length"]||"").trim();if(!t)return null;let s=Number.parseInt(t,10);return Number.isFinite(s)&&s>=0?s:null}function dt(e){let t=String(e["last-modified"]||"").trim();if(!t)return null;let s=Date.parse(t);return Number.isFinite(s)?s:null}function Ir(e,t){let s=dt(t),r=Lr(t),n=e?.mtime.getTime();return s!==null&&Math.abs((n??0)-s)>=1e3||r!==null&&e?.size!==r?false:s!==null||r!==null}async function Or(e,t){if(!t)return;let s=dt(t);if(s===null)return;let r=await ct(e);if(!r)return;let n=new Date(s);await y.utimes(e,r.atime,n).catch(()=>{});}function we(e,t){let s=h.extname(e.pathname).toLowerCase(),r=t["content-type"]||"";return nr.has(s)||tr.some(n=>r.includes(n))&&!r.startsWith("image/")&&!r.includes("font")}function Pe(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 Dr(e){return ce(e.toString("base64"),40)}function Er(e,t,s){let r=e.assetVariantDigestsByOriginalPath.get(t);if(!r||r.size===0)return false;for(let n of r)if(n!==s)return true;return false}function Fr(e,t,s){let r=e.assetVariantDigestsByOriginalPath.get(t);r||(r=new Set,e.assetVariantDigestsByOriginalPath.set(t,r)),r.add(s);}async function ye(e,t,s,r,n,i,o){let l=Re(e,s),a=Dr(r),c=l.originalFilePath,u=l.originalPublicUrlWithSearch;if(l.preferQueryHashed&&l.hashedFilePath&&l.hashedPublicUrl&&Er(n,l.originalFilePath,a)){let f=Sr(e,t,s);f?(c=f.outputPath,u=f.publicUrl):(c=l.hashedFilePath,u=l.hashedPublicUrl);}Mr(e,t,s,u,l.originalPublicUrl);let p=U(c)?Buffer.from(fe(r.toString("utf8"),e,t,c),"utf8"):r,d=await lt(c),g=false;return (d===null||!d.equals(p))&&(await de(c),await y.writeFile(c,p),g=true),Fr(n,l.originalFilePath,a),await Or(c,o),n.stats.assetsSaved++,i&&(n.stats.assetsSaved%50===0||n.stats.assetsSaved===1)&&i.progress(`Asset progress: saved ${n.stats.assetsSaved}, discovered ${n.stats.assetsQueued}, pending ${n.assetQueue.length}.`,{assetsSaved:n.stats.assetsSaved,assetsQueued:n.stats.assetsQueued,assetQueue:n.assetQueue.length,phase:"download-assets"}),{outputPath:c,publicUrl:u,wroteFile:g}}function H(e,t,s,r,n){let i=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,o=k(e,s,i,r,"page");if(!o)return;if(!J(o)||at(o)){if(C(e,o)){r.info(`Seeded/non-page URL queued as asset: ${o.toString()}`,{url:o.toString(),source:n}),T(e,t,o.toString(),r,n);return}r.reject("page",o.toString(),se(o)?"asset/internal path cannot be page":"not page-like",n);return}let l=o.toString();!t.donePages.has(l)&&!t.queuedPages.has(l)&&(t.queuedPages.add(l),t.pageQueue.push(l),t.stats.pagesQueued++,(t.stats.pagesQueued%25===0||t.stats.pagesQueued===1)&&r.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,pageQueue:t.pageQueue.length,phase:"discovery"}));}function T(e,t,s,r,n){let i=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,o=k(e,s,i,r,"asset");if(!o)return;if(!C(e,o)){r.reject("asset",o.toString(),"not a safe asset path/prefix",n);return}let l=o.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)&&r.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,assetQueue:t.assetQueue.length,phase:"discovery"}));}function Ce(e,t,s,r,n){let i=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,o=k(e,s,i,r,"sitemap");if(!o)return;if(!ne(o)){r.reject("sitemap",o.toString(),"not sitemap-like",n);return}let l=o.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)&&r.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,sitemapQueue:t.sitemapQueue.length,phase:"discovery"}));}function jr(e){let t=j(e),s=[...t.matchAll(/<url>\s*([\s\S]*?)\s*<\/url>/gi)].map(r=>r[1]);return s.length>0?s.map(r=>{let n=r.match(/<loc>\s*([^<]+?)\s*<\/loc>/i);if(!n?.[1])return null;let i=r.match(/<lastmod>\s*([^<]+?)\s*<\/lastmod>/i);return {loc:n[1].trim(),lastmod:ee(i?.[1]??null)}}).filter(r=>!!r):[...t.matchAll(/<loc>\s*([^<]+?)\s*<\/loc>/gi)].map(r=>({loc:r[1].trim(),lastmod:null})).filter(r=>r.loc)}function $r(e){return e.split(",").map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function Ur(e){let t=[],s=/url\(\s*(?:"([^"]+)"|'([^']+)'|([^)]*?))\s*\)/gi;for(let r of e.matchAll(s)){let n=(r[1]||r[2]||r[3]||"").trim();n&&t.push(n);}return t}function Se(e){return e.trim().replace(/\\/g,"/").replace(/^https?:\/\/[^/]+/i,"").replace(/^\/+/,"")}async function pt(e,t){let s=[];await y.mkdir(t,{recursive:true});let r=await y.readdir(e,{withFileTypes:true});for(let n of r){let i=h.join(e,n.name),o=h.join(t,n.name);if(n.isDirectory()){s.push(...await pt(i,o));continue}await y.copyFile(i,o),s.push(o);}return s}async function Qr(e,t){let s=Object.entries(e.postCrawlCopyMap||{}).map(([i,o])=>({sourcePath:i.trim(),prefix:String(o||"").trim()}));if(s.length===0)return [];let r=0,n=[];t.mark("copy-extra-paths");for(let i of s){let o=i.sourcePath,l=i.prefix;if(!o||!l){t.warn("Skipped post-crawl copy mapping with empty key/value",{sourcePath:o,prefixPath:l});continue}let a=lr(o);if(!a.resolvedPath){t.warn("Skipped post-crawl copy source because alias root is not configured",{sourcePath:o,alias:a.alias||"",requiredEnv:a.requiredEnv||"",prefixPath:l});continue}let c=a.resolvedPath,u=Se(l);if(!u){t.warn("Skipped post-crawl copy mapping with invalid export prefix",{sourcePath:o,prefixPath:l});continue}let p;try{p=await y.stat(c);}catch{t.warn("Skipped post-crawl copy source because it does not exist",{sourcePath:o,sourceAbs:c,prefixPath:l});continue}let d=h.resolve(e.outputDir,u);if(p.isDirectory()){n.push(...await pt(c,d)),r++,t.progress(`Copied static directory to export: ${c} -> /${u}`,{phase:"copy-extra-paths",sourcePath:c,targetPath:`/${u}`,copiedItems:r});continue}let g=h.basename(c),f=l.endsWith("/")?h.join(d,g):d;await y.mkdir(h.dirname(f),{recursive:true}),await y.copyFile(c,f),n.push(f),r++,t.progress(`Copied static file to export: ${c} -> /${Se(l.endsWith("/")?`${l}${g}`:l)}`,{phase:"copy-extra-paths",sourcePath:c,targetPath:`/${Se(l.endsWith("/")?`${l}${g}`:l)}`,copiedItems:r});}return t.endMark("copy-extra-paths",{mappedSources:s.length,copiedItems:r}),n}function z(e,t,s,r,n){let i=new Set,o=j(s).replace(/\\\//g,"/");for(let c of Ur(o)){let u=k(e,c,t,r,`${n}:css-url`);u&&C(e,u)&&i.add(u.toString());}for(let c of o.matchAll(/@import\s+(?:url\()?\s*['"]?([^'"\s;]+)['"]?\s*\)?/gi)){let u=k(e,c[1],t,r,`${n}:css-import`);u&&C(e,u)&&i.add(u.toString());}for(let c of o.matchAll(/<\?xml-stylesheet[^>]+href=["']([^"']+)["'][^>]*\?>/gi)){let u=k(e,c[1],t,r,`${n}:xml-stylesheet`);u&&C(e,u)&&i.add(u.toString());}let l="(?: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)",a=new RegExp(`(?:https?:)?//[^\\s'"<>\\);]+\\.${l}(?:\\?[^\\s'"<>\\);]*)?|(?<!\\.)/[^\\s'"<>\\);]+\\.${l}(?:\\?[^\\s'"<>\\);]*)?`,"gi");for(let c of o.matchAll(a)){let u=c[0].startsWith("//")?`${new URL(e.sourceOrigin).protocol}${c[0]}`:c[0];if(ot(u)){r.ignore(`${n}:serialized-url`,u,"looks like JavaScript/code fragment",t);continue}let p=k(e,u,t,r,`${n}:serialized-url`);p&&C(e,p)?i.add(p.toString()):p&&r.ignore("asset",p.toString(),"serialized URL did not pass safe asset path filter",t);}return [...i]}function Nr(e,t,s,r){let n=new Set,i=j(s);for(let o of i.matchAll(/href=["']([^"'#\s][^"']*?)["']/gi)){let l=o[1],a=k(e,l,t,r,"page-link");a&&(it(e,a)||J(a)&&!se(a)&&!C(e,a)&&n.add(a.toString()));}return [...n]}async function Je(e,t,s,r){for(;s.sitemapQueue.length>0;){let n=s.sitemapQueue.shift();if(s.queuedSitemaps.delete(n),!s.doneSitemaps.has(n)){s.doneSitemaps.add(n),r.sitemap(`Fetching sitemap ${n}`,{url:n});try{let i=await t.get(n,{timeout:6e4});if(!i.ok()){r.skip("sitemap",n,i.status());continue}let o=await i.body(),l=i.url()||n;await ye(e,s.assetMap,l,o,s,r);let a=o.toString("utf8");for(let c of z(e,l,a,r,"sitemap"))T(e,s,c,r,l);for(let c of jr(a)){let u=k(e,c.loc,l,r,"sitemap-loc");u&&(ne(u)?Ce(e,s,u.toString(),r,l):C(e,u)?T(e,s,u.toString(),r,l):J(u)?(c.lastmod&&(s.sitemapLastmodByPage[u.toString()]=c.lastmod),H(e,s,u.toString(),r,l)):r.reject("sitemap-loc",u.toString(),"not page/sitemap/asset-like",l));}}catch(i){r.error(`Failed sitemap ${n}`,{url:n,error:String(i)});}}}}async function qr(e,t,s,r,n,i,o){let l=k(e,r,e.sourceOrigin,n,"asset-fetch");if(!l||!C(e,l))return;let a=l.toString();if(s.doneAssets.has(a))return;let c=i.enabled?i.previousManifest.assets[a]:void 0,u=(p,d={})=>{if(!c)return false;i.manifest.assets[a]={...c,discoveredAssets:[...c.discoveredAssets||[]],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId},s.doneAssets.add(a);for(let g of c.discoveredAssets||[])T(e,s,g,n,a);return n.warn(`Keeping previous incremental asset ${a} after fetch issue.`,{url:a,reason:p,preservedFromPreviousManifest:true,...d,phase:"download-assets"}),Pe(s,n),true};n.asset(`Fetching asset ${a}`,{url:a});try{let p=te(e,s.assetMap,a),d=p?await ct(p):null;if(p&&d)try{let P=await t.head(a,{timeout:6e4}),v=P.headers();if(P.ok()&&Ir(d,v)){let R=await lt(p);if(R!==null){let A=P.url()||a,O=await ye(e,s.assetMap,A,R,s,n,v);O.wroteFile&&($(o,e,O.outputPath),U(O.outputPath)&&Z(o,O.outputPath)),s.doneAssets.add(a),n.info(`Reused existing asset ${a} based on response headers.`,{url:a,filePath:p,lastModified:v["last-modified"]||"",contentLength:v["content-length"]||"",phase:"download-assets"}),Pe(s,n);let D=we(l,v),x=c?.discoveredAssets?[...c.discoveredAssets]:[];if(D||c?.isText){let ht=R.toString("utf8"),xe=z(e,A,ht,n,"asset:cached");(xe.length>0||!c)&&(x=xe);for(let ft of x)T(e,s,ft,n,A);}i.trackManifest&&(i.manifest.assets[a]={url:a,outputPath:O.outputPath,isText:D||!!c?.isText,discoveredAssets:x,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId});return}}}catch{}let g=await t.get(a,{timeout:6e4});if(!g.ok()){if(u(`http-${g.status()}`,{status:g.status()}))return;n.skip("asset",a,g.status());return}let f=await g.body(),w=g.url()||a,b=g.headers(),S=await ye(e,s.assetMap,w,f,s,n,b);S.wroteFile&&($(o,e,S.outputPath),U(S.outputPath)&&Z(o,S.outputPath)),s.doneAssets.add(a),Pe(s,n);let m=[];if(we(l,b)){let P=f.toString("utf8");m=z(e,w,P,n,`asset:${h.extname(l.pathname).toLowerCase()||b["content-type"]||"unknown"}`);for(let v of m)T(e,s,v,n,w);}i.trackManifest&&(i.manifest.assets[a]={url:a,outputPath:S.outputPath,isText:we(l,b),discoveredAssets:m,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId});}catch(p){if(u("fetch-error",{error:String(p)}))return;n.error(`Failed asset ${a}`,{url:a,error:String(p)});}}async function Wr(e,t,s,r,n,i){let o=Math.max(1,Number(e.assetDownloadConcurrency||e.concurrency||1)),l=Array.from({length:o},async()=>{for(;s.assetQueue.length>0;){let a=s.assetQueue.shift();a&&(s.queuedAssets.delete(a),await qr(e,t,s,a,r,n,i));}});await Promise.all(l);}async function _r(e){await e.evaluate(async()=>{await new Promise(t=>{let s=0,r=700,n=window.setInterval(()=>{window.scrollBy(0,r),s+=r,s>=document.body.scrollHeight+window.innerHeight&&(window.clearInterval(n),window.scrollTo(0,0),t());},120);});});}async function Br(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 _r(t),await t.waitForTimeout(e.readiness.fallbackWaitMs);}async function Hr(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 zr(e,t){return e.noJavaScriptRenderPathPrefixes.some(s=>ve(t,s))}async function Jr(e,t,s,r,n=true){let i=new Set;if(n){let l=await t.evaluate(()=>{let a=new Set,c=["href","src","poster","data-src","data-lazy-src","data-original","data-bg","data-background","data-href"],u=new Set,p=["srcset","data-srcset","data-lazy-srcset"];return document.querySelectorAll("*").forEach(d=>{for(let f of c){let w=d.getAttribute(f);w&&a.add(w);}for(let f of p){let w=d.getAttribute(f);w&&w.split(",").forEach(b=>{let S=b.trim().split(/\s+/)[0];S&&a.add(S);});}let g=d.getAttribute("style");g&&u.add(g);}),{attrs:[...a],styles:[...u]}});for(let a of l.attrs)for(let c of $r(a)){let u=k(e,c,s,r,"dom-attr");u&&C(e,u)&&i.add(u.toString());}for(let a of l.styles)for(let c of z(e,s,a,r,"dom-style"))i.add(c);}let o=await t.content();for(let l of z(e,s,o,r,"page-html"))i.add(l);return [...i]}async function Ve(e,t,s,r,n){let i=_(e,t);await de(i),await y.writeFile(i,s,"utf8"),r.stats.pagesSaved++,n&&(r.stats.pagesSaved%10===0||r.stats.pagesSaved===1)&&n.progress(`Page progress: processed ${r.donePages.size}, rendered ${r.stats.pagesRendered}, saved ${r.stats.pagesSaved}, discovered ${r.stats.pagesQueued}.`,{donePages:r.donePages.size,pagesRendered:r.stats.pagesRendered,pagesSaved:r.stats.pagesSaved,pagesQueued:r.stats.pagesQueued,pageQueue:r.pageQueue.length,phase:"save-pages"});}function Ge(e){return e.donePages.size%5===0||e.donePages.size===1||e.donePages.size===e.stats.pagesQueued}function Ke(e,t){t.progress(`Render progress: processed ${e.donePages.size}, rendered ${e.stats.pagesRendered}, saved ${e.stats.pagesSaved}, discovered ${e.stats.pagesQueued}.`,{donePages:e.donePages.size,pagesRendered:e.stats.pagesRendered,pagesSaved:e.stats.pagesSaved,pagesQueued:e.stats.pagesQueued,phase:"render-pages"});}async function Vr(e){await e.addInitScript(()=>{Object.defineProperty(window,"__WPSUITE_STATIC_EXPORT__",{value:true,writable:false,configurable:true});let t=s=>{if(s==null||String(s)==="")return true;try{let r=new URL(String(s),window.location.href),n=new URL(window.location.href);return r.hash="",n.hash="",r.href===n.href}catch{return false}};try{let s=window.location.assign.bind(window.location),r=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 s(i)}}),Object.defineProperty(window.location,"replace",{configurable:!0,value:i=>{if(t(i)){console.warn("[smartcloud-static-publisher] blocked same-page location.replace",i??"");return}return r(i)}}),Object.defineProperty(window.location,"reload",{configurable:!0,value:()=>{console.warn("[smartcloud-static-publisher] blocked location.reload");}});}catch{}});}async function Gr(e,t,s,r,n,i,o){let l=await chromium.launch({headless:true}),a=await l.newContext({viewport:e.viewport,userAgent:"WPSuiteStaticPublisher/0.8 Playwright SitemapOnly",ignoreHTTPSErrors:e.ignoreHttpsErrors}),c=await l.newContext({viewport:e.viewport,userAgent:"WPSuiteStaticPublisher/0.8 Playwright SitemapOnly",javaScriptEnabled:false,ignoreHTTPSErrors:e.ignoreHttpsErrors});await Vr(a);try{for(;t.pageQueue.length>0&&!(e.maxPages>0&&t.donePages.size>=e.maxPages);){let u=t.pageQueue.shift();if(!u)break;if(t.queuedPages.delete(u),t.donePages.has(u))continue;t.donePages.add(u),i.enabled&&i.seenPages.add(u);let p=new URL(u),d=ut(e,u),g=zr(e,p.pathname);if(!J(p)||C(e,p)||se(p)){if(C(e,p)){s.info(`Worker redirected non-page URL to asset queue: ${u}`,{url:u,source:"worker-guard"}),T(e,t,u,s,"worker-guard");continue}s.reject("page",u,"guard rejected non-page URL before rendering","worker");continue}let f=await fr(e,n,t,i,u,s);if(i.enabled&&r!=="single-url"){let m=i.manifest.pages[u];if(f.action==="reuse"&&m){for(let P of m.discoveredAssets)T(e,t,P,s,u);for(let P of m.discoveredPages)H(e,t,P,s,u);m.lastSeenRunId=i.runId,m.sitemapLastmod=ee(t.sitemapLastmodByPage[u])??m.sitemapLastmod,f.changeToken?.supported&&(m.changeToken=f.changeToken.token,m.tokenSource=f.changeToken.tokenSource??m.tokenSource),s.info(`Incremental reuse skipped unchanged page ${u}`,{url:u,mode:"incremental",reason:f.changeToken?.supported===!0?"change-token-match":"sitemap-lastmod-match"}),Ge(t)&&Ke(t,s);continue}}let w=await(g?c.newPage():a.newPage()),b=!1,S=new Set;await w.route("**/*",async m=>{let P=m.request();if(P.isNavigationRequest()&&P.frame()===w.mainFrame())try{let v=new URL(P.url()),R=new URL(u);if(v.hash="",R.hash="",v.href===R.href){if(b){s.warn(`Blocked same-page navigation/reload for ${u}`,{url:u,requestUrl:P.url()}),await m.abort("aborted");return}b=!0;}}catch{}await m.continue();}),w.on("response",m=>{try{let P=k(e,m.url(),e.sourceOrigin,void 0,"network-response");P&&C(e,P)&&(S.add(P.toString()),T(e,t,P.toString(),s,u));}catch{}}),s.page(`Rendering ${u}`,{url:u});try{let m=null,P=null;try{if(m=await w.goto(u,{waitUntil:"domcontentloaded",timeout:e.navigationTimeoutMs}),m&&m.ok())try{P=await m.text();}catch{P=null;}}catch(x){s.warn(`Navigation issue for ${u}; saving current DOM if available`,{url:u,error:String(x)});}if(d){let x=m?.status()??null;if(x!==404){s.error(`Generated 404 request path returned unexpected status for ${u}`,{url:u,expectedStatus:404,status:x,requestPath:e.generated404RequestPath});continue}s.info(`Capturing rendered 404 page for ${u}`,{url:u,status:x,outputPath:_(e,u)});}else if(m&&!m.ok()){s.skip("page",u,m.status()),await w.close();continue}g?(s.info(`Rendering without JS execution for ${u}`,{url:u,mode:"no-js"}),await Hr(e,w)):await Br(e,w),t.stats.pagesRendered++,Ge(t)&&Ke(t,s);let v=await Jr(e,w,u,s,!g);for(let x of v)T(e,t,x,s,u);let R=[...new Set([...v,...S])],A=P??await w.content(),O=r!=="single-url"&&!d?Nr(e,u,A,s):[];if(r!=="single-url"&&!d)for(let x of O)H(e,t,x,s,u);await Ve(e,u,A,t,s);let D=_(e,u);$(o,e,D),Z(o,D),i.trackManifest&&(i.manifest.pages[u]={url:u,outputPath:D,changeToken:f.changeToken?.supported?f.changeToken.token:null,tokenSource:f.changeToken?.supported?f.changeToken.tokenSource??null:null,sitemapLastmod:ee(t.sitemapLastmodByPage[u])??null,discoveredPages:O,discoveredAssets:R,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId});}catch(m){try{let P=await w.content();if(P&&P.trim()){await Ve(e,u,P,t,s);let v=_(e,u);$(o,e,v),Z(o,v),s.warn(`Saved partial DOM for ${u}`,{url:u,error:String(m)});}}catch(P){s.error(`Could not save partial DOM for ${u}`,{url:u,error:String(P)});}s.error(`Failed page ${u}`,{url:u,error:String(m)});}finally{await w.close();}}}finally{await c.close(),await a.close(),await l.close();}}async function Kr(e){try{let t=await y.readFile(e),r=(e.endsWith(".gz")?gunzipSync(t):t).toString("utf8").trim();if(!r)return [];try{let n=JSON.parse(r);if(Array.isArray(n))return n;if(n&&typeof n=="object")return [n]}catch{return r.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 Ye(e){let t=String(e||"").toLowerCase();return t.includes("timeout")||t.includes("timed out")||t.includes("navigation timeout")}function Yr(e){let t=String(e?.job?.command||"").trim(),s=String(e?.job?.crawlMode||"full").trim();return t!=="publish"&&t!=="crawl"?false:s!=="incremental"}function Xr(e){let t=[e?.archivedAt,e?.job?.endedAt,e?.job?.startedAt];for(let s of t){let r=Date.parse(String(s||""));if(Number.isFinite(r))return r}return 0}async function gt(e){try{let t=await y.readFile(e,"utf8"),s=JSON.parse(t);return s&&typeof s=="object"&&!Array.isArray(s)?s:null}catch{return null}}function Xe(e){let t=String(e.originalFileName||"").toLowerCase();return t.endsWith("errors.jsonl")?0:t.endsWith("errors.json")?1:2}function Zr(e,t){let s=Array.isArray(t?.artifacts)?t.artifacts.filter(r=>String(r?.role||"").trim()==="errors"&&String(r?.storedFileName||"").trim()!=="").sort((r,n)=>Xe(r)-Xe(n)).map(r=>h.join(e,String(r.storedFileName))):[];return [...new Set([...s,h.join(e,"errors.jsonl"),h.join(e,"errors.json"),h.join(e,"errors.jsonl.gz"),h.join(e,"errors.json.gz")])]}async function Ze(e){let t=await gt(h.join(e,"job.json"));for(let s of Zr(e,t)){let r=await Kr(s);if(r.length>0)return r}return []}async function es(e){let t=h.join(e.logDir,"archive"),s;try{s=await y.readdir(t);}catch{return ""}let r="",n=0;for(let i of s){let o=h.join(t,i);if(!(await y.stat(o).catch(()=>null))?.isDirectory())continue;let a=await gt(h.join(o,"job.json"));if(!Yr(a))continue;let c=Xr(a);c>=n&&(n=c,r=o);}return r}async function ts(e){let t=await es(e),s=t!==""?await Ze(t):await Ze(e.logDir),r=new Set;for(let n of s)if(Ye(n.error)||Ye(n.message)){let i=n.url;typeof i=="string"&&i&&r.add(i);}return [...r]}async function rs(e){let t=[];for(let s of e)if(s.startsWith("@")){let r=s.slice(1),n=await y.readFile(r,"utf8");t.push(...n.split(/\r?\n/).map(i=>i.trim()).filter(i=>i&&!i.startsWith("#")));}else t.push(s);return t}async function ss(e){try{let t=await y.readFile(h.join(e.outputDir,"asset-map.json"),"utf8");return JSON.parse(t)}catch{return {}}}async function ns(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 y.mkdir(e,{recursive:true}),await Promise.all(t.map(async s=>{try{await y.unlink(h.join(e,s));}catch(r){if(r.code!=="ENOENT")throw r}}));}function et(e,t,s,r,n){let i=k(e,s,e.sourceOrigin,r,"manual-url");i&&(ne(i)?Ce(e,t,i.toString(),r,n):C(e,i)?T(e,t,i.toString(),r,n):J(i)?H(e,t,i.toString(),r,n):r.reject("manual-url",i.toString(),"not page/sitemap/asset-like",n));}async function is(){let e=await le(),t=or(process.argv.slice(2));if(t.resumeRewrite&&t.mode!=="full")throw new Error("--resume-rewrite is only supported for full crawl/publish jobs.");let s=[];t.mode==="retry-timeouts"&&(s=await ts(e)),t.mode==="single-url"&&(s=await rs(t.urls));let r=t.crawlMode==="incremental"&&t.mode==="full",n=r&&typeof e.subscriptionType=="string"&&e.subscriptionType.trim()!=="",i=t.mode==="full"&&!t.resumeRewrite,o=t.mode!=="full"||t.resumeRewrite||n,l=o?await ss(e):{},a=n?await dr(e):st(),c={enabled:n,trackManifest:i,manifest:_e(a),previousManifest:_e(a),runId:`${Date.now()}`,seenPages:new Set,changeTokenCache:new Map};await ns(e.logDir);let u={pageQueue:[],queuedPages:new Set,donePages:new Set,assetQueue:[],queuedAssets:new Set,doneAssets:new Set,sitemapQueue:[],queuedSitemaps:new Set,doneSitemaps:new Set,sitemapLastmodByPage:{},assetMap:{...l},assetVariantDigestsByOriginalPath:new Map,stats:{pagesQueued:0,pagesRendered:0,assetsQueued:0,sitemapsQueued:0,assetsSaved:0,pagesSaved:0}},p=cr();o||await y.rm(e.outputDir,{recursive:true,force:true}),await y.mkdir(e.outputDir,{recursive:true});let d=new W(e.logDir,e.logLevel);if(r&&!n&&d.warn("Incremental crawl requested without active remote publisher subscription. Falling back to full crawl.",{requestedMode:t.crawlMode,subscriptionType:e.subscriptionType??null}),t.resumeRewrite)d.info("Resuming final rewrite from existing output.",{phase:"rewrite-text",mode:t.mode,crawlMode:t.crawlMode});else {let S=await chromium.launch({headless:true}),m=await S.newContext({ignoreHTTPSErrors:e.ignoreHttpsErrors}),P=m.request;try{if(d.mark("discovery"),t.mode==="full"?(e.sitemapPaths.forEach(R=>Ce(e,u,R,d)),await Je(e,P,u,d),e.seedPaths.forEach(R=>et(e,u,R,d,"seed-path")),e.generated404RequestPath&&H(e,u,e.generated404RequestPath,d,"generated-404-request-path")):(s.forEach(R=>et(e,u,R,d,"cli")),await Je(e,P,u,d)),d.endMark("discovery",{pages:u.pageQueue.length,assets:u.assetQueue.length,sitemaps:u.sitemapQueue.length}),d.summary(`Queued ${u.pageQueue.length} pages, ${u.assetQueue.length} assets, ${u.sitemapQueue.length} sitemaps.`,{mode:t.mode,crawlMode:t.crawlMode,queuedPages:u.pageQueue.length,queuedAssets:u.assetQueue.length,queuedSitemaps:u.sitemapQueue.length}),t.mode==="retry-timeouts"&&u.pageQueue.length===0&&u.assetQueue.length===0&&u.sitemapQueue.length===0){d.summary("No timed-out URLs were queued. Skipping retry crawl.",{mode:t.mode,crawlMode:t.crawlMode,queuedPages:0,queuedAssets:0,queuedSitemaps:0}),await d.flush();return}d.mark("render-pages");let v=Array.from({length:Math.max(1,e.concurrency)},()=>Gr(e,u,d,t.mode,P,c,p));if(await Promise.all(v),d.endMark("render-pages",{pages:u.donePages.size}),d.mark("download-assets"),await Wr(e,P,u,d,c,p),d.endMark("download-assets",{assets:u.doneAssets.size}),c.enabled&&e.maxPages===0&&await mr(e,u,c,d,p),t.mode==="full"){let R=await Qr(e,d);for(let A of R)$(p,e,A);}}finally{await m.close(),await S.close();}}c.trackManifest&&(c.manifest.updatedAt=new Date().toISOString(),await pr(e,c.manifest)),await y.writeFile(h.join(e.outputDir,"asset-map.json"),JSON.stringify(u.assetMap,null,2),"utf8"),JSON.stringify(l,null,2)!==JSON.stringify(u.assetMap,null,2)&&$(p,e,h.join(e.outputDir,"asset-map.json"));let g=t.mode==="single-url"?vr(e,u):c.enabled&&!t.resumeRewrite?wr(e,c,p,l,u.assetMap):void 0;d.mark("rewrite-text");let f=t.mode==="single-url"?`Rewriting text files touched by URL crawl: 0/${g?.length??0}`:"Rewriting text files...";d.progress(f,{phase:"rewrite-text",index:0,totalFiles:g?.length,changedTextFiles:0}),await ze(f);let w=Date.now(),b=await Ue(e,u.assetMap,{files:g,previousAssetMap:l,onProgress:async({index:S,totalFiles:m,changedTextFiles:P,file:v,changed:R})=>{R&&$(p,e,h.join(e.outputDir,v)),d.checkpoint(`Rewriting text file ${S}/${m}`,{phase:"rewrite-text",index:S,totalFiles:m,changedTextFiles:P,file:v});let A=Date.now();if(!(S===1||S===m||A-w>=5e3))return;w=A;let D=`Rewriting text files: ${S}/${m}`;d.progress(D,{phase:"rewrite-text",index:S,totalFiles:m,changedTextFiles:P,file:v}),await ze(D);}});d.endMark("rewrite-text",{changedTextFiles:b}),await Te(e,{generatedAt:new Date().toISOString(),outputDir:h.resolve(e.outputDir),runMode:t.mode,crawlMode:t.crawlMode,fullSyncRequired:!(c.enabled&&!t.resumeRewrite),changedFiles:c.enabled&&!t.resumeRewrite?[...p.changedFiles].sort():[],deletedFiles:c.enabled&&!t.resumeRewrite?[...p.deletedFiles].sort():[],rewriteTargets:c.enabled&&!t.resumeRewrite?[...new Set((g||[]).map(S=>V(e.outputDir,h.isAbsolute(S)?S:h.join(e.outputDir,S))).filter(S=>S!==null))].sort():[]}),d.summary(t.resumeRewrite?`Done. Resumed final rewrite over existing output and changed ${b} text files.`:`Done. Rendered ${u.stats.pagesRendered} pages, processed ${u.doneSitemaps.size} sitemaps, downloaded ${u.doneAssets.size} assets.`,{mode:t.mode,crawlMode:t.crawlMode,resumeRewrite:t.resumeRewrite,...u.stats,pagesRendered:u.stats.pagesRendered,donePages:u.donePages.size,doneSitemaps:u.doneSitemaps.size,doneAssets:u.doneAssets.size,changedTextFiles:b}),await d.flush();}is().catch(async e=>{console.error(e);try{let s=(await le().catch(()=>null))?.logDir??"logs",r=new W(s,"debug");r.error(`Unhandled error: ${e instanceof Error?e.message:String(e)}`,e instanceof Error?{stack:e.stack}:void 0),await r.flush();}catch{}process.exit(1);});
4
+ `;return e.replace(/<head\b[^>]*>/i,n=>`${n}${r} ${t}`)}function Wt(e){let t=E(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function _t(e,t){let s=[...new Set(t)].filter(i=>i.includes("/")&&!/\\+\//.test(i)).map(i=>[i,K(i)]).filter(([i,a])=>i!==a).sort((i,a)=>a[0].length-i[0].length);if(!s.length)return e;let r=i=>{let a=i;for(let[u,o]of s)a=a.split(u).join(o);return a},n=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(i,a,u,o)=>`${a}${r(u)}${o}`);return n=n.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(i,a,u,o,l)=>Wt(o)?`${a}${r(o)}${l}`:i),n}function Bt(e,t){if(!t)return null;let s=f.dirname(f.resolve(t)),r=f.resolve(e.outputDir),n=f.relative(s,r).replace(/\\/g,"/");return n?(n.startsWith(".")||(n=`./${n}`),n.endsWith("/")?n:`${n}/`):"./"}function zt(e,t,s){let r=Bt(t,s);if(!r)return e;let n=e;for(let i of $t){let a=i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),u=new RegExp(`(?:\\.{1,}/)+${a}`,"g"),o=new RegExp(`(?<!\\.)/${a}`,"g");n=n.replace(u,`${r}${i}`).replace(o,`${r}${i}`);let l=i.replace(/\//g,"\\/"),c=r.replace(/\//g,"\\/"),p=l.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),d=new RegExp(`(?:\\.{1,}\\\\/)+${p}`,"g"),h=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${p}`,"g"),m=new RegExp(`(?<![\\.\\\\])\\/${p}`,"g");n=n.replace(d,`${c}${l}`).replace(h,`${c}${l}`).replace(m,`${c}${l}`);}return n}function he(e,t,s){if(e.urlRewriteMode==="absolute")return t;let r=(()=>{try{return new URL(t,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin)}catch{return null}})(),n=r?r.pathname:Oe(t,e.targetOrigin),i=r?`${r.search}${r.hash}`:"";return e.urlRewriteMode==="root-relative"?`${n}${i}`:`${Ee(e.outputDir,s,n)}${i}`}function ge(e,t,s,r,n){Y(e,s,he(t,r,n));}function Ht(e,t,s,r,n){if(!s||s===r)return;Y(e,s,r);let i=he(t,s,n),a=he(t,r,n);Y(e,i,a);}function fe(e,t,s,r,n={}){let i=e,a={};ge(a,t,t.sourceOrigin,t.targetOrigin,r);for(let[o,l]of Object.entries(t.extraReplacements))ge(a,t,o,l,r);for(let[o,l]of Object.entries(s))ge(a,t,o,l,r);for(let[o,l]of Object.entries(n)){let c=s[o];!c||c===l||Ht(a,t,l,c,r);}let u=Object.entries(a).sort((o,l)=>l[0].length-o[0].length);for(let[o,l]of u)i=i.split(o).join(l);return t.urlRewriteMode!=="absolute"&&(i=zt(i,t,r)),i=_t(i,u.map(([,o])=>o)),Nt(t,i,r)&&(i=qt(i)),i}async function Jt(e,t,s,r){let n=f.join(e.outputDir,r),i=f.extname(n).toLowerCase(),a;try{a=await P.readFile(n,"utf8");}catch(l){if(l.code!=="ENOENT")throw l;return {changed:false}}let o=fe(a,e,t,i===".js"||i===".mjs"?void 0:n,s);return o!==a?(await P.writeFile(n,o,"utf8"),{changed:true}):{changed:false}}async function Vt(e,t){return await new Promise((s,r)=>{let n=o=>{if(u(),o?.error){r(new Error(o.error));return}s({changed:!!o?.changed});},i=o=>{u(),r(o);},a=o=>{u(),o!==0&&r(new Error(`Rewrite worker exited with code ${o}.`));},u=()=>{e.off("message",n),e.off("error",i),e.off("exit",a);};e.on("message",n),e.on("error",i),e.on("exit",a),e.postMessage({file:t});})}async function Ue(e,t,s={}){let n=(s.files?[...new Set(s.files)].map(d=>f.resolve(d)).filter(d=>d.startsWith(f.resolve(e.outputDir))).map(d=>f.relative(e.outputDir,d).replace(/\\/g,"/")).filter(d=>d.length>0):await Ot(["**/*"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(d=>d!=="asset-map.json"&&U(d)),i=0;if(n.length===0)return 0;let a=Math.max(1,Number(e.rewriteConcurrency||e.assetDownloadConcurrency||1)),u=Math.max(1,Math.min(a,n.length,availableParallelism()));await s.onStart?.({totalFiles:n.length,workerCount:u});let o=0,l=0,c=null;if(u===1){for(let d of n){let h=await Jt(e,t,s.previousAssetMap??{},d);h.changed&&(i+=1),l+=1,await s.onProgress?.({index:l,totalFiles:n.length,changedTextFiles:i,file:d,changed:h.changed});}return i}let p=Array.from({length:u},async()=>{let d=new Worker(new URL("./rewrite-worker.js",import.meta.url),{workerData:{config:e,assetMap:t,previousAssetMap:s.previousAssetMap??{}}});try{for(;!c;){let h=o;if(h>=n.length)return;o+=1;let m=n[h],y=await Vt(d,m);y.changed&&(i+=1),l+=1,await s.onProgress?.({index:l,totalFiles:n.length,changedTextFiles:i,file:m,changed:y.changed});}}catch(h){throw c=h instanceof Error?h:new Error(String(h)),c}finally{await d.terminate().catch(()=>{});}});return await Promise.all(p),i}var j={error:0,warn:1,info:2,debug:3},Qe=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",X=Qe?f.join(Qe,"current-progress.json"):"",Ne=Promise.resolve();function qe(e){return e.includes("crawl")?"crawl":e.includes("deploy")?"deploy":e.includes("invalidate")?"invalidate":e}function Gt(e,t){let s={...e},r=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 a=s[n];if(typeof a=="number"&&typeof i=="number"&&r.has(n)){s[n]=Math.max(a,i);continue}s[n]=i;}return s}function Kt(e,t,s){X&&(Ne=Ne.then(async()=>{let r=new Date,n=r.toISOString();await P.mkdir(f.dirname(X),{recursive:true});let i=await P.readFile(X,"utf8").then(y=>JSON.parse(y)).catch(()=>null),a=i&&typeof i.details=="object"&&i.details?i.details:{},u=qe(e),o=i?.currentStep||qe(i?.source||""),l=i?.startedAt||n,c={...i?.stepDurationsSec??{}},p=i?.stepStartedAt||n;if(o&&o!==u&&i?.stepStartedAt){let y=Math.max(0,Math.round((r.getTime()-new Date(i.stepStartedAt).getTime())/1e3));c[o]=(c[o]??0)+y,p=n;}let d=Math.max(0,Math.round((r.getTime()-new Date(p).getTime())/1e3)),h=Math.max(0,Math.round((r.getTime()-new Date(l).getTime())/1e3)),m={checkedAt:n,source:e,message:t,details:Gt(a,s??{}),startedAt:l,currentStep:u,stepStartedAt:p,stepElapsedSec:d,totalElapsedSec:h,stepDurationsSec:c};await P.writeFile(X,JSON.stringify(m,null,2),"utf8");}).catch(()=>{}));}async function Yt(e,t){await P.mkdir(f.dirname(e),{recursive:true}),await P.appendFile(e,`${JSON.stringify(t)}
5
+ `,"utf8");}function Xt(e,t){let s=typeof t?.phase=="string"?t.phase.trim():"";return s||(e==="page"?"render-pages":e==="asset"?"download-assets":e==="sitemap"?"discovery":e==="timing"&&typeof t?.name=="string"&&t.name.trim()||"crawl")}function Zt(e,t,s){return {checkedAt:new Date().toISOString(),currentStep:Xt(e,s),level:e,message:t,details:s??{}}}var _=class{constructor(t,s="info"){this.logDir=t;this.level=typeof s=="boolean"?s?"debug":"info":s,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 P.mkdir(this.logDir,{recursive:true}),await P.writeFile(this.logPath,"","utf8");})()),this.initPromise}enqueueTask(t){this.writeQueue=this.writeQueue.then(t).catch(s=>{this.writeError=s instanceof Error?s:new Error(String(s));});}enqueueLine(t){this.enqueueTask(async()=>{await this.ensureLogFileReady(),await P.appendFile(this.logPath,`${t}
6
+ `,"utf8");});}enqueueJsonLine(t,s){this.enqueueTask(()=>Yt(t,s));}updateCurrentEvent(t,s,r){let n=Zt(t,s,r);this.enqueueTask(async()=>{await P.mkdir(this.logDir,{recursive:true}),await P.writeFile(this.currentEventPath,JSON.stringify(n,null,2),"utf8");});}push(t,s,r){let n=JSON.stringify({time:new Date().toISOString(),level:t,message:s,...r||{}});this.enqueueLine(n),this.updateCurrentEvent(t,s,r),t==="error"?console.error(s,r||""):t==="warn"?console.warn(s,r||""):(j[this.level]>=j.debug||["summary","page","sitemap","asset","timing"].includes(t))&&console.log(s);}info(t,s){this.push("info",t,s);}debug(t,s){j[this.level]<j.debug||this.push("debug",t,s);}progress(t,s){Kt("crawl.log.jsonl",t,s),this.updateCurrentEvent("progress",t,s);}checkpoint(t,s){this.updateCurrentEvent("checkpoint",t,s);}page(t,s){this.push("page",t,s);}sitemap(t,s){this.push("sitemap",t,s);}asset(t,s){this.push("asset",t,s);}warn(t,s){this.push("warn",t,s);}error(t,s){this.enqueueJsonLine(this.errorsPath,{message:t,...s||{}}),this.push("error",t,s);}summary(t,s){this.push("summary",t,s);}mark(t){this.marks.set(t,Date.now());}endMark(t,s){let r=this.marks.get(t);if(!r)return;let n=Date.now()-r,i={name:t,ms:n,seconds:Number((n/1e3).toFixed(2)),...s||{}};this.enqueueJsonLine(this.timingsPath,i),this.push("timing",`Timing ${t}: ${i.seconds}s`,i);}reject(t,s,r,n){let i={kind:t,url:s,reason:r,source:n};this.enqueueJsonLine(this.rejectedPath,i),j[this.level]>=j.debug&&this.push("reject",`Rejected ${t} ${s}: ${r}`,i);}ignore(t,s,r,n){let i={kind:t,url:s,reason:r,source:n};this.enqueueJsonLine(this.ignoredPath,i),j[this.level]>=j.debug&&this.push("ignore",`Ignored ${t} ${s}: ${r}`,i);}skip(t,s,r,n){let i={kind:t,url:s,status:r,source:n};this.enqueueJsonLine(this.skippedPath,i),this.push("warn",`Skipped ${t} ${s}: HTTP ${r}`,i);}async flush(){let t=Date.now()-this.startedAt,s={name:"total",ms:t,seconds:Number((t/1e3).toFixed(2))};if(this.enqueueJsonLine(this.timingsPath,s),await this.writeQueue,this.writeError)throw this.writeError}};var tr=["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"],rr=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"]),sr=new Set(["",".html",".htm"]),nr=new Set([".css",".xml",".xsl",".svg",".json",".html",".htm",".txt",".enc",".jws"]),ir=["/wp-content/","/wp-includes/","/wp-admin/","/static/","/assets/","/build/","/_next/"];function or(e){let t=[],s="full",r="full",n=false,i=false;for(let a=0;a<e.length;a++){let u=e[a];if(u==="--retry-timeouts")s="retry-timeouts",n=true;else if(u==="--resume")n=true;else if(u==="--resume-rewrite")n=true,i=true;else if(u==="--crawl-mode"){let o=e[++a];if(!o)throw new Error("--crawl-mode requires a value");r=o==="incremental"?"incremental":"full",n||=r==="incremental";}else if(u.startsWith("--crawl-mode="))r=u.slice(13)==="incremental"?"incremental":"full",n||=r==="incremental";else if(u==="--incremental")r="incremental",n=true;else if(u==="--url"){let o=e[++a];if(!o)throw new Error("--url requires a value");s="single-url",n=true,t.push(o);}else if(u.startsWith("--url="))s="single-url",n=true,t.push(u.slice(6));else if(u==="--urls"){let o=e[++a];if(!o)throw new Error("--urls requires a file path");s="single-url",n=true,t.push(`@${o}`);}}return {mode:s,crawlMode:r,urls:t,preserveOutput:n,resumeRewrite:i}}function be(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?f.resolve(e):""}function ar(){let e=be();return e?f.resolve(e,".."):""}function ur(){let e=process.env.STATIC_PUBLISHER_WP_ROOT||process.env.WPSUITE_STATIC_PUBLISHER_WP_ROOT||"";return e.trim()?f.resolve(e):""}function lr(e){let t=e.trim(),s=[{alias:"@storage-root",root:ar(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@runtime",root:be(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@wp-root",root:ur(),requiredEnv:"STATIC_PUBLISHER_WP_ROOT or WPSUITE_STATIC_PUBLISHER_WP_ROOT"}];for(let r of s){if(t!==r.alias&&!t.startsWith(`${r.alias}/`))continue;if(!r.root)return {resolvedPath:null,alias:r.alias,requiredEnv:r.requiredEnv};let n=t.slice(r.alias.length).replace(/^\/+/,"");return {resolvedPath:n?f.resolve(r.root,n):r.root,alias:r.alias}}return {resolvedPath:f.resolve(t)}}function rt(e){let t=be();return t?f.join(t,"crawl-manifest.json"):f.join(e.outputDir,".crawl-manifest.json")}function st(){return {schemaVersion:2,updatedAt:"",pages:{},assets:{}}}function cr(){return {rewriteTargets:new Set,changedFiles:new Set,deletedFiles:new Set}}function $(e,t,s){let r=G(t.outputDir,s);r&&(e.changedFiles.add(r),e.deletedFiles.delete(r));}function We(e,t,s){let r=G(t.outputDir,s);r&&(e.deletedFiles.add(r),e.changedFiles.delete(r));}function ee(e,t){e.rewriteTargets.add(f.resolve(t));}async function dr(e){try{let t=await P.readFile(rt(e),"utf8"),s=JSON.parse(t);if(s&&typeof s=="object"&&s.pages&&typeof s.pages=="object"){if(s.schemaVersion===2&&s.assets&&typeof s.assets=="object")return s;if(s.schemaVersion===1)return {schemaVersion:2,updatedAt:String(s.updatedAt||""),pages:s.pages,assets:{}}}}catch{}return st()}function _e(e){return JSON.parse(JSON.stringify(e))}async function pr(e,t){let s=rt(e);await P.mkdir(f.dirname(s),{recursive:true}),await P.writeFile(s,JSON.stringify(t,null,2),"utf8");}function te(e){if(!e)return null;let t=e.trim();return t||null}function gr(e,t){let s=new Set,r=new Set([...Object.keys(e),...Object.keys(t)]);for(let n of r){let i=e[n],a=t[n];!i||!a||i===a||s.add(n);}return s}async function hr(e,t,s,r){let n=[...new Set(s.map(u=>u.trim()).filter(Boolean))],i=String(e.wpsuite?.runtimeToken||"").trim();if(n.length===0||!i)return new Map;let a=new URL("/wp-json/smartcloud-static-publisher/v1/change-tokens",e.sourceOrigin).toString();try{let u=await t.post(a,{timeout:3e4,failOnStatusCode:!1,headers:{"content-type":"application/json","x-static-publisher-token":i},data:JSON.stringify({urls:n})});if(!u.ok())return r.warn(`Change token lookup failed with HTTP ${u.status()}`,{endpoint:a,status:u.status()}),new Map;let o=await u.json().catch(()=>null);if(!o||!Array.isArray(o.items))return new Map;let l=new Map;for(let c of o.items)!c||typeof c.url!="string"||l.set(c.url,c);return l}catch(u){return r.warn("Change token lookup failed; falling back to sitemap metadata",{endpoint:a,error:String(u)}),new Map}}async function me(e,t,s,r,n){if(!s.enabled&&!s.trackManifest)return null;if(s.changeTokenCache.has(r))return s.changeTokenCache.get(r)??null;let a=(await hr(e,t,[r],n)).get(r)??null;return s.changeTokenCache.set(r,a),a}async function fr(e,t,s,r,n,i){if(ut(e,n))return {action:"render",changeToken:null};if(!r.enabled)return {action:"render",changeToken:r.trackManifest?await me(e,t,r,n,i):null};let a=r.manifest.pages[n];if(!a)return {action:"render",changeToken:await me(e,t,r,n,i)};let u=await me(e,t,r,n,i);if(u?.supported&&u.token)return a.changeToken===u.token?{action:"reuse",changeToken:u}:{action:"render",changeToken:u};let o=te(s.sitemapLastmodByPage[n]);return o&&a.sitemapLastmod&&a.sitemapLastmod===o?{action:"reuse",changeToken:u}:{action:"render",changeToken:u}}async function mr(e,t,s,r,n){let i=Be(s.previousManifest),a=0;for(let[d,h]of Object.entries(s.manifest.pages))if(!s.seenPages.has(d)){We(n,e,h.outputPath);try{await P.unlink(h.outputPath);}catch(m){(m.code||"")!=="ENOENT"&&r.warn(`Failed to remove stale incremental page output for ${d}`,{url:d,outputPath:h.outputPath,error:String(m)});}delete s.manifest.pages[d],a++;}let u=Be(s.manifest,s.runId),o=new Set,l=new Set;for(let d of u){for(let y of B(e,d))o.add(y);let h=s.manifest.assets[d]?.outputPath;h&&l.add(h);let m=re(e,t.assetMap,d);m&&l.add(m);}for(let d of Object.keys(s.manifest.assets))u.has(d)||delete s.manifest.assets[d];let c=0,p=0;for(let d of i){let h=new Set,m=s.previousManifest.assets[d]?.outputPath;m&&h.add(m);let y=re(e,t.assetMap,d);if(!u.has(d)&&y)h.add(y);else if(!u.has(d)){let S=Re(e,d);h.add(S.originalFilePath),S.hashedFilePath&&h.add(S.hashedFilePath);}for(let S of h)if(!l.has(S)){We(n,e,S);try{await P.unlink(S),c++;}catch(g){(g.code||"")!=="ENOENT"&&r.warn(`Failed to remove stale incremental asset output for ${d}`,{url:d,outputPath:S,error:String(g)});}}for(let S of B(e,d))o.has(S)||Object.prototype.hasOwnProperty.call(t.assetMap,S)&&(delete t.assetMap[S],p++);}(a>0||c>0||p>0)&&r.info(`Incremental cleanup removed ${a} stale pages, ${c} stale assets, ${p} stale asset mappings`,{removedPages:a,removedAssets:c,removedAssetMappings:p,phase:"incremental-cleanup"});}function Be(e,t){let s=new Set;for(let r of Object.values(e.pages))for(let n of r.discoveredAssets||[]){let i=n.trim();i&&s.add(i);}for(let[r,n]of Object.entries(e.assets||{})){if(t&&n.lastSeenRunId!==t)continue;let i=r.trim();i&&s.add(i);}return s}function ze(e,t,s){for(let r of t)for(let n of B(e,r))if(s.has(n))return true;return false}function wr(e,t,s,r,n){let i=new Set(s.rewriteTargets),a=gr(r,n);if(a.size===0)return [...i];for(let u of Object.values(t.manifest.pages))ze(e,u.discoveredAssets,a)&&i.add(f.resolve(u.outputPath));for(let[u,o]of Object.entries(t.manifest.assets)){o.isText&&ze(e,o.discoveredAssets,a)&&i.add(f.resolve(o.outputPath));for(let l of B(e,u))if(a.has(l)){$(s,e,o.outputPath),o.isText&&i.add(f.resolve(o.outputPath));break}}return [...i]}function B(e,t){let s=new Set([t]);try{let r=new URL(t),i=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{i.push(new URL(e.targetOrigin).origin);}catch{}for(let a of i)try{s.add(new URL(a).origin+r.pathname+r.search);}catch{}s.add(r.pathname+r.search),s.add(r.pathname);}catch{}return [...s]}function Pr(e,t){let s=new Set([t]);try{let r=new URL(t),i=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{i.push(new URL(e.targetOrigin).origin);}catch{}for(let a of i)try{s.add(new URL(a).origin+r.pathname+r.search);}catch{}s.add(r.pathname+r.search);}catch{}return [...s]}function nt(e,t){let s=e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/"?e.targetOrigin:"https://relative.invalid/";try{let r=new URL(t,s);return f.join(e.outputDir,decodeURIComponent(r.pathname))}catch{return null}}function yr(e,t,s){for(let r of Pr(e,s)){let n=t[r];if(!n)continue;let i=nt(e,n);if(i)return {outputPath:i,publicUrl:n}}return null}function Sr(e,t,s){for(let r of B(e,s)){let n=t[r];if(!n)continue;let i=nt(e,n);if(i)return i}return null}function re(e,t,s){let r=Sr(e,t,s);return r||Re(e,s).originalFilePath}function br(){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 He(e){let t=br();if(t)try{let s=await P.readFile(t,"utf8"),r=JSON.parse(s);if(!r||typeof r!="object")return;await P.writeFile(t,JSON.stringify({...r,checkedAt:new Date().toISOString(),status:"running",currentStep:"rewrite",message:e},null,2),"utf8");}catch{}}function vr(e,t){let s=new Set;for(let r of t.donePages)s.add(f.resolve(q(e,r)));for(let r of t.doneAssets){let n=re(e,t.assetMap,r);!n||!U(n)||s.add(f.resolve(n));}return [...s]}var se="re:",Z=new Map;function Rr(e){if(!e.startsWith(se))return null;let t=Z.get(e);if(t!==void 0)return t||null;let s=e.slice(se.length).trim();if(!s)return Z.set(e,false),null;try{let r=new RegExp(s);return Z.set(e,r),r}catch{return console.warn(`[crawl] Ignoring invalid path matcher regex: ${e}`),Z.set(e,false),null}}function ve(e,t){let s=Rr(t);return s?s.test(e):t.startsWith(se)?false:e.startsWith(t)}function Cr(e,t){return t.find(s=>ve(e,s))}function it(e,t){let s=Cr(t.pathname,e.blockedPathPrefixes);if(s)return s.startsWith(se)?`blocked path regex: ${s}`:`blocked path prefix: ${s}`;let r=e.blockedSearchFragments.find(n=>t.search.includes(n));return r?`blocked search fragment: ${r}`:null}function xr(e){let t=new URL(e.sourceOrigin),s=new Set([t.hostname,...e.allowedAssetHosts]);if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{s.add(new URL(e.targetOrigin).hostname);}catch{}for(let r of Object.keys(e.extraReplacements||{}))try{s.add(new URL(r).hostname);}catch{}return s}function kr(e,t){return xr(e).has(t.hostname)}function Tr(e){let t=E(e.trim()).replace(/\\\//g,"/").replace(/^['"]|['"]$/g,"").trim();return t=t.replace(/[)]+$/g,"").trim(),t=t.replace(/;.*$/g,"").trim(),t}function ot(e){let t=E(e).replace(/\\\//g,"/");return /[{}]|\bwindow\.|\blocation\.|\bincludes\(|\?\?null|\+|%7B|%7D|%22|<|>|\s/.test(t)}function z(e){return ir.some(t=>e.pathname.startsWith(t))}function k(e,t,s=e.sourceOrigin,r,n="url"){let i=Tr(t);if(!i||i.startsWith("data:")||i.startsWith("blob:")||i.startsWith("mailto:")||i.startsWith("tel:")||i.startsWith("#"))return r?.ignore(n,t,"empty or unsupported scheme",s),null;if(ot(i))return r?.ignore(n,t,"looks like JavaScript/code fragment",s),null;try{let a=new URL(i,s);if(!["http:","https:"].includes(a.protocol))return r?.ignore(n,t,"unsupported protocol: ",s),null;if(!kr(e,a))return r?.ignore(n,a.toString(),"host not allowed",s),null;let u=it(e,a);if(u)return r?.reject(n,a.toString(),u,s),null;let o=new URL(e.sourceOrigin);return a.protocol=o.protocol,a.host=o.host,a.hash="",a}catch{return r?.reject(n,t,"invalid URL",s),null}}function at(e){return rr.has(f.extname(e.pathname).toLowerCase())}function W(e){return z(e)?false:sr.has(f.extname(e.pathname).toLowerCase())}function V(e){let t=e.pathname.toLowerCase();return t.endsWith(".xml")&&(t.includes("sitemap")||t.endsWith("/sitemap.xml"))}function x(e,t){return V(t)||t.pathname==="/robots.txt"||t.pathname==="/llms.txt"||t.pathname.toLowerCase().endsWith(".xsl")?true:at(t)?e.assetPathPrefixes.length===0?true:e.assetPathPrefixes.some(s=>ve(t.pathname,s)):false}function q(e,t){let s=new URL(t),r=decodeURIComponent(s.pathname);return r.endsWith("/")?r+="index.html":f.extname(r)||(r+="/index.html"),f.join(e.outputDir,r)}function Ar(e){if(!e.generated404RequestPath)return null;try{return new URL(e.generated404RequestPath,e.sourceOrigin).toString()}catch{return null}}function ut(e,t){let s=Ar(e);if(!s)return false;try{return new URL(t,e.sourceOrigin).toString()===s}catch{return false}}function Re(e,t){let s=new URL(t),r=decodeURIComponent(s.pathname);r.endsWith("/")&&(r+="index.html");let n=!!s.search,i=r,a=f.join(e.outputDir,i),u=pe(e.targetOrigin,i),o=`${u}${s.search}`;if(!n)return {originalPathname:i,originalFilePath:a,originalPublicUrl:u,originalPublicUrlWithSearch:o,preferQueryHashed:n};let l=f.extname(r),p=`${l?r.slice(0,-l.length):r}.${ce(s.search)}${l||".bin"}`;return {originalPathname:i,originalFilePath:a,originalPublicUrl:u,originalPublicUrlWithSearch:o,preferQueryHashed:n,hashedPathname:p,hashedFilePath:f.join(e.outputDir,p),hashedPublicUrl:pe(e.targetOrigin,p)}}function Mr(e,t,s,r,n){t[s]=r;try{let i=new URL(s),u=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{u.push(new URL(e.targetOrigin).origin);}catch{}for(let o of u)try{let l=new URL(o);t[l.origin+i.pathname+i.search]=r;}catch{}try{let o=(()=>{let l=new URL(r,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin);return `${l.pathname}${l.search}`})();t[i.pathname+i.search]=o;}catch{}try{let o=new URL(r,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[i.pathname]=o;}catch{}try{let o=new URL(n,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[i.pathname]=o;}catch{}}catch{}}async function lt(e){try{return await P.readFile(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}async function ct(e){try{return await P.stat(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}function Lr(e){let t=String(e["content-length"]||"").trim();if(!t)return null;let s=Number.parseInt(t,10);return Number.isFinite(s)&&s>=0?s:null}function dt(e){let t=String(e["last-modified"]||"").trim();if(!t)return null;let s=Date.parse(t);return Number.isFinite(s)?s:null}function Ir(e,t){let s=dt(t),r=Lr(t),n=e?.mtime.getTime();return s!==null&&Math.abs((n??0)-s)>=1e3||r!==null&&e?.size!==r?false:s!==null||r!==null}async function Fr(e,t){if(!t)return;let s=dt(t);if(s===null)return;let r=await ct(e);if(!r)return;let n=new Date(s);await P.utimes(e,r.atime,n).catch(()=>{});}function we(e,t){let s=f.extname(e.pathname).toLowerCase(),r=t["content-type"]||"";return nr.has(s)||tr.some(n=>r.includes(n))&&!r.startsWith("image/")&&!r.includes("font")}function Pe(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 Dr(e){return ce(e.toString("base64"),40)}function Or(e,t,s){let r=e.assetVariantDigestsByOriginalPath.get(t);if(!r||r.size===0)return false;for(let n of r)if(n!==s)return true;return false}function Er(e,t,s){let r=e.assetVariantDigestsByOriginalPath.get(t);r||(r=new Set,e.assetVariantDigestsByOriginalPath.set(t,r)),r.add(s);}async function Se(e,t,s,r,n,i,a){let u=Re(e,s),o=Dr(r),l=u.originalFilePath,c=u.originalPublicUrlWithSearch;if(u.preferQueryHashed&&u.hashedFilePath&&u.hashedPublicUrl&&Or(n,u.originalFilePath,o)){let m=yr(e,t,s);m?(l=m.outputPath,c=m.publicUrl):(l=u.hashedFilePath,c=u.hashedPublicUrl);}Mr(e,t,s,c,u.originalPublicUrl);let p=U(l)?Buffer.from(fe(r.toString("utf8"),e,t,l),"utf8"):r,d=await lt(l),h=false;return (d===null||!d.equals(p))&&(await de(l),await P.writeFile(l,p),h=true),Er(n,u.originalFilePath,o),await Fr(l,a),n.stats.assetsSaved++,i&&(n.stats.assetsSaved%50===0||n.stats.assetsSaved===1)&&i.progress(`Asset progress: saved ${n.stats.assetsSaved}, discovered ${n.stats.assetsQueued}, pending ${n.assetQueue.length}.`,{assetsSaved:n.stats.assetsSaved,assetsQueued:n.stats.assetsQueued,assetQueue:n.assetQueue.length,phase:"download-assets"}),{outputPath:l,publicUrl:c,wroteFile:h}}function H(e,t,s,r,n){let i=()=>{let l=String(n??"").trim();if(!l)return {discoveredFrom:"",discoveredFromType:"unknown"};if(l==="seed-path"||l==="cli"||l==="generated-404-request-path")return {discoveredFrom:l,discoveredFromType:l};if(/^https?:\/\//i.test(l))try{let c=new URL(l);return V(c)?{discoveredFrom:l,discoveredFromType:"sitemap"}:x(e,c)?{discoveredFrom:l,discoveredFromType:"asset"}:W(c)&&!z(c)?{discoveredFrom:l,discoveredFromType:"page"}:{discoveredFrom:l,discoveredFromType:"url"}}catch{return {discoveredFrom:l,discoveredFromType:"url"}}return {discoveredFrom:l,discoveredFromType:"url"}},a=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,u=k(e,s,a,r,"page");if(!u)return;if(!W(u)||at(u)){if(x(e,u)){r.info(`Seeded/non-page URL queued as asset: ${u.toString()}`,{url:u.toString(),source:n}),A(e,t,u.toString(),r,n);return}r.reject("page",u.toString(),z(u)?"asset/internal path cannot be page":"not page-like",n);return}let o=u.toString();if(!t.donePages.has(o)&&!t.queuedPages.has(o)){let{discoveredFrom:l,discoveredFromType:c}=i();t.queuedPages.add(o),t.pageQueue.push(o),t.stats.pagesQueued++,r.debug(`Queued discovered page ${o}`,{phase:"discovery",url:o,discoveredFrom:l,discoveredFromType:c,outputPath:q(e,o)}),(t.stats.pagesQueued%25===0||t.stats.pagesQueued===1)&&r.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,pageQueue:t.pageQueue.length,phase:"discovery"});}}function A(e,t,s,r,n){let i=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,a=k(e,s,i,r,"asset");if(!a)return;if(!x(e,a)){r.reject("asset",a.toString(),"not a safe asset path/prefix",n);return}let u=a.toString();!t.doneAssets.has(u)&&!t.queuedAssets.has(u)&&(t.queuedAssets.add(u),t.assetQueue.push(u),t.stats.assetsQueued++,(t.stats.assetsQueued%100===0||t.stats.assetsQueued===1)&&r.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,assetQueue:t.assetQueue.length,phase:"discovery"}));}function Ce(e,t,s,r,n){let i=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,a=k(e,s,i,r,"sitemap");if(!a)return;if(!V(a)){r.reject("sitemap",a.toString(),"not sitemap-like",n);return}let u=a.toString();!t.doneSitemaps.has(u)&&!t.queuedSitemaps.has(u)&&(t.queuedSitemaps.add(u),t.sitemapQueue.push(u),t.stats.sitemapsQueued++,(t.stats.sitemapsQueued%10===0||t.stats.sitemapsQueued===1)&&r.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,sitemapQueue:t.sitemapQueue.length,phase:"discovery"}));}function jr(e){let t=E(e),s=[...t.matchAll(/<url>\s*([\s\S]*?)\s*<\/url>/gi)].map(r=>r[1]);return s.length>0?s.map(r=>{let n=r.match(/<loc>\s*([^<]+?)\s*<\/loc>/i);if(!n?.[1])return null;let i=r.match(/<lastmod>\s*([^<]+?)\s*<\/lastmod>/i);return {loc:n[1].trim(),lastmod:te(i?.[1]??null)}}).filter(r=>!!r):[...t.matchAll(/<loc>\s*([^<]+?)\s*<\/loc>/gi)].map(r=>({loc:r[1].trim(),lastmod:null})).filter(r=>r.loc)}function $r(e){return e.split(",").map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function Ur(e){let t=[],s=/url\(\s*(?:"([^"]+)"|'([^']+)'|([^)]*?))\s*\)/gi;for(let r of e.matchAll(s)){let n=(r[1]||r[2]||r[3]||"").trim();n&&t.push(n);}return t}function ye(e){return e.trim().replace(/\\/g,"/").replace(/^https?:\/\/[^/]+/i,"").replace(/^\/+/,"")}async function pt(e,t){let s=[];await P.mkdir(t,{recursive:true});let r=await P.readdir(e,{withFileTypes:true});for(let n of r){let i=f.join(e,n.name),a=f.join(t,n.name);if(n.isDirectory()){s.push(...await pt(i,a));continue}await P.copyFile(i,a),s.push(a);}return s}async function Qr(e,t){let s=Object.entries(e.postCrawlCopyMap||{}).map(([i,a])=>({sourcePath:i.trim(),prefix:String(a||"").trim()}));if(s.length===0)return [];let r=0,n=[];t.mark("copy-extra-paths");for(let i of s){let a=i.sourcePath,u=i.prefix;if(!a||!u){t.warn("Skipped post-crawl copy mapping with empty key/value",{sourcePath:a,prefixPath:u});continue}let o=lr(a);if(!o.resolvedPath){t.warn("Skipped post-crawl copy source because alias root is not configured",{sourcePath:a,alias:o.alias||"",requiredEnv:o.requiredEnv||"",prefixPath:u});continue}let l=o.resolvedPath,c=ye(u);if(!c){t.warn("Skipped post-crawl copy mapping with invalid export prefix",{sourcePath:a,prefixPath:u});continue}let p;try{p=await P.stat(l);}catch{t.warn("Skipped post-crawl copy source because it does not exist",{sourcePath:a,sourceAbs:l,prefixPath:u});continue}let d=f.resolve(e.outputDir,c);if(p.isDirectory()){n.push(...await pt(l,d)),r++,t.progress(`Copied static directory to export: ${l} -> /${c}`,{phase:"copy-extra-paths",sourcePath:l,targetPath:`/${c}`,copiedItems:r});continue}let h=f.basename(l),m=u.endsWith("/")?f.join(d,h):d;await P.mkdir(f.dirname(m),{recursive:true}),await P.copyFile(l,m),n.push(m),r++,t.progress(`Copied static file to export: ${l} -> /${ye(u.endsWith("/")?`${u}${h}`:u)}`,{phase:"copy-extra-paths",sourcePath:l,targetPath:`/${ye(u.endsWith("/")?`${u}${h}`:u)}`,copiedItems:r});}return t.endMark("copy-extra-paths",{mappedSources:s.length,copiedItems:r}),n}function J(e,t,s,r,n){let i=new Set,a=E(s).replace(/\\\//g,"/");for(let l of Ur(a)){let c=k(e,l,t,r,`${n}:css-url`);c&&x(e,c)&&i.add(c.toString());}for(let l of a.matchAll(/@import\s+(?:url\()?\s*['"]?([^'"\s;]+)['"]?\s*\)?/gi)){let c=k(e,l[1],t,r,`${n}:css-import`);c&&x(e,c)&&i.add(c.toString());}for(let l of a.matchAll(/<\?xml-stylesheet[^>]+href=["']([^"']+)["'][^>]*\?>/gi)){let c=k(e,l[1],t,r,`${n}:xml-stylesheet`);c&&x(e,c)&&i.add(c.toString());}let u="(?: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)",o=new RegExp(`(?:https?:)?//[^\\s'"<>\\);]+\\.${u}(?:\\?[^\\s'"<>\\);]*)?|(?<!\\.)/[^\\s'"<>\\);]+\\.${u}(?:\\?[^\\s'"<>\\);]*)?`,"gi");for(let l of a.matchAll(o)){let c=l[0].startsWith("//")?`${new URL(e.sourceOrigin).protocol}${l[0]}`:l[0];if(ot(c)){r.ignore(`${n}:serialized-url`,c,"looks like JavaScript/code fragment",t);continue}let p=k(e,c,t,r,`${n}:serialized-url`);p&&x(e,p)?i.add(p.toString()):p&&r.ignore("asset",p.toString(),"serialized URL did not pass safe asset path filter",t);}return [...i]}function Nr(e,t,s,r){let n=new Set,i=E(s);for(let a of i.matchAll(/href=["']([^"'#\s][^"']*?)["']/gi)){let u=a[1],o=k(e,u,t,r,"page-link");o&&(it(e,o)||W(o)&&!z(o)&&!x(e,o)&&n.add(o.toString()));}return [...n]}async function Je(e,t,s,r){for(;s.sitemapQueue.length>0;){let n=s.sitemapQueue.shift();if(s.queuedSitemaps.delete(n),!s.doneSitemaps.has(n)){s.doneSitemaps.add(n),r.sitemap(`Fetching sitemap ${n}`,{url:n});try{let i=await t.get(n,{timeout:6e4});if(!i.ok()){r.skip("sitemap",n,i.status());continue}let a=await i.body(),u=i.url()||n;await Se(e,s.assetMap,u,a,s,r);let o=a.toString("utf8");for(let l of J(e,u,o,r,"sitemap"))A(e,s,l,r,u);for(let l of jr(o)){let c=k(e,l.loc,u,r,"sitemap-loc");c&&(V(c)?Ce(e,s,c.toString(),r,u):x(e,c)?A(e,s,c.toString(),r,u):W(c)?(l.lastmod&&(s.sitemapLastmodByPage[c.toString()]=l.lastmod),H(e,s,c.toString(),r,u)):r.reject("sitemap-loc",c.toString(),"not page/sitemap/asset-like",u));}}catch(i){r.error(`Failed sitemap ${n}`,{url:n,error:String(i)});}}}}async function qr(e,t,s,r,n,i,a){let u=k(e,r,e.sourceOrigin,n,"asset-fetch");if(!u||!x(e,u))return;let o=u.toString();if(s.doneAssets.has(o))return;let l=i.enabled?i.previousManifest.assets[o]:void 0,c=(p,d={})=>{if(!l)return false;i.manifest.assets[o]={...l,discoveredAssets:[...l.discoveredAssets||[]],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId},s.doneAssets.add(o);for(let h of l.discoveredAssets||[])A(e,s,h,n,o);return n.warn(`Keeping previous incremental asset ${o} after fetch issue.`,{url:o,reason:p,preservedFromPreviousManifest:true,...d,phase:"download-assets"}),Pe(s,n),true};n.asset(`Fetching asset ${o}`,{url:o});try{let p=re(e,s.assetMap,o),d=p?await ct(p):null;if(p&&d)try{let b=await t.head(o,{timeout:6e4}),v=b.headers();if(b.ok()&&Ir(d,v)){let R=await lt(p);if(R!==null){let T=b.url()||o,M=await Se(e,s.assetMap,T,R,s,n,v);M.wroteFile&&($(a,e,M.outputPath),U(M.outputPath)&&ee(a,M.outputPath)),s.doneAssets.add(o),n.info(`Reused existing asset ${o} based on response headers.`,{url:o,filePath:p,lastModified:v["last-modified"]||"",contentLength:v["content-length"]||"",phase:"download-assets"}),Pe(s,n);let C=we(u,v),ne=l?.discoveredAssets?[...l.discoveredAssets]:[];if(C||l?.isText){let ht=R.toString("utf8"),xe=J(e,T,ht,n,"asset:cached");(xe.length>0||!l)&&(ne=xe);for(let ft of ne)A(e,s,ft,n,T);}i.trackManifest&&(i.manifest.assets[o]={url:o,outputPath:M.outputPath,isText:C||!!l?.isText,discoveredAssets:ne,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId});return}}}catch{}let h=await t.get(o,{timeout:6e4});if(!h.ok()){if(c(`http-${h.status()}`,{status:h.status()}))return;n.skip("asset",o,h.status());return}let m=await h.body(),y=h.url()||o,S=h.headers(),g=await Se(e,s.assetMap,y,m,s,n,S);g.wroteFile&&($(a,e,g.outputPath),U(g.outputPath)&&ee(a,g.outputPath)),s.doneAssets.add(o),Pe(s,n);let w=[];if(we(u,S)){let b=m.toString("utf8");w=J(e,y,b,n,`asset:${f.extname(u.pathname).toLowerCase()||S["content-type"]||"unknown"}`);for(let v of w)A(e,s,v,n,y);}i.trackManifest&&(i.manifest.assets[o]={url:o,outputPath:g.outputPath,isText:we(u,S),discoveredAssets:w,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId});}catch(p){if(c("fetch-error",{error:String(p)}))return;n.error(`Failed asset ${o}`,{url:o,error:String(p)});}}async function Wr(e,t,s,r,n,i){let a=Math.max(1,Number(e.assetDownloadConcurrency||e.concurrency||1)),u=Array.from({length:a},async()=>{for(;s.assetQueue.length>0;){let o=s.assetQueue.shift();o&&(s.queuedAssets.delete(o),await qr(e,t,s,o,r,n,i));}});await Promise.all(u);}async function _r(e){await e.evaluate(async()=>{await new Promise(t=>{let s=0,r=700,n=window.setInterval(()=>{window.scrollBy(0,r),s+=r,s>=document.body.scrollHeight+window.innerHeight&&(window.clearInterval(n),window.scrollTo(0,0),t());},120);});});}async function Br(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 _r(t),await t.waitForTimeout(e.readiness.fallbackWaitMs);}async function zr(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 Hr(e,t){return e.noJavaScriptRenderPathPrefixes.some(s=>ve(t,s))}async function Jr(e,t,s,r,n=true){let i=new Set;if(n){let u=await t.evaluate(()=>{let o=new Set,l=["href","src","poster","data-src","data-lazy-src","data-original","data-bg","data-background","data-href"],c=new Set,p=["srcset","data-srcset","data-lazy-srcset"];return document.querySelectorAll("*").forEach(d=>{for(let m of l){let y=d.getAttribute(m);y&&o.add(y);}for(let m of p){let y=d.getAttribute(m);y&&y.split(",").forEach(S=>{let g=S.trim().split(/\s+/)[0];g&&o.add(g);});}let h=d.getAttribute("style");h&&c.add(h);}),{attrs:[...o],styles:[...c]}});for(let o of u.attrs)for(let l of $r(o)){let c=k(e,l,s,r,"dom-attr");c&&x(e,c)&&i.add(c.toString());}for(let o of u.styles)for(let l of J(e,s,o,r,"dom-style"))i.add(l);}let a=await t.content();for(let u of J(e,s,a,r,"page-html"))i.add(u);return [...i]}async function Ve(e,t,s,r,n){let i=q(e,t);await de(i),await P.writeFile(i,s,"utf8"),r.stats.pagesSaved++,n&&(r.stats.pagesSaved%10===0||r.stats.pagesSaved===1)&&n.progress(`Page progress: processed ${r.donePages.size}, rendered ${r.stats.pagesRendered}, saved ${r.stats.pagesSaved}, discovered ${r.stats.pagesQueued}.`,{donePages:r.donePages.size,pagesRendered:r.stats.pagesRendered,pagesSaved:r.stats.pagesSaved,pagesQueued:r.stats.pagesQueued,pageQueue:r.pageQueue.length,phase:"save-pages"});}function Ge(e){return e.donePages.size%5===0||e.donePages.size===1||e.donePages.size===e.stats.pagesQueued}function Ke(e,t){t.progress(`Render progress: processed ${e.donePages.size}, rendered ${e.stats.pagesRendered}, saved ${e.stats.pagesSaved}, discovered ${e.stats.pagesQueued}.`,{donePages:e.donePages.size,pagesRendered:e.stats.pagesRendered,pagesSaved:e.stats.pagesSaved,pagesQueued:e.stats.pagesQueued,phase:"render-pages"});}async function Vr(e){await e.addInitScript(()=>{Object.defineProperty(window,"__WPSUITE_STATIC_EXPORT__",{value:true,writable:false,configurable:true});let t=s=>{if(s==null||String(s)==="")return true;try{let r=new URL(String(s),window.location.href),n=new URL(window.location.href);return r.hash="",n.hash="",r.href===n.href}catch{return false}};try{let s=window.location.assign.bind(window.location),r=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 s(i)}}),Object.defineProperty(window.location,"replace",{configurable:!0,value:i=>{if(t(i)){console.warn("[smartcloud-static-publisher] blocked same-page location.replace",i??"");return}return r(i)}}),Object.defineProperty(window.location,"reload",{configurable:!0,value:()=>{console.warn("[smartcloud-static-publisher] blocked location.reload");}});}catch{}});}async function Gr(e,t,s){let r=await e.newContext({viewport:t.viewport,userAgent:"WPSuiteStaticPublisher/0.8 Playwright SitemapOnly",ignoreHTTPSErrors:t.ignoreHttpsErrors,...s?{javaScriptEnabled:false}:{}});return s||await Vr(r),r}async function Kr(e,t,s,r,n,i,a){let u=await chromium.launch({headless:true});try{for(;t.pageQueue.length>0&&!(e.maxPages>0&&t.donePages.size>=e.maxPages);){let o=t.pageQueue.shift();if(!o)break;if(t.queuedPages.delete(o),t.donePages.has(o))continue;t.donePages.add(o),i.enabled&&i.seenPages.add(o);let l=new URL(o),c=ut(e,o),p=Hr(e,l.pathname);if(!W(l)||x(e,l)||z(l)){if(x(e,l)){s.info(`Worker redirected non-page URL to asset queue: ${o}`,{url:o,source:"worker-guard"}),A(e,t,o,s,"worker-guard");continue}s.reject("page",o,"guard rejected non-page URL before rendering","worker");continue}let d=await fr(e,n,t,i,o,s);if(i.enabled&&r!=="single-url"){let g=i.manifest.pages[o];if(d.action==="reuse"&&g){for(let w of g.discoveredAssets)A(e,t,w,s,o);for(let w of g.discoveredPages)H(e,t,w,s,o);g.lastSeenRunId=i.runId,g.sitemapLastmod=te(t.sitemapLastmodByPage[o])??g.sitemapLastmod,d.changeToken?.supported&&(g.changeToken=d.changeToken.token,g.tokenSource=d.changeToken.tokenSource??g.tokenSource),s.info(`Incremental reuse skipped unchanged page ${o}`,{url:o,mode:"incremental",reason:d.changeToken?.supported===!0?"change-token-match":"sitemap-lastmod-match"}),Ge(t)&&Ke(t,s);continue}}let h=await Gr(u,e,p),m=await h.newPage(),y=!1,S=new Set;await m.route("**/*",async g=>{let w=g.request();if(w.isNavigationRequest()&&w.frame()===m.mainFrame())try{let b=new URL(w.url()),v=new URL(o);if(b.hash="",v.hash="",b.href===v.href){if(y){s.warn(`Blocked same-page navigation/reload for ${o}`,{url:o,requestUrl:w.url()}),await g.abort("aborted");return}y=!0;}}catch{}await g.continue();}),m.on("response",g=>{try{let w=k(e,g.url(),e.sourceOrigin,void 0,"network-response");w&&x(e,w)&&(S.add(w.toString()),A(e,t,w.toString(),s,o));}catch{}}),s.page(`Rendering ${o}`,{url:o});try{let g=null,w=null;try{if(g=await m.goto(o,{waitUntil:"domcontentloaded",timeout:e.navigationTimeoutMs}),g&&g.ok())try{w=await g.text();}catch{w=null;}}catch(C){s.warn(`Navigation issue for ${o}; saving current DOM if available`,{url:o,error:String(C)});}if(c){let C=g?.status()??null;if(C!==404){s.error(`Generated 404 request path returned unexpected status for ${o}`,{url:o,expectedStatus:404,status:C,requestPath:e.generated404RequestPath});continue}s.info(`Capturing rendered 404 page for ${o}`,{url:o,status:C,outputPath:q(e,o)});}else if(g&&!g.ok()){s.skip("page",o,g.status()),await m.close();continue}p?(s.info(`Rendering without JS execution for ${o}`,{url:o,mode:"no-js"}),await zr(e,m)):await Br(e,m),t.stats.pagesRendered++,Ge(t)&&Ke(t,s);let b=await Jr(e,m,o,s,!p);for(let C of b)A(e,t,C,s,o);let v=[...new Set([...b,...S])],R=w??await m.content(),T=r!=="single-url"&&!c?Nr(e,o,R,s):[];if(r!=="single-url"&&!c)for(let C of T)H(e,t,C,s,o);await Ve(e,o,R,t,s);let M=q(e,o);$(a,e,M),ee(a,M),i.trackManifest&&(i.manifest.pages[o]={url:o,outputPath:M,changeToken:d.changeToken?.supported?d.changeToken.token:null,tokenSource:d.changeToken?.supported?d.changeToken.tokenSource??null:null,sitemapLastmod:te(t.sitemapLastmodByPage[o])??null,discoveredPages:T,discoveredAssets:v,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId});}catch(g){try{let w=await m.content();if(w&&w.trim()){await Ve(e,o,w,t,s);let b=q(e,o);$(a,e,b),ee(a,b),s.warn(`Saved partial DOM for ${o}`,{url:o,error:String(g)});}}catch(w){s.error(`Could not save partial DOM for ${o}`,{url:o,error:String(w)});}s.error(`Failed page ${o}`,{url:o,error:String(g)});}finally{await m.close(),await h.close();}}}finally{await u.close();}}async function Yr(e){try{let t=await P.readFile(e),r=(e.endsWith(".gz")?gunzipSync(t):t).toString("utf8").trim();if(!r)return [];try{let n=JSON.parse(r);if(Array.isArray(n))return n;if(n&&typeof n=="object")return [n]}catch{return r.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 Ye(e){let t=String(e||"").toLowerCase();return t.includes("timeout")||t.includes("timed out")||t.includes("navigation timeout")}function Xr(e){let t=String(e?.job?.command||"").trim(),s=String(e?.job?.crawlMode||"full").trim();return t!=="publish"&&t!=="crawl"?false:s!=="incremental"}function Zr(e){let t=[e?.archivedAt,e?.job?.endedAt,e?.job?.startedAt];for(let s of t){let r=Date.parse(String(s||""));if(Number.isFinite(r))return r}return 0}async function gt(e){try{let t=await P.readFile(e,"utf8"),s=JSON.parse(t);return s&&typeof s=="object"&&!Array.isArray(s)?s:null}catch{return null}}function Xe(e){let t=String(e.originalFileName||"").toLowerCase();return t.endsWith("errors.jsonl")?0:t.endsWith("errors.json")?1:2}function es(e,t){let s=Array.isArray(t?.artifacts)?t.artifacts.filter(r=>String(r?.role||"").trim()==="errors"&&String(r?.storedFileName||"").trim()!=="").sort((r,n)=>Xe(r)-Xe(n)).map(r=>f.join(e,String(r.storedFileName))):[];return [...new Set([...s,f.join(e,"errors.jsonl"),f.join(e,"errors.json"),f.join(e,"errors.jsonl.gz"),f.join(e,"errors.json.gz")])]}async function Ze(e){let t=await gt(f.join(e,"job.json"));for(let s of es(e,t)){let r=await Yr(s);if(r.length>0)return r}return []}async function ts(e){let t=f.join(e.logDir,"archive"),s;try{s=await P.readdir(t);}catch{return ""}let r="",n=0;for(let i of s){let a=f.join(t,i);if(!(await P.stat(a).catch(()=>null))?.isDirectory())continue;let o=await gt(f.join(a,"job.json"));if(!Xr(o))continue;let l=Zr(o);l>=n&&(n=l,r=a);}return r}async function rs(e){let t=await ts(e),s=t!==""?await Ze(t):await Ze(e.logDir),r=new Set;for(let n of s)if(Ye(n.error)||Ye(n.message)){let i=n.url;typeof i=="string"&&i&&r.add(i);}return [...r]}async function ss(e){let t=[];for(let s of e)if(s.startsWith("@")){let r=s.slice(1),n=await P.readFile(r,"utf8");t.push(...n.split(/\r?\n/).map(i=>i.trim()).filter(i=>i&&!i.startsWith("#")));}else t.push(s);return t}async function ns(e){try{let t=await P.readFile(f.join(e.outputDir,"asset-map.json"),"utf8");return JSON.parse(t)}catch{return {}}}async function is(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 P.mkdir(e,{recursive:true}),await Promise.all(t.map(async s=>{try{await P.unlink(f.join(e,s));}catch(r){if(r.code!=="ENOENT")throw r}}));}function et(e,t,s,r,n){let i=k(e,s,e.sourceOrigin,r,"manual-url");i&&(V(i)?Ce(e,t,i.toString(),r,n):x(e,i)?A(e,t,i.toString(),r,n):W(i)?H(e,t,i.toString(),r,n):r.reject("manual-url",i.toString(),"not page/sitemap/asset-like",n));}async function os(){let e=await le(),t=or(process.argv.slice(2));if(t.resumeRewrite&&t.mode!=="full")throw new Error("--resume-rewrite is only supported for full crawl/publish jobs.");let s=[];t.mode==="retry-timeouts"&&(s=await rs(e)),t.mode==="single-url"&&(s=await ss(t.urls));let r=t.crawlMode==="incremental"&&t.mode==="full",n=r&&typeof e.subscriptionType=="string"&&e.subscriptionType.trim()!=="",i=t.mode==="full"&&!t.resumeRewrite,a=t.mode!=="full"||t.resumeRewrite||n,u=a?await ns(e):{},o=n?await dr(e):st(),l={enabled:n,trackManifest:i,manifest:_e(o),previousManifest:_e(o),runId:`${Date.now()}`,seenPages:new Set,changeTokenCache:new Map};await is(e.logDir);let c={pageQueue:[],queuedPages:new Set,donePages:new Set,assetQueue:[],queuedAssets:new Set,doneAssets:new Set,sitemapQueue:[],queuedSitemaps:new Set,doneSitemaps:new Set,sitemapLastmodByPage:{},assetMap:{...u},assetVariantDigestsByOriginalPath:new Map,stats:{pagesQueued:0,pagesRendered:0,assetsQueued:0,sitemapsQueued:0,assetsSaved:0,pagesSaved:0}},p=cr();a||await P.rm(e.outputDir,{recursive:true,force:true}),await P.mkdir(e.outputDir,{recursive:true});let d=new _(e.logDir,e.logLevel);if(r&&!n&&d.warn("Incremental crawl requested without active remote publisher subscription. Falling back to full crawl.",{requestedMode:t.crawlMode,subscriptionType:e.subscriptionType??null}),t.resumeRewrite)d.info("Resuming final rewrite from existing output.",{phase:"rewrite-text",mode:t.mode,crawlMode:t.crawlMode});else {let g=await chromium.launch({headless:true}),w=await g.newContext({ignoreHTTPSErrors:e.ignoreHttpsErrors}),b=w.request;try{if(d.mark("discovery"),t.mode==="full"?(e.sitemapPaths.forEach(R=>Ce(e,c,R,d)),await Je(e,b,c,d),e.seedPaths.forEach(R=>et(e,c,R,d,"seed-path")),e.generated404RequestPath&&H(e,c,e.generated404RequestPath,d,"generated-404-request-path")):(s.forEach(R=>et(e,c,R,d,"cli")),await Je(e,b,c,d)),d.endMark("discovery",{pages:c.pageQueue.length,assets:c.assetQueue.length,sitemaps:c.sitemapQueue.length}),d.summary(`Queued ${c.pageQueue.length} pages, ${c.assetQueue.length} assets, ${c.sitemapQueue.length} sitemaps.`,{mode:t.mode,crawlMode:t.crawlMode,queuedPages:c.pageQueue.length,queuedAssets:c.assetQueue.length,queuedSitemaps:c.sitemapQueue.length}),t.mode==="retry-timeouts"&&c.pageQueue.length===0&&c.assetQueue.length===0&&c.sitemapQueue.length===0){d.summary("No timed-out URLs were queued. Skipping retry crawl.",{mode:t.mode,crawlMode:t.crawlMode,queuedPages:0,queuedAssets:0,queuedSitemaps:0}),await d.flush();return}d.mark("render-pages");let v=Array.from({length:Math.max(1,e.concurrency)},()=>Kr(e,c,d,t.mode,b,l,p));if(await Promise.all(v),d.endMark("render-pages",{pages:c.donePages.size}),d.mark("download-assets"),await Wr(e,b,c,d,l,p),d.endMark("download-assets",{assets:c.doneAssets.size}),l.enabled&&e.maxPages===0&&await mr(e,c,l,d,p),t.mode==="full"){let R=await Qr(e,d);for(let T of R)$(p,e,T);}}finally{await w.close(),await g.close();}}l.trackManifest&&(l.manifest.updatedAt=new Date().toISOString(),await pr(e,l.manifest)),await P.writeFile(f.join(e.outputDir,"asset-map.json"),JSON.stringify(c.assetMap,null,2),"utf8"),JSON.stringify(u,null,2)!==JSON.stringify(c.assetMap,null,2)&&$(p,e,f.join(e.outputDir,"asset-map.json"));let h=t.mode==="single-url"?vr(e,c):l.enabled&&!t.resumeRewrite?wr(e,l,p,u,c.assetMap):void 0;d.mark("rewrite-text");let m=t.mode==="single-url"?`Rewriting text files touched by URL crawl: 0/${h?.length??0}`:"Rewriting text files...";d.progress(m,{phase:"rewrite-text",index:0,totalFiles:h?.length,changedTextFiles:0}),await He(m);let y=Date.now(),S=await Ue(e,c.assetMap,{files:h,previousAssetMap:u,onProgress:async({index:g,totalFiles:w,changedTextFiles:b,file:v,changed:R})=>{R&&$(p,e,f.join(e.outputDir,v)),d.checkpoint(`Rewriting text file ${g}/${w}`,{phase:"rewrite-text",index:g,totalFiles:w,changedTextFiles:b,file:v});let T=Date.now();if(!(g===1||g===w||T-y>=5e3))return;y=T;let C=`Rewriting text files: ${g}/${w}`;d.progress(C,{phase:"rewrite-text",index:g,totalFiles:w,changedTextFiles:b,file:v}),await He(C);}});d.endMark("rewrite-text",{changedTextFiles:S}),await Ae(e,{generatedAt:new Date().toISOString(),outputDir:f.resolve(e.outputDir),runMode:t.mode,crawlMode:t.crawlMode,fullSyncRequired:!(l.enabled&&!t.resumeRewrite),changedFiles:l.enabled&&!t.resumeRewrite?[...p.changedFiles].sort():[],deletedFiles:l.enabled&&!t.resumeRewrite?[...p.deletedFiles].sort():[],rewriteTargets:l.enabled&&!t.resumeRewrite?[...new Set((h||[]).map(g=>G(e.outputDir,f.isAbsolute(g)?g:f.join(e.outputDir,g))).filter(g=>g!==null))].sort():[]}),d.summary(t.resumeRewrite?`Done. Resumed final rewrite over existing output and changed ${S} text files.`:`Done. Rendered ${c.stats.pagesRendered} pages, processed ${c.doneSitemaps.size} sitemaps, downloaded ${c.doneAssets.size} assets.`,{mode:t.mode,crawlMode:t.crawlMode,resumeRewrite:t.resumeRewrite,...c.stats,pagesRendered:c.stats.pagesRendered,donePages:c.donePages.size,doneSitemaps:c.doneSitemaps.size,doneAssets:c.doneAssets.size,changedTextFiles:S}),await d.flush();}os().catch(async e=>{console.error(e);try{let s=(await le().catch(()=>null))?.logDir??"logs",r=new _(s,"debug");r.error(`Unhandled error: ${e instanceof Error?e.message:String(e)}`,e instanceof Error?{stack:e.stack}:void 0),await r.flush();}catch{}process.exit(1);});
package/dist/deploy.js CHANGED
@@ -1,6 +1,6 @@
1
- import {S3Client,ListObjectsV2Command,HeadObjectCommand,GetObjectCommand,DeleteObjectsCommand}from'@aws-sdk/client-s3';import {Upload}from'@aws-sdk/lib-storage';import {createHash}from'crypto';import ft from'fast-glob';import $ from'fs/promises';import v from'path';import jt from'mime-types';import {getConfig}from'@smart-cloud/wpsuite-core';import {availableParallelism}from'os';import {Worker}from'worker_threads';function pe(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function Ke(e){let t=String(e??"").trim();if(!t)return "";let r=t;if(/^https?:\/\//i.test(r))try{r=new URL(r).pathname;}catch{return ""}if(r=r.split(/[?#]/,1)[0]?.replace(/\\/g,"/").trim()??"",!r)return "";let n=r.endsWith("/"),i=r.replace(/^\/+/,"").split("/").map(o=>o.replace(/[^A-Za-z0-9._-]/g,"")).filter(o=>o.length>0&&o!=="."&&o!=="..");if(i.length===0)return "";let s=`/${i.join("/")}`;return n&&v.extname(s)===""&&(s+="/"),s==="/"?"":s}function Q(e){return !e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).map(([t,r])=>[t.trim(),String(r??"")]).filter(([t])=>t.length>0))}function Qe(e){if(!e||typeof e!="object")return {};let t={};for(let[r,n]of Object.entries(e)){let i=r.trim();if(!i||!n||typeof n!="object")continue;let s=n,o={};if(typeof s.targetOrigin=="string"){let a=pe(s.targetOrigin);a&&(o.targetOrigin=a);}let l=Q(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[i]=o;}return t}function de(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function Ge(e,t){if(!e||typeof e!="object")return null;let r=e,n=r.command;if(n!=="publish"&&n!=="crawl"&&n!=="deploy"&&n!=="invalidate"&&n!=="retry-timeouts"&&n!=="url")return null;let i=Number.parseInt(String(r.intervalMinutes??"0"),10);if(!Number.isFinite(i)||i<1)return null;let s=String(r.id??`${n}-${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:n,intervalMinutes:i,...n==="publish"||n==="crawl"?{crawlMode:r.crawlMode==="incremental"?"incremental":"full"}:{},...(n==="publish"||n==="deploy"||n==="invalidate")&&o?{deploymentProfile:o}:{},...l?{url:l}:{}}}function fe(e){let t=e&&typeof e=="object"?e:{},r=Array.isArray(t.rules)?t.rules.map((n,i)=>Ge(n,i)).filter(n=>!!n):[];return {enabled:t.enabled===true,timezone:typeof t.timezone=="string"&&t.timezone.trim()!==""?t.timezone.trim():"UTC",rules:r}}function Ve(e){if(!e||typeof e!="object")return;let t=e,r={};for(let i of ["accountId","siteId"]){let s=t[i];typeof s=="string"&&s.trim()!==""&&(r[i]=s.trim());}let n=Number(t.lastUpdate??0);return Number.isFinite(n)&&n>0&&(r.lastUpdate=Math.floor(n)),t.subscriber===true&&(r.subscriber=true),Object.keys(r).length>0?r:void 0}function V(e){let t=e&&typeof e=="object"?e:{},r=String(t.accountId??"").trim(),n=String(t.siteId??"").trim(),i=t.subscriber===true,s=Ve(t.siteSettings),o={...s??{},...r?{accountId:s?.accountId??r}:{},...n?{siteId:s?.siteId??n}:{},...s?.subscriber===true||i?{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.uploadUrl??"").trim();c&&(l.uploadUrl=c),Object.keys(o).length>0&&(l.siteSettings=o);let f=de(t.subscriptionType);return f&&(l.subscriptionType=f),l}function Ye(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function Ze(e){let t=V(e.wpsuite),r={...t.siteSettings??{},...t.siteSettings?.subscriber===true||t.subscriptionType==="PROFESSIONAL"||t.subscriptionType==="AGENCY"?{subscriber:true}:{}},n=String(r.accountId??"").trim(),i=String(r.siteId??"").trim(),s=String(t.uploadUrl??"").trim();if(e.wpsuite={...t.apiBase?{apiBase:t.apiBase}:{},...t.runtimeToken?{runtimeToken:t.runtimeToken}:{},...s?{uploadUrl:s}:{},...Object.keys(r).length>0?{siteSettings:r}:{},...t.subscriptionType?{subscriptionType:t.subscriptionType}:{}},!n||!i||!s)return false;Ye(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 Xe(e){if(!Ze(e))return null;try{let t=await getConfig("publisher");return t&&typeof t=="object"?t:null}catch{return null}}function et(e,t){let r=Qe(t?.deploymentProfiles),n=String(t?.defaultDeploymentProfile??"").trim(),i=r[n]?n:"",s=de(t?.subscriptionType),o=V(e.wpsuite);return {...e,scheduler:fe(t?.scheduler),deploymentProfiles:r,defaultDeploymentProfile:i,...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 G(e,t){let n=String(e||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!n)return t;let i=n.split("/").map(s=>s.trim()).filter(s=>s.length>0&&s!=="."&&s!=="..");return i.length>0?i.join("/"):t}function tt(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?v.resolve(e):""}function ge(e,t,r){let n=String(t||"").trim();return n&&v.isAbsolute(n)?v.resolve(n):v.resolve(e,G(n,r))}async function Y(e){let t=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",r=await $.readFile(t,"utf8"),n=JSON.parse(r);n.sourceOrigin=n.sourceOrigin.replace(/\/$/,""),n.targetOrigin=pe(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=Ke(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=Q(n.extraReplacements),n.postCrawlCopyMap=Q(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=V(n.wpsuite),n.scheduler=fe(void 0),n.deploymentProfiles={},n.defaultDeploymentProfile="",n.deploymentTargetOverride=String(n.deploymentTargetOverride??"").trim();let i=et(n,await Xe(n)),s=tt(),o=s?v.resolve(s,".."):"";return o?(i.outputDir=ge(o,i.outputDir,"export"),i.logDir=ge(o,i.logDir,"logs")):(v.isAbsolute(i.outputDir)||(i.outputDir=G(i.outputDir,"export")),v.isAbsolute(i.logDir)||(i.logDir=G(i.logDir,"logs"))),i}var rt=".deploy-plan.json",nt="deploy-plan.json";function it(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?v.resolve(e):""}function st(e){let t=String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").trim();return !t||t==="."||t.startsWith("../")||t===".."?null:t}function Z(e){return [...new Set(e.map(st).filter(t=>t!==null))]}function ot(e,t){return {schemaVersion:1,generatedAt:String(t.generatedAt||new Date().toISOString()),outputDir:v.resolve(e.outputDir),runMode:t.runMode,crawlMode:t.crawlMode,fullSyncRequired:!!t.fullSyncRequired,changedFiles:Z(t.changedFiles||[]),deletedFiles:Z(t.deletedFiles||[]),rewriteTargets:Z(t.rewriteTargets||[])}}function at(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 he(e){let t=v.join(v.resolve(e.outputDir),rt),r=it();return r?[v.join(r,nt),t]:[t]}async function we(e){let t=v.resolve(e.outputDir);for(let r of he(e))try{let n=await $.readFile(r,"utf8"),i=JSON.parse(n);if(!at(i)||v.resolve(i.outputDir)!==t)continue;return ot(e,i)}catch{}return null}async function ye(e){for(let t of he(e))try{await $.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}function lt(e){return typeof e.subscriptionType=="string"&&e.subscriptionType.trim()!==""}function be(e){let t="";for(let n=0;n<e.length;n++){let i=e[n];if(i==="--profile"){let s=(e[n+1]||"").trim();if(!s)throw new Error("Missing value for --profile.");t=s,n+=1;}else if(i.startsWith("--profile=")){let s=i.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 ut(e,t){return {...e,...t??{}}}function ct(e,t){return {...e,...t??{},invalidationPaths:[...(t?.invalidationPaths??e.invalidationPaths)||[]]}}function Pe(e,t){let r=String(t??e.deploymentTargetOverride??"").trim();if(!lt(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 n=String(r||e.defaultDeploymentProfile||"").trim();if(!n)return {name:null,profile:null,config:e};let i=e.deploymentProfiles?.[n];if(!i)throw new Error(`Unknown deployment profile "${n}". Check the linked WPSuite publisher configuration.`);return {name:n,profile:i,config:{...e,targetOrigin:i.targetOrigin??e.targetOrigin,s3:ut(e.s3,i.s3),cloudFront:ct(e.cloudFront,i.cloudFront)}}}var Se={error:0,warn:1,info:2,debug:3},ve=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",W=ve?v.join(ve,"current-progress.json"):"",xe=Promise.resolve();function Re(e){return e.includes("crawl")?"crawl":e.includes("deploy")?"deploy":e.includes("invalidate")?"invalidate":e}function gt(e,t){let r={...e},n=new Set(["pagesQueued","pagesRendered","assetsQueued","sitemapsQueued","pagesDiscovered","assetsDiscovered","sitemapsDiscovered","pagesSaved","assetsSaved","donePages","doneAssets","doneSitemaps","changedTextFiles","uploaded","failed","index","totalFiles","pageQueue","assetQueue","sitemapQueue"]);for(let[i,s]of Object.entries(t)){let o=r[i];if(typeof o=="number"&&typeof s=="number"&&n.has(i)){r[i]=Math.max(o,s);continue}r[i]=s;}return r}function pt(e,t,r){W&&(xe=xe.then(async()=>{let n=new Date,i=n.toISOString();await $.mkdir(v.dirname(W),{recursive:true});let s=await $.readFile(W,"utf8").then(b=>JSON.parse(b)).catch(()=>null),o=s&&typeof s.details=="object"&&s.details?s.details:{},l=Re(e),a=s?.currentStep||Re(s?.source||""),u=s?.startedAt||i,c={...s?.stepDurationsSec??{}},f=s?.stepStartedAt||i;if(a&&a!==l&&s?.stepStartedAt){let b=Math.max(0,Math.round((n.getTime()-new Date(s.stepStartedAt).getTime())/1e3));c[a]=(c[a]??0)+b,f=i;}let g=Math.max(0,Math.round((n.getTime()-new Date(f).getTime())/1e3)),m=Math.max(0,Math.round((n.getTime()-new Date(u).getTime())/1e3)),y={checkedAt:i,source:e,message:t,details:gt(o,r??{}),startedAt:u,currentStep:l,stepStartedAt:f,stepElapsedSec:g,totalElapsedSec:m,stepDurationsSec:c};await $.writeFile(W,JSON.stringify(y,null,2),"utf8");}).catch(()=>{}));}async function dt(e,t){await $.mkdir(v.dirname(e),{recursive:true}),await $.appendFile(e,`${JSON.stringify(t)}
2
- `,"utf8");}var A=class{constructor(t,r,n="info"){this.logDir=t;this.logFile=r;this.level=n;this.ensureLogFileReady();}logDir;logFile;level;startedAt=Date.now();marks=new Map;initPromise=null;writeQueue=Promise.resolve();writeError=null;get logPath(){return v.join(this.logDir,this.logFile)}get errorsPath(){return v.join(this.logDir,this.logFile.replace(".log.jsonl",".errors.jsonl"))}ensureLogFileReady(){return this.initPromise||(this.initPromise=(async()=>{await $.mkdir(this.logDir,{recursive:true}),await $.writeFile(this.logPath,"","utf8");})()),this.initPromise}enqueueTask(t){this.writeQueue=this.writeQueue.then(t).catch(r=>{this.writeError=r instanceof Error?r:new Error(String(r));});}enqueueLine(t){this.enqueueTask(async()=>{await this.ensureLogFileReady(),await $.appendFile(this.logPath,`${t}
3
- `,"utf8");});}enqueueJsonLine(t,r){this.enqueueTask(()=>dt(t,r));}accepts(t){return Se[t]<=Se[this.level]}push(t,r,n){if(!this.accepts(t))return;let i=JSON.stringify({time:new Date().toISOString(),level:t,message:r,...n||{}});this.enqueueLine(i),t==="error"?console.error(`[ERROR] ${r}`,n?JSON.stringify(n):""):t==="warn"?console.warn(`[WARN] ${r}`,n?JSON.stringify(n):""):console.log(`[${t.toUpperCase().padEnd(5)}] ${r}`);}info(t,r){this.push("info",t,r);}progress(t,r){pt(this.logFile,t,r);}debug(t,r){this.push("debug",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);}mark(t){this.marks.set(t,Date.now());}endMark(t,r){let n=this.marks.get(t);if(!n)return;let i=Date.now()-n,s=Number((i/1e3).toFixed(2));this.push("info",`Timing ${t}: ${s}s`,{name:t,ms:i,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}};function De(e){return [".html",".htm",".css",".js",".mjs",".json",".xml",".xsl",".txt",".svg",".map",".enc",".jws"].includes(v.extname(e).toLowerCase())}function Ce(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 T(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function B(e){return e.replace(/\//g,"\\/")}function $e(e){return e.replace(/\//g,"\\\\/")}function H(e,t,r){if(!t)return;e[t]=r;let n=B(t),i=B(r);e[n]=i;let s=$e(t),o=$e(r);e[s]=o;let l=T(t),a=T(r);e[l]=a;let u=T(n),c=T(i);e[u]=c;let f=T(s),g=T(o);e[f]=g;}function Ee(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function ke(e,t,r){if(!t)return r;let n=v.dirname(v.resolve(t)),i=v.resolve(e,r.replace(/^\/+/,"")),s=v.relative(n,i).replace(/\\/g,"/");return s?(s.startsWith(".")||(s=`./${s}`),s):"."}var wt=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],yt=new Set([".html",".htm"]),Te="WPSuite.io Static Publisher",bt=Te.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function Pt(e,t,r){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let i=v.extname(r).toLowerCase();return yt.has(i)?/<head\b|<html\b|<!doctype html/i.test(t):false}function St(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${bt}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${Te}" />`;if(e.match(/(\r?\n)([ \t]*)<\/head>/i))return e.replace(/(\r?\n)([ \t]*)<\/head>/i,`$1$2${t}$1$2</head>`);let n=e.includes(`\r
1
+ import {S3Client,ListObjectsV2Command,HeadObjectCommand,GetObjectCommand,DeleteObjectsCommand}from'@aws-sdk/client-s3';import {Upload}from'@aws-sdk/lib-storage';import {createHash}from'crypto';import wt from'fast-glob';import R from'fs/promises';import v from'path';import Nt from'mime-types';import {getConfig}from'@smart-cloud/wpsuite-core';import {availableParallelism}from'os';import {Worker}from'worker_threads';function fe(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function Ve(e){let t=String(e??"").trim();if(!t)return "";let r=t;if(/^https?:\/\//i.test(r))try{r=new URL(r).pathname;}catch{return ""}if(r=r.split(/[?#]/,1)[0]?.replace(/\\/g,"/").trim()??"",!r)return "";let n=r.endsWith("/"),i=r.replace(/^\/+/,"").split("/").map(o=>o.replace(/[^A-Za-z0-9._-]/g,"")).filter(o=>o.length>0&&o!=="."&&o!=="..");if(i.length===0)return "";let s=`/${i.join("/")}`;return n&&v.extname(s)===""&&(s+="/"),s==="/"?"":s}function V(e){return !e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).map(([t,r])=>[t.trim(),String(r??"")]).filter(([t])=>t.length>0))}function Ye(e){if(!e||typeof e!="object")return {};let t={};for(let[r,n]of Object.entries(e)){let i=r.trim();if(!i||!n||typeof n!="object")continue;let s=n,o={};if(typeof s.targetOrigin=="string"){let a=fe(s.targetOrigin);a&&(o.targetOrigin=a);}let u=V(s.extraReplacements);if(Object.keys(u).length>0&&(o.extraReplacements=u),s.s3&&typeof s.s3=="object"){let a={},l=s.s3;typeof l.bucket=="string"&&(a.bucket=l.bucket.trim()),typeof l.prefix=="string"&&(a.prefix=l.prefix.trim()),typeof l.region=="string"&&(a.region=l.region.trim()),typeof l.htmlCacheControl=="string"&&(a.htmlCacheControl=l.htmlCacheControl.trim()),typeof l.assetCacheControl=="string"&&(a.assetCacheControl=l.assetCacheControl.trim()),Object.keys(a).length>0&&(o.s3=a);}if(s.cloudFront&&typeof s.cloudFront=="object"){let a={},l=s.cloudFront;typeof l.distributionId=="string"&&(a.distributionId=l.distributionId.trim()),Array.isArray(l.invalidationPaths)&&(a.invalidationPaths=l.invalidationPaths.map(c=>String(c??"").trim()).filter(c=>c.length>0)),Object.keys(a).length>0&&(o.cloudFront=a);}t[i]=o;}return t}function me(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function Ze(e,t){if(!e||typeof e!="object")return null;let r=e,n=r.command;if(n!=="publish"&&n!=="crawl"&&n!=="deploy"&&n!=="invalidate"&&n!=="retry-timeouts"&&n!=="url")return null;let i=Number.parseInt(String(r.intervalMinutes??"0"),10);if(!Number.isFinite(i)||i<1)return null;let s=String(r.id??`${n}-${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:n,intervalMinutes:i,...n==="publish"||n==="crawl"?{crawlMode:r.crawlMode==="incremental"?"incremental":"full"}:{},...(n==="publish"||n==="deploy"||n==="invalidate")&&o?{deploymentProfile:o}:{},...u?{url:u}:{}}}function he(e){let t=e&&typeof e=="object"?e:{},r=Array.isArray(t.rules)?t.rules.map((n,i)=>Ze(n,i)).filter(n=>!!n):[];return {enabled:t.enabled===true,timezone:typeof t.timezone=="string"&&t.timezone.trim()!==""?t.timezone.trim():"UTC",rules:r}}function Xe(e){if(!e||typeof e!="object")return;let t=e,r={};for(let i of ["accountId","siteId"]){let s=t[i];typeof s=="string"&&s.trim()!==""&&(r[i]=s.trim());}let n=Number(t.lastUpdate??0);return Number.isFinite(n)&&n>0&&(r.lastUpdate=Math.floor(n)),t.subscriber===true&&(r.subscriber=true),Object.keys(r).length>0?r:void 0}function Z(e){let t=e&&typeof e=="object"?e:{},r=String(t.accountId??"").trim(),n=String(t.siteId??"").trim(),i=t.subscriber===true,s=Xe(t.siteSettings),o={...s??{},...r?{accountId:s?.accountId??r}:{},...n?{siteId:s?.siteId??n}:{},...s?.subscriber===true||i?{subscriber:true}:{}},u={},a=String(t.apiBase??"").trim();a&&(u.apiBase=a);let l=String(t.runtimeToken??t.nonce??"").trim();l&&(u.runtimeToken=l);let c=String(t.uploadUrl??"").trim();c&&(u.uploadUrl=c),Object.keys(o).length>0&&(u.siteSettings=o);let f=me(t.subscriptionType);return f&&(u.subscriptionType=f),u}function et(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function tt(e){let t=Z(e.wpsuite),r={...t.siteSettings??{},...t.siteSettings?.subscriber===true||t.subscriptionType==="PROFESSIONAL"||t.subscriptionType==="AGENCY"?{subscriber:true}:{}},n=String(r.accountId??"").trim(),i=String(r.siteId??"").trim(),s=String(t.uploadUrl??"").trim();if(e.wpsuite={...t.apiBase?{apiBase:t.apiBase}:{},...t.runtimeToken?{runtimeToken:t.runtimeToken}:{},...s?{uploadUrl:s}:{},...Object.keys(r).length>0?{siteSettings:r}:{},...t.subscriptionType?{subscriptionType:t.subscriptionType}:{}},!n||!i||!s)return false;et(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 rt(e){if(!tt(e))return null;try{let t=await getConfig("publisher");return t&&typeof t=="object"?t:null}catch{return null}}function nt(e,t){let r=Ye(t?.deploymentProfiles),n=String(t?.defaultDeploymentProfile??"").trim(),i=r[n]?n:"",s=me(t?.subscriptionType),o=Z(e.wpsuite);return {...e,scheduler:he(t?.scheduler),deploymentProfiles:r,defaultDeploymentProfile:i,...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 Y(e,t){let n=String(e||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!n)return t;let i=n.split("/").map(s=>s.trim()).filter(s=>s.length>0&&s!=="."&&s!=="..");return i.length>0?i.join("/"):t}function it(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?v.resolve(e):""}function de(e,t,r){let n=String(t||"").trim();return n&&v.isAbsolute(n)?v.resolve(n):v.resolve(e,Y(n,r))}async function X(e){let t=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",r=await R.readFile(t,"utf8"),n=JSON.parse(r);n.sourceOrigin=n.sourceOrigin.replace(/\/$/,""),n.targetOrigin=fe(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=Ve(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=V(n.extraReplacements),n.postCrawlCopyMap=V(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=Z(n.wpsuite),n.scheduler=he(void 0),n.deploymentProfiles={},n.defaultDeploymentProfile="",n.deploymentTargetOverride=String(n.deploymentTargetOverride??"").trim();let i=nt(n,await rt(n)),s=it(),o=s?v.resolve(s,".."):"";return o?(i.outputDir=de(o,i.outputDir,"export"),i.logDir=de(o,i.logDir,"logs")):(v.isAbsolute(i.outputDir)||(i.outputDir=Y(i.outputDir,"export")),v.isAbsolute(i.logDir)||(i.logDir=Y(i.logDir,"logs"))),i}var st=".deploy-plan.json",ot="deploy-plan.json";function at(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?v.resolve(e):""}function lt(e){let t=String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").trim();return !t||t==="."||t.startsWith("../")||t===".."?null:t}function ee(e){return [...new Set(e.map(lt).filter(t=>t!==null))]}function ut(e,t){return {schemaVersion:1,generatedAt:String(t.generatedAt||new Date().toISOString()),outputDir:v.resolve(e.outputDir),runMode:t.runMode,crawlMode:t.crawlMode,fullSyncRequired:!!t.fullSyncRequired,changedFiles:ee(t.changedFiles||[]),deletedFiles:ee(t.deletedFiles||[]),rewriteTargets:ee(t.rewriteTargets||[])}}function ct(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 ye(e){let t=v.join(v.resolve(e.outputDir),st),r=at();return r?[v.join(r,ot),t]:[t]}async function be(e){let t=v.resolve(e.outputDir);for(let r of ye(e))try{let n=await R.readFile(r,"utf8"),i=JSON.parse(n);if(!ct(i)||v.resolve(i.outputDir)!==t)continue;return ut(e,i)}catch{}return null}async function Pe(e){for(let t of ye(e))try{await R.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}function gt(e){return typeof e.subscriptionType=="string"&&e.subscriptionType.trim()!==""}function Se(e){let t="";for(let n=0;n<e.length;n++){let i=e[n];if(i==="--profile"){let s=(e[n+1]||"").trim();if(!s)throw new Error("Missing value for --profile.");t=s,n+=1;}else if(i.startsWith("--profile=")){let s=i.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 pt(e,t){return {...e,...t??{}}}function dt(e,t){return {...e,...t??{},invalidationPaths:[...(t?.invalidationPaths??e.invalidationPaths)||[]]}}function ve(e,t){let r=String(t??e.deploymentTargetOverride??"").trim();if(!gt(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 n=String(r||e.defaultDeploymentProfile||"").trim();if(!n)return {name:null,profile:null,config:e};let i=e.deploymentProfiles?.[n];if(!i)throw new Error(`Unknown deployment profile "${n}". Check the linked WPSuite publisher configuration.`);return {name:n,profile:i,config:{...e,targetOrigin:i.targetOrigin??e.targetOrigin,s3:pt(e.s3,i.s3),cloudFront:dt(e.cloudFront,i.cloudFront)}}}var Re={error:0,warn:1,info:2,debug:3},xe=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",W=xe?v.join(xe,"current-progress.json"):"",De=Promise.resolve();function $e(e){return e.includes("crawl")?"crawl":e.includes("deploy")?"deploy":e.includes("invalidate")?"invalidate":e}function ft(e,t){let r={...e},n=new Set(["pagesQueued","pagesRendered","assetsQueued","sitemapsQueued","pagesDiscovered","assetsDiscovered","sitemapsDiscovered","pagesSaved","assetsSaved","donePages","doneAssets","doneSitemaps","changedTextFiles","uploaded","failed","index","totalFiles","pageQueue","assetQueue","sitemapQueue"]);for(let[i,s]of Object.entries(t)){let o=r[i];if(typeof o=="number"&&typeof s=="number"&&n.has(i)){r[i]=Math.max(o,s);continue}r[i]=s;}return r}function mt(e,t,r){W&&(De=De.then(async()=>{let n=new Date,i=n.toISOString();await R.mkdir(v.dirname(W),{recursive:true});let s=await R.readFile(W,"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||""),l=s?.startedAt||i,c={...s?.stepDurationsSec??{}},f=s?.stepStartedAt||i;if(a&&a!==u&&s?.stepStartedAt){let b=Math.max(0,Math.round((n.getTime()-new Date(s.stepStartedAt).getTime())/1e3));c[a]=(c[a]??0)+b,f=i;}let g=Math.max(0,Math.round((n.getTime()-new Date(f).getTime())/1e3)),m=Math.max(0,Math.round((n.getTime()-new Date(l).getTime())/1e3)),y={checkedAt:i,source:e,message:t,details:ft(o,r??{}),startedAt:l,currentStep:u,stepStartedAt:f,stepElapsedSec:g,totalElapsedSec:m,stepDurationsSec:c};await R.writeFile(W,JSON.stringify(y,null,2),"utf8");}).catch(()=>{}));}async function ht(e,t){await R.mkdir(v.dirname(e),{recursive:true}),await R.appendFile(e,`${JSON.stringify(t)}
2
+ `,"utf8");}var A=class{constructor(t,r,n="info"){this.logDir=t;this.logFile=r;this.level=n;this.ensureLogFileReady();}logDir;logFile;level;startedAt=Date.now();marks=new Map;initPromise=null;writeQueue=Promise.resolve();writeError=null;get logPath(){return v.join(this.logDir,this.logFile)}get errorsPath(){return v.join(this.logDir,this.logFile.replace(".log.jsonl",".errors.jsonl"))}ensureLogFileReady(){return this.initPromise||(this.initPromise=(async()=>{await R.mkdir(this.logDir,{recursive:true}),await R.writeFile(this.logPath,"","utf8");})()),this.initPromise}enqueueTask(t){this.writeQueue=this.writeQueue.then(t).catch(r=>{this.writeError=r instanceof Error?r:new Error(String(r));});}enqueueLine(t){this.enqueueTask(async()=>{await this.ensureLogFileReady(),await R.appendFile(this.logPath,`${t}
3
+ `,"utf8");});}enqueueJsonLine(t,r){this.enqueueTask(()=>ht(t,r));}accepts(t){return Re[t]<=Re[this.level]}push(t,r,n){if(!this.accepts(t))return;let i=JSON.stringify({time:new Date().toISOString(),level:t,message:r,...n||{}});this.enqueueLine(i),t==="error"?console.error(`[ERROR] ${r}`,n?JSON.stringify(n):""):t==="warn"?console.warn(`[WARN] ${r}`,n?JSON.stringify(n):""):console.log(`[${t.toUpperCase().padEnd(5)}] ${r}`);}info(t,r){this.push("info",t,r);}progress(t,r){mt(this.logFile,t,r);}debug(t,r){this.push("debug",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);}mark(t){this.marks.set(t,Date.now());}endMark(t,r){let n=this.marks.get(t);if(!n)return;let i=Date.now()-n,s=Number((i/1e3).toFixed(2));this.push("info",`Timing ${t}: ${s}s`,{name:t,ms:i,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}};function Ee(e){return [".html",".htm",".css",".js",".mjs",".json",".xml",".xsl",".txt",".svg",".map",".enc",".jws"].includes(v.extname(e).toLowerCase())}function ke(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 L(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function B(e){return e.replace(/\//g,"\\/")}function Ce(e){return e.replace(/\//g,"\\\\/")}function H(e,t,r){if(!t)return;e[t]=r;let n=B(t),i=B(r);e[n]=i;let s=Ce(t),o=Ce(r);e[s]=o;let u=L(t),a=L(r);e[u]=a;let l=L(n),c=L(i);e[l]=c;let f=L(s),g=L(o);e[f]=g;}function Te(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function Le(e,t,r){if(!t)return r;let n=v.dirname(v.resolve(t)),i=v.resolve(e,r.replace(/^\/+/,"")),s=v.relative(n,i).replace(/\\/g,"/");return s?(s.startsWith(".")||(s=`./${s}`),s):"."}var Pt=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],St=new Set([".html",".htm"]),Ie="WPSuite.io Static Publisher",vt=Ie.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function Rt(e,t,r){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let i=v.extname(r).toLowerCase();return St.has(i)?/<head\b|<html\b|<!doctype html/i.test(t):false}function xt(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${vt}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${Ie}" />`;if(e.match(/(\r?\n)([ \t]*)<\/head>/i))return e.replace(/(\r?\n)([ \t]*)<\/head>/i,`$1$2${t}$1$2</head>`);let n=e.includes(`\r
4
4
  `)?`\r
5
5
  `:`
6
- `;return e.replace(/<head\b[^>]*>/i,i=>`${i}${n} ${t}`)}function vt(e){let t=Ce(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function xt(e,t){let r=[...new Set(t)].filter(s=>s.includes("/")&&!/\\+\//.test(s)).map(s=>[s,B(s)]).filter(([s,o])=>s!==o).sort((s,o)=>o[0].length-s[0].length);if(!r.length)return e;let n=s=>{let o=s;for(let[l,a]of r)o=o.split(l).join(a);return o},i=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(s,o,l,a)=>`${o}${n(l)}${a}`);return i=i.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(s,o,l,a,u)=>vt(a)?`${o}${n(a)}${u}`:s),i}function Rt(e,t){if(!t)return null;let r=v.dirname(v.resolve(t)),n=v.resolve(e.outputDir),i=v.relative(r,n).replace(/\\/g,"/");return i?(i.startsWith(".")||(i=`./${i}`),i.endsWith("/")?i:`${i}/`):"./"}function $t(e,t,r){let n=Rt(t,r);if(!n)return e;let i=e;for(let s of wt){let o=s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),l=new RegExp(`(?:\\.{1,}/)+${o}`,"g"),a=new RegExp(`(?<!\\.)/${o}`,"g");i=i.replace(l,`${n}${s}`).replace(a,`${n}${s}`);let u=s.replace(/\//g,"\\/"),c=n.replace(/\//g,"\\/"),f=u.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),g=new RegExp(`(?:\\.{1,}\\\\/)+${f}`,"g"),m=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${f}`,"g"),y=new RegExp(`(?<![\\.\\\\])\\/${f}`,"g");i=i.replace(g,`${c}${u}`).replace(m,`${c}${u}`).replace(y,`${c}${u}`);}return i}function ee(e,t,r){if(e.urlRewriteMode==="absolute")return t;let n=(()=>{try{return new URL(t,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin)}catch{return null}})(),i=n?n.pathname:Ee(t,e.targetOrigin),s=n?`${n.search}${n.hash}`:"";return e.urlRewriteMode==="root-relative"?`${i}${s}`:`${ke(e.outputDir,r,i)}${s}`}function X(e,t,r,n,i){H(e,r,ee(t,n,i));}function Dt(e,t,r,n,i){if(!r||r===n)return;H(e,r,n);let s=ee(t,r,i),o=ee(t,n,i);H(e,s,o);}function Ct(e,t,r,n,i={}){let s=e,o={};X(o,t,t.sourceOrigin,t.targetOrigin,n);for(let[a,u]of Object.entries(t.extraReplacements))X(o,t,a,u,n);for(let[a,u]of Object.entries(r))X(o,t,a,u,n);for(let[a,u]of Object.entries(i)){let c=r[a];!c||c===u||Dt(o,t,u,c,n);}let l=Object.entries(o).sort((a,u)=>u[0].length-a[0].length);for(let[a,u]of l)s=s.split(a).join(u);return t.urlRewriteMode!=="absolute"&&(s=$t(s,t,n)),s=xt(s,l.map(([,a])=>a)),Pt(t,s,n)&&(s=St(s)),s}async function Et(e,t,r,n){let i=v.join(e.outputDir,n),s=v.extname(i).toLowerCase(),o;try{o=await $.readFile(i,"utf8");}catch(u){if(u.code!=="ENOENT")throw u;return {changed:false}}let a=Ct(o,e,t,s===".js"||s===".mjs"?void 0:i,r);return a!==o?(await $.writeFile(i,a,"utf8"),{changed:true}):{changed:false}}async function kt(e,t){return await new Promise((r,n)=>{let i=a=>{if(l(),a?.error){n(new Error(a.error));return}r({changed:!!a?.changed});},s=a=>{l(),n(a);},o=a=>{l(),a!==0&&n(new Error(`Rewrite worker exited with code ${a}.`));},l=()=>{e.off("message",i),e.off("error",s),e.off("exit",o);};e.on("message",i),e.on("error",s),e.on("exit",o),e.postMessage({file:t});})}async function Me(e,t,r={}){let i=(r.files?[...new Set(r.files)].map(g=>v.resolve(g)).filter(g=>g.startsWith(v.resolve(e.outputDir))).map(g=>v.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"&&De(g)),s=0;if(i.length===0)return 0;let o=Math.max(1,Number(e.rewriteConcurrency||e.assetDownloadConcurrency||1)),l=Math.max(1,Math.min(o,i.length,availableParallelism()));await r.onStart?.({totalFiles:i.length,workerCount:l});let a=0,u=0,c=null;if(l===1){for(let g of i){let m=await Et(e,t,r.previousAssetMap??{},g);m.changed&&(s+=1),u+=1,await r.onProgress?.({index:u,totalFiles:i.length,changedTextFiles:s,file:g,changed:m.changed});}return s}let f=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 m=a;if(m>=i.length)return;a+=1;let y=i[m],b=await kt(g,y);b.changed&&(s+=1),u+=1,await r.onProgress?.({index:u,totalFiles:i.length,changedTextFiles:s,file:y,changed:b.changed});}}catch(m){throw c=m instanceof Error?m:new Error(String(m)),c}finally{await g.terminate().catch(()=>{});}});return await Promise.all(f),s}var Oe="wpsuite-sha256",Fe="wpsuite-normalized-sha256",_t=/(?:^|[-_:.])(id|uid|nonce|token|hash|instance)(?:$|[-_:.])/i,ae=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;function At(e){return e&&(ae.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 ne(e){return e.split(/([_:.\-/=?&#]+)/g).map((t,r)=>r%2===1?t:At(t)).join("")}function Nt(e){return e.split(/([_:.\-/=?&#]+)/g).map((t,r)=>r%2===1?t:ae.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 q(e,t){return Array.isArray(e)?e.map(r=>q(r,t)):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([r,n])=>[r,q(n,r)])):typeof e!="string"?e:t&&_t.test(t)?Nt(e):ae.test(e)?"__uuid__":/^[0-9a-f]{6,}$/i.test(e)||/^[0-9]{8,}$/.test(e)?ne(e):e}function Ut(e){return e.replace(/((?:https?:\/\/[^"'\s>]+|\/)(?:wp-content|wp-includes)\/[^"'\s>?]+)\?ver=[A-Za-z0-9._-]+(?=$|[#"'])/gi,"$1")}function zt(e,t){let r=t.trim();if((r.startsWith("{")||r.startsWith("[")||r.startsWith('"'))&&e.startsWith("data-"))try{let i=JSON.parse(r);return JSON.stringify(q(i))}catch{}if(e.startsWith("data-")&&/^[A-Za-z0-9+/=]+$/.test(r))try{let i=Buffer.from(r,"base64").toString("utf8"),s=JSON.parse(i),o=JSON.stringify(q(s));return Buffer.from(o,"utf8").toString("base64")}catch{}return t}function Wt(e,t){let r=e.toLowerCase();return r==="class"?t.split(/(\s+)/).map((n,i)=>i%2===1?n:ne(n)).join(""):r==="id"||r==="for"||r==="aria-controls"||r==="aria-labelledby"||r==="aria-describedby"||r==="aria-owns"||r==="aria-activedescendant"||r==="name"?ne(t):r==="href"||r==="src"?Ut(t):zt(r,t)}function Bt(e){return e.replace(/<([a-z][^\s/>]*)([^<>]*?)>/gi,(t,r,n)=>{if(r.startsWith("/"))return t;let i=n.replace(/\s([:@a-zA-Z_][-:.a-zA-Z0-9_]*?)=(['"])([\s\S]*?)\2/g,(s,o,l,a)=>{let u=Wt(o,a);return ` ${o}=${l}${u}${l}`});return `<${r}${i}>`})}function te(e){let t=v.extname(e).toLowerCase();return [".html",".htm",".xml",".xsl",".txt"].includes(t)||["robots.txt","sitemap.xml"].includes(v.basename(e))}function re(e,t){return [e.replace(/^\/+|\/+$/g,""),t.replace(/^\/+/,"")].filter(Boolean).join("/")}async function Ht(e,t,r,n){let i=new Map,s,o=0;do{o++;let l=await e.send(new ListObjectsV2Command({Bucket:t,Prefix:r||void 0,ContinuationToken:s}));for(let a of l.Contents||[]){if(!a.Key)continue;let u=(a.ETag||"").replace(/^"|"$/g,"").toLowerCase(),c=Number(a.Size??0);i.set(a.Key,{etag:u,size:c});}s=l.NextContinuationToken,n.debug(`Listed S3 keys page ${o}: ${i.size} keys so far`);}while(s);return i}async function qt(e,t,r,n){if(n.has(r))return n.get(r)??null;try{let i=await e.send(new HeadObjectCommand({Bucket:t,Key:r})),s={etag:(i.ETag||"").replace(/^"|"$/g,"").toLowerCase(),size:Number(i.ContentLength??0)};return n.set(r,s),s}catch{return n.set(r,null),null}}async function je(e,t,r,n){let i=[...new Set(Array.from(r).filter(Boolean))];if(i.length===0)return n.info("No stale S3 objects to delete."),[];n.info(`Deleting ${i.length} stale S3 object(s)\u2026`);for(let s=0;s<i.length;s+=1e3){let o=i.slice(s,s+1e3);if(o.length!==0){await e.send(new DeleteObjectsCommand({Bucket:t,Delete:{Objects:o.map(l=>({Key:l}))}})),n.info(`Deleted batch of ${o.length} object(s).`);for(let l of o)n.debug(` deleted: ${l}`);}}return i}async function Jt(e,t,r,n,i){return je(e,t,Array.from(r).filter(s=>!n.has(s)),i)}function Kt(e){return createHash("md5").update(e).digest("hex")}function Ie(e){return createHash("sha256").update(e).digest("hex")}function ie(e){return createHash("sha256").update(Bt(e.toString("utf8"))).digest("hex")}async function Qt(e,t,r,n){if(n.has(r))return n.get(r)??null;try{let o=((await e.send(new HeadObjectCommand({Bucket:t,Key:r}))).Metadata?.[Oe]||"").trim().toLowerCase()||null;return n.set(r,o),o}catch{return n.set(r,null),null}}async function Gt(e,t,r,n,i){if(n.has(r))return n.get(r)??null;try{let o=((await e.send(new HeadObjectCommand({Bucket:t,Key:r}))).Metadata?.[Fe]||"").trim().toLowerCase();if(o)return n.set(r,o),o}catch{return n.set(r,null),null}if(i.has(r)){let s=i.get(r)??null;return n.set(r,s),s}try{let o=await(await e.send(new GetObjectCommand({Bucket:t,Key:r}))).Body?.transformToByteArray(),l=o?ie(Buffer.from(o)):null;return i.set(r,l),n.set(r,l),l}catch{return i.set(r,null),n.set(r,null),null}}function Vt(e){return e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")||"profile"}function Yt(e,t){let r=e,n=Object.entries(t).sort((i,s)=>s[0].length-i[0].length);for(let[i,s]of n)i&&(r=r.split(i).join(s));return r}async function Zt(e,t,r,n){let i=v.join(e,"asset-map.json"),s;try{s=await $.readFile(i,"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=Yt(c,n),[a,c]}));await $.writeFile(i,JSON.stringify(l,null,2),"utf8");}async function Xt(e,t,r,n,i){let s=e.targetOrigin!==t.targetOrigin,o=Object.keys(n).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=v.join(v.dirname(e.outputDir),`.deploy-profile-${Vt(r)}-${Date.now()}`);i.info(`Preparing deployment profile "${r}" from existing crawl output to ${l}...`);let a="remove existing temp directory";try{await $.rm(l,{recursive:!0,force:!0}),a="copy crawl output into temp directory",await $.cp(e.outputDir,l,{recursive:!0});}catch(g){throw i.error(`Failed to ${a} while preparing deployment profile "${r}".`,{tempDir:l,outputDir:e.outputDir,error:g instanceof Error?g.message:String(g),...g instanceof Error&&g.stack?{stack:g.stack}:{}}),await i.flush().catch(()=>{}),g}let u={...e,sourceOrigin:e.targetOrigin,targetOrigin:t.targetOrigin,extraReplacements:n,outputDir:l},c=1;i.info(`Rewriting text files for deployment profile "${r}"...`);let f=await Me(u,{},{onStart:({totalFiles:g,workerCount:m})=>{c=m,i.info(`Rewriting ${g} text file(s) for deployment profile "${r}" with ${m} worker(s).`);},onProgress:({index:g,totalFiles:m,changedTextFiles:y,file:b,changed:p})=>{let P=`Rewriting [${g}/${m}] ${b} (${p?"rewrote":"checked"}; ${y} changed so far)`;m<=200||g<=5||g%10===0||g===m?(i.progress(P,{file:b,index:g,totalFiles:m,changed:p,changedTextFiles:y,workerCount:c}),i.info(P)):i.debug(P);}});return await Zt(l,e,t,n),i.info(`Prepared deployment profile "${r}" in ${l} (${f} rewritten text file(s)).`),{outputDir:l,cleanup:async()=>{await $.rm(l,{recursive:true,force:true});}}}async function er(){let e=await Y(),t=be(process.argv.slice(2)),r=Pe(e,t),n=v.resolve(r.config.logDir||"logs"),i=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",s=i?v.join(v.resolve(i),"deploy-diff.json"):"",o=new A(n,"deploy.log.jsonl",r.config.logLevel??"info"),l=r.profile?.extraReplacements??{},a=async()=>{};try{let u=await Xt(e,r.config,r.name,l,o);a=u.cleanup;let c={...r.config,outputDir:u.outputDir},f=c.s3SyncMode??"sdk-upload-delete",g=await we(e),m=u.outputDir!==e.outputDir&&(e.targetOrigin!==r.config.targetOrigin||Object.keys(l).length>0),y=!!g&&!g.fullSyncRequired&&!m;r.name&&o.info(`Using deployment profile: ${r.name}`),o.info(`Starting deploy \u2014 s3://${c.s3.bucket}/${c.s3.prefix||""} (region: ${c.s3.region})`),o.info(`S3 sync mode: ${f}`),g&&g.fullSyncRequired?o.info("Deploy plan requests a full sync; scanning the whole output tree."):g&&m?o.info("Ignoring incremental deploy plan because deployment-profile rewrites require a full sync."):y&&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:c.s3.region}),p=y?(await Promise.all(g.changedFiles.map(async h=>{try{return (await $.stat(v.join(c.outputDir,h))).isFile()?h:null}catch{return null}}))).filter(h=>h!==null):await ft(["**/*"],{cwd:c.outputDir,onlyFiles:!0,dot:!0}),le=y?new Set:new Set(p.map(h=>re(c.s3.prefix,h)));y?o.info(`Using ${p.length} planned changed file(s) from deploy plan for upload.`):o.info(`Found ${p.length} file(s) in output directory "${c.outputDir}".`);let P=0,S=0,E=0,J=[],M=[],K=[],U=[],I=new Map,_e=new Map,Ae=new Map,Ne=new Map,Ue=new Map;y||(o.info("Listing existing S3 objects to detect unchanged files..."),I=await Ht(b,c.s3.bucket,c.s3.prefix,o),o.info(`Found ${I.size} existing key(s) in S3.`));let ze=async h=>I.has(h)?I.get(h)??null:y?qt(b,c.s3.bucket,h,_e):null;for(let h of p){let ue=v.join(c.outputDir,h),d=re(c.s3.prefix,h),O=jt.lookup(h)||"application/octet-stream",We=te(h)?c.s3.htmlCacheControl:c.s3.assetCacheControl,w=P+S+E+1;p.length<=200||w<=5||w%10===0||w===p.length?(o.progress(`Uploading [${w}/${p.length}] ${d} (${O})`,{file:h,key:d,index:w,totalFiles:p.length,contentType:O,mode:f}),o.info(`Uploading [${w}/${p.length}] ${d} (${O})`)):o.debug(`Uploading [${w}/${p.length}] ${d} (${O})`);try{let x=await $.readFile(ue),F=await ze(d),j=null,L=null;if(F){let Be=x.byteLength;if(F.size===Be){let z=F.etag.includes("-");if(F.etag!==""&&!z){let He=Kt(x);if(F.etag===He){S++,p.length<=200||S<=5||S%25===0?(o.progress(`Skipped unchanged [${w}/${p.length}] ${d}`,{file:h,key:d,index:w,totalFiles:p.length,uploaded:P,skipped:S,failed:E,mode:f,reason:"etag-md5-match"}),o.info(`Skipped unchanged [${w}/${p.length}] ${d}`)):o.debug(`Skipped unchanged [${w}/${p.length}] ${d}`),M.push(d);continue}}j=Ie(x);let ce=await Qt(b,c.s3.bucket,d,Ae);if(ce&&ce===j){S++,p.length<=200||S<=5||S%25===0?(o.progress(`Skipped unchanged [${w}/${p.length}] ${d}`,{file:h,key:d,index:w,totalFiles:p.length,uploaded:P,skipped:S,failed:E,mode:f,reason:"metadata-sha256-match"}),o.info(`Skipped unchanged [${w}/${p.length}] ${d}`)):o.debug(`Skipped unchanged [${w}/${p.length}] ${d}`),M.push(d);continue}}if(te(h)){L=ie(x);let z=await Gt(b,c.s3.bucket,d,Ne,Ue);if(z&&z===L){S++,p.length<=200||S<=5||S%25===0?(o.progress(`Skipped semantically unchanged [${w}/${p.length}] ${d}`,{file:h,key:d,index:w,totalFiles:p.length,uploaded:P,skipped:S,failed:E,mode:f,reason:"normalized-html-match"}),o.info(`Skipped semantically unchanged [${w}/${p.length}] ${d}`)):o.debug(`Skipped semantically unchanged [${w}/${p.length}] ${d}`),M.push(d);continue}}}j=j??Ie(x),L=L??(te(h)?ie(x):null),await new Upload({client:b,params:{Bucket:c.s3.bucket,Key:d,Body:x,ContentType:O,CacheControl:We,Metadata:{[Oe]:j,...L?{[Fe]:L}:{}}}}).done(),P++,J.push(d),(P%25===0||P===p.length)&&(o.progress(`Uploaded ${P}/${p.length} file(s)\u2026`,{uploaded:P,skipped:S,failed:E,totalFiles:p.length,mode:f}),o.info(`Uploaded ${P}/${p.length} file(s)\u2026`));}catch(x){E++,K.push(d),o.error(`Failed to upload ${d}: ${x.message}`,{key:d,error:String(x)});}}o.info(`Upload complete: ${P} uploaded, ${S} skipped unchanged, ${E} failed.`),f==="sdk-upload-delete"?y?U=await je(b,c.s3.bucket,g.deletedFiles.map(h=>re(c.s3.prefix,h)),o):U=await Jt(b,c.s3.bucket,I.keys(),le,o):o.info("Sync mode is sdk-upload-only \u2014 skipping stale object deletion."),s&&(await $.mkdir(v.dirname(s),{recursive:!0}),await $.writeFile(s,JSON.stringify({generatedAt:new Date().toISOString(),mode:f,summary:{totalFiles:p.length,uploaded:J.length,skipped:M.length,failed:K.length,deleted:U.length,...r.name?{profile:r.name}:{}},uploadedKeys:J,skippedKeys:M,failedKeys:K,deletedKeys:U},null,2),"utf8")),await ye(e),o.endMark("deploy"),await o.flush();}finally{await a().catch(()=>{});}}er().catch(async e=>{console.error(e);try{let r=(await Y().catch(()=>null))?.logDir??"logs",n=new A(r,"deploy.log.jsonl","debug");n.error(`Unhandled error: ${e instanceof Error?e.message:String(e)}`,e instanceof Error?{stack:e.stack}:void 0),await n.flush();}catch{}process.exit(1);});
6
+ `;return e.replace(/<head\b[^>]*>/i,i=>`${i}${n} ${t}`)}function Dt(e){let t=ke(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function $t(e,t){let r=[...new Set(t)].filter(s=>s.includes("/")&&!/\\+\//.test(s)).map(s=>[s,B(s)]).filter(([s,o])=>s!==o).sort((s,o)=>o[0].length-s[0].length);if(!r.length)return e;let n=s=>{let o=s;for(let[u,a]of r)o=o.split(u).join(a);return o},i=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(s,o,u,a)=>`${o}${n(u)}${a}`);return i=i.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(s,o,u,a,l)=>Dt(a)?`${o}${n(a)}${l}`:s),i}function Ct(e,t){if(!t)return null;let r=v.dirname(v.resolve(t)),n=v.resolve(e.outputDir),i=v.relative(r,n).replace(/\\/g,"/");return i?(i.startsWith(".")||(i=`./${i}`),i.endsWith("/")?i:`${i}/`):"./"}function Et(e,t,r){let n=Ct(t,r);if(!n)return e;let i=e;for(let s of Pt){let o=s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),u=new RegExp(`(?:\\.{1,}/)+${o}`,"g"),a=new RegExp(`(?<!\\.)/${o}`,"g");i=i.replace(u,`${n}${s}`).replace(a,`${n}${s}`);let l=s.replace(/\//g,"\\/"),c=n.replace(/\//g,"\\/"),f=l.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),g=new RegExp(`(?:\\.{1,}\\\\/)+${f}`,"g"),m=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${f}`,"g"),y=new RegExp(`(?<![\\.\\\\])\\/${f}`,"g");i=i.replace(g,`${c}${l}`).replace(m,`${c}${l}`).replace(y,`${c}${l}`);}return i}function re(e,t,r){if(e.urlRewriteMode==="absolute")return t;let n=(()=>{try{return new URL(t,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin)}catch{return null}})(),i=n?n.pathname:Te(t,e.targetOrigin),s=n?`${n.search}${n.hash}`:"";return e.urlRewriteMode==="root-relative"?`${i}${s}`:`${Le(e.outputDir,r,i)}${s}`}function te(e,t,r,n,i){H(e,r,re(t,n,i));}function kt(e,t,r,n,i){if(!r||r===n)return;H(e,r,n);let s=re(t,r,i),o=re(t,n,i);H(e,s,o);}function Tt(e,t,r,n,i={}){let s=e,o={};te(o,t,t.sourceOrigin,t.targetOrigin,n);for(let[a,l]of Object.entries(t.extraReplacements))te(o,t,a,l,n);for(let[a,l]of Object.entries(r))te(o,t,a,l,n);for(let[a,l]of Object.entries(i)){let c=r[a];!c||c===l||kt(o,t,l,c,n);}let u=Object.entries(o).sort((a,l)=>l[0].length-a[0].length);for(let[a,l]of u)s=s.split(a).join(l);return t.urlRewriteMode!=="absolute"&&(s=Et(s,t,n)),s=$t(s,u.map(([,a])=>a)),Rt(t,s,n)&&(s=xt(s)),s}async function Lt(e,t,r,n){let i=v.join(e.outputDir,n),s=v.extname(i).toLowerCase(),o;try{o=await R.readFile(i,"utf8");}catch(l){if(l.code!=="ENOENT")throw l;return {changed:false}}let a=Tt(o,e,t,s===".js"||s===".mjs"?void 0:i,r);return a!==o?(await R.writeFile(i,a,"utf8"),{changed:true}):{changed:false}}async function Mt(e,t){return await new Promise((r,n)=>{let i=a=>{if(u(),a?.error){n(new Error(a.error));return}r({changed:!!a?.changed});},s=a=>{u(),n(a);},o=a=>{u(),a!==0&&n(new Error(`Rewrite worker exited with code ${a}.`));},u=()=>{e.off("message",i),e.off("error",s),e.off("exit",o);};e.on("message",i),e.on("error",s),e.on("exit",o),e.postMessage({file:t});})}async function Oe(e,t,r={}){let i=(r.files?[...new Set(r.files)].map(g=>v.resolve(g)).filter(g=>g.startsWith(v.resolve(e.outputDir))).map(g=>v.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"&&Ee(g)),s=0;if(i.length===0)return 0;let o=Math.max(1,Number(e.rewriteConcurrency||e.assetDownloadConcurrency||1)),u=Math.max(1,Math.min(o,i.length,availableParallelism()));await r.onStart?.({totalFiles:i.length,workerCount:u});let a=0,l=0,c=null;if(u===1){for(let g of i){let m=await Lt(e,t,r.previousAssetMap??{},g);m.changed&&(s+=1),l+=1,await r.onProgress?.({index:l,totalFiles:i.length,changedTextFiles:s,file:g,changed:m.changed});}return s}let f=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(;!c;){let m=a;if(m>=i.length)return;a+=1;let y=i[m],b=await Mt(g,y);b.changed&&(s+=1),l+=1,await r.onProgress?.({index:l,totalFiles:i.length,changedTextFiles:s,file:y,changed:b.changed});}}catch(m){throw c=m instanceof Error?m:new Error(String(m)),c}finally{await g.terminate().catch(()=>{});}});return await Promise.all(f),s}var _e="wpsuite-sha256",Ae="wpsuite-normalized-sha256",Ut=/(?:^|[-_:.])(id|uid|nonce|token|hash|instance)(?:$|[-_:.])/i,ue=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,zt=["SIGINT","SIGTERM"],q=new Set,J=new Map,Fe=null;function Wt(e){q.add(e);let t=false;return ()=>{t||(t=true,q.delete(e));}}async function Bt(){let e=[...q];e.length!==0&&await Promise.allSettled(e.map(async t=>{q.delete(t),await R.rm(t,{recursive:true,force:true});}));}function Ht(){if(!(J.size>0))for(let e of zt){let t=()=>{Fe||(Fe=Bt().finally(()=>{for(let[r,n]of J)process.off(r,n);J.clear(),process.exit(1);}));};J.set(e,t),process.on(e,t);}}Ht();function Jt(e){return e&&(ue.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 se(e){return e.split(/([_:.\-/=?&#]+)/g).map((t,r)=>r%2===1?t:Jt(t)).join("")}function qt(e){return e.split(/([_:.\-/=?&#]+)/g).map((t,r)=>r%2===1?t:ue.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 K(e,t){return Array.isArray(e)?e.map(r=>K(r,t)):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([r,n])=>[r,K(n,r)])):typeof e!="string"?e:t&&Ut.test(t)?qt(e):ue.test(e)?"__uuid__":/^[0-9a-f]{6,}$/i.test(e)||/^[0-9]{8,}$/.test(e)?se(e):e}function Kt(e){return e.replace(/((?:https?:\/\/[^"'\s>]+|\/)(?:wp-content|wp-includes)\/[^"'\s>?]+)\?ver=[A-Za-z0-9._-]+(?=$|[#"'])/gi,"$1")}function Gt(e,t){let r=t.trim();if((r.startsWith("{")||r.startsWith("[")||r.startsWith('"'))&&e.startsWith("data-"))try{let i=JSON.parse(r);return JSON.stringify(K(i))}catch{}if(e.startsWith("data-")&&/^[A-Za-z0-9+/=]+$/.test(r))try{let i=Buffer.from(r,"base64").toString("utf8"),s=JSON.parse(i),o=JSON.stringify(K(s));return Buffer.from(o,"utf8").toString("base64")}catch{}return t}function Qt(e,t){let r=e.toLowerCase();return r==="class"?t.split(/(\s+)/).map((n,i)=>i%2===1?n:se(n)).join(""):r==="id"||r==="for"||r==="aria-controls"||r==="aria-labelledby"||r==="aria-describedby"||r==="aria-owns"||r==="aria-activedescendant"||r==="name"?se(t):r==="href"||r==="src"?Kt(t):Gt(r,t)}function Vt(e){return e.replace(/<([a-z][^\s/>]*)([^<>]*?)>/gi,(t,r,n)=>{if(r.startsWith("/"))return t;let i=n.replace(/\s([:@a-zA-Z_][-:.a-zA-Z0-9_]*?)=(['"])([\s\S]*?)\2/g,(s,o,u,a)=>{let l=Qt(o,a);return ` ${o}=${u}${l}${u}`});return `<${r}${i}>`})}function ne(e){let t=v.extname(e).toLowerCase();return [".html",".htm",".xml",".xsl",".txt"].includes(t)||["robots.txt","sitemap.xml"].includes(v.basename(e))}function ie(e,t){return [e.replace(/^\/+|\/+$/g,""),t.replace(/^\/+/,"")].filter(Boolean).join("/")}async function Yt(e,t,r,n){let i=new Map,s,o=0;do{o++;let u=await e.send(new ListObjectsV2Command({Bucket:t,Prefix:r||void 0,ContinuationToken:s}));for(let a of u.Contents||[]){if(!a.Key)continue;let l=(a.ETag||"").replace(/^"|"$/g,"").toLowerCase(),c=Number(a.Size??0);i.set(a.Key,{etag:l,size:c});}s=u.NextContinuationToken,n.debug(`Listed S3 keys page ${o}: ${i.size} keys so far`);}while(s);return i}async function Zt(e,t,r,n){if(n.has(r))return n.get(r)??null;try{let i=await e.send(new HeadObjectCommand({Bucket:t,Key:r})),s={etag:(i.ETag||"").replace(/^"|"$/g,"").toLowerCase(),size:Number(i.ContentLength??0)};return n.set(r,s),s}catch{return n.set(r,null),null}}async function Ne(e,t,r,n){let i=[...new Set(Array.from(r).filter(Boolean))];if(i.length===0)return n.info("No stale S3 objects to delete."),[];n.info(`Deleting ${i.length} stale S3 object(s)\u2026`);for(let s=0;s<i.length;s+=1e3){let o=i.slice(s,s+1e3);if(o.length!==0){await e.send(new DeleteObjectsCommand({Bucket:t,Delete:{Objects:o.map(u=>({Key:u}))}})),n.info(`Deleted batch of ${o.length} object(s).`);for(let u of o)n.debug(` deleted: ${u}`);}}return i}async function Xt(e,t,r,n,i){return Ne(e,t,Array.from(r).filter(s=>!n.has(s)),i)}function er(e){return createHash("md5").update(e).digest("hex")}function je(e){return createHash("sha256").update(e).digest("hex")}function oe(e){return createHash("sha256").update(Vt(e.toString("utf8"))).digest("hex")}async function tr(e,t,r,n){if(n.has(r))return n.get(r)??null;try{let o=((await e.send(new HeadObjectCommand({Bucket:t,Key:r}))).Metadata?.[_e]||"").trim().toLowerCase()||null;return n.set(r,o),o}catch{return n.set(r,null),null}}async function rr(e,t,r,n,i){if(n.has(r))return n.get(r)??null;try{let o=((await e.send(new HeadObjectCommand({Bucket:t,Key:r}))).Metadata?.[Ae]||"").trim().toLowerCase();if(o)return n.set(r,o),o}catch{return n.set(r,null),null}if(i.has(r)){let s=i.get(r)??null;return n.set(r,s),s}try{let o=await(await e.send(new GetObjectCommand({Bucket:t,Key:r}))).Body?.transformToByteArray(),u=o?oe(Buffer.from(o)):null;return i.set(r,u),n.set(r,u),u}catch{return i.set(r,null),n.set(r,null),null}}function nr(e){return e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")||"profile"}function ir(e,t){let r=e,n=Object.entries(t).sort((i,s)=>s[0].length-i[0].length);for(let[i,s]of n)i&&(r=r.split(i).join(s));return r}async function sr(e,t,r,n){let i=v.join(e,"asset-map.json"),s;try{s=await R.readFile(i,"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,l])=>{let c=String(l??"");return t.urlRewriteMode==="absolute"&&t.targetOrigin&&r.targetOrigin&&t.targetOrigin!==r.targetOrigin&&(c=c.split(t.targetOrigin).join(r.targetOrigin)),c=ir(c,n),[a,c]}));await R.writeFile(i,JSON.stringify(u,null,2),"utf8");}async function or(e,t,r,n,i){let s=e.targetOrigin!==t.targetOrigin,o=Object.keys(n).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=v.join(v.dirname(e.outputDir),`.deploy-profile-${nr(r)}-${Date.now()}`),a=Wt(u);i.info(`Preparing deployment profile "${r}" from existing crawl output to ${u}...`);try{await R.rm(u,{recursive:!0,force:!0}),await R.cp(e.outputDir,u,{recursive:!0});let l={...e,sourceOrigin:e.targetOrigin,targetOrigin:t.targetOrigin,extraReplacements:n,outputDir:u},c=1;i.info(`Rewriting text files for deployment profile "${r}"...`);let f=await Oe(l,{},{onStart:({totalFiles:g,workerCount:m})=>{c=m,i.info(`Rewriting ${g} text file(s) for deployment profile "${r}" with ${m} worker(s).`);},onProgress:({index:g,totalFiles:m,changedTextFiles:y,file:b,changed:p})=>{let P=`Rewriting [${g}/${m}] ${b} (${p?"rewrote":"checked"}; ${y} changed so far)`;m<=200||g<=5||g%10===0||g===m?(i.progress(P,{file:b,index:g,totalFiles:m,changed:p,changedTextFiles:y,workerCount:c}),i.info(P)):i.debug(P);}});return await sr(u,e,t,n),i.info(`Prepared deployment profile "${r}" in ${u} (${f} rewritten text file(s)).`),{outputDir:u,cleanup:async()=>{a(),await R.rm(u,{recursive:!0,force:!0});}}}catch(l){throw i.error(`Failed to prepare deployment profile "${r}" temporary output.`,{tempDir:u,outputDir:e.outputDir,error:l instanceof Error?l.message:String(l),...l instanceof Error&&l.stack?{stack:l.stack}:{}}),await R.rm(u,{recursive:true,force:true}).catch(()=>{}),a(),await i.flush().catch(()=>{}),l}}async function ar(){let e=await X(),t=Se(process.argv.slice(2)),r=ve(e,t),n=v.resolve(r.config.logDir||"logs"),i=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",s=i?v.join(v.resolve(i),"deploy-diff.json"):"",o=new A(n,"deploy.log.jsonl",r.config.logLevel??"info"),u=r.profile?.extraReplacements??{},a=async()=>{};try{let l=await or(e,r.config,r.name,u,o);a=l.cleanup;let c={...r.config,outputDir:l.outputDir},f=c.s3SyncMode??"sdk-upload-delete",g=await be(e),m=l.outputDir!==e.outputDir&&(e.targetOrigin!==r.config.targetOrigin||Object.keys(u).length>0),y=!!g&&!g.fullSyncRequired&&!m;r.name&&o.info(`Using deployment profile: ${r.name}`),o.info(`Starting deploy \u2014 s3://${c.s3.bucket}/${c.s3.prefix||""} (region: ${c.s3.region})`),o.info(`S3 sync mode: ${f}`),g&&g.fullSyncRequired?o.info("Deploy plan requests a full sync; scanning the whole output tree."):g&&m?o.info("Ignoring incremental deploy plan because deployment-profile rewrites require a full sync."):y&&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:c.s3.region}),p=y?(await Promise.all(g.changedFiles.map(async h=>{try{return (await R.stat(v.join(c.outputDir,h))).isFile()?h:null}catch{return null}}))).filter(h=>h!==null):await wt(["**/*"],{cwd:c.outputDir,onlyFiles:!0,dot:!0}),ce=y?new Set:new Set(p.map(h=>ie(c.s3.prefix,h)));y?o.info(`Using ${p.length} planned changed file(s) from deploy plan for upload.`):o.info(`Found ${p.length} file(s) in output directory "${c.outputDir}".`);let P=0,S=0,E=0,G=[],M=[],Q=[],U=[],I=new Map,Ue=new Map,ze=new Map,We=new Map,Be=new Map;y||(o.info("Listing existing S3 objects to detect unchanged files..."),I=await Yt(b,c.s3.bucket,c.s3.prefix,o),o.info(`Found ${I.size} existing key(s) in S3.`));let He=async h=>I.has(h)?I.get(h)??null:y?Zt(b,c.s3.bucket,h,Ue):null;for(let h of p){let ge=v.join(c.outputDir,h),d=ie(c.s3.prefix,h),O=Nt.lookup(h)||"application/octet-stream",Je=ne(h)?c.s3.htmlCacheControl:c.s3.assetCacheControl,w=P+S+E+1;p.length<=200||w<=5||w%10===0||w===p.length?(o.progress(`Uploading [${w}/${p.length}] ${d} (${O})`,{file:h,key:d,index:w,totalFiles:p.length,contentType:O,mode:f}),o.info(`Uploading [${w}/${p.length}] ${d} (${O})`)):o.debug(`Uploading [${w}/${p.length}] ${d} (${O})`);try{let x=await R.readFile(ge),F=await He(d),j=null,T=null;if(F){let qe=x.byteLength;if(F.size===qe){let z=F.etag.includes("-");if(F.etag!==""&&!z){let Ke=er(x);if(F.etag===Ke){S++,p.length<=200||S<=5||S%25===0?(o.progress(`Skipped unchanged [${w}/${p.length}] ${d}`,{file:h,key:d,index:w,totalFiles:p.length,uploaded:P,skipped:S,failed:E,mode:f,reason:"etag-md5-match"}),o.info(`Skipped unchanged [${w}/${p.length}] ${d}`)):o.debug(`Skipped unchanged [${w}/${p.length}] ${d}`),M.push(d);continue}}j=je(x);let pe=await tr(b,c.s3.bucket,d,ze);if(pe&&pe===j){S++,p.length<=200||S<=5||S%25===0?(o.progress(`Skipped unchanged [${w}/${p.length}] ${d}`,{file:h,key:d,index:w,totalFiles:p.length,uploaded:P,skipped:S,failed:E,mode:f,reason:"metadata-sha256-match"}),o.info(`Skipped unchanged [${w}/${p.length}] ${d}`)):o.debug(`Skipped unchanged [${w}/${p.length}] ${d}`),M.push(d);continue}}if(ne(h)){T=oe(x);let z=await rr(b,c.s3.bucket,d,We,Be);if(z&&z===T){S++,p.length<=200||S<=5||S%25===0?(o.progress(`Skipped semantically unchanged [${w}/${p.length}] ${d}`,{file:h,key:d,index:w,totalFiles:p.length,uploaded:P,skipped:S,failed:E,mode:f,reason:"normalized-html-match"}),o.info(`Skipped semantically unchanged [${w}/${p.length}] ${d}`)):o.debug(`Skipped semantically unchanged [${w}/${p.length}] ${d}`),M.push(d);continue}}}j=j??je(x),T=T??(ne(h)?oe(x):null),await new Upload({client:b,params:{Bucket:c.s3.bucket,Key:d,Body:x,ContentType:O,CacheControl:Je,Metadata:{[_e]:j,...T?{[Ae]:T}:{}}}}).done(),P++,G.push(d),(P%25===0||P===p.length)&&(o.progress(`Uploaded ${P}/${p.length} file(s)\u2026`,{uploaded:P,skipped:S,failed:E,totalFiles:p.length,mode:f}),o.info(`Uploaded ${P}/${p.length} file(s)\u2026`));}catch(x){E++,Q.push(d),o.error(`Failed to upload ${d}: ${x.message}`,{key:d,error:String(x)});}}o.info(`Upload complete: ${P} uploaded, ${S} skipped unchanged, ${E} failed.`),f==="sdk-upload-delete"?y?U=await Ne(b,c.s3.bucket,g.deletedFiles.map(h=>ie(c.s3.prefix,h)),o):U=await Xt(b,c.s3.bucket,I.keys(),ce,o):o.info("Sync mode is sdk-upload-only \u2014 skipping stale object deletion."),s&&(await R.mkdir(v.dirname(s),{recursive:!0}),await R.writeFile(s,JSON.stringify({generatedAt:new Date().toISOString(),mode:f,summary:{totalFiles:p.length,uploaded:G.length,skipped:M.length,failed:Q.length,deleted:U.length,...r.name?{profile:r.name}:{}},uploadedKeys:G,skippedKeys:M,failedKeys:Q,deletedKeys:U},null,2),"utf8")),await Pe(e),o.endMark("deploy"),await o.flush();}finally{await a().catch(()=>{});}}ar().catch(async e=>{console.error(e);try{let r=(await X().catch(()=>null))?.logDir??"logs",n=new A(r,"deploy.log.jsonl","debug");n.error(`Unhandled error: ${e instanceof Error?e.message:String(e)}`,e instanceof Error?{stack:e.stack}:void 0),await n.flush();}catch{}process.exit(1);});
@@ -1,3 +1,3 @@
1
- import {CloudFrontClient,CreateInvalidationCommand}from'@aws-sdk/client-cloudfront';import d from'fs/promises';import p from'path';import {getConfig}from'@smart-cloud/wpsuite-core';function C(i){let t=i.trim();return t==="."?".":t.replace(/\/$/,"")}function N(i){let t=String(i??"").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 e=r.endsWith("/"),o=r.replace(/^\/+/,"").split("/").map(s=>s.replace(/[^A-Za-z0-9._-]/g,"")).filter(s=>s.length>0&&s!=="."&&s!=="..");if(o.length===0)return "";let n=`/${o.join("/")}`;return e&&p.extname(n)===""&&(n+="/"),n==="/"?"":n}function P(i){return !i||typeof i!="object"?{}:Object.fromEntries(Object.entries(i).map(([t,r])=>[t.trim(),String(r??"")]).filter(([t])=>t.length>0))}function $(i){if(!i||typeof i!="object")return {};let t={};for(let[r,e]of Object.entries(i)){let o=r.trim();if(!o||!e||typeof e!="object")continue;let n=e,s={};if(typeof n.targetOrigin=="string"){let a=C(n.targetOrigin);a&&(s.targetOrigin=a);}let u=P(n.extraReplacements);if(Object.keys(u).length>0&&(s.extraReplacements=u),n.s3&&typeof n.s3=="object"){let a={},l=n.s3;typeof l.bucket=="string"&&(a.bucket=l.bucket.trim()),typeof l.prefix=="string"&&(a.prefix=l.prefix.trim()),typeof l.region=="string"&&(a.region=l.region.trim()),typeof l.htmlCacheControl=="string"&&(a.htmlCacheControl=l.htmlCacheControl.trim()),typeof l.assetCacheControl=="string"&&(a.assetCacheControl=l.assetCacheControl.trim()),Object.keys(a).length>0&&(s.s3=a);}if(n.cloudFront&&typeof n.cloudFront=="object"){let a={},l=n.cloudFront;typeof l.distributionId=="string"&&(a.distributionId=l.distributionId.trim()),Array.isArray(l.invalidationPaths)&&(a.invalidationPaths=l.invalidationPaths.map(g=>String(g??"").trim()).filter(g=>g.length>0)),Object.keys(a).length>0&&(s.cloudFront=a);}t[o]=s;}return t}function I(i){return i==="PROFESSIONAL"||i==="AGENCY"?i:void 0}function W(i,t){if(!i||typeof i!="object")return null;let r=i,e=r.command;if(e!=="publish"&&e!=="crawl"&&e!=="deploy"&&e!=="invalidate"&&e!=="retry-timeouts"&&e!=="url")return null;let o=Number.parseInt(String(r.intervalMinutes??"0"),10);if(!Number.isFinite(o)||o<1)return null;let n=String(r.id??`${e}-${t+1}`).trim();if(!n)return null;let s=String(r.deploymentProfile??"").trim(),u=String(r.url??"").trim();return {id:n,enabled:r.enabled!==false,command:e,intervalMinutes:o,...e==="publish"||e==="crawl"?{crawlMode:r.crawlMode==="incremental"?"incremental":"full"}:{},...(e==="publish"||e==="deploy"||e==="invalidate")&&s?{deploymentProfile:s}:{},...u?{url:u}:{}}}function L(i){let t=i&&typeof i=="object"?i:{},r=Array.isArray(t.rules)?t.rules.map((e,o)=>W(e,o)).filter(e=>!!e):[];return {enabled:t.enabled===true,timezone:typeof t.timezone=="string"&&t.timezone.trim()!==""?t.timezone.trim():"UTC",rules:r}}function U(i){if(!i||typeof i!="object")return;let t=i,r={};for(let o of ["accountId","siteId"]){let n=t[o];typeof n=="string"&&n.trim()!==""&&(r[o]=n.trim());}let e=Number(t.lastUpdate??0);return Number.isFinite(e)&&e>0&&(r.lastUpdate=Math.floor(e)),t.subscriber===true&&(r.subscriber=true),Object.keys(r).length>0?r:void 0}function v(i){let t=i&&typeof i=="object"?i:{},r=String(t.accountId??"").trim(),e=String(t.siteId??"").trim(),o=t.subscriber===true,n=U(t.siteSettings),s={...n??{},...r?{accountId:n?.accountId??r}:{},...e?{siteId:n?.siteId??e}:{},...n?.subscriber===true||o?{subscriber:true}:{}},u={},a=String(t.apiBase??"").trim();a&&(u.apiBase=a);let l=String(t.runtimeToken??t.nonce??"").trim();l&&(u.runtimeToken=l);let g=String(t.uploadUrl??"").trim();g&&(u.uploadUrl=g),Object.keys(s).length>0&&(u.siteSettings=s);let c=I(t.subscriptionType);return c&&(u.subscriptionType=c),u}function q(i){try{let t=new URL(i);globalThis.location=t;}catch{}}function _(i){let t=v(i.wpsuite),r={...t.siteSettings??{},...t.siteSettings?.subscriber===true||t.subscriptionType==="PROFESSIONAL"||t.subscriptionType==="AGENCY"?{subscriber:true}:{}},e=String(r.accountId??"").trim(),o=String(r.siteId??"").trim(),n=String(t.uploadUrl??"").trim();if(i.wpsuite={...t.apiBase?{apiBase:t.apiBase}:{},...t.runtimeToken?{runtimeToken:t.runtimeToken}:{},...n?{uploadUrl:n}:{},...Object.keys(r).length>0?{siteSettings:r}:{},...t.subscriptionType?{subscriptionType:t.subscriptionType}:{}},!e||!o||!n)return false;q(i.sourceOrigin);let s=globalThis,a={...s.WpSuite??{},siteSettings:r,uploadUrl:n};return t.apiBase&&(a.apiBase=t.apiBase),s.WpSuite=a,true}async function J(i){if(!_(i))return null;try{let t=await getConfig("publisher");return t&&typeof t=="object"?t:null}catch{return null}}function B(i,t){let r=$(t?.deploymentProfiles),e=String(t?.defaultDeploymentProfile??"").trim(),o=r[e]?e:"",n=I(t?.subscriptionType),s=v(i.wpsuite);return {...i,scheduler:L(t?.scheduler),deploymentProfiles:r,defaultDeploymentProfile:o,...n?{subscriptionType:n}:{},wpsuite:{...s,...s.siteSettings||n?{siteSettings:{...s.siteSettings??{},...s.siteSettings?.subscriber===true||n==="PROFESSIONAL"||n==="AGENCY"?{subscriber:true}:{}}}:{},...n?{subscriptionType:n}:{}}}}function S(i,t){let e=String(i||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!e)return t;let o=e.split("/").map(n=>n.trim()).filter(n=>n.length>0&&n!=="."&&n!=="..");return o.length>0?o.join("/"):t}function z(){let i=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return i.trim()?p.resolve(i):""}function y(i,t,r){let e=String(t||"").trim();return e&&p.isAbsolute(e)?p.resolve(e):p.resolve(i,S(e,r))}async function w(i){let t=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",r=await d.readFile(t,"utf8"),e=JSON.parse(r);e.sourceOrigin=e.sourceOrigin.replace(/\/$/,""),e.targetOrigin=C(e.targetOrigin),e.ignoreHttpsErrors??=false,e.outputDir=String(e.outputDir||"export").trim()||"export",e.urlRewriteMode||=e.targetOrigin==="."?"relative":"absolute",e.noJavaScriptRenderPathPrefixes||=[],e.seedPaths||=[],e.generated404RequestPath=N(e.generated404RequestPath),e.sitemapPaths||=["/sitemap_index.xml","/sitemap.xml"],e.allowedAssetHosts||=[],e.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],e.blockedPathPrefixes||=[],e.blockedSearchFragments||=[],e.concurrency||=1,e.maxPages||=0,e.extraReplacements=P(e.extraReplacements),e.postCrawlCopyMap=P(e.postCrawlCopyMap),e.logDir=String(e.logDir||"logs").trim()||"logs",e.verbose??=false,e.logLevel||=e.verbose?"debug":"info",e.s3SyncMode||="sdk-upload-delete",e.readiness||={waitForSelector:null,waitForFunction:null,timeoutMs:1500,fallbackWaitMs:1500},e.readiness.timeoutMs??=1500,e.readiness.fallbackWaitMs??=1500,e.viewport||={width:1440,height:1200},e.navigationTimeoutMs||=3e4,e.assetDownloadConcurrency=Number(e.assetDownloadConcurrency)>0?Number(e.assetDownloadConcurrency):e.concurrency,e.rewriteConcurrency=Number(e.rewriteConcurrency)>0?Number(e.rewriteConcurrency):e.assetDownloadConcurrency,e.wpsuite=v(e.wpsuite),e.scheduler=L(void 0),e.deploymentProfiles={},e.defaultDeploymentProfile="",e.deploymentTargetOverride=String(e.deploymentTargetOverride??"").trim();let o=B(e,await J(e)),n=z(),s=n?p.resolve(n,".."):"";return s?(o.outputDir=y(s,o.outputDir,"export"),o.logDir=y(s,o.logDir,"logs")):(p.isAbsolute(o.outputDir)||(o.outputDir=S(o.outputDir,"export")),p.isAbsolute(o.logDir)||(o.logDir=S(o.logDir,"logs"))),o}function Q(i){return typeof i.subscriptionType=="string"&&i.subscriptionType.trim()!==""}function D(i){let t="";for(let e=0;e<i.length;e++){let o=i[e];if(o==="--profile"){let n=(i[e+1]||"").trim();if(!n)throw new Error("Missing value for --profile.");t=n,e+=1;}else if(o.startsWith("--profile=")){let n=o.slice(10).trim();if(!n)throw new Error("Missing value for --profile.");t=n;}}let r=String(process.env.PUBLISHER_DEPLOY_PROFILE||process.env.PUBLISHER_DEPLOYMENT_PROFILE||"").trim();return t||r||null}function H(i,t){return {...i,...t??{}}}function G(i,t){return {...i,...t??{},invalidationPaths:[...(t?.invalidationPaths??i.invalidationPaths)||[]]}}function R(i,t){let r=String(t??i.deploymentTargetOverride??"").trim();if(!Q(i)){if(r)throw new Error(`Deployment target "${r}" requires an active WPSuite subscription and remote publisher config.`);return {name:null,profile:null,config:i}}let e=String(r||i.defaultDeploymentProfile||"").trim();if(!e)return {name:null,profile:null,config:i};let o=i.deploymentProfiles?.[e];if(!o)throw new Error(`Unknown deployment profile "${e}". Check the linked WPSuite publisher configuration.`);return {name:e,profile:o,config:{...i,targetOrigin:o.targetOrigin??i.targetOrigin,s3:H(i.s3,o.s3),cloudFront:G(i.cloudFront,o.cloudFront)}}}var k={error:0,warn:1,info:2,debug:3},T=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",f=T?p.join(T,"current-progress.json"):"",F=Promise.resolve();function E(i){return i.includes("crawl")?"crawl":i.includes("deploy")?"deploy":i.includes("invalidate")?"invalidate":i}function Y(i,t){let r={...i},e=new Set(["pagesQueued","pagesRendered","assetsQueued","sitemapsQueued","pagesDiscovered","assetsDiscovered","sitemapsDiscovered","pagesSaved","assetsSaved","donePages","doneAssets","doneSitemaps","changedTextFiles","uploaded","failed","index","totalFiles","pageQueue","assetQueue","sitemapQueue"]);for(let[o,n]of Object.entries(t)){let s=r[o];if(typeof s=="number"&&typeof n=="number"&&e.has(o)){r[o]=Math.max(s,n);continue}r[o]=n;}return r}function K(i,t,r){f&&(F=F.then(async()=>{let e=new Date,o=e.toISOString();await d.mkdir(p.dirname(f),{recursive:true});let n=await d.readFile(f,"utf8").then(b=>JSON.parse(b)).catch(()=>null),s=n&&typeof n.details=="object"&&n.details?n.details:{},u=E(i),a=n?.currentStep||E(n?.source||""),l=n?.startedAt||o,g={...n?.stepDurationsSec??{}},c=n?.stepStartedAt||o;if(a&&a!==u&&n?.stepStartedAt){let b=Math.max(0,Math.round((e.getTime()-new Date(n.stepStartedAt).getTime())/1e3));g[a]=(g[a]??0)+b,c=o;}let x=Math.max(0,Math.round((e.getTime()-new Date(c).getTime())/1e3)),O=Math.max(0,Math.round((e.getTime()-new Date(l).getTime())/1e3)),j={checkedAt:o,source:i,message:t,details:Y(s,r??{}),startedAt:l,currentStep:u,stepStartedAt:c,stepElapsedSec:x,totalElapsedSec:O,stepDurationsSec:g};await d.writeFile(f,JSON.stringify(j,null,2),"utf8");}).catch(()=>{}));}async function V(i,t){await d.mkdir(p.dirname(i),{recursive:true}),await d.appendFile(i,`${JSON.stringify(t)}
1
+ import {CloudFrontClient,CreateInvalidationCommand}from'@aws-sdk/client-cloudfront';import d from'fs/promises';import p from'path';import {getConfig}from'@smart-cloud/wpsuite-core';function C(i){let t=i.trim();return t==="."?".":t.replace(/\/$/,"")}function N(i){let t=String(i??"").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 e=r.endsWith("/"),o=r.replace(/^\/+/,"").split("/").map(s=>s.replace(/[^A-Za-z0-9._-]/g,"")).filter(s=>s.length>0&&s!=="."&&s!=="..");if(o.length===0)return "";let n=`/${o.join("/")}`;return e&&p.extname(n)===""&&(n+="/"),n==="/"?"":n}function P(i){return !i||typeof i!="object"?{}:Object.fromEntries(Object.entries(i).map(([t,r])=>[t.trim(),String(r??"")]).filter(([t])=>t.length>0))}function $(i){if(!i||typeof i!="object")return {};let t={};for(let[r,e]of Object.entries(i)){let o=r.trim();if(!o||!e||typeof e!="object")continue;let n=e,s={};if(typeof n.targetOrigin=="string"){let a=C(n.targetOrigin);a&&(s.targetOrigin=a);}let l=P(n.extraReplacements);if(Object.keys(l).length>0&&(s.extraReplacements=l),n.s3&&typeof n.s3=="object"){let a={},u=n.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&&(s.s3=a);}if(n.cloudFront&&typeof n.cloudFront=="object"){let a={},u=n.cloudFront;typeof u.distributionId=="string"&&(a.distributionId=u.distributionId.trim()),Array.isArray(u.invalidationPaths)&&(a.invalidationPaths=u.invalidationPaths.map(g=>String(g??"").trim()).filter(g=>g.length>0)),Object.keys(a).length>0&&(s.cloudFront=a);}t[o]=s;}return t}function I(i){return i==="PROFESSIONAL"||i==="AGENCY"?i:void 0}function W(i,t){if(!i||typeof i!="object")return null;let r=i,e=r.command;if(e!=="publish"&&e!=="crawl"&&e!=="deploy"&&e!=="invalidate"&&e!=="retry-timeouts"&&e!=="url")return null;let o=Number.parseInt(String(r.intervalMinutes??"0"),10);if(!Number.isFinite(o)||o<1)return null;let n=String(r.id??`${e}-${t+1}`).trim();if(!n)return null;let s=String(r.deploymentProfile??"").trim(),l=String(r.url??"").trim();return {id:n,enabled:r.enabled!==false,command:e,intervalMinutes:o,...e==="publish"||e==="crawl"?{crawlMode:r.crawlMode==="incremental"?"incremental":"full"}:{},...(e==="publish"||e==="deploy"||e==="invalidate")&&s?{deploymentProfile:s}:{},...l?{url:l}:{}}}function L(i){let t=i&&typeof i=="object"?i:{},r=Array.isArray(t.rules)?t.rules.map((e,o)=>W(e,o)).filter(e=>!!e):[];return {enabled:t.enabled===true,timezone:typeof t.timezone=="string"&&t.timezone.trim()!==""?t.timezone.trim():"UTC",rules:r}}function U(i){if(!i||typeof i!="object")return;let t=i,r={};for(let o of ["accountId","siteId"]){let n=t[o];typeof n=="string"&&n.trim()!==""&&(r[o]=n.trim());}let e=Number(t.lastUpdate??0);return Number.isFinite(e)&&e>0&&(r.lastUpdate=Math.floor(e)),t.subscriber===true&&(r.subscriber=true),Object.keys(r).length>0?r:void 0}function v(i){let t=i&&typeof i=="object"?i:{},r=String(t.accountId??"").trim(),e=String(t.siteId??"").trim(),o=t.subscriber===true,n=U(t.siteSettings),s={...n??{},...r?{accountId:n?.accountId??r}:{},...e?{siteId:n?.siteId??e}:{},...n?.subscriber===true||o?{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 g=String(t.uploadUrl??"").trim();g&&(l.uploadUrl=g),Object.keys(s).length>0&&(l.siteSettings=s);let c=I(t.subscriptionType);return c&&(l.subscriptionType=c),l}function q(i){try{let t=new URL(i);globalThis.location=t;}catch{}}function _(i){let t=v(i.wpsuite),r={...t.siteSettings??{},...t.siteSettings?.subscriber===true||t.subscriptionType==="PROFESSIONAL"||t.subscriptionType==="AGENCY"?{subscriber:true}:{}},e=String(r.accountId??"").trim(),o=String(r.siteId??"").trim(),n=String(t.uploadUrl??"").trim();if(i.wpsuite={...t.apiBase?{apiBase:t.apiBase}:{},...t.runtimeToken?{runtimeToken:t.runtimeToken}:{},...n?{uploadUrl:n}:{},...Object.keys(r).length>0?{siteSettings:r}:{},...t.subscriptionType?{subscriptionType:t.subscriptionType}:{}},!e||!o||!n)return false;q(i.sourceOrigin);let s=globalThis,a={...s.WpSuite??{},siteSettings:r,uploadUrl:n};return t.apiBase&&(a.apiBase=t.apiBase),s.WpSuite=a,true}async function J(i){if(!_(i))return null;try{let t=await getConfig("publisher");return t&&typeof t=="object"?t:null}catch{return null}}function B(i,t){let r=$(t?.deploymentProfiles),e=String(t?.defaultDeploymentProfile??"").trim(),o=r[e]?e:"",n=I(t?.subscriptionType),s=v(i.wpsuite);return {...i,scheduler:L(t?.scheduler),deploymentProfiles:r,defaultDeploymentProfile:o,...n?{subscriptionType:n}:{},wpsuite:{...s,...s.siteSettings||n?{siteSettings:{...s.siteSettings??{},...s.siteSettings?.subscriber===true||n==="PROFESSIONAL"||n==="AGENCY"?{subscriber:true}:{}}}:{},...n?{subscriptionType:n}:{}}}}function S(i,t){let e=String(i||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!e)return t;let o=e.split("/").map(n=>n.trim()).filter(n=>n.length>0&&n!=="."&&n!=="..");return o.length>0?o.join("/"):t}function z(){let i=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return i.trim()?p.resolve(i):""}function y(i,t,r){let e=String(t||"").trim();return e&&p.isAbsolute(e)?p.resolve(e):p.resolve(i,S(e,r))}async function w(i){let t=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",r=await d.readFile(t,"utf8"),e=JSON.parse(r);e.sourceOrigin=e.sourceOrigin.replace(/\/$/,""),e.targetOrigin=C(e.targetOrigin),e.ignoreHttpsErrors??=false,e.outputDir=String(e.outputDir||"export").trim()||"export",e.urlRewriteMode||=e.targetOrigin==="."?"relative":"absolute",e.noJavaScriptRenderPathPrefixes||=[],e.seedPaths||=[],e.generated404RequestPath=N(e.generated404RequestPath),e.sitemapPaths||=["/sitemap_index.xml","/sitemap.xml"],e.allowedAssetHosts||=[],e.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],e.blockedPathPrefixes||=[],e.blockedSearchFragments||=[],e.concurrency||=1,e.maxPages||=0,e.extraReplacements=P(e.extraReplacements),e.postCrawlCopyMap=P(e.postCrawlCopyMap),e.logDir=String(e.logDir||"logs").trim()||"logs",e.verbose??=false,e.logLevel||=e.verbose?"debug":"info",e.s3SyncMode||="sdk-upload-delete",e.readiness||={waitForSelector:null,waitForFunction:null,timeoutMs:1500,fallbackWaitMs:1500},e.readiness.timeoutMs??=1500,e.readiness.fallbackWaitMs??=1500,e.viewport||={width:1440,height:1200},e.navigationTimeoutMs||=3e4,e.assetDownloadConcurrency=Number(e.assetDownloadConcurrency)>0?Number(e.assetDownloadConcurrency):e.concurrency,e.rewriteConcurrency=Number(e.rewriteConcurrency)>0?Number(e.rewriteConcurrency):e.assetDownloadConcurrency,e.wpsuite=v(e.wpsuite),e.scheduler=L(void 0),e.deploymentProfiles={},e.defaultDeploymentProfile="",e.deploymentTargetOverride=String(e.deploymentTargetOverride??"").trim();let o=B(e,await J(e)),n=z(),s=n?p.resolve(n,".."):"";return s?(o.outputDir=y(s,o.outputDir,"export"),o.logDir=y(s,o.logDir,"logs")):(p.isAbsolute(o.outputDir)||(o.outputDir=S(o.outputDir,"export")),p.isAbsolute(o.logDir)||(o.logDir=S(o.logDir,"logs"))),o}function Q(i){return typeof i.subscriptionType=="string"&&i.subscriptionType.trim()!==""}function D(i){let t="";for(let e=0;e<i.length;e++){let o=i[e];if(o==="--profile"){let n=(i[e+1]||"").trim();if(!n)throw new Error("Missing value for --profile.");t=n,e+=1;}else if(o.startsWith("--profile=")){let n=o.slice(10).trim();if(!n)throw new Error("Missing value for --profile.");t=n;}}let r=String(process.env.PUBLISHER_DEPLOY_PROFILE||process.env.PUBLISHER_DEPLOYMENT_PROFILE||"").trim();return t||r||null}function H(i,t){return {...i,...t??{}}}function G(i,t){return {...i,...t??{},invalidationPaths:[...(t?.invalidationPaths??i.invalidationPaths)||[]]}}function R(i,t){let r=String(t??i.deploymentTargetOverride??"").trim();if(!Q(i)){if(r)throw new Error(`Deployment target "${r}" requires an active WPSuite subscription and remote publisher config.`);return {name:null,profile:null,config:i}}let e=String(r||i.defaultDeploymentProfile||"").trim();if(!e)return {name:null,profile:null,config:i};let o=i.deploymentProfiles?.[e];if(!o)throw new Error(`Unknown deployment profile "${e}". Check the linked WPSuite publisher configuration.`);return {name:e,profile:o,config:{...i,targetOrigin:o.targetOrigin??i.targetOrigin,s3:H(i.s3,o.s3),cloudFront:G(i.cloudFront,o.cloudFront)}}}var k={error:0,warn:1,info:2,debug:3},T=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",f=T?p.join(T,"current-progress.json"):"",F=Promise.resolve();function E(i){return i.includes("crawl")?"crawl":i.includes("deploy")?"deploy":i.includes("invalidate")?"invalidate":i}function Y(i,t){let r={...i},e=new Set(["pagesQueued","pagesRendered","assetsQueued","sitemapsQueued","pagesDiscovered","assetsDiscovered","sitemapsDiscovered","pagesSaved","assetsSaved","donePages","doneAssets","doneSitemaps","changedTextFiles","uploaded","failed","index","totalFiles","pageQueue","assetQueue","sitemapQueue"]);for(let[o,n]of Object.entries(t)){let s=r[o];if(typeof s=="number"&&typeof n=="number"&&e.has(o)){r[o]=Math.max(s,n);continue}r[o]=n;}return r}function K(i,t,r){f&&(F=F.then(async()=>{let e=new Date,o=e.toISOString();await d.mkdir(p.dirname(f),{recursive:true});let n=await d.readFile(f,"utf8").then(b=>JSON.parse(b)).catch(()=>null),s=n&&typeof n.details=="object"&&n.details?n.details:{},l=E(i),a=n?.currentStep||E(n?.source||""),u=n?.startedAt||o,g={...n?.stepDurationsSec??{}},c=n?.stepStartedAt||o;if(a&&a!==l&&n?.stepStartedAt){let b=Math.max(0,Math.round((e.getTime()-new Date(n.stepStartedAt).getTime())/1e3));g[a]=(g[a]??0)+b,c=o;}let x=Math.max(0,Math.round((e.getTime()-new Date(c).getTime())/1e3)),O=Math.max(0,Math.round((e.getTime()-new Date(u).getTime())/1e3)),j={checkedAt:o,source:i,message:t,details:Y(s,r??{}),startedAt:u,currentStep:l,stepStartedAt:c,stepElapsedSec:x,totalElapsedSec:O,stepDurationsSec:g};await d.writeFile(f,JSON.stringify(j,null,2),"utf8");}).catch(()=>{}));}async function V(i,t){await d.mkdir(p.dirname(i),{recursive:true}),await d.appendFile(i,`${JSON.stringify(t)}
2
2
  `,"utf8");}var h=class{constructor(t,r,e="info"){this.logDir=t;this.logFile=r;this.level=e;this.ensureLogFileReady();}logDir;logFile;level;startedAt=Date.now();marks=new Map;initPromise=null;writeQueue=Promise.resolve();writeError=null;get logPath(){return p.join(this.logDir,this.logFile)}get errorsPath(){return p.join(this.logDir,this.logFile.replace(".log.jsonl",".errors.jsonl"))}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(()=>V(t,r));}accepts(t){return k[t]<=k[this.level]}push(t,r,e){if(!this.accepts(t))return;let o=JSON.stringify({time:new Date().toISOString(),level:t,message:r,...e||{}});this.enqueueLine(o),t==="error"?console.error(`[ERROR] ${r}`,e?JSON.stringify(e):""):t==="warn"?console.warn(`[WARN] ${r}`,e?JSON.stringify(e):""):console.log(`[${t.toUpperCase().padEnd(5)}] ${r}`);}info(t,r){this.push("info",t,r);}progress(t,r){K(this.logFile,t,r);}debug(t,r){this.push("debug",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);}mark(t){this.marks.set(t,Date.now());}endMark(t,r){let e=this.marks.get(t);if(!e)return;let o=Date.now()-e,n=Number((o/1e3).toFixed(2));this.push("info",`Timing ${t}: ${n}s`,{name:t,ms:o,seconds:n,...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 ee(){let i=await w(),t=D(process.argv.slice(2)),r=R(i,t),e=r.config,o=e.logDir||"logs",n=new h(o,"invalidate.log.jsonl",e.logLevel??"info");if(r.name&&n.info(`Using deployment profile: ${r.name}`),!e.cloudFront.distributionId){n.info("No CloudFront distributionId configured; skipping invalidation."),await n.flush();return}let s=e.cloudFront.invalidationPaths.length>0?e.cloudFront.invalidationPaths:["/*"];n.info(`Starting CloudFront invalidation for distribution ${e.cloudFront.distributionId}`),n.info(`Invalidation paths (${s.length}): ${s.join(", ")}`),n.mark("invalidate");let u=new CloudFrontClient({region:"us-east-1"}),a=`smartcloud-static-publisher-${Date.now()}`;n.debug(`CallerReference: ${a}`);let l=await u.send(new CreateInvalidationCommand({DistributionId:e.cloudFront.distributionId,InvalidationBatch:{CallerReference:a,Paths:{Quantity:s.length,Items:s}}})),g=l.Invalidation?.Id??"(unknown)",c=l.Invalidation?.Status??"(unknown)";n.info(`CloudFront invalidation created. ID: ${g} Status: ${c}`),n.debug(`Full invalidation response: ${JSON.stringify(l.Invalidation)}`),n.endMark("invalidate"),await n.flush();}ee().catch(async i=>{console.error(i);try{let r=(await w().catch(()=>null))?.logDir??"logs",e=new h(r,"invalidate.log.jsonl","debug");e.error(`Unhandled error: ${i instanceof Error?i.message:String(i)}`,i instanceof Error?{stack:i.stack}:void 0),await e.flush();}catch{}process.exit(1);});
3
+ `,"utf8");});}enqueueJsonLine(t,r){this.enqueueTask(()=>V(t,r));}accepts(t){return k[t]<=k[this.level]}push(t,r,e){if(!this.accepts(t))return;let o=JSON.stringify({time:new Date().toISOString(),level:t,message:r,...e||{}});this.enqueueLine(o),t==="error"?console.error(`[ERROR] ${r}`,e?JSON.stringify(e):""):t==="warn"?console.warn(`[WARN] ${r}`,e?JSON.stringify(e):""):console.log(`[${t.toUpperCase().padEnd(5)}] ${r}`);}info(t,r){this.push("info",t,r);}progress(t,r){K(this.logFile,t,r);}debug(t,r){this.push("debug",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);}mark(t){this.marks.set(t,Date.now());}endMark(t,r){let e=this.marks.get(t);if(!e)return;let o=Date.now()-e,n=Number((o/1e3).toFixed(2));this.push("info",`Timing ${t}: ${n}s`,{name:t,ms:o,seconds:n,...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 ee(){let i=await w(),t=D(process.argv.slice(2)),r=R(i,t),e=r.config,o=e.logDir||"logs",n=new h(o,"invalidate.log.jsonl",e.logLevel??"info");if(r.name&&n.info(`Using deployment profile: ${r.name}`),!e.cloudFront.distributionId){n.info("No CloudFront distributionId configured; skipping invalidation."),await n.flush();return}let s=e.cloudFront.invalidationPaths.length>0?e.cloudFront.invalidationPaths:["/*"];n.info(`Starting CloudFront invalidation for distribution ${e.cloudFront.distributionId}`),n.info(`Invalidation paths (${s.length}): ${s.join(", ")}`),n.mark("invalidate");let l=new CloudFrontClient({region:"us-east-1"}),a=`smartcloud-static-publisher-${Date.now()}`;n.debug(`CallerReference: ${a}`);let u=await l.send(new CreateInvalidationCommand({DistributionId:e.cloudFront.distributionId,InvalidationBatch:{CallerReference:a,Paths:{Quantity:s.length,Items:s}}})),g=u.Invalidation?.Id??"(unknown)",c=u.Invalidation?.Status??"(unknown)";n.info(`CloudFront invalidation created. ID: ${g} Status: ${c}`),n.debug(`Full invalidation response: ${JSON.stringify(u.Invalidation)}`),n.endMark("invalidate"),await n.flush();}ee().catch(async i=>{console.error(i);try{let r=(await w().catch(()=>null))?.logDir??"logs",e=new h(r,"invalidate.log.jsonl","debug");e.error(`Unhandled error: ${i instanceof Error?i.message:String(i)}`,i instanceof Error?{stack:i.stack}:void 0),await e.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.5",
3
+ "version": "1.1.6",
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.",
@@ -12,11 +12,7 @@
12
12
  "/xmlrpc.php",
13
13
  "/wp-cron.php"
14
14
  ],
15
- "blockedSearchFragments": [
16
- "preview=true",
17
- "elementor-preview",
18
- "customize_changeset_uuid"
19
- ],
15
+ "blockedSearchFragments": [],
20
16
  "extraReplacements": {
21
17
  "https://dev.wpsuite.io": "https://wpsuite.io",
22
18
  "http://localhost:8080": "https://wpsuite.io"