@smart-cloud/publisher-exporter 1.1.7 → 1.1.9
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 +4 -4
- package/package.json +1 -1
package/dist/crawl.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
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(/"/g,'"').replace(/"/g,'"').replace(/'/g,"'").replace(/'/g,"'").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function Q(e){return e.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">")}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
|
|
1
|
+
import {request,chromium}from'playwright';import S from'fs/promises';import m from'path';import {gunzipSync}from'zlib';import {getConfig}from'@smart-cloud/wpsuite-core';import Ot from'crypto';import $t from'fast-glob';import {availableParallelism}from'os';import {Worker}from'worker_threads';var Pt=".deploy-plan.json",St="deploy-plan.json";function bt(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?m.resolve(e):""}function Fe(e){let t=String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").trim();return !t||t==="."||t.startsWith("../")||t===".."?null:t}function de(e){return [...new Set(e.map(Fe).filter(t=>t!==null))]}function yt(e,t){return {schemaVersion:1,generatedAt:String(t.generatedAt||new Date().toISOString()),outputDir:m.resolve(e.outputDir),runMode:t.runMode,crawlMode:t.crawlMode,fullSyncRequired:!!t.fullSyncRequired,changedFiles:de(t.changedFiles||[]),deletedFiles:de(t.deletedFiles||[]),rewriteTargets:de(t.rewriteTargets||[])}}function vt(e){let t=m.join(m.resolve(e.outputDir),Pt),r=bt();return r?[m.join(r,St),t]:[t]}function te(e,t){let r=m.resolve(e),s=m.resolve(t),n=m.relative(r,s).replace(/\\/g,"/");return Fe(n)}async function Oe(e,t){let r=yt(e,t);for(let s of vt(e))await S.mkdir(m.dirname(s),{recursive:true}),await S.writeFile(s,JSON.stringify(r,null,2),"utf8");}function $e(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function xt(e){let t=String(e??"").trim();if(!t)return "";let r=t;if(/^https?:\/\//i.test(r))try{r=new URL(r).pathname;}catch{return ""}if(r=r.split(/[?#]/,1)[0]?.replace(/\\/g,"/").trim()??"",!r)return "";let s=r.endsWith("/"),n=r.replace(/^\/+/,"").split("/").map(u=>u.replace(/[^A-Za-z0-9._-]/g,"")).filter(u=>u.length>0&&u!=="."&&u!=="..");if(n.length===0)return "";let i=`/${n.join("/")}`;return s&&m.extname(i)===""&&(i+="/"),i==="/"?"":i}function pe(e){return !e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).map(([t,r])=>[t.trim(),String(r??"")]).filter(([t])=>t.length>0))}function kt(e){if(!e||typeof e!="object")return {};let t={};for(let[r,s]of Object.entries(e)){let n=r.trim();if(!n||!s||typeof s!="object")continue;let i=s,u={};if(typeof i.targetOrigin=="string"){let a=$e(i.targetOrigin);a&&(u.targetOrigin=a);}let l=pe(i.extraReplacements);if(Object.keys(l).length>0&&(u.extraReplacements=l),i.s3&&typeof i.s3=="object"){let a={},o=i.s3;typeof o.bucket=="string"&&(a.bucket=o.bucket.trim()),typeof o.prefix=="string"&&(a.prefix=o.prefix.trim()),typeof o.region=="string"&&(a.region=o.region.trim()),typeof o.htmlCacheControl=="string"&&(a.htmlCacheControl=o.htmlCacheControl.trim()),typeof o.assetCacheControl=="string"&&(a.assetCacheControl=o.assetCacheControl.trim()),Object.keys(a).length>0&&(u.s3=a);}if(i.cloudFront&&typeof i.cloudFront=="object"){let a={},o=i.cloudFront;typeof o.distributionId=="string"&&(a.distributionId=o.distributionId.trim()),Array.isArray(o.invalidationPaths)&&(a.invalidationPaths=o.invalidationPaths.map(c=>String(c??"").trim()).filter(c=>c.length>0)),Object.keys(a).length>0&&(u.cloudFront=a);}t[n]=u;}return t}function je(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function Tt(e,t){if(!e||typeof e!="object")return null;let r=e,s=r.command;if(s!=="publish"&&s!=="crawl"&&s!=="deploy"&&s!=="invalidate"&&s!=="retry-timeouts"&&s!=="url")return null;let n=Number.parseInt(String(r.intervalMinutes??"0"),10);if(!Number.isFinite(n)||n<1)return null;let i=String(r.id??`${s}-${t+1}`).trim();if(!i)return null;let u=String(r.deploymentProfile??"").trim(),l=String(r.url??"").trim();return {id:i,enabled:r.enabled!==false,command:s,intervalMinutes:n,...s==="publish"||s==="crawl"?{crawlMode:r.crawlMode==="incremental"?"incremental":"full"}:{},...(s==="publish"||s==="deploy"||s==="invalidate")&&u?{deploymentProfile:u}:{},...l?{url:l}:{}}}function Ue(e){let t=e&&typeof e=="object"?e:{},r=Array.isArray(t.rules)?t.rules.map((s,n)=>Tt(s,n)).filter(s=>!!s):[];return {enabled:t.enabled===true,timezone:typeof t.timezone=="string"&&t.timezone.trim()!==""?t.timezone.trim():"UTC",rules:r}}function At(e){if(!e||typeof e!="object")return;let t=e,r={};for(let n of ["accountId","siteId"]){let i=t[n];typeof i=="string"&&i.trim()!==""&&(r[n]=i.trim());}let s=Number(t.lastUpdate??0);return Number.isFinite(s)&&s>0&&(r.lastUpdate=Math.floor(s)),t.subscriber===true&&(r.subscriber=true),Object.keys(r).length>0?r:void 0}function me(e){let t=e&&typeof e=="object"?e:{},r=String(t.accountId??"").trim(),s=String(t.siteId??"").trim(),n=t.subscriber===true,i=At(t.siteSettings),u={...i??{},...r?{accountId:i?.accountId??r}:{},...s?{siteId:i?.siteId??s}:{},...i?.subscriber===true||n?{subscriber:true}:{}},l={},a=String(t.apiBase??"").trim();a&&(l.apiBase=a);let o=String(t.runtimeToken??t.nonce??"").trim();o&&(l.runtimeToken=o);let c=String(t.uploadUrl??"").trim();c&&(l.uploadUrl=c),Object.keys(u).length>0&&(l.siteSettings=u);let p=je(t.subscriptionType);return p&&(l.subscriptionType=p),l}function Mt(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function Lt(e){let t=me(e.wpsuite),r={...t.siteSettings??{},...t.siteSettings?.subscriber===true||t.subscriptionType==="PROFESSIONAL"||t.subscriptionType==="AGENCY"?{subscriber:true}:{}},s=String(r.accountId??"").trim(),n=String(r.siteId??"").trim(),i=String(t.uploadUrl??"").trim();if(e.wpsuite={...t.apiBase?{apiBase:t.apiBase}:{},...t.runtimeToken?{runtimeToken:t.runtimeToken}:{},...i?{uploadUrl:i}:{},...Object.keys(r).length>0?{siteSettings:r}:{},...t.subscriptionType?{subscriptionType:t.subscriptionType}:{}},!s||!n||!i)return false;Mt(e.sourceOrigin);let u=globalThis,a={...u.WpSuite??{},siteSettings:r,uploadUrl:i};return t.apiBase&&(a.apiBase=t.apiBase),u.WpSuite=a,true}async function It(e){if(!Lt(e))return null;try{let t=await getConfig("publisher");return t&&typeof t=="object"?t:null}catch{return null}}function Dt(e,t){let r=kt(t?.deploymentProfiles),s=String(t?.defaultDeploymentProfile??"").trim(),n=r[s]?s:"",i=je(t?.subscriptionType),u=me(e.wpsuite);return {...e,scheduler:Ue(t?.scheduler),deploymentProfiles:r,defaultDeploymentProfile:n,...i?{subscriptionType:i}:{},wpsuite:{...u,...u.siteSettings||i?{siteSettings:{...u.siteSettings??{},...u.siteSettings?.subscriber===true||i==="PROFESSIONAL"||i==="AGENCY"?{subscriber:true}:{}}}:{},...i?{subscriptionType:i}:{}}}}function ge(e,t){let s=String(e||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!s)return t;let n=s.split("/").map(i=>i.trim()).filter(i=>i.length>0&&i!=="."&&i!=="..");return n.length>0?n.join("/"):t}function Ft(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?m.resolve(e):""}function Ee(e,t,r){let s=String(t||"").trim();return s&&m.isAbsolute(s)?m.resolve(s):m.resolve(e,ge(s,r))}async function he(e){let t=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",r=await S.readFile(t,"utf8"),s=JSON.parse(r);s.sourceOrigin=s.sourceOrigin.replace(/\/$/,""),s.targetOrigin=$e(s.targetOrigin),s.ignoreHttpsErrors??=false,s.outputDir=String(s.outputDir||"export").trim()||"export",s.urlRewriteMode||=s.targetOrigin==="."?"relative":"absolute",s.noJavaScriptRenderPathPrefixes||=[],s.seedPaths||=[],s.generated404RequestPath=xt(s.generated404RequestPath),s.sitemapPaths||=["/sitemap_index.xml","/sitemap.xml"],s.allowedAssetHosts||=[],s.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],s.blockedPathPrefixes||=[],s.blockedSearchFragments||=[],s.concurrency||=1,s.maxPages||=0,s.extraReplacements=pe(s.extraReplacements),s.postCrawlCopyMap=pe(s.postCrawlCopyMap),s.logDir=String(s.logDir||"logs").trim()||"logs",s.verbose??=false,s.logLevel||=s.verbose?"debug":"info",s.s3SyncMode||="sdk-upload-delete",s.readiness||={waitForSelector:null,waitForFunction:null,timeoutMs:1500,fallbackWaitMs:1500},s.readiness.timeoutMs??=1500,s.readiness.fallbackWaitMs??=1500,s.viewport||={width:1440,height:1200},s.navigationTimeoutMs||=3e4,s.assetDownloadConcurrency=Number(s.assetDownloadConcurrency)>0?Number(s.assetDownloadConcurrency):s.concurrency,s.rewriteConcurrency=Number(s.rewriteConcurrency)>0?Number(s.rewriteConcurrency):s.assetDownloadConcurrency,s.wpsuite=me(s.wpsuite),s.scheduler=Ue(void 0),s.deploymentProfiles={},s.defaultDeploymentProfile="",s.deploymentTargetOverride=String(s.deploymentTargetOverride??"").trim();let n=Dt(s,await It(s)),i=Ft(),u=i?m.resolve(i,".."):"";return u?(n.outputDir=Ee(u,n.outputDir,"export"),n.logDir=Ee(u,n.logDir,"logs")):(m.isAbsolute(n.outputDir)||(n.outputDir=ge(n.outputDir,"export")),m.isAbsolute(n.logDir)||(n.logDir=ge(n.logDir,"logs"))),n}function fe(e,t=10){return Ot.createHash("sha1").update(e).digest("hex").slice(0,t)}async function we(e){await S.mkdir(m.dirname(e),{recursive:true});}function q(e){return [".html",".htm",".css",".js",".mjs",".json",".xml",".xsl",".txt",".svg",".map",".enc",".jws"].includes(m.extname(e).toLowerCase())}function j(e){return e.replace(/"/g,'"').replace(/"/g,'"').replace(/'/g,"'").replace(/'/g,"'").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function W(e){return e.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">")}function re(e){return e.replace(/\//g,"\\/")}function Qe(e){return e.replace(/\//g,"\\\\/")}function se(e,t,r){if(!t)return;e[t]=r;let s=re(t),n=re(r);e[s]=n;let i=Qe(t),u=Qe(r);e[i]=u;let l=W(t),a=W(r);e[l]=a;let o=W(s),c=W(n);e[o]=c;let p=W(i),d=W(u);e[p]=d;}function Pe(e,t){let r=t.startsWith("/")?t:`/${t}`,s=(e||"").replace(/\/$/,"");return !s||s==="."||s==="/"?r:`${s}${r}`}function Ne(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function qe(e,t,r){if(!t)return r;let s=m.dirname(m.resolve(t)),n=m.resolve(e,r.replace(/^\/+/,"")),i=m.relative(s,n).replace(/\\/g,"/");return i?(i.startsWith(".")||(i=`./${i}`),i):"."}var Qt=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],Nt=new Set([".html",".htm"]),_e="WPSuite.io Static Publisher",qt=_e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function Wt(e,t,r){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let n=m.extname(r).toLowerCase();return Nt.has(n)?/<head\b|<html\b|<!doctype html/i.test(t):false}function _t(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 s=e.includes(`\r
|
|
2
2
|
`)?`\r
|
|
3
3
|
`:`
|
|
4
|
-
`;return e.replace(/<head\b[^>]*>/i,n=>`${n}${
|
|
5
|
-
`,"utf8");}function
|
|
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"),d.progress("Asset download phase started.",{phase:"download-assets",doneAssets:c.doneAssets.size,assetsQueued:c.stats.assetsQueued,assetQueue:c.assetQueue.length}),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);});
|
|
4
|
+
`;return e.replace(/<head\b[^>]*>/i,n=>`${n}${s} ${t}`)}function Bt(e){let t=j(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function Ht(e,t){let r=[...new Set(t)].filter(i=>i.includes("/")&&!/\\+\//.test(i)).map(i=>[i,re(i)]).filter(([i,u])=>i!==u).sort((i,u)=>u[0].length-i[0].length);if(!r.length)return e;let s=i=>{let u=i;for(let[l,a]of r)u=u.split(l).join(a);return u},n=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(i,u,l,a)=>`${u}${s(l)}${a}`);return n=n.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(i,u,l,a,o)=>Bt(a)?`${u}${s(a)}${o}`:i),n}function zt(e,t){if(!t)return null;let r=m.dirname(m.resolve(t)),s=m.resolve(e.outputDir),n=m.relative(r,s).replace(/\\/g,"/");return n?(n.startsWith(".")||(n=`./${n}`),n.endsWith("/")?n:`${n}/`):"./"}function Jt(e,t,r){let s=zt(t,r);if(!s)return e;let n=e;for(let i of Qt){let u=i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),l=new RegExp(`(?:\\.{1,}/)+${u}`,"g"),a=new RegExp(`(?<!\\.)/${u}`,"g");n=n.replace(l,`${s}${i}`).replace(a,`${s}${i}`);let o=i.replace(/\//g,"\\/"),c=s.replace(/\//g,"\\/"),p=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),d=new RegExp(`(?:\\.{1,}\\\\/)+${p}`,"g"),g=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${p}`,"g"),h=new RegExp(`(?<![\\.\\\\])\\/${p}`,"g");n=n.replace(d,`${c}${o}`).replace(g,`${c}${o}`).replace(h,`${c}${o}`);}return n}function be(e,t,r){if(e.urlRewriteMode==="absolute")return t;let s=(()=>{try{return new URL(t,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin)}catch{return null}})(),n=s?s.pathname:Ne(t,e.targetOrigin),i=s?`${s.search}${s.hash}`:"";return e.urlRewriteMode==="root-relative"?`${n}${i}`:`${qe(e.outputDir,r,n)}${i}`}function Se(e,t,r,s,n){se(e,r,be(t,s,n));}function Vt(e,t,r,s,n){if(!r||r===s)return;se(e,r,s);let i=be(t,r,n),u=be(t,s,n);se(e,i,u);}function ye(e,t,r,s,n={}){let i=e,u={};Se(u,t,t.sourceOrigin,t.targetOrigin,s);for(let[a,o]of Object.entries(t.extraReplacements))Se(u,t,a,o,s);for(let[a,o]of Object.entries(r))Se(u,t,a,o,s);for(let[a,o]of Object.entries(n)){let c=r[a];!c||c===o||Vt(u,t,o,c,s);}let l=Object.entries(u).sort((a,o)=>o[0].length-a[0].length);for(let[a,o]of l)i=i.split(a).join(o);return t.urlRewriteMode!=="absolute"&&(i=Jt(i,t,s)),i=Ht(i,l.map(([,a])=>a)),Wt(t,i,s)&&(i=_t(i)),i}async function Gt(e,t,r,s){let n=m.join(e.outputDir,s),i=m.extname(n).toLowerCase(),u;try{u=await S.readFile(n,"utf8");}catch(o){if(o.code!=="ENOENT")throw o;return {changed:false}}let a=ye(u,e,t,i===".js"||i===".mjs"?void 0:n,r);return a!==u?(await S.writeFile(n,a,"utf8"),{changed:true}):{changed:false}}async function Kt(e,t){return await new Promise((r,s)=>{let n=a=>{if(l(),a?.error){s(new Error(a.error));return}r({changed:!!a?.changed});},i=a=>{l(),s(a);},u=a=>{l(),a!==0&&s(new Error(`Rewrite worker exited with code ${a}.`));},l=()=>{e.off("message",n),e.off("error",i),e.off("exit",u);};e.on("message",n),e.on("error",i),e.on("exit",u),e.postMessage({file:t});})}async function Be(e,t,r={}){let n=(r.files?[...new Set(r.files)].map(d=>m.resolve(d)).filter(d=>d.startsWith(m.resolve(e.outputDir))).map(d=>m.relative(e.outputDir,d).replace(/\\/g,"/")).filter(d=>d.length>0):await $t(["**/*"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(d=>d!=="asset-map.json"&&q(d)),i=0;if(n.length===0)return 0;let u=Math.max(1,Number(e.rewriteConcurrency||e.assetDownloadConcurrency||1)),l=Math.max(1,Math.min(u,n.length,availableParallelism()));await r.onStart?.({totalFiles:n.length,workerCount:l});let a=0,o=0,c=null;if(l===1){for(let d of n){let g=await Gt(e,t,r.previousAssetMap??{},d);g.changed&&(i+=1),o+=1,await r.onProgress?.({index:o,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:r.previousAssetMap??{}}});try{for(;!c;){let g=a;if(g>=n.length)return;a+=1;let h=n[g],f=await Kt(d,h);f.changed&&(i+=1),o+=1,await r.onProgress?.({index:o,totalFiles:n.length,changedTextFiles:i,file:h,changed:f.changed});}}catch(g){throw c=g instanceof Error?g:new Error(String(g)),c}finally{await d.terminate().catch(()=>{});}});return await Promise.all(p),i}var U={error:0,warn:1,info:2,debug:3},He=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",ne=He?m.join(He,"current-progress.json"):"",ze=Promise.resolve();function Je(e){return e.includes("crawl")?"crawl":e.includes("deploy")?"deploy":e.includes("invalidate")?"invalidate":e}function Yt(e,t){let r={...e},s=new Set(["pagesQueued","pagesRendered","assetsQueued","sitemapsQueued","pagesDiscovered","assetsDiscovered","sitemapsDiscovered","pagesSaved","assetsSaved","donePages","doneAssets","doneSitemaps","changedTextFiles","uploaded","failed","index","totalFiles","pageQueue","assetQueue","sitemapQueue"]);for(let[n,i]of Object.entries(t)){let u=r[n];if(typeof u=="number"&&typeof i=="number"&&s.has(n)){r[n]=Math.max(u,i);continue}r[n]=i;}return r}function Xt(e,t,r){ne&&(ze=ze.then(async()=>{let s=new Date,n=s.toISOString();await S.mkdir(m.dirname(ne),{recursive:true});let i=await S.readFile(ne,"utf8").then(f=>JSON.parse(f)).catch(()=>null),u=i&&typeof i.details=="object"&&i.details?i.details:{},l=Je(e),a=i?.currentStep||Je(i?.source||""),o=i?.startedAt||n,c={...i?.stepDurationsSec??{}},p=i?.stepStartedAt||n;if(a&&a!==l&&i?.stepStartedAt){let f=Math.max(0,Math.round((s.getTime()-new Date(i.stepStartedAt).getTime())/1e3));c[a]=(c[a]??0)+f,p=n;}let d=Math.max(0,Math.round((s.getTime()-new Date(p).getTime())/1e3)),g=Math.max(0,Math.round((s.getTime()-new Date(o).getTime())/1e3)),h={checkedAt:n,source:e,message:t,details:Yt(u,r??{}),startedAt:o,currentStep:l,stepStartedAt:p,stepElapsedSec:d,totalElapsedSec:g,stepDurationsSec:c};await S.writeFile(ne,JSON.stringify(h,null,2),"utf8");}).catch(()=>{}));}async function Zt(e,t){await S.mkdir(m.dirname(e),{recursive:true}),await S.appendFile(e,`${JSON.stringify(t)}
|
|
5
|
+
`,"utf8");}function er(e,t){let r=typeof t?.phase=="string"?t.phase.trim():"";return r||(e==="page"?"render-pages":e==="asset"?"download-assets":e==="sitemap"?"discovery":e==="timing"&&typeof t?.name=="string"&&t.name.trim()||"crawl")}function tr(e,t,r){return {checkedAt:new Date().toISOString(),currentStep:er(e,r),level:e,message:t,details:r??{}}}var V=class{constructor(t,r="info"){this.logDir=t;this.level=typeof r=="boolean"?r?"debug":"info":r,this.ensureLogFileReady();}logDir;startedAt=Date.now();marks=new Map;initPromise=null;writeQueue=Promise.resolve();writeError=null;level;get logPath(){return m.join(this.logDir,"crawl.log.jsonl")}get currentEventPath(){return m.join(this.logDir,"current-crawl-event.json")}get rejectedPath(){return m.join(this.logDir,"rejected.jsonl")}get ignoredPath(){return m.join(this.logDir,"ignored.jsonl")}get skippedPath(){return m.join(this.logDir,"skipped-http.jsonl")}get errorsPath(){return m.join(this.logDir,"errors.jsonl")}get timingsPath(){return m.join(this.logDir,"timings.jsonl")}ensureLogFileReady(){return this.initPromise||(this.initPromise=(async()=>{await S.mkdir(this.logDir,{recursive:true}),await S.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 S.appendFile(this.logPath,`${t}
|
|
6
|
+
`,"utf8");});}enqueueJsonLine(t,r){this.enqueueTask(()=>Zt(t,r));}updateCurrentEvent(t,r,s){let n=tr(t,r,s);this.enqueueTask(async()=>{await S.mkdir(this.logDir,{recursive:true}),await S.writeFile(this.currentEventPath,JSON.stringify(n,null,2),"utf8");});}push(t,r,s){let n=JSON.stringify({time:new Date().toISOString(),level:t,message:r,...s||{}});this.enqueueLine(n),this.updateCurrentEvent(t,r,s),t==="error"?console.error(r,s||""):t==="warn"?console.warn(r,s||""):(U[this.level]>=U.debug||["summary","page","sitemap","asset","timing"].includes(t))&&console.log(r);}info(t,r){this.push("info",t,r);}debug(t,r){U[this.level]<U.debug||this.push("debug",t,r);}progress(t,r){Xt("crawl.log.jsonl",t,r),this.updateCurrentEvent("progress",t,r);}checkpoint(t,r){this.updateCurrentEvent("checkpoint",t,r);}page(t,r){this.push("page",t,r);}sitemap(t,r){this.push("sitemap",t,r);}asset(t,r){this.push("asset",t,r);}warn(t,r){this.push("warn",t,r);}error(t,r){this.enqueueJsonLine(this.errorsPath,{message:t,...r||{}}),this.push("error",t,r);}summary(t,r){this.push("summary",t,r);}mark(t){this.marks.set(t,Date.now());}endMark(t,r){let s=this.marks.get(t);if(!s)return;let n=Date.now()-s,i={name:t,ms:n,seconds:Number((n/1e3).toFixed(2)),...r||{}};this.enqueueJsonLine(this.timingsPath,i),this.push("timing",`Timing ${t}: ${i.seconds}s`,i);}reject(t,r,s,n){let i={kind:t,url:r,reason:s,source:n};this.enqueueJsonLine(this.rejectedPath,i),U[this.level]>=U.debug&&this.push("reject",`Rejected ${t} ${r}: ${s}`,i);}ignore(t,r,s,n){let i={kind:t,url:r,reason:s,source:n};this.enqueueJsonLine(this.ignoredPath,i),U[this.level]>=U.debug&&this.push("ignore",`Ignored ${t} ${r}: ${s}`,i);}skip(t,r,s,n){let i={kind:t,url:r,status:s,source:n};this.enqueueJsonLine(this.skippedPath,i),this.push("warn",`Skipped ${t} ${r}: HTTP ${s}`,i);}async flush(){let t=Date.now()-this.startedAt,r={name:"total",ms:t,seconds:Number((t/1e3).toFixed(2))};if(this.enqueueJsonLine(this.timingsPath,r),await this.writeQueue,this.writeError)throw this.writeError}};var ir=["text/css","javascript","image/","font/","application/font","application/json","application/xml","text/xml","application/rss+xml","application/atom+xml","application/xslt+xml","text/xsl","image/svg+xml","application/octet-stream"],or=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"]),ar=new Set(["",".html",".htm"]),ur=new Set([".css",".xml",".xsl",".svg",".json",".html",".htm",".txt",".enc",".jws"]),lr=["/wp-content/","/wp-includes/","/wp-admin/","/static/","/assets/","/build/","/_next/"];function cr(e){let t=[],r="full",s="full",n=false,i=false;for(let u=0;u<e.length;u++){let l=e[u];if(l==="--retry-timeouts")r="retry-timeouts",n=true;else if(l==="--resume")n=true;else if(l==="--resume-rewrite")n=true,i=true;else if(l==="--crawl-mode"){let a=e[++u];if(!a)throw new Error("--crawl-mode requires a value");s=a==="incremental"?"incremental":"full",n||=s==="incremental";}else if(l.startsWith("--crawl-mode="))s=l.slice(13)==="incremental"?"incremental":"full",n||=s==="incremental";else if(l==="--incremental")s="incremental",n=true;else if(l==="--url"){let a=e[++u];if(!a)throw new Error("--url requires a value");r="single-url",n=true,t.push(a);}else if(l.startsWith("--url="))r="single-url",n=true,t.push(l.slice(6));else if(l==="--urls"){let a=e[++u];if(!a)throw new Error("--urls requires a file path");r="single-url",n=true,t.push(`@${a}`);}}return {mode:r,crawlMode:s,urls:t,preserveOutput:n,resumeRewrite:i}}function Te(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?m.resolve(e):""}function dr(){let e=Te();return e?m.resolve(e,".."):""}function pr(){let e=process.env.STATIC_PUBLISHER_WP_ROOT||process.env.WPSUITE_STATIC_PUBLISHER_WP_ROOT||"";return e.trim()?m.resolve(e):""}function gr(e){let t=e.trim(),r=[{alias:"@storage-root",root:dr(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@runtime",root:Te(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@wp-root",root:pr(),requiredEnv:"STATIC_PUBLISHER_WP_ROOT or WPSUITE_STATIC_PUBLISHER_WP_ROOT"}];for(let s of r){if(t!==s.alias&&!t.startsWith(`${s.alias}/`))continue;if(!s.root)return {resolvedPath:null,alias:s.alias,requiredEnv:s.requiredEnv};let n=t.slice(s.alias.length).replace(/^\/+/,"");return {resolvedPath:n?m.resolve(s.root,n):s.root,alias:s.alias}}return {resolvedPath:m.resolve(t)}}function it(e){let t=Te();return t?m.join(t,"crawl-manifest.json"):m.join(e.outputDir,".crawl-manifest.json")}function ot(){return {schemaVersion:2,updatedAt:"",pages:{},assets:{}}}function mr(){return {rewriteTargets:new Set,changedFiles:new Set,deletedFiles:new Set}}function Q(e,t,r){let s=te(t.outputDir,r);s&&(e.changedFiles.add(s),e.deletedFiles.delete(s));}function Ve(e,t,r){let s=te(t.outputDir,r);s&&(e.deletedFiles.add(s),e.changedFiles.delete(s));}function ae(e,t){e.rewriteTargets.add(m.resolve(t));}async function hr(e){try{let t=await S.readFile(it(e),"utf8"),r=JSON.parse(t);if(r&&typeof r=="object"&&r.pages&&typeof r.pages=="object"){if(r.schemaVersion===2&&r.assets&&typeof r.assets=="object")return r;if(r.schemaVersion===1)return {schemaVersion:2,updatedAt:String(r.updatedAt||""),pages:r.pages,assets:{}}}}catch{}return ot()}function Ge(e){return JSON.parse(JSON.stringify(e))}async function fr(e,t){let r=it(e);await S.mkdir(m.dirname(r),{recursive:true}),await S.writeFile(r,JSON.stringify(t,null,2),"utf8");}function ue(e){if(!e)return null;let t=e.trim();return t||null}function wr(e,t){let r=new Set,s=new Set([...Object.keys(e),...Object.keys(t)]);for(let n of s){let i=e[n],u=t[n];!i||!u||i===u||r.add(n);}return r}async function Pr(e,t,r,s){let n=[...new Set(r.map(l=>l.trim()).filter(Boolean))],i=String(e.wpsuite?.runtimeToken||"").trim();if(n.length===0||!i)return new Map;let u=new URL("/wp-json/smartcloud-static-publisher/v1/change-tokens",e.sourceOrigin).toString();try{let l=await t.post(u,{timeout:3e4,failOnStatusCode:!1,headers:{"content-type":"application/json","x-static-publisher-token":i},data:JSON.stringify({urls:n})});if(!l.ok())return s.warn(`Change token lookup failed with HTTP ${l.status()}`,{endpoint:u,status:l.status()}),new Map;let a=await l.json().catch(()=>null);if(!a||!Array.isArray(a.items))return new Map;let o=new Map;for(let c of a.items)!c||typeof c.url!="string"||o.set(c.url,c);return o}catch(l){return s.warn("Change token lookup failed; falling back to sitemap metadata",{endpoint:u,error:String(l)}),new Map}}async function ve(e,t,r,s,n){if(!r.enabled&&!r.trackManifest)return null;if(r.changeTokenCache.has(s))return r.changeTokenCache.get(s)??null;let u=(await Pr(e,t,[s],n)).get(s)??null;return r.changeTokenCache.set(s,u),u}async function Sr(e,t,r,s,n,i){if(dt(e,n))return {action:"render",changeToken:null};if(!s.enabled)return {action:"render",changeToken:s.trackManifest?await ve(e,t,s,n,i):null};let u=s.manifest.pages[n];if(!u)return {action:"render",changeToken:await ve(e,t,s,n,i)};let l=await ve(e,t,s,n,i);if(l?.supported&&l.token)return u.changeToken===l.token?{action:"reuse",changeToken:l}:{action:"render",changeToken:l};let a=ue(r.sitemapLastmodByPage[n]);return a&&u.sitemapLastmod&&u.sitemapLastmod===a?{action:"reuse",changeToken:l}:{action:"render",changeToken:l}}async function br(e,t,r,s,n){let i=Ke(r.previousManifest),u=0;for(let[d,g]of Object.entries(r.manifest.pages))if(!r.seenPages.has(d)){Ve(n,e,g.outputPath);try{await S.unlink(g.outputPath);}catch(h){(h.code||"")!=="ENOENT"&&s.warn(`Failed to remove stale incremental page output for ${d}`,{url:d,outputPath:g.outputPath,error:String(h)});}delete r.manifest.pages[d],u++;}let l=Ke(r.manifest,r.runId),a=new Set,o=new Set;for(let d of l){for(let f of G(e,d))a.add(f);let g=r.manifest.assets[d]?.outputPath;g&&o.add(g);let h=le(e,t.assetMap,d);h&&o.add(h);}for(let d of Object.keys(r.manifest.assets))l.has(d)||delete r.manifest.assets[d];let c=0,p=0;for(let d of i){let g=new Set,h=r.previousManifest.assets[d]?.outputPath;h&&g.add(h);let f=le(e,t.assetMap,d);if(!l.has(d)&&f)g.add(f);else if(!l.has(d)){let b=Me(e,d);g.add(b.originalFilePath),b.hashedFilePath&&g.add(b.hashedFilePath);}for(let b of g)if(!o.has(b)){Ve(n,e,b);try{await S.unlink(b),c++;}catch(w){(w.code||"")!=="ENOENT"&&s.warn(`Failed to remove stale incremental asset output for ${d}`,{url:d,outputPath:b,error:String(w)});}}for(let b of G(e,d))a.has(b)||Object.prototype.hasOwnProperty.call(t.assetMap,b)&&(delete t.assetMap[b],p++);}(u>0||c>0||p>0)&&s.info(`Incremental cleanup removed ${u} stale pages, ${c} stale assets, ${p} stale asset mappings`,{removedPages:u,removedAssets:c,removedAssetMappings:p,phase:"incremental-cleanup"});}function Ke(e,t){let r=new Set;for(let s of Object.values(e.pages))for(let n of s.discoveredAssets||[]){let i=n.trim();i&&r.add(i);}for(let[s,n]of Object.entries(e.assets||{})){if(t&&n.lastSeenRunId!==t)continue;let i=s.trim();i&&r.add(i);}return r}function Ye(e,t,r){for(let s of t)for(let n of G(e,s))if(r.has(n))return true;return false}function yr(e,t,r,s,n){let i=new Set(r.rewriteTargets),u=wr(s,n);if(u.size===0)return [...i];for(let l of Object.values(t.manifest.pages))Ye(e,l.discoveredAssets,u)&&i.add(m.resolve(l.outputPath));for(let[l,a]of Object.entries(t.manifest.assets)){a.isText&&Ye(e,a.discoveredAssets,u)&&i.add(m.resolve(a.outputPath));for(let o of G(e,l))if(u.has(o)){Q(r,e,a.outputPath),a.isText&&i.add(m.resolve(a.outputPath));break}}return [...i]}function G(e,t){let r=new Set([t]);try{let s=new URL(t),i=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{i.push(new URL(e.targetOrigin).origin);}catch{}for(let u of i)try{r.add(new URL(u).origin+s.pathname+s.search);}catch{}r.add(s.pathname+s.search),r.add(s.pathname);}catch{}return [...r]}function vr(e,t){let r=new Set([t]);try{let s=new URL(t),i=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{i.push(new URL(e.targetOrigin).origin);}catch{}for(let u of i)try{r.add(new URL(u).origin+s.pathname+s.search);}catch{}r.add(s.pathname+s.search);}catch{}return [...r]}function at(e,t){let r=e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/"?e.targetOrigin:"https://relative.invalid/";try{let s=new URL(t,r);return m.join(e.outputDir,decodeURIComponent(s.pathname))}catch{return null}}function Rr(e,t,r){for(let s of vr(e,r)){let n=t[s];if(!n)continue;let i=at(e,n);if(i)return {outputPath:i,publicUrl:n}}return null}function Cr(e,t,r){for(let s of G(e,r)){let n=t[s];if(!n)continue;let i=at(e,n);if(i)return i}return null}function le(e,t,r){let s=Cr(e,t,r);return s||Me(e,r).originalFilePath}function xr(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?m.join(m.resolve(e),"queue-runner-heartbeat.json"):""}async function Xe(e){let t=xr();if(t)try{let r=await S.readFile(t,"utf8"),s=JSON.parse(r);if(!s||typeof s!="object")return;await S.writeFile(t,JSON.stringify({...s,checkedAt:new Date().toISOString(),status:"running",currentStep:"rewrite",message:e},null,2),"utf8");}catch{}}function kr(e,t){let r=new Set;for(let s of t.donePages)r.add(m.resolve(H(e,s)));for(let s of t.doneAssets){let n=le(e,t.assetMap,s);!n||!q(n)||r.add(m.resolve(n));}return [...r]}var ce="re:",ie=new Map;function Tr(e){if(!e.startsWith(ce))return null;let t=ie.get(e);if(t!==void 0)return t||null;let r=e.slice(ce.length).trim();if(!r)return ie.set(e,false),null;try{let s=new RegExp(r);return ie.set(e,s),s}catch{return console.warn(`[crawl] Ignoring invalid path matcher regex: ${e}`),ie.set(e,false),null}}function Ae(e,t){let r=Tr(t);return r?r.test(e):t.startsWith(ce)?false:e.startsWith(t)}function Ar(e,t){return t.find(r=>Ae(e,r))}function ut(e,t){let r=Ar(t.pathname,e.blockedPathPrefixes);if(r)return r.startsWith(ce)?`blocked path regex: ${r}`:`blocked path prefix: ${r}`;let s=e.blockedSearchFragments.find(n=>t.search.includes(n));return s?`blocked search fragment: ${s}`:null}function Mr(e){let t=new URL(e.sourceOrigin),r=new Set([t.hostname,...e.allowedAssetHosts]);if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{r.add(new URL(e.targetOrigin).hostname);}catch{}for(let s of Object.keys(e.extraReplacements||{}))try{r.add(new URL(s).hostname);}catch{}return r}function Lr(e,t){return Mr(e).has(t.hostname)}function Ir(e){let t=j(e.trim()).replace(/\\\//g,"/").replace(/^['"]|['"]$/g,"").trim();return t=t.replace(/[)]+$/g,"").trim(),t=t.replace(/;.*$/g,"").trim(),t}function lt(e){let t=j(e).replace(/\\\//g,"/");return /[{}]|\bwindow\.|\blocation\.|\bincludes\(|\?\?null|\+|%7B|%7D|%22|<|>|\s/.test(t)}function K(e){return lr.some(t=>e.pathname.startsWith(t))}function k(e,t,r=e.sourceOrigin,s,n="url"){let i=Ir(t);if(!i||i.startsWith("data:")||i.startsWith("blob:")||i.startsWith("mailto:")||i.startsWith("tel:")||i.startsWith("#"))return s?.ignore(n,t,"empty or unsupported scheme",r),null;if(lt(i))return s?.ignore(n,t,"looks like JavaScript/code fragment",r),null;try{let u=new URL(i,r);if(!["http:","https:"].includes(u.protocol))return s?.ignore(n,t,"unsupported protocol: ",r),null;if(!Lr(e,u))return s?.ignore(n,u.toString(),"host not allowed",r),null;let l=ut(e,u);if(l)return s?.reject(n,u.toString(),l,r),null;let a=new URL(e.sourceOrigin);return u.protocol=a.protocol,u.host=a.host,u.hash="",u}catch{return s?.reject(n,t,"invalid URL",r),null}}function ct(e){return or.has(m.extname(e.pathname).toLowerCase())}function z(e){return K(e)?false:ar.has(m.extname(e.pathname).toLowerCase())}function Z(e){let t=e.pathname.toLowerCase();return t.endsWith(".xml")&&(t.includes("sitemap")||t.endsWith("/sitemap.xml"))}function x(e,t){return Z(t)||t.pathname==="/robots.txt"||t.pathname==="/llms.txt"||t.pathname.toLowerCase().endsWith(".xsl")?true:ct(t)?e.assetPathPrefixes.length===0?true:e.assetPathPrefixes.some(r=>Ae(t.pathname,r)):false}function H(e,t){let r=new URL(t),s=decodeURIComponent(r.pathname);return s.endsWith("/")?s+="index.html":m.extname(s)||(s+="/index.html"),m.join(e.outputDir,s)}function Dr(e){if(!e.generated404RequestPath)return null;try{return new URL(e.generated404RequestPath,e.sourceOrigin).toString()}catch{return null}}function dt(e,t){let r=Dr(e);if(!r)return false;try{return new URL(t,e.sourceOrigin).toString()===r}catch{return false}}function Me(e,t){let r=new URL(t),s=decodeURIComponent(r.pathname);s.endsWith("/")&&(s+="index.html");let n=!!r.search,i=s,u=m.join(e.outputDir,i),l=Pe(e.targetOrigin,i),a=`${l}${r.search}`;if(!n)return {originalPathname:i,originalFilePath:u,originalPublicUrl:l,originalPublicUrlWithSearch:a,preferQueryHashed:n};let o=m.extname(s),p=`${o?s.slice(0,-o.length):s}.${fe(r.search)}${o||".bin"}`;return {originalPathname:i,originalFilePath:u,originalPublicUrl:l,originalPublicUrlWithSearch:a,preferQueryHashed:n,hashedPathname:p,hashedFilePath:m.join(e.outputDir,p),hashedPublicUrl:Pe(e.targetOrigin,p)}}function Fr(e,t,r,s,n){t[r]=s;try{let i=new URL(r),l=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{l.push(new URL(e.targetOrigin).origin);}catch{}for(let a of l)try{let o=new URL(a);t[o.origin+i.pathname+i.search]=s;}catch{}try{let a=(()=>{let o=new URL(s,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin);return `${o.pathname}${o.search}`})();t[i.pathname+i.search]=a;}catch{}try{let a=new URL(s,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[i.pathname]=a;}catch{}try{let a=new URL(n,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[i.pathname]=a;}catch{}}catch{}}async function pt(e){try{return await S.readFile(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}async function gt(e){try{return await S.stat(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}function Or(e){let t=String(e["content-length"]||"").trim();if(!t)return null;let r=Number.parseInt(t,10);return Number.isFinite(r)&&r>=0?r:null}function mt(e){let t=String(e["last-modified"]||"").trim();if(!t)return null;let r=Date.parse(t);return Number.isFinite(r)?r:null}function Er(e,t){let r=mt(t),s=Or(t),n=e?.mtime.getTime();return r!==null&&Math.abs((n??0)-r)>=1e3||s!==null&&e?.size!==s?false:r!==null||s!==null}async function $r(e,t){if(!t)return;let r=mt(t);if(r===null)return;let s=await gt(e);if(!s)return;let n=new Date(r);await S.utimes(e,s.atime,n).catch(()=>{});}function Re(e,t){let r=m.extname(e.pathname).toLowerCase(),s=t["content-type"]||"";return ur.has(r)||ir.some(n=>s.includes(n))&&!s.startsWith("image/")&&!s.includes("font")}function Ce(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 jr(e){return fe(e.toString("base64"),40)}function Ur(e,t,r){let s=e.assetVariantDigestsByOriginalPath.get(t);if(!s||s.size===0)return false;for(let n of s)if(n!==r)return true;return false}function Qr(e,t,r){let s=e.assetVariantDigestsByOriginalPath.get(t);s||(s=new Set,e.assetVariantDigestsByOriginalPath.set(t,s)),s.add(r);}async function ke(e,t,r,s,n,i,u){let l=Me(e,r),a=jr(s),o=l.originalFilePath,c=l.originalPublicUrlWithSearch;if(l.preferQueryHashed&&l.hashedFilePath&&l.hashedPublicUrl&&Ur(n,l.originalFilePath,a)){let h=Rr(e,t,r);h?(o=h.outputPath,c=h.publicUrl):(o=l.hashedFilePath,c=l.hashedPublicUrl);}Fr(e,t,r,c,l.originalPublicUrl);let p=q(o)?Buffer.from(ye(s.toString("utf8"),e,t,o),"utf8"):s,d=await pt(o),g=false;return (d===null||!d.equals(p))&&(await we(o),await S.writeFile(o,p),g=true),Qr(n,l.originalFilePath,a),await $r(o,u),n.stats.assetsSaved++,i&&(n.stats.assetsSaved%50===0||n.stats.assetsSaved===1)&&i.progress(`Asset progress: saved ${n.stats.assetsSaved}, discovered ${n.stats.assetsQueued}, pending ${n.assetQueue.length}.`,{assetsSaved:n.stats.assetsSaved,assetsQueued:n.stats.assetsQueued,assetQueue:n.assetQueue.length,phase:"download-assets"}),{outputPath:o,publicUrl:c,wroteFile:g}}function Y(e,t,r,s,n){let i=()=>{let o=String(n??"").trim();if(!o)return {discoveredFrom:"",discoveredFromType:"unknown"};if(o==="seed-path"||o==="cli"||o==="generated-404-request-path")return {discoveredFrom:o,discoveredFromType:o};if(/^https?:\/\//i.test(o))try{let c=new URL(o);return Z(c)?{discoveredFrom:o,discoveredFromType:"sitemap"}:x(e,c)?{discoveredFrom:o,discoveredFromType:"asset"}:z(c)&&!K(c)?{discoveredFrom:o,discoveredFromType:"page"}:{discoveredFrom:o,discoveredFromType:"url"}}catch{return {discoveredFrom:o,discoveredFromType:"url"}}return {discoveredFrom:o,discoveredFromType:"url"}},u=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,l=k(e,r,u,s,"page");if(!l)return;if(!z(l)||ct(l)){if(x(e,l)){s.info(`Seeded/non-page URL queued as asset: ${l.toString()}`,{url:l.toString(),source:n}),T(e,t,l.toString(),s,n);return}s.reject("page",l.toString(),K(l)?"asset/internal path cannot be page":"not page-like",n);return}let a=l.toString();if(!t.donePages.has(a)&&!t.queuedPages.has(a)){let{discoveredFrom:o,discoveredFromType:c}=i();t.queuedPages.add(a),t.pageQueue.push(a),t.stats.pagesQueued++,s.debug(`Queued discovered page ${a}`,{phase:"discovery",url:a,discoveredFrom:o,discoveredFromType:c,outputPath:H(e,a)}),(t.stats.pagesQueued%25===0||t.stats.pagesQueued===1)&&s.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,pageQueue:t.pageQueue.length,phase:"discovery"});}}function T(e,t,r,s,n){let i=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,u=k(e,r,i,s,"asset");if(!u)return;if(!x(e,u)){s.reject("asset",u.toString(),"not a safe asset path/prefix",n);return}let l=u.toString();!t.doneAssets.has(l)&&!t.queuedAssets.has(l)&&(t.queuedAssets.add(l),t.assetQueue.push(l),t.stats.assetsQueued++,(t.stats.assetsQueued%100===0||t.stats.assetsQueued===1)&&s.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,assetQueue:t.assetQueue.length,phase:"discovery"}));}function Le(e,t,r,s,n){let i=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,u=k(e,r,i,s,"sitemap");if(!u)return;if(!Z(u)){s.reject("sitemap",u.toString(),"not sitemap-like",n);return}let l=u.toString();!t.doneSitemaps.has(l)&&!t.queuedSitemaps.has(l)&&(t.queuedSitemaps.add(l),t.sitemapQueue.push(l),t.stats.sitemapsQueued++,(t.stats.sitemapsQueued%10===0||t.stats.sitemapsQueued===1)&&s.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,sitemapQueue:t.sitemapQueue.length,phase:"discovery"}));}function Nr(e){let t=j(e),r=[...t.matchAll(/<url>\s*([\s\S]*?)\s*<\/url>/gi)].map(s=>s[1]);return r.length>0?r.map(s=>{let n=s.match(/<loc>\s*([^<]+?)\s*<\/loc>/i);if(!n?.[1])return null;let i=s.match(/<lastmod>\s*([^<]+?)\s*<\/lastmod>/i);return {loc:n[1].trim(),lastmod:ue(i?.[1]??null)}}).filter(s=>!!s):[...t.matchAll(/<loc>\s*([^<]+?)\s*<\/loc>/gi)].map(s=>({loc:s[1].trim(),lastmod:null})).filter(s=>s.loc)}function qr(e){return e.split(",").map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function Wr(e){let t=[],r=/url\(\s*(?:"([^"]+)"|'([^']+)'|([^)]*?))\s*\)/gi;for(let s of e.matchAll(r)){let n=(s[1]||s[2]||s[3]||"").trim();n&&t.push(n);}return t}function xe(e){return e.trim().replace(/\\/g,"/").replace(/^https?:\/\/[^/]+/i,"").replace(/^\/+/,"")}async function ht(e,t){let r=[];await S.mkdir(t,{recursive:true});let s=await S.readdir(e,{withFileTypes:true});for(let n of s){let i=m.join(e,n.name),u=m.join(t,n.name);if(n.isDirectory()){r.push(...await ht(i,u));continue}await S.copyFile(i,u),r.push(u);}return r}async function _r(e,t){let r=Object.entries(e.postCrawlCopyMap||{}).map(([i,u])=>({sourcePath:i.trim(),prefix:String(u||"").trim()}));if(r.length===0)return [];let s=0,n=[];t.mark("copy-extra-paths");for(let i of r){let u=i.sourcePath,l=i.prefix;if(!u||!l){t.warn("Skipped post-crawl copy mapping with empty key/value",{sourcePath:u,prefixPath:l});continue}let a=gr(u);if(!a.resolvedPath){t.warn("Skipped post-crawl copy source because alias root is not configured",{sourcePath:u,alias:a.alias||"",requiredEnv:a.requiredEnv||"",prefixPath:l});continue}let o=a.resolvedPath,c=xe(l);if(!c){t.warn("Skipped post-crawl copy mapping with invalid export prefix",{sourcePath:u,prefixPath:l});continue}let p;try{p=await S.stat(o);}catch{t.warn("Skipped post-crawl copy source because it does not exist",{sourcePath:u,sourceAbs:o,prefixPath:l});continue}let d=m.resolve(e.outputDir,c);if(p.isDirectory()){n.push(...await ht(o,d)),s++,t.progress(`Copied static directory to export: ${o} -> /${c}`,{phase:"copy-extra-paths",sourcePath:o,targetPath:`/${c}`,copiedItems:s});continue}let g=m.basename(o),h=l.endsWith("/")?m.join(d,g):d;await S.mkdir(m.dirname(h),{recursive:true}),await S.copyFile(o,h),n.push(h),s++,t.progress(`Copied static file to export: ${o} -> /${xe(l.endsWith("/")?`${l}${g}`:l)}`,{phase:"copy-extra-paths",sourcePath:o,targetPath:`/${xe(l.endsWith("/")?`${l}${g}`:l)}`,copiedItems:s});}return t.endMark("copy-extra-paths",{mappedSources:r.length,copiedItems:s}),n}function X(e,t,r,s,n){let i=new Set,u=j(r).replace(/\\\//g,"/");for(let o of Wr(u)){let c=k(e,o,t,s,`${n}:css-url`);c&&x(e,c)&&i.add(c.toString());}for(let o of u.matchAll(/@import\s+(?:url\()?\s*['"]?([^'"\s;]+)['"]?\s*\)?/gi)){let c=k(e,o[1],t,s,`${n}:css-import`);c&&x(e,c)&&i.add(c.toString());}for(let o of u.matchAll(/<\?xml-stylesheet[^>]+href=["']([^"']+)["'][^>]*\?>/gi)){let c=k(e,o[1],t,s,`${n}:xml-stylesheet`);c&&x(e,c)&&i.add(c.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 o of u.matchAll(a)){let c=o[0].startsWith("//")?`${new URL(e.sourceOrigin).protocol}${o[0]}`:o[0];if(lt(c)){s.ignore(`${n}:serialized-url`,c,"looks like JavaScript/code fragment",t);continue}let p=k(e,c,t,s,`${n}:serialized-url`);p&&x(e,p)?i.add(p.toString()):p&&s.ignore("asset",p.toString(),"serialized URL did not pass safe asset path filter",t);}return [...i]}function Br(e,t,r,s){let n=new Set,i=j(r);for(let u of i.matchAll(/href=["']([^"'#\s][^"']*?)["']/gi)){let l=u[1],a=k(e,l,t,s,"page-link");a&&(ut(e,a)||z(a)&&!K(a)&&!x(e,a)&&n.add(a.toString()));}return [...n]}async function Ze(e,t,r,s){for(;r.sitemapQueue.length>0;){let n=r.sitemapQueue.shift();if(r.queuedSitemaps.delete(n),!r.doneSitemaps.has(n)){r.doneSitemaps.add(n),s.sitemap(`Fetching sitemap ${n}`,{url:n});try{let i=await t.get(n,{timeout:6e4});if(!i.ok()){s.skip("sitemap",n,i.status());continue}let u=await i.body(),l=i.url()||n;await ke(e,r.assetMap,l,u,r,s);let a=u.toString("utf8");for(let o of X(e,l,a,s,"sitemap"))T(e,r,o,s,l);for(let o of Nr(a)){let c=k(e,o.loc,l,s,"sitemap-loc");c&&(Z(c)?Le(e,r,c.toString(),s,l):x(e,c)?T(e,r,c.toString(),s,l):z(c)?(o.lastmod&&(r.sitemapLastmodByPage[c.toString()]=o.lastmod),Y(e,r,c.toString(),s,l)):s.reject("sitemap-loc",c.toString(),"not page/sitemap/asset-like",l));}}catch(i){s.error(`Failed sitemap ${n}`,{url:n,error:String(i)});}}}}async function Hr(e,t,r,s,n,i,u){let l=k(e,s,e.sourceOrigin,n,"asset-fetch");if(!l||!x(e,l))return;let a=l.toString();if(r.doneAssets.has(a))return;let o=i.enabled?i.previousManifest.assets[a]:void 0,c=(p,d={})=>{if(!o)return false;i.manifest.assets[a]={...o,discoveredAssets:[...o.discoveredAssets||[]],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId},r.doneAssets.add(a);for(let g of o.discoveredAssets||[])T(e,r,g,n,a);return n.warn(`Keeping previous incremental asset ${a} after fetch issue.`,{url:a,reason:p,preservedFromPreviousManifest:true,...d,phase:"download-assets"}),Ce(r,n),true};n.asset(`Fetching asset ${a}`,{url:a});try{let p=le(e,r.assetMap,a),d=p?await gt(p):null;if(p&&d)try{let v=await t.head(a,{timeout:6e4}),R=v.headers();if(v.ok()&&Er(d,R)){let N=await pt(p);if(N!==null){let I=v.url()||a,D=await ke(e,r.assetMap,I,N,r,n,R);D.wroteFile&&(Q(u,e,D.outputPath),q(D.outputPath)&&ae(u,D.outputPath)),r.doneAssets.add(a),n.info(`Reused existing asset ${a} based on response headers.`,{url:a,filePath:p,lastModified:R["last-modified"]||"",contentLength:R["content-length"]||"",phase:"download-assets"}),Ce(r,n);let F=Re(l,R),P=o?.discoveredAssets?[...o.discoveredAssets]:[];if(F||o?.isText){let C=N.toString("utf8"),J=X(e,I,C,n,"asset:cached");(J.length>0||!o)&&(P=J);for(let ee of P)T(e,r,ee,n,I);}i.trackManifest&&(i.manifest.assets[a]={url:a,outputPath:D.outputPath,isText:F||!!o?.isText,discoveredAssets:P,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId});return}}}catch{}let g=await t.get(a,{timeout:6e4});if(!g.ok()){if(c(`http-${g.status()}`,{status:g.status()}))return;n.skip("asset",a,g.status());return}let h=await g.body(),f=g.url()||a,b=g.headers(),w=await ke(e,r.assetMap,f,h,r,n,b);w.wroteFile&&(Q(u,e,w.outputPath),q(w.outputPath)&&ae(u,w.outputPath)),r.doneAssets.add(a),Ce(r,n);let y=[];if(Re(l,b)){let v=h.toString("utf8");y=X(e,f,v,n,`asset:${m.extname(l.pathname).toLowerCase()||b["content-type"]||"unknown"}`);for(let R of y)T(e,r,R,n,f);}i.trackManifest&&(i.manifest.assets[a]={url:a,outputPath:w.outputPath,isText:Re(l,b),discoveredAssets:y,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId});}catch(p){if(c("fetch-error",{error:String(p)}))return;n.error(`Failed asset ${a}`,{url:a,error:String(p)});}}async function zr(e,t,r,s,n,i){let u=Math.max(1,Number(e.assetDownloadConcurrency||e.concurrency||1)),l=Array.from({length:u},async()=>{for(;r.assetQueue.length>0;){let a=r.assetQueue.shift();a&&(r.queuedAssets.delete(a),await Hr(e,t,r,a,s,n,i));}});await Promise.all(l);}function Jr(e){let t=Math.ceil(e/1e3);return `${t} second${t===1?"":"s"}`}function B(e){return Math.max(6e4,e.navigationTimeoutMs*2,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+15e3)}function oe(e){return Math.max(15e3,Math.min(6e4,B(e)))}function Vr(e){return Math.max(15e3,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+1e4)}function Ie(e){return e.stats.pagesCompleted}function ft(e){let r=e.options?.browserProcess;return {pid:typeof r?.process?.pid=="number"?r.process.pid:null,kill:typeof r?.kill=="function"?r.kill.bind(r):null}}async function Gr(e,t,r){let s=ft(e);try{if(s.kill){await s.kill(),t.warn(`Force-killed crawl worker browser after ${r}`,{browserPid:s.pid,reason:r});return}if(s.pid!==null){process.kill(s.pid,"SIGKILL"),t.warn(`Sent SIGKILL to crawl worker browser after ${r}`,{browserPid:s.pid,reason:r});return}t.warn(`Could not resolve crawl worker browser PID after ${r}`,{reason:r});}catch(n){t.error(`Failed to force-kill crawl worker browser after ${r}`,{browserPid:s.pid,reason:r,error:String(n)});}}async function E(e,t,r){let s;try{return await Promise.race([r(),new Promise((n,i)=>{s=globalThis.setTimeout(()=>{i(new Error(`${e} timed out after ${Jr(t)}.`));},t);})])}finally{s!==void 0&&globalThis.clearTimeout(s);}}async function Kr(e,t){let r=Vr(e);await t.evaluate(async s=>{await new Promise(n=>{let i=0,u=700,l=Date.now(),a=()=>{window.clearInterval(o),window.scrollTo(0,0),n();},o=window.setInterval(()=>{if(Date.now()-l>=s.maxDurationMs){a();return}window.scrollBy(0,u),i+=u;let c=document.body?.scrollHeight||0,p=document.documentElement?.scrollHeight||0,d=Math.max(c,p);i>=d+window.innerHeight&&a();},120);});},{maxDurationMs:r});}async function Yr(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 Kr(e,t),await t.waitForTimeout(e.readiness.fallbackWaitMs);}async function Xr(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(r=>Ae(t,r))}async function es(e,t,r,s,n=true){let i=new Set;if(n){let l=await t.evaluate(()=>{let a=new Set,o=["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 h of o){let f=d.getAttribute(h);f&&a.add(f);}for(let h of p){let f=d.getAttribute(h);f&&f.split(",").forEach(b=>{let w=b.trim().split(/\s+/)[0];w&&a.add(w);});}let g=d.getAttribute("style");g&&c.add(g);}),{attrs:[...a],styles:[...c]}});for(let a of l.attrs)for(let o of qr(a)){let c=k(e,o,r,s,"dom-attr");c&&x(e,c)&&i.add(c.toString());}for(let a of l.styles)for(let o of X(e,r,a,s,"dom-style"))i.add(o);}let u=await t.content();for(let l of X(e,r,u,s,"page-html"))i.add(l);return [...i]}async function et(e,t,r,s,n){let i=H(e,t);await E(`save page ${t}`,B(e),async()=>{await we(i),await S.writeFile(i,r,"utf8");}),s.stats.pagesSaved++;let u=Math.min(s.stats.pagesQueued,Ie(s)+1);n&&(s.stats.pagesSaved%10===0||s.stats.pagesSaved===1)&&n.progress(`Page progress: processed ${u}, rendered ${s.stats.pagesRendered}, saved ${s.stats.pagesSaved}, discovered ${s.stats.pagesQueued}.`,{donePages:u,claimedPages:s.donePages.size,pagesRendered:s.stats.pagesRendered,pagesSaved:s.stats.pagesSaved,pagesQueued:s.stats.pagesQueued,pageQueue:s.pageQueue.length,phase:"save-pages"});}function ts(e){let t=Ie(e);return t%5===0||t===1||t===e.stats.pagesQueued}function rs(e,t){let r=Ie(e);t.progress(`Render progress: processed ${r}, rendered ${e.stats.pagesRendered}, saved ${e.stats.pagesSaved}, discovered ${e.stats.pagesQueued}.`,{donePages:r,claimedPages:e.donePages.size,pagesRendered:e.stats.pagesRendered,pagesSaved:e.stats.pagesSaved,pagesQueued:e.stats.pagesQueued,phase:"render-pages"});}async function ss(e){await e.addInitScript(()=>{Object.defineProperty(window,"__WPSUITE_STATIC_EXPORT__",{value:true,writable:false,configurable:true});let t=r=>{if(r==null||String(r)==="")return true;try{let s=new URL(String(r),window.location.href),n=new URL(window.location.href);return s.hash="",n.hash="",s.href===n.href}catch{return false}};try{let r=window.location.assign.bind(window.location),s=window.location.replace.bind(window.location),n=window.location.reload.bind(window.location);Object.defineProperty(window.location,"assign",{configurable:!0,value:i=>{if(t(i)){console.warn("[smartcloud-static-publisher] blocked same-page location.assign",i??"");return}return r(i)}}),Object.defineProperty(window.location,"replace",{configurable:!0,value:i=>{if(t(i)){console.warn("[smartcloud-static-publisher] blocked same-page location.replace",i??"");return}return s(i)}}),Object.defineProperty(window.location,"reload",{configurable:!0,value:()=>{console.warn("[smartcloud-static-publisher] blocked location.reload");}});}catch{}});}async function ns(e,t,r){let s=await e.newContext({viewport:t.viewport,userAgent:"WPSuiteStaticPublisher/0.8 Playwright SitemapOnly",ignoreHTTPSErrors:t.ignoreHttpsErrors,...r?{javaScriptEnabled:false}:{}});return r||await ss(s),s}async function is(e,t,r,s,n,i,u){let l=await chromium.launch({headless:true}),a=ft(l);a.pid!==null&&r.debug(`Launched crawl worker browser PID ${a.pid}`,{browserPid:a.pid});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 c=null,p=null;try{let d=new URL(o),g=dt(e,o),h=Zr(e,d.pathname);if(!z(d)||x(e,d)||K(d)){if(x(e,d)){r.info(`Worker redirected non-page URL to asset queue: ${o}`,{url:o,source:"worker-guard"}),T(e,t,o,r,"worker-guard");continue}r.reject("page",o,"guard rejected non-page URL before rendering","worker");continue}let f=await Sr(e,n,t,i,o,r);if(i.enabled&&s!=="single-url"){let P=i.manifest.pages[o];if(f.action==="reuse"&&P){for(let C of P.discoveredAssets)T(e,t,C,r,o);for(let C of P.discoveredPages)Y(e,t,C,r,o);P.lastSeenRunId=i.runId,P.sitemapLastmod=ue(t.sitemapLastmodByPage[o])??P.sitemapLastmod,f.changeToken?.supported&&(P.changeToken=f.changeToken.token,P.tokenSource=f.changeToken.tokenSource??P.tokenSource),r.info(`Incremental reuse skipped unchanged page ${o}`,{url:o,mode:"incremental",reason:f.changeToken?.supported===!0?"change-token-match":"sitemap-lastmod-match"});continue}}c=await ns(l,e,h),p=await c.newPage();let b=!1,w=new Set;await p.route("**/*",async P=>{let C=P.request();if(C.isNavigationRequest()&&C.frame()===p.mainFrame())try{let J=new URL(C.url()),ee=new URL(o);if(J.hash="",ee.hash="",J.href===ee.href){if(b){r.warn(`Blocked same-page navigation/reload for ${o}`,{url:o,requestUrl:C.url()}),await P.abort("aborted");return}b=!0;}}catch{}await P.continue();}),p.on("response",P=>{try{let C=k(e,P.url(),e.sourceOrigin,void 0,"network-response");C&&x(e,C)&&(w.add(C.toString()),T(e,t,C.toString(),r,o));}catch{}}),r.page(`Rendering ${o}`,{url:o});let y=null,v=null;try{if(y=await p.goto(o,{waitUntil:"domcontentloaded",timeout:e.navigationTimeoutMs}),y&&y.ok())try{v=await E(`read response body ${o}`,B(e),()=>y.text());}catch{v=null;}}catch(P){r.warn(`Navigation issue for ${o}; saving current DOM if available`,{url:o,error:String(P)});}if(g){let P=y?.status()??null;if(P!==404){r.error(`Generated 404 request path returned unexpected status for ${o}`,{url:o,expectedStatus:404,status:P,requestPath:e.generated404RequestPath});continue}r.info(`Capturing rendered 404 page for ${o}`,{url:o,status:P,outputPath:H(e,o)});}else if(y&&!y.ok()){r.skip("page",o,y.status()),await p.close();continue}h?(r.info(`Rendering without JS execution for ${o}`,{url:o,mode:"no-js"}),await Xr(e,p)):await Yr(e,p),t.stats.pagesRendered++;let R=await E(`extract rendered assets ${o}`,B(e),()=>es(e,p,o,r,!h));for(let P of R)T(e,t,P,r,o);let N=[...new Set([...R,...w])],I=v??await E(`capture rendered html ${o}`,B(e),()=>p.content()),D=s!=="single-url"&&!g?Br(e,o,I,r):[];if(s!=="single-url"&&!g)for(let P of D)Y(e,t,P,r,o);await et(e,o,I,t,r);let F=H(e,o);Q(u,e,F),ae(u,F),i.trackManifest&&(i.manifest.pages[o]={url:o,outputPath:F,changeToken:f.changeToken?.supported?f.changeToken.token:null,tokenSource:f.changeToken?.supported?f.changeToken.tokenSource??null:null,sitemapLastmod:ue(t.sitemapLastmodByPage[o])??null,discoveredPages:D,discoveredAssets:N,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId});}catch(d){try{let g=p?await E(`capture partial html ${o}`,B(e),()=>p.content()):"";if(g&&g.trim()){await et(e,o,g,t,r);let h=H(e,o);Q(u,e,h),ae(u,h),r.warn(`Saved partial DOM for ${o}`,{url:o,error:String(d)});}}catch(g){r.error(`Could not save partial DOM for ${o}`,{url:o,error:String(g)});}r.error(`Failed page ${o}`,{url:o,error:String(d)});}finally{t.stats.pagesCompleted++,ts(t)&&rs(t,r),p&&await E(`close page ${o}`,oe(e),()=>p.close()).catch(d=>{r.warn(`Timed out while closing page ${o}`,{url:o,browserPid:a.pid,error:String(d)});}),c&&await E(`close page context ${o}`,oe(e),()=>c.close()).catch(d=>{r.warn(`Timed out while closing page context for ${o}`,{url:o,browserPid:a.pid,error:String(d)});});}}}finally{await E("close worker browser",oe(e),()=>l.close()).catch(o=>(r.warn("Timed out while closing crawl worker browser",{browserPid:a.pid,error:String(o)}),Gr(l,r,"browser.close timeout")));}}async function os(e){try{let t=await S.readFile(e),s=(e.endsWith(".gz")?gunzipSync(t):t).toString("utf8").trim();if(!s)return [];try{let n=JSON.parse(s);if(Array.isArray(n))return n;if(n&&typeof n=="object")return [n]}catch{return s.split(/\r?\n/).map(n=>n.trim()).filter(Boolean).map(n=>{try{let i=JSON.parse(n);return i&&typeof i=="object"?i:null}catch{return null}}).filter(n=>n!==null)}return []}catch{return []}}function tt(e){let t=String(e||"").toLowerCase();return t.includes("timeout")||t.includes("timed out")||t.includes("navigation timeout")}function as(e){let t=String(e?.job?.command||"").trim(),r=String(e?.job?.crawlMode||"full").trim();return t!=="publish"&&t!=="crawl"?false:r!=="incremental"}function us(e){let t=[e?.archivedAt,e?.job?.endedAt,e?.job?.startedAt];for(let r of t){let s=Date.parse(String(r||""));if(Number.isFinite(s))return s}return 0}async function wt(e){try{let t=await S.readFile(e,"utf8"),r=JSON.parse(t);return r&&typeof r=="object"&&!Array.isArray(r)?r:null}catch{return null}}function rt(e){let t=String(e.originalFileName||"").toLowerCase();return t.endsWith("errors.jsonl")?0:t.endsWith("errors.json")?1:2}function ls(e,t){let r=Array.isArray(t?.artifacts)?t.artifacts.filter(s=>String(s?.role||"").trim()==="errors"&&String(s?.storedFileName||"").trim()!=="").sort((s,n)=>rt(s)-rt(n)).map(s=>m.join(e,String(s.storedFileName))):[];return [...new Set([...r,m.join(e,"errors.jsonl"),m.join(e,"errors.json"),m.join(e,"errors.jsonl.gz"),m.join(e,"errors.json.gz")])]}async function st(e){let t=await wt(m.join(e,"job.json"));for(let r of ls(e,t)){let s=await os(r);if(s.length>0)return s}return []}async function cs(e){let t=m.join(e.logDir,"archive"),r;try{r=await S.readdir(t);}catch{return ""}let s="",n=0;for(let i of r){let u=m.join(t,i);if(!(await S.stat(u).catch(()=>null))?.isDirectory())continue;let a=await wt(m.join(u,"job.json"));if(!as(a))continue;let o=us(a);o>=n&&(n=o,s=u);}return s}async function ds(e){let t=await cs(e),r=t!==""?await st(t):await st(e.logDir),s=new Set;for(let n of r)if(tt(n.error)||tt(n.message)){let i=n.url;typeof i=="string"&&i&&s.add(i);}return [...s]}async function ps(e){let t=[];for(let r of e)if(r.startsWith("@")){let s=r.slice(1),n=await S.readFile(s,"utf8");t.push(...n.split(/\r?\n/).map(i=>i.trim()).filter(i=>i&&!i.startsWith("#")));}else t.push(r);return t}async function gs(e){try{let t=await S.readFile(m.join(e.outputDir,"asset-map.json"),"utf8");return JSON.parse(t)}catch{return {}}}async function ms(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 S.mkdir(e,{recursive:true}),await Promise.all(t.map(async r=>{try{await S.unlink(m.join(e,r));}catch(s){if(s.code!=="ENOENT")throw s}}));}function nt(e,t,r,s,n){let i=k(e,r,e.sourceOrigin,s,"manual-url");i&&(Z(i)?Le(e,t,i.toString(),s,n):x(e,i)?T(e,t,i.toString(),s,n):z(i)?Y(e,t,i.toString(),s,n):s.reject("manual-url",i.toString(),"not page/sitemap/asset-like",n));}async function hs(){let e=await he(),t=cr(process.argv.slice(2));if(t.resumeRewrite&&t.mode!=="full")throw new Error("--resume-rewrite is only supported for full crawl/publish jobs.");let r=[];t.mode==="retry-timeouts"&&(r=await ds(e)),t.mode==="single-url"&&(r=await ps(t.urls));let s=t.crawlMode==="incremental"&&t.mode==="full",n=s&&typeof e.subscriptionType=="string"&&e.subscriptionType.trim()!=="",i=t.mode==="full"&&!t.resumeRewrite,u=t.mode!=="full"||t.resumeRewrite||n,l=u?await gs(e):{},a=n?await hr(e):ot(),o={enabled:n,trackManifest:i,manifest:Ge(a),previousManifest:Ge(a),runId:`${Date.now()}`,seenPages:new Set,changeTokenCache:new Map};await ms(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:{...l},assetVariantDigestsByOriginalPath:new Map,stats:{pagesQueued:0,pagesRendered:0,pagesCompleted:0,assetsQueued:0,sitemapsQueued:0,assetsSaved:0,pagesSaved:0}},p=mr();u||await S.rm(e.outputDir,{recursive:true,force:true}),await S.mkdir(e.outputDir,{recursive:true});let d=new V(e.logDir,e.logLevel);if(d.info("Resolved WPSuite publisher subscription state for crawl startup.",{phase:"startup",mode:t.mode,requestedMode:t.crawlMode,requestedIncremental:s,incrementalEnabled:n,configSubscriptionType:e.subscriptionType??null,wpsuiteSubscriptionType:e.wpsuite?.subscriptionType??null,subscriber:e.wpsuite?.siteSettings?.subscriber===true,hasAccountId:!!String(e.wpsuite?.siteSettings?.accountId??"").trim(),hasSiteId:!!String(e.wpsuite?.siteSettings?.siteId??"").trim(),hasUploadUrl:!!String(e.wpsuite?.uploadUrl??"").trim(),hasRuntimeToken:!!String(e.wpsuite?.runtimeToken??"").trim(),lastUpdate:e.wpsuite?.siteSettings?.lastUpdate??null,apiBase:e.wpsuite?.apiBase??null,uploadUrl:e.wpsuite?.uploadUrl??null}),s&&!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 w=await request.newContext({ignoreHTTPSErrors:e.ignoreHttpsErrors});try{if(d.mark("discovery"),t.mode==="full"?(e.sitemapPaths.forEach(v=>Le(e,c,v,d)),await Ze(e,w,c,d),e.seedPaths.forEach(v=>nt(e,c,v,d,"seed-path")),e.generated404RequestPath&&Y(e,c,e.generated404RequestPath,d,"generated-404-request-path")):(r.forEach(v=>nt(e,c,v,d,"cli")),await Ze(e,w,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 y=Array.from({length:Math.max(1,e.concurrency)},()=>is(e,c,d,t.mode,w,o,p));if(await Promise.all(y),d.endMark("render-pages",{pages:c.stats.pagesCompleted}),d.mark("download-assets"),d.progress("Asset download phase started.",{phase:"download-assets",doneAssets:c.doneAssets.size,assetsQueued:c.stats.assetsQueued,assetQueue:c.assetQueue.length}),await zr(e,w,c,d,o,p),d.endMark("download-assets",{assets:c.doneAssets.size}),o.enabled&&e.maxPages===0&&await br(e,c,o,d,p),t.mode==="full"){let v=await _r(e,d);for(let R of v)Q(p,e,R);}}finally{await E("dispose crawl request context",oe(e),()=>w.dispose()).catch(y=>{d.warn("Timed out while disposing crawl request context",{error:String(y)});});}}o.trackManifest&&(o.manifest.updatedAt=new Date().toISOString(),await fr(e,o.manifest)),await S.writeFile(m.join(e.outputDir,"asset-map.json"),JSON.stringify(c.assetMap,null,2),"utf8"),JSON.stringify(l,null,2)!==JSON.stringify(c.assetMap,null,2)&&Q(p,e,m.join(e.outputDir,"asset-map.json"));let g=t.mode==="single-url"?kr(e,c):o.enabled&&!t.resumeRewrite?yr(e,o,p,l,c.assetMap):void 0;d.mark("rewrite-text");let h=t.mode==="single-url"?`Rewriting text files touched by URL crawl: 0/${g?.length??0}`:"Rewriting text files...";d.progress(h,{phase:"rewrite-text",index:0,totalFiles:g?.length,changedTextFiles:0}),await Xe(h);let f=Date.now(),b=await Be(e,c.assetMap,{files:g,previousAssetMap:l,onProgress:async({index:w,totalFiles:y,changedTextFiles:v,file:R,changed:N})=>{N&&Q(p,e,m.join(e.outputDir,R)),d.checkpoint(`Rewriting text file ${w}/${y}`,{phase:"rewrite-text",index:w,totalFiles:y,changedTextFiles:v,file:R});let I=Date.now();if(!(w===1||w===y||I-f>=5e3))return;f=I;let F=`Rewriting text files: ${w}/${y}`;d.progress(F,{phase:"rewrite-text",index:w,totalFiles:y,changedTextFiles:v,file:R}),await Xe(F);}});d.endMark("rewrite-text",{changedTextFiles:b}),await Oe(e,{generatedAt:new Date().toISOString(),outputDir:m.resolve(e.outputDir),runMode:t.mode,crawlMode:t.crawlMode,fullSyncRequired:!(o.enabled&&!t.resumeRewrite),changedFiles:o.enabled&&!t.resumeRewrite?[...p.changedFiles].sort():[],deletedFiles:o.enabled&&!t.resumeRewrite?[...p.deletedFiles].sort():[],rewriteTargets:o.enabled&&!t.resumeRewrite?[...new Set((g||[]).map(w=>te(e.outputDir,m.isAbsolute(w)?w:m.join(e.outputDir,w))).filter(w=>w!==null))].sort():[]}),d.summary(t.resumeRewrite?`Done. Resumed final rewrite over existing output and changed ${b} 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.stats.pagesCompleted,claimedPages:c.donePages.size,doneSitemaps:c.doneSitemaps.size,doneAssets:c.doneAssets.size,changedTextFiles:b}),await d.flush();}hs().catch(async e=>{console.error(e);try{let r=(await he().catch(()=>null))?.logDir??"logs",s=new V(r,"debug");s.error(`Unhandled error: ${e instanceof Error?e.message:String(e)}`,e instanceof Error?{stack:e.stack}:void 0),await s.flush();}catch{}process.exit(1);});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@smart-cloud/publisher-exporter",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.9",
|
|
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.",
|