@smart-cloud/publisher-exporter 1.1.35 → 1.1.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/crawl.js +5 -5
- package/package.json +3 -1
package/dist/crawl.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {request,chromium}from'playwright';import b from'fs/promises';import f from'path';import {gunzipSync}from'zlib';import Kt from'http';import Yt from'https';import at from'crypto';import dr from'fast-glob';import {availableParallelism}from'os';import {Worker}from'worker_threads';var Ht=".deploy-plan.json",zt="deploy-plan.json",Jt=".crawl-incomplete.json",Vt="crawl-incomplete.json";function ze(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?f.resolve(e):""}function Je(e){let t=String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").trim();return !t||t==="."||t.startsWith("../")||t===".."?null:t}function ye(e){return [...new Set(e.map(Je).filter(t=>t!==null))]}function Gt(e,t){return {schemaVersion:1,generatedAt:String(t.generatedAt||new Date().toISOString()),outputDir:f.resolve(e.outputDir),runMode:t.runMode,crawlMode:t.crawlMode,fullSyncRequired:!!t.fullSyncRequired,changedFiles:ye(t.changedFiles||[]),deletedFiles:ye(t.deletedFiles||[]),rewriteTargets:ye(t.rewriteTargets||[])}}function Ve(e){let t=f.join(f.resolve(e.outputDir),Ht),r=ze();return r?[f.join(r,zt),t]:[t]}function Ge(e){let t=f.join(f.resolve(e.outputDir),Jt),r=ze();return r?[f.join(r,Vt),t]:[t]}function te(e,t){let r=f.resolve(e),s=f.resolve(t),n=f.relative(r,s).replace(/\\/g,"/");return Je(n)}async function Ze(e,t){let r=Gt(e,t);for(let s of Ve(e))await b.mkdir(f.dirname(s),{recursive:true}),await b.writeFile(s,JSON.stringify(r,null,2),"utf8");}async function Ke(e){for(let t of Ve(e))try{await b.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}async function Ye(e,t){let r={schemaVersion:1,startedAt:String(t.startedAt||new Date().toISOString()),outputDir:f.resolve(e.outputDir)};for(let s of Ge(e)){await b.mkdir(f.dirname(s),{recursive:true});let n=`${s}.${process.pid}.tmp`;await b.writeFile(n,JSON.stringify(r,null,2),"utf8"),await b.rename(n,s);}}async function Xe(e){for(let t of Ge(e))try{await b.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}function tt(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function Xt(e){let t=String(e??"").trim();if(!t)return "";let r=t;if(/^https?:\/\//i.test(r))try{r=new URL(r).pathname;}catch{return ""}if(r=r.split(/[?#]/,1)[0]?.replace(/\\/g,"/").trim()??"",!r)return "";let s=r.endsWith("/"),n=r.replace(/^\/+/,"").split("/").map(u=>u.replace(/[^A-Za-z0-9._-]/g,"")).filter(u=>u.length>0&&u!=="."&&u!=="..");if(n.length===0)return "";let i=`/${n.join("/")}`;return s&&f.extname(i)===""&&(i+="/"),i==="/"?"":i}function ve(e){return !e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).map(([t,r])=>[t.trim(),String(r??"")]).filter(([t])=>t.length>0))}function er(e){if(!e||typeof e!="object")return {};let t={};for(let[r,s]of Object.entries(e)){let n=r.trim();if(!n||!s||typeof s!="object")continue;let i=s,u={};if(typeof i.targetOrigin=="string"){let o=tt(i.targetOrigin);o&&(u.targetOrigin=o);}let l=ve(i.extraReplacements);if(Object.keys(l).length>0&&(u.extraReplacements=l),i.s3&&typeof i.s3=="object"){let o={},a=i.s3;typeof a.bucket=="string"&&(o.bucket=a.bucket.trim()),typeof a.prefix=="string"&&(o.prefix=a.prefix.trim()),typeof a.region=="string"&&(o.region=a.region.trim()),typeof a.htmlCacheControl=="string"&&(o.htmlCacheControl=a.htmlCacheControl.trim()),typeof a.assetCacheControl=="string"&&(o.assetCacheControl=a.assetCacheControl.trim()),Object.keys(o).length>0&&(u.s3=o);}if(i.cloudFront&&typeof i.cloudFront=="object"){let o={},a=i.cloudFront;typeof a.distributionId=="string"&&(o.distributionId=a.distributionId.trim()),Array.isArray(a.invalidationPaths)&&(o.invalidationPaths=a.invalidationPaths.map(p=>String(p??"").trim()).filter(p=>p.length>0)),Object.keys(o).length>0&&(u.cloudFront=o);}t[n]=u;}return t}function Re(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function tr(e,t){if(!e||typeof e!="object")return null;let r=e,s=r.command;if(s!=="publish"&&s!=="crawl"&&s!=="deploy"&&s!=="invalidate"&&s!=="retry-timeouts"&&s!=="url")return null;let n=Number.parseInt(String(r.intervalMinutes??"0"),10);if(!Number.isFinite(n)||n<1)return null;let i=String(r.id??`${s}-${t+1}`).trim();if(!i)return null;let u=String(r.deploymentProfile??"").trim(),l=String(r.url??"").trim();return {id:i,enabled:r.enabled!==false,command:s,intervalMinutes:n,...s==="publish"||s==="crawl"?{crawlMode:r.crawlMode==="incremental"?"incremental":"full"}:{},...(s==="publish"||s==="deploy"||s==="invalidate")&&u?{deploymentProfile:u}:{},...l?{url:l}:{}}}function rt(e){let t=e&&typeof e=="object"?e:{},r=Array.isArray(t.rules)?t.rules.map((s,n)=>tr(s,n)).filter(s=>!!s):[];return {enabled:t.enabled===true,timezone:typeof t.timezone=="string"&&t.timezone.trim()!==""?t.timezone.trim():"UTC",rules:r}}function rr(e){if(!e||typeof e!="object")return;let t=e,r={};for(let n of ["accountId","siteId"]){let i=t[n];typeof i=="string"&&i.trim()!==""&&(r[n]=i.trim());}let s=Number(t.lastUpdate??0);return Number.isFinite(s)&&s>0&&(r.lastUpdate=Math.floor(s)),t.subscriber===true&&(r.subscriber=true),Object.keys(r).length>0?r:void 0}function ke(e){let t=e&&typeof e=="object"?e:{},r=String(t.accountId??"").trim(),s=String(t.siteId??"").trim(),n=t.subscriber===true,i=rr(t.siteSettings),u={...i??{},...r?{accountId:i?.accountId??r}:{},...s?{siteId:i?.siteId??s}:{},...i?.subscriber===true||n?{subscriber:true}:{}},l={},o=String(t.apiBase??"").trim();o&&(l.apiBase=o);let a=String(t.runtimeToken??t.nonce??"").trim();a&&(l.runtimeToken=a);let p=String(t.virtualAssetBaseUrl??t.uploadUrl??"").trim();p&&(l.virtualAssetBaseUrl=p),Object.keys(u).length>0&&(l.siteSettings=u);let d=Re(t.subscriptionType);return d&&(l.subscriptionType=d),l}function sr(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function st(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function nr(e,t){let r=new Headers(e instanceof Request?e.headers:void 0);if(t?.headers)for(let[s,n]of new Headers(t.headers).entries())r.set(s,n);return r}async function nt(e,t,r=5){let s=new URL(st(e)),n=String(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase(),i=s.protocol==="http:"?Kt:Yt,u=nr(e,t);return await new Promise((l,o)=>{let a=i.request(s,{method:n,headers:Object.fromEntries(u.entries()),...s.protocol==="https:"?{rejectUnauthorized:false}:{}},p=>{let d=[];p.on("data",c=>{d.push(Buffer.isBuffer(c)?c:Buffer.from(c));}),p.on("error",o),p.on("end",()=>{let c=p.statusCode??0,g=p.headers.location;if(r>0&&g&&[301,302,303,307,308].includes(c)){l(nt(new URL(g,s),{method:c===303?"GET":n},r-1));return}let h=new Headers;for(let[m,w]of Object.entries(p.headers))Array.isArray(w)?h.set(m,w.join(", ")):typeof w=="string"&&h.set(m,w);l(new Response(Buffer.concat(d),{status:c,statusText:p.statusMessage??"",headers:h}));});});a.on("error",o),a.end();})}function ir(e){let t=ke(e.wpsuite),r={...t.siteSettings??{},...t.siteSettings?.subscriber===true||t.subscriptionType==="PROFESSIONAL"||t.subscriptionType==="AGENCY"?{subscriber:true}:{}},s=String(r.accountId??"").trim(),n=String(r.siteId??"").trim(),i=String(t.virtualAssetBaseUrl??t.uploadUrl??"").trim();if(e.wpsuite={...t.apiBase?{apiBase:t.apiBase}:{},...t.runtimeToken?{runtimeToken:t.runtimeToken}:{},...i?{virtualAssetBaseUrl:i}:{},...Object.keys(r).length>0?{siteSettings:r}:{},...t.subscriptionType?{subscriptionType:t.subscriptionType}:{}},!s||!n||!i)return false;sr(e.sourceOrigin);let u=globalThis,o={...u.WpSuite??{},siteSettings:r,uploadUrl:i};return t.apiBase&&(o.apiBase=t.apiBase),u.WpSuite=o,true}async function or(e){let t=String(e.wpsuite?.virtualAssetBaseUrl??e.wpsuite?.uploadUrl??"").trim();if(!ir(e)){let n=e.wpsuite?.siteSettings,i=[String(n?.accountId??"").trim()?"":"accountId",String(n?.siteId??"").trim()?"":"siteId",t?"":"virtualAssetBaseUrl"].filter(Boolean);return {remote:null,diagnostic:{status:"invalid-runtime",virtualAssetBaseUrl:t,subscriptionType:null,error:`Missing WP Suite runtime field(s): ${i.join(", ")}.`,requests:[]}}}let r=globalThis.fetch,s=[];try{typeof r=="function"&&/^https?:\/\//i.test(t)&&(globalThis.fetch=(async(o,a)=>{let p=st(o);if(p.startsWith(t)){let d=(()=>{try{return new URL(p).pathname}catch{return p}})();try{let c=e.ignoreHttpsErrors&&p.startsWith("https://")?await nt(o,a):await r(o,a);return s.push({path:d,status:c.status,ok:c.ok,error:null}),c}catch(c){throw s.push({path:d,status:null,ok:!1,error:c instanceof Error?c.message:String(c)}),c}}return r(o,a)}));let{getConfig:n}=await import('@smart-cloud/wpsuite-core'),i=await n("publisher"),u=i&&typeof i=="object"?i:null,l=Re(u?.subscriptionType);return {remote:u,diagnostic:{status:u?"loaded":"unavailable",virtualAssetBaseUrl:t,subscriptionType:l??null,error:u?null:"WP Suite publisher config loader returned no configuration.",requests:s}}}catch(n){return {remote:null,diagnostic:{status:"unavailable",virtualAssetBaseUrl:t,subscriptionType:null,error:n instanceof Error?n.message:String(n),requests:s}}}finally{typeof r=="function"&&(globalThis.fetch=r);}}function ar(e,t){let r=er(t?.deploymentProfiles),s=String(t?.defaultDeploymentProfile??"").trim(),n=r[s]?s:"",i=Re(t?.subscriptionType),u=ke(e.wpsuite);return {...e,scheduler:rt(t?.scheduler),deploymentProfiles:r,defaultDeploymentProfile:n,...i?{subscriptionType:i}:{},wpsuite:{...u,...u.siteSettings||i?{siteSettings:{...u.siteSettings??{},...u.siteSettings?.subscriber===true||i==="PROFESSIONAL"||i==="AGENCY"?{subscriber:true}:{}}}:{},...i?{subscriptionType:i}:{}}}}function Ce(e,t){let s=String(e||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!s)return t;let n=s.split("/").map(i=>i.trim()).filter(i=>i.length>0&&i!=="."&&i!=="..");return n.length>0?n.join("/"):t}function ur(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?f.resolve(e):""}function et(e,t,r){let s=String(t||"").trim();return s&&f.isAbsolute(s)?f.resolve(s):f.resolve(e,Ce(s,r))}async function xe(e,t={}){let r=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",s=await b.readFile(r,"utf8"),n=JSON.parse(s);n.sourceOrigin=n.sourceOrigin.replace(/\/$/,""),n.targetOrigin=tt(n.targetOrigin),n.ignoreHttpsErrors??=false,n.outputDir=String(n.outputDir||"export").trim()||"export",n.urlRewriteMode||=n.targetOrigin==="."?"relative":"absolute",n.noJavaScriptRenderPathPrefixes||=[],n.seedPaths||=[],n.generated404RequestPath=Xt(n.generated404RequestPath),n.sitemapPaths||=["/sitemap_index.xml","/sitemap.xml"],n.allowedAssetHosts||=[],n.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],n.blockedPathPrefixes||=[],n.blockedSearchFragments||=[],n.concurrency||=1,n.maxPages||=0,n.extraReplacements=ve(n.extraReplacements),n.postCrawlCopyMap=ve(n.postCrawlCopyMap),n.logDir=String(n.logDir||"logs").trim()||"logs",n.verbose??=false,n.logLevel||=n.verbose?"debug":"info",n.s3SyncMode||="sdk-upload-delete",n.readiness||={waitForSelector:null,waitForFunction:null,timeoutMs:1500,fallbackWaitMs:1500},n.readiness.timeoutMs??=1500,n.readiness.fallbackWaitMs??=1500,n.viewport||={width:1440,height:1200},n.navigationTimeoutMs||=3e4,n.assetDownloadConcurrency=Number(n.assetDownloadConcurrency)>0?Number(n.assetDownloadConcurrency):n.concurrency,n.rewriteConcurrency=Number(n.rewriteConcurrency)>0?Number(n.rewriteConcurrency):n.assetDownloadConcurrency,n.wpsuite=ke(n.wpsuite),n.scheduler=rt(void 0),n.deploymentProfiles={},n.defaultDeploymentProfile="",n.deploymentTargetOverride=String(n.deploymentTargetOverride??"").trim();let i=await or(n);t.onRemotePublisherConfigDiagnostic?.(i.diagnostic);let u=ar(n,i.remote),l=ur(),o=l?f.resolve(l,".."):"";return o?(u.outputDir=et(o,u.outputDir,"export"),u.logDir=et(o,u.logDir,"logs")):(f.isAbsolute(u.outputDir)||(u.outputDir=Ce(u.outputDir,"export")),f.isAbsolute(u.logDir)||(u.logDir=Ce(u.logDir,"logs"))),u}function se(e,t=10){return at.createHash("sha1").update(e).digest("hex").slice(0,t)}async function lr(e){await b.mkdir(f.dirname(e),{recursive:true});}async function ne(e,t,r){await lr(e);let s=f.join(f.dirname(e),`.${f.basename(e)}.${process.pid}.${Date.now()}.${at.randomBytes(6).toString("hex")}.tmp`);try{typeof t=="string"?await b.writeFile(s,t,r??"utf8"):await b.writeFile(s,t),await b.rename(s,e);}catch(n){throw await b.unlink(s).catch(()=>{}),n}}function J(e){return [".html",".htm",".css",".js",".mjs",".json",".xml",".xsl",".txt",".svg",".map",".enc",".jws"].includes(f.extname(e).toLowerCase())}function U(e){return e.replace(/"/g,'"').replace(/"/g,'"').replace(/'/g,"'").replace(/'/g,"'").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function Z(e){return e.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">")}function ge(e){return e.replace(/\//g,"\\/")}function it(e){return e.replace(/\//g,"\\\\/")}function cr(e){try{let t=new URL(e);if(t.protocol!=="http:"&&t.protocol!=="https:")return null;let r=t.pathname==="/"&&!t.search&&!t.hash?"":`${t.pathname}${t.search}${t.hash}`;return `//${t.host}${r}`}catch{return null}}function ot(e,t,r){if(!t)return;e[t]=r;let s=ge(t),n=ge(r);e[s]=n;let i=it(t),u=it(r);e[i]=u;let l=Z(t),o=Z(r);e[l]=o;let a=Z(s),p=Z(n);e[a]=p;let d=Z(i),c=Z(u);e[d]=c;}function fe(e,t,r){ot(e,t,r);let s=cr(t);s&&s!==t&&ot(e,s,r);}function Te(e,t){let r=t.startsWith("/")?t:`/${t}`,s=(e||"").replace(/\/$/,"");return !s||s==="."||s==="/"?r:`${s}${r}`}function ut(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function lt(e,t,r){if(!t)return r;let s=f.dirname(f.resolve(t)),n=f.resolve(e,r.replace(/^\/+/,"")),i=f.relative(s,n).replace(/\\/g,"/");return i?(i.startsWith(".")||(i=`./${i}`),i):"."}var hr=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],mr=new Set([".html",".htm"]),ct="WPSuite.io Static Publisher",wr=ct.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function Pr(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function br(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function Sr(e,t,r){return br(t)?e.replace(new RegExp(`(?<!:)${Pr(t)}`,"g"),r):e.split(t).join(r)}function yr(e,t,r){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let n=f.extname(r).toLowerCase();return mr.has(n)?/<head\b|<html\b|<!doctype html/i.test(t):false}function vr(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${wr}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${ct}" />`;if(e.match(/(\r?\n)([ \t]*)<\/head>/i))return e.replace(/(\r?\n)([ \t]*)<\/head>/i,`$1$2${t}$1$2</head>`);let s=e.includes(`\r
|
|
1
|
+
import {request,chromium}from'playwright';import b from'fs/promises';import f from'path';import {gunzipSync}from'zlib';import Yt from'http';import Kt from'https';import at from'crypto';import dr from'fast-glob';import {availableParallelism}from'os';import {Worker}from'worker_threads';var Ht=".deploy-plan.json",zt="deploy-plan.json",Jt=".crawl-incomplete.json",Vt="crawl-incomplete.json";function ze(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?f.resolve(e):""}function Je(e){let t=String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").trim();return !t||t==="."||t.startsWith("../")||t===".."?null:t}function ye(e){return [...new Set(e.map(Je).filter(t=>t!==null))]}function Gt(e,t){return {schemaVersion:1,generatedAt:String(t.generatedAt||new Date().toISOString()),outputDir:f.resolve(e.outputDir),runMode:t.runMode,crawlMode:t.crawlMode,fullSyncRequired:!!t.fullSyncRequired,changedFiles:ye(t.changedFiles||[]),deletedFiles:ye(t.deletedFiles||[]),rewriteTargets:ye(t.rewriteTargets||[])}}function Ve(e){let t=f.join(f.resolve(e.outputDir),Ht),r=ze();return r?[f.join(r,zt),t]:[t]}function Ge(e){let t=f.join(f.resolve(e.outputDir),Jt),r=ze();return r?[f.join(r,Vt),t]:[t]}function te(e,t){let r=f.resolve(e),s=f.resolve(t),n=f.relative(r,s).replace(/\\/g,"/");return Je(n)}async function Ze(e,t){let r=Gt(e,t);for(let s of Ve(e))await b.mkdir(f.dirname(s),{recursive:true}),await b.writeFile(s,JSON.stringify(r,null,2),"utf8");}async function Ye(e){for(let t of Ve(e))try{await b.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}async function Ke(e,t){let r={schemaVersion:1,startedAt:String(t.startedAt||new Date().toISOString()),outputDir:f.resolve(e.outputDir)};for(let s of Ge(e)){await b.mkdir(f.dirname(s),{recursive:true});let n=`${s}.${process.pid}.tmp`;await b.writeFile(n,JSON.stringify(r,null,2),"utf8"),await b.rename(n,s);}}async function Xe(e){for(let t of Ge(e))try{await b.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}function tt(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function Xt(e){let t=String(e??"").trim();if(!t)return "";let r=t;if(/^https?:\/\//i.test(r))try{r=new URL(r).pathname;}catch{return ""}if(r=r.split(/[?#]/,1)[0]?.replace(/\\/g,"/").trim()??"",!r)return "";let s=r.endsWith("/"),n=r.replace(/^\/+/,"").split("/").map(u=>u.replace(/[^A-Za-z0-9._-]/g,"")).filter(u=>u.length>0&&u!=="."&&u!=="..");if(n.length===0)return "";let i=`/${n.join("/")}`;return s&&f.extname(i)===""&&(i+="/"),i==="/"?"":i}function ve(e){return !e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).map(([t,r])=>[t.trim(),String(r??"")]).filter(([t])=>t.length>0))}function er(e){if(!e||typeof e!="object")return {};let t={};for(let[r,s]of Object.entries(e)){let n=r.trim();if(!n||!s||typeof s!="object")continue;let i=s,u={};if(typeof i.targetOrigin=="string"){let o=tt(i.targetOrigin);o&&(u.targetOrigin=o);}let l=ve(i.extraReplacements);if(Object.keys(l).length>0&&(u.extraReplacements=l),i.s3&&typeof i.s3=="object"){let o={},a=i.s3;typeof a.bucket=="string"&&(o.bucket=a.bucket.trim()),typeof a.prefix=="string"&&(o.prefix=a.prefix.trim()),typeof a.region=="string"&&(o.region=a.region.trim()),typeof a.htmlCacheControl=="string"&&(o.htmlCacheControl=a.htmlCacheControl.trim()),typeof a.assetCacheControl=="string"&&(o.assetCacheControl=a.assetCacheControl.trim()),Object.keys(o).length>0&&(u.s3=o);}if(i.cloudFront&&typeof i.cloudFront=="object"){let o={},a=i.cloudFront;typeof a.distributionId=="string"&&(o.distributionId=a.distributionId.trim()),Array.isArray(a.invalidationPaths)&&(o.invalidationPaths=a.invalidationPaths.map(p=>String(p??"").trim()).filter(p=>p.length>0)),Object.keys(o).length>0&&(u.cloudFront=o);}t[n]=u;}return t}function Re(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function tr(e,t){if(!e||typeof e!="object")return null;let r=e,s=r.command;if(s!=="publish"&&s!=="crawl"&&s!=="deploy"&&s!=="invalidate"&&s!=="retry-timeouts"&&s!=="url")return null;let n=Number.parseInt(String(r.intervalMinutes??"0"),10);if(!Number.isFinite(n)||n<1)return null;let i=String(r.id??`${s}-${t+1}`).trim();if(!i)return null;let u=String(r.deploymentProfile??"").trim(),l=String(r.url??"").trim();return {id:i,enabled:r.enabled!==false,command:s,intervalMinutes:n,...s==="publish"||s==="crawl"?{crawlMode:r.crawlMode==="incremental"?"incremental":"full"}:{},...(s==="publish"||s==="deploy"||s==="invalidate")&&u?{deploymentProfile:u}:{},...l?{url:l}:{}}}function rt(e){let t=e&&typeof e=="object"?e:{},r=Array.isArray(t.rules)?t.rules.map((s,n)=>tr(s,n)).filter(s=>!!s):[];return {enabled:t.enabled===true,timezone:typeof t.timezone=="string"&&t.timezone.trim()!==""?t.timezone.trim():"UTC",rules:r}}function rr(e){if(!e||typeof e!="object")return;let t=e,r={};for(let n of ["accountId","siteId"]){let i=t[n];typeof i=="string"&&i.trim()!==""&&(r[n]=i.trim());}let s=Number(t.lastUpdate??0);return Number.isFinite(s)&&s>0&&(r.lastUpdate=Math.floor(s)),t.subscriber===true&&(r.subscriber=true),Object.keys(r).length>0?r:void 0}function ke(e){let t=e&&typeof e=="object"?e:{},r=String(t.accountId??"").trim(),s=String(t.siteId??"").trim(),n=t.subscriber===true,i=rr(t.siteSettings),u={...i??{},...r?{accountId:i?.accountId??r}:{},...s?{siteId:i?.siteId??s}:{},...i?.subscriber===true||n?{subscriber:true}:{}},l={},o=String(t.apiBase??"").trim();o&&(l.apiBase=o);let a=String(t.runtimeToken??t.nonce??"").trim();a&&(l.runtimeToken=a);let p=String(t.virtualAssetBaseUrl??t.uploadUrl??"").trim();p&&(l.virtualAssetBaseUrl=p),Object.keys(u).length>0&&(l.siteSettings=u);let d=Re(t.subscriptionType);return d&&(l.subscriptionType=d),l}function sr(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function st(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function nr(e,t){let r=new Headers(e instanceof Request?e.headers:void 0);if(t?.headers)for(let[s,n]of new Headers(t.headers).entries())r.set(s,n);return r}async function nt(e,t,r=5){let s=new URL(st(e)),n=String(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase(),i=s.protocol==="http:"?Yt:Kt,u=nr(e,t);return await new Promise((l,o)=>{let a=i.request(s,{method:n,headers:Object.fromEntries(u.entries()),...s.protocol==="https:"?{rejectUnauthorized:false}:{}},p=>{let d=[];p.on("data",c=>{d.push(Buffer.isBuffer(c)?c:Buffer.from(c));}),p.on("error",o),p.on("end",()=>{let c=p.statusCode??0,g=p.headers.location;if(r>0&&g&&[301,302,303,307,308].includes(c)){l(nt(new URL(g,s),{method:c===303?"GET":n},r-1));return}let h=new Headers;for(let[m,w]of Object.entries(p.headers))Array.isArray(w)?h.set(m,w.join(", ")):typeof w=="string"&&h.set(m,w);l(new Response(Buffer.concat(d),{status:c,statusText:p.statusMessage??"",headers:h}));});});a.on("error",o),a.end();})}function ir(e){let t=ke(e.wpsuite),r={...t.siteSettings??{},...t.siteSettings?.subscriber===true||t.subscriptionType==="PROFESSIONAL"||t.subscriptionType==="AGENCY"?{subscriber:true}:{}},s=String(r.accountId??"").trim(),n=String(r.siteId??"").trim(),i=String(t.virtualAssetBaseUrl??t.uploadUrl??"").trim();if(e.wpsuite={...t.apiBase?{apiBase:t.apiBase}:{},...t.runtimeToken?{runtimeToken:t.runtimeToken}:{},...i?{virtualAssetBaseUrl:i}:{},...Object.keys(r).length>0?{siteSettings:r}:{},...t.subscriptionType?{subscriptionType:t.subscriptionType}:{}},!s||!n||!i)return false;sr(e.sourceOrigin);let u=globalThis,o={...u.WpSuite??{},siteSettings:r,uploadUrl:i};return t.apiBase&&(o.apiBase=t.apiBase),u.WpSuite=o,true}async function or(e){let t=String(e.wpsuite?.virtualAssetBaseUrl??e.wpsuite?.uploadUrl??"").trim();if(!ir(e)){let n=e.wpsuite?.siteSettings,i=[String(n?.accountId??"").trim()?"":"accountId",String(n?.siteId??"").trim()?"":"siteId",t?"":"virtualAssetBaseUrl"].filter(Boolean);return {remote:null,diagnostic:{status:"invalid-runtime",virtualAssetBaseUrl:t,subscriptionType:null,error:`Missing WP Suite runtime field(s): ${i.join(", ")}.`,requests:[]}}}let r=globalThis.fetch,s=[];try{typeof r=="function"&&/^https?:\/\//i.test(t)&&(globalThis.fetch=(async(o,a)=>{let p=st(o);if(p.startsWith(t)){let d=(()=>{try{return new URL(p).pathname}catch{return p}})();try{let c=e.ignoreHttpsErrors&&p.startsWith("https://")?await nt(o,a):await r(o,a);return s.push({path:d,status:c.status,ok:c.ok,error:null}),c}catch(c){throw s.push({path:d,status:null,ok:!1,error:c instanceof Error?c.message:String(c)}),c}}return r(o,a)}));let{getConfig:n}=await import('@smart-cloud/wpsuite-core'),i=await n("publisher"),u=i&&typeof i=="object"?i:null,l=Re(u?.subscriptionType);return {remote:u,diagnostic:{status:u?"loaded":"unavailable",virtualAssetBaseUrl:t,subscriptionType:l??null,error:u?null:"WP Suite publisher config loader returned no configuration.",requests:s}}}catch(n){return {remote:null,diagnostic:{status:"unavailable",virtualAssetBaseUrl:t,subscriptionType:null,error:n instanceof Error?n.message:String(n),requests:s}}}finally{typeof r=="function"&&(globalThis.fetch=r);}}function ar(e,t){let r=er(t?.deploymentProfiles),s=String(t?.defaultDeploymentProfile??"").trim(),n=r[s]?s:"",i=Re(t?.subscriptionType),u=ke(e.wpsuite);return {...e,scheduler:rt(t?.scheduler),deploymentProfiles:r,defaultDeploymentProfile:n,...i?{subscriptionType:i}:{},wpsuite:{...u,...u.siteSettings||i?{siteSettings:{...u.siteSettings??{},...u.siteSettings?.subscriber===true||i==="PROFESSIONAL"||i==="AGENCY"?{subscriber:true}:{}}}:{},...i?{subscriptionType:i}:{}}}}function Ce(e,t){let s=String(e||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!s)return t;let n=s.split("/").map(i=>i.trim()).filter(i=>i.length>0&&i!=="."&&i!=="..");return n.length>0?n.join("/"):t}function ur(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?f.resolve(e):""}function et(e,t,r){let s=String(t||"").trim();return s&&f.isAbsolute(s)?f.resolve(s):f.resolve(e,Ce(s,r))}async function xe(e,t={}){let r=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",s=await b.readFile(r,"utf8"),n=JSON.parse(s);n.sourceOrigin=n.sourceOrigin.replace(/\/$/,""),n.targetOrigin=tt(n.targetOrigin),n.ignoreHttpsErrors??=false,n.outputDir=String(n.outputDir||"export").trim()||"export",n.urlRewriteMode||=n.targetOrigin==="."?"relative":"absolute",n.noJavaScriptRenderPathPrefixes||=[],n.seedPaths||=[],n.generated404RequestPath=Xt(n.generated404RequestPath),n.sitemapPaths||=["/sitemap_index.xml","/sitemap.xml"],n.allowedAssetHosts||=[],n.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],n.blockedPathPrefixes||=[],n.blockedSearchFragments||=[],n.concurrency||=1,n.maxPages||=0,n.extraReplacements=ve(n.extraReplacements),n.postCrawlCopyMap=ve(n.postCrawlCopyMap),n.logDir=String(n.logDir||"logs").trim()||"logs",n.verbose??=false,n.logLevel||=n.verbose?"debug":"info",n.s3SyncMode||="sdk-upload-delete",n.readiness||={waitForSelector:null,waitForFunction:null,timeoutMs:1500,fallbackWaitMs:1500},n.readiness.timeoutMs??=1500,n.readiness.fallbackWaitMs??=1500,n.viewport||={width:1440,height:1200},n.navigationTimeoutMs||=3e4,n.assetDownloadConcurrency=Number(n.assetDownloadConcurrency)>0?Number(n.assetDownloadConcurrency):n.concurrency,n.rewriteConcurrency=Number(n.rewriteConcurrency)>0?Number(n.rewriteConcurrency):n.assetDownloadConcurrency,n.wpsuite=ke(n.wpsuite),n.scheduler=rt(void 0),n.deploymentProfiles={},n.defaultDeploymentProfile="",n.deploymentTargetOverride=String(n.deploymentTargetOverride??"").trim();let i=await or(n);t.onRemotePublisherConfigDiagnostic?.(i.diagnostic);let u=ar(n,i.remote),l=ur(),o=l?f.resolve(l,".."):"";return o?(u.outputDir=et(o,u.outputDir,"export"),u.logDir=et(o,u.logDir,"logs")):(f.isAbsolute(u.outputDir)||(u.outputDir=Ce(u.outputDir,"export")),f.isAbsolute(u.logDir)||(u.logDir=Ce(u.logDir,"logs"))),u}function se(e,t=10){return at.createHash("sha1").update(e).digest("hex").slice(0,t)}async function lr(e){await b.mkdir(f.dirname(e),{recursive:true});}async function ne(e,t,r){await lr(e);let s=f.join(f.dirname(e),`.${f.basename(e)}.${process.pid}.${Date.now()}.${at.randomBytes(6).toString("hex")}.tmp`);try{typeof t=="string"?await b.writeFile(s,t,r??"utf8"):await b.writeFile(s,t),await b.rename(s,e);}catch(n){throw await b.unlink(s).catch(()=>{}),n}}function J(e){return [".html",".htm",".css",".js",".mjs",".json",".xml",".xsl",".txt",".svg",".map",".enc",".jws"].includes(f.extname(e).toLowerCase())}function U(e){return e.replace(/"/g,'"').replace(/"/g,'"').replace(/'/g,"'").replace(/'/g,"'").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function Z(e){return e.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">")}function ge(e){return e.replace(/\//g,"\\/")}function it(e){return e.replace(/\//g,"\\\\/")}function cr(e){try{let t=new URL(e);if(t.protocol!=="http:"&&t.protocol!=="https:")return null;let r=t.pathname==="/"&&!t.search&&!t.hash?"":`${t.pathname}${t.search}${t.hash}`;return `//${t.host}${r}`}catch{return null}}function ot(e,t,r){if(!t)return;e[t]=r;let s=ge(t),n=ge(r);e[s]=n;let i=it(t),u=it(r);e[i]=u;let l=Z(t),o=Z(r);e[l]=o;let a=Z(s),p=Z(n);e[a]=p;let d=Z(i),c=Z(u);e[d]=c;}function fe(e,t,r){ot(e,t,r);let s=cr(t);s&&s!==t&&ot(e,s,r);}function Te(e,t){let r=t.startsWith("/")?t:`/${t}`,s=(e||"").replace(/\/$/,"");return !s||s==="."||s==="/"?r:`${s}${r}`}function ut(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function lt(e,t,r){if(!t)return r;let s=f.dirname(f.resolve(t)),n=f.resolve(e,r.replace(/^\/+/,"")),i=f.relative(s,n).replace(/\\/g,"/");return i?(i.startsWith(".")||(i=`./${i}`),i):"."}var hr=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],mr=new Set([".html",".htm"]),ct="WPSuite.io Static Publisher",wr=ct.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function Pr(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function br(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function Sr(e,t,r){return br(t)?e.replace(new RegExp(`(?<!:)${Pr(t)}`,"g"),r):e.split(t).join(r)}function yr(e,t,r){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let n=f.extname(r).toLowerCase();return mr.has(n)?/<head\b|<html\b|<!doctype html/i.test(t):false}function vr(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${wr}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${ct}" />`;if(e.match(/(\r?\n)([ \t]*)<\/head>/i))return e.replace(/(\r?\n)([ \t]*)<\/head>/i,`$1$2${t}$1$2</head>`);let s=e.includes(`\r
|
|
2
2
|
`)?`\r
|
|
3
3
|
`:`
|
|
4
|
-
`;return e.replace(/<head\b[^>]*>/i,n=>`${n}${s} ${t}`)}function Cr(e){let t=U(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function Rr(e,t){let r=[...new Set(t)].filter(i=>i.includes("/")&&!/\\+\//.test(i)).map(i=>[i,ge(i)]).filter(([i,u])=>i!==u).sort((i,u)=>u[0].length-i[0].length);if(!r.length)return e;let s=i=>{let u=i;for(let[l,o]of r)u=u.split(l).join(o);return u},n=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(i,u,l,o)=>`${u}${s(l)}${o}`);return n=n.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(i,u,l,o,a)=>Cr(o)?`${u}${s(o)}${a}`:i),n}function kr(e,t){if(!t)return null;let r=f.dirname(f.resolve(t)),s=f.resolve(e.outputDir),n=f.relative(r,s).replace(/\\/g,"/");return n?(n.startsWith(".")||(n=`./${n}`),n.endsWith("/")?n:`${n}/`):"./"}function xr(e,t,r){let s=kr(t,r);if(!s)return e;let n=e;for(let i of hr){let u=i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),l=new RegExp(`(?:\\.{1,}/)+${u}`,"g"),o=new RegExp(`(?<!\\.)/${u}`,"g");n=n.replace(l,`${s}${i}`).replace(o,`${s}${i}`);let a=i.replace(/\//g,"\\/"),p=s.replace(/\//g,"\\/"),d=a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),c=new RegExp(`(?:\\.{1,}\\\\/)+${d}`,"g"),g=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${d}`,"g"),h=new RegExp(`(?<![\\.\\\\])\\/${d}`,"g");n=n.replace(c,`${p}${a}`).replace(g,`${p}${a}`).replace(h,`${p}${a}`);}return n}function Me(e,t,r){if(e.urlRewriteMode==="absolute")return t;let s=(()=>{try{return new URL(t,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin)}catch{return null}})(),n=s?s.pathname:ut(t,e.targetOrigin),i=s?`${s.search}${s.hash}`:"";return e.urlRewriteMode==="root-relative"?`${n}${i}`:`${lt(e.outputDir,r,n)}${i}`}function Ae(e,t,r,s,n){fe(e,r,Me(t,s,n));}function Tr(e,t,r,s,n){if(!r||r===s)return;fe(e,r,s);let i=Me(t,r,n),u=Me(t,s,n);fe(e,i,u);}function Ie(e,t,r,s,n={}){let i=e,u={};Ae(u,t,t.sourceOrigin,t.targetOrigin,s);for(let[o,a]of Object.entries(t.extraReplacements))Ae(u,t,o,a,s);for(let[o,a]of Object.entries(r))Ae(u,t,o,a,s);for(let[o,a]of Object.entries(n)){let p=r[o];!p||p===a||Tr(u,t,a,p,s);}let l=Object.entries(u).sort((o,a)=>a[0].length-o[0].length);for(let[o,a]of l)i=Sr(i,o,a);return t.urlRewriteMode!=="absolute"&&(i=xr(i,t,s)),i=Rr(i,l.map(([,o])=>o)),yr(t,i,s)&&(i=vr(i)),i}async function Ar(e,t,r,s){let n=f.join(e.outputDir,s),i=f.extname(n).toLowerCase(),u;try{u=await b.readFile(n,"utf8");}catch(a){if(a.code!=="ENOENT")throw a;return {changed:false}}let o=Ie(u,e,t,i===".js"||i===".mjs"?void 0:n,r);return o!==u?(await ne(n,o,"utf8"),{changed:true}):{changed:false}}async function Mr(e,t){return await new Promise((r,s)=>{let n=o=>{if(l(),o?.error){s(new Error(o.error));return}r({changed:!!o?.changed});},i=o=>{l(),s(o);},u=o=>{l(),o!==0&&s(new Error(`Rewrite worker exited with code ${o}.`));},l=()=>{e.off("message",n),e.off("error",i),e.off("exit",u);};e.on("message",n),e.on("error",i),e.on("exit",u),e.postMessage({file:t});})}async function dt(e,t,r={}){let n=(r.files?[...new Set(r.files)].map(c=>f.resolve(c)).filter(c=>c.startsWith(f.resolve(e.outputDir))).map(c=>f.relative(e.outputDir,c).replace(/\\/g,"/")).filter(c=>c.length>0):await dr(["**/*"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(c=>c!=="asset-map.json"&&J(c)),i=0;if(n.length===0)return 0;let u=Math.max(1,Number(e.rewriteConcurrency||e.assetDownloadConcurrency||1)),l=Math.max(1,Math.min(u,n.length,availableParallelism()));await r.onStart?.({totalFiles:n.length,workerCount:l});let o=0,a=0,p=null;if(l===1){for(let c of n){let g=await Ar(e,t,r.previousAssetMap??{},c);g.changed&&(i+=1),a+=1,await r.onProgress?.({index:a,totalFiles:n.length,changedTextFiles:i,file:c,changed:g.changed});}return i}let d=Array.from({length:l},async()=>{let c=new Worker(new URL("./rewrite-worker.js",import.meta.url),{workerData:{config:e,assetMap:t,previousAssetMap:r.previousAssetMap??{}}});try{for(;!p;){let g=o;if(g>=n.length)return;o+=1;let h=n[g],m=await Mr(c,h);m.changed&&(i+=1),a+=1,await r.onProgress?.({index:a,totalFiles:n.length,changedTextFiles:i,file:h,changed:m.changed});}}catch(g){throw p=g instanceof Error?g:new Error(String(g)),p}finally{await c.terminate().catch(()=>{});}});return await Promise.all(d),i}var B={error:0,warn:1,info:2,debug:3},pt=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",he=pt?f.join(pt,"current-progress.json"):"",gt=Promise.resolve();function ft(e){return e.includes("crawl")?"crawl":e.includes("deploy")?"deploy":e.includes("invalidate")?"invalidate":e}function Ir(e,t){let r={...e},s=new Set(["pagesQueued","pagesRendered","assetsQueued","sitemapsQueued","pagesDiscovered","assetsDiscovered","sitemapsDiscovered","pagesSaved","assetsSaved","donePages","doneAssets","doneSitemaps","changedTextFiles","uploaded","failed","index","totalFiles","pageQueue","assetQueue","sitemapQueue"]);for(let[n,i]of Object.entries(t)){let u=r[n];if(typeof u=="number"&&typeof i=="number"&&s.has(n)){r[n]=Math.max(u,i);continue}r[n]=i;}return r}function Lr(e,t,r){he&&(gt=gt.then(async()=>{let s=new Date,n=s.toISOString();await b.mkdir(f.dirname(he),{recursive:true});let i=await b.readFile(he,"utf8").then(m=>JSON.parse(m)).catch(()=>null),u=i&&typeof i.details=="object"&&i.details?i.details:{},l=ft(e),o=i?.currentStep||ft(i?.source||""),a=i?.startedAt||n,p={...i?.stepDurationsSec??{}},d=i?.stepStartedAt||n;if(o&&o!==l&&i?.stepStartedAt){let m=Math.max(0,Math.round((s.getTime()-new Date(i.stepStartedAt).getTime())/1e3));p[o]=(p[o]??0)+m,d=n;}let c=Math.max(0,Math.round((s.getTime()-new Date(d).getTime())/1e3)),g=Math.max(0,Math.round((s.getTime()-new Date(a).getTime())/1e3)),h={checkedAt:n,source:e,message:t,details:Ir(u,r??{}),startedAt:a,currentStep:l,stepStartedAt:d,stepElapsedSec:c,totalElapsedSec:g,stepDurationsSec:p};await b.writeFile(he,JSON.stringify(h,null,2),"utf8");}).catch(()=>{}));}async function
|
|
5
|
-
`,"utf8");}function
|
|
6
|
-
`,"utf8");});}enqueueJsonLine(t,r){this.enqueueTask(()
|
|
4
|
+
`;return e.replace(/<head\b[^>]*>/i,n=>`${n}${s} ${t}`)}function Cr(e){let t=U(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function Rr(e,t){let r=[...new Set(t)].filter(i=>i.includes("/")&&!/\\+\//.test(i)).map(i=>[i,ge(i)]).filter(([i,u])=>i!==u).sort((i,u)=>u[0].length-i[0].length);if(!r.length)return e;let s=i=>{let u=i;for(let[l,o]of r)u=u.split(l).join(o);return u},n=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(i,u,l,o)=>`${u}${s(l)}${o}`);return n=n.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(i,u,l,o,a)=>Cr(o)?`${u}${s(o)}${a}`:i),n}function kr(e,t){if(!t)return null;let r=f.dirname(f.resolve(t)),s=f.resolve(e.outputDir),n=f.relative(r,s).replace(/\\/g,"/");return n?(n.startsWith(".")||(n=`./${n}`),n.endsWith("/")?n:`${n}/`):"./"}function xr(e,t,r){let s=kr(t,r);if(!s)return e;let n=e;for(let i of hr){let u=i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),l=new RegExp(`(?:\\.{1,}/)+${u}`,"g"),o=new RegExp(`(?<!\\.)/${u}`,"g");n=n.replace(l,`${s}${i}`).replace(o,`${s}${i}`);let a=i.replace(/\//g,"\\/"),p=s.replace(/\//g,"\\/"),d=a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),c=new RegExp(`(?:\\.{1,}\\\\/)+${d}`,"g"),g=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${d}`,"g"),h=new RegExp(`(?<![\\.\\\\])\\/${d}`,"g");n=n.replace(c,`${p}${a}`).replace(g,`${p}${a}`).replace(h,`${p}${a}`);}return n}function Me(e,t,r){if(e.urlRewriteMode==="absolute")return t;let s=(()=>{try{return new URL(t,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin)}catch{return null}})(),n=s?s.pathname:ut(t,e.targetOrigin),i=s?`${s.search}${s.hash}`:"";return e.urlRewriteMode==="root-relative"?`${n}${i}`:`${lt(e.outputDir,r,n)}${i}`}function Ae(e,t,r,s,n){fe(e,r,Me(t,s,n));}function Tr(e,t,r,s,n){if(!r||r===s)return;fe(e,r,s);let i=Me(t,r,n),u=Me(t,s,n);fe(e,i,u);}function Ie(e,t,r,s,n={}){let i=e,u={};Ae(u,t,t.sourceOrigin,t.targetOrigin,s);for(let[o,a]of Object.entries(t.extraReplacements))Ae(u,t,o,a,s);for(let[o,a]of Object.entries(r))Ae(u,t,o,a,s);for(let[o,a]of Object.entries(n)){let p=r[o];!p||p===a||Tr(u,t,a,p,s);}let l=Object.entries(u).sort((o,a)=>a[0].length-o[0].length);for(let[o,a]of l)i=Sr(i,o,a);return t.urlRewriteMode!=="absolute"&&(i=xr(i,t,s)),i=Rr(i,l.map(([,o])=>o)),yr(t,i,s)&&(i=vr(i)),i}async function Ar(e,t,r,s){let n=f.join(e.outputDir,s),i=f.extname(n).toLowerCase(),u;try{u=await b.readFile(n,"utf8");}catch(a){if(a.code!=="ENOENT")throw a;return {changed:false}}let o=Ie(u,e,t,i===".js"||i===".mjs"?void 0:n,r);return o!==u?(await ne(n,o,"utf8"),{changed:true}):{changed:false}}async function Mr(e,t){return await new Promise((r,s)=>{let n=o=>{if(l(),o?.error){s(new Error(o.error));return}r({changed:!!o?.changed});},i=o=>{l(),s(o);},u=o=>{l(),o!==0&&s(new Error(`Rewrite worker exited with code ${o}.`));},l=()=>{e.off("message",n),e.off("error",i),e.off("exit",u);};e.on("message",n),e.on("error",i),e.on("exit",u),e.postMessage({file:t});})}async function dt(e,t,r={}){let n=(r.files?[...new Set(r.files)].map(c=>f.resolve(c)).filter(c=>c.startsWith(f.resolve(e.outputDir))).map(c=>f.relative(e.outputDir,c).replace(/\\/g,"/")).filter(c=>c.length>0):await dr(["**/*"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(c=>c!=="asset-map.json"&&J(c)),i=0;if(n.length===0)return 0;let u=Math.max(1,Number(e.rewriteConcurrency||e.assetDownloadConcurrency||1)),l=Math.max(1,Math.min(u,n.length,availableParallelism()));await r.onStart?.({totalFiles:n.length,workerCount:l});let o=0,a=0,p=null;if(l===1){for(let c of n){let g=await Ar(e,t,r.previousAssetMap??{},c);g.changed&&(i+=1),a+=1,await r.onProgress?.({index:a,totalFiles:n.length,changedTextFiles:i,file:c,changed:g.changed});}return i}let d=Array.from({length:l},async()=>{let c=new Worker(new URL("./rewrite-worker.js",import.meta.url),{workerData:{config:e,assetMap:t,previousAssetMap:r.previousAssetMap??{}}});try{for(;!p;){let g=o;if(g>=n.length)return;o+=1;let h=n[g],m=await Mr(c,h);m.changed&&(i+=1),a+=1,await r.onProgress?.({index:a,totalFiles:n.length,changedTextFiles:i,file:h,changed:m.changed});}}catch(g){throw p=g instanceof Error?g:new Error(String(g)),p}finally{await c.terminate().catch(()=>{});}});return await Promise.all(d),i}var B={error:0,warn:1,info:2,debug:3},pt=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",he=pt?f.join(pt,"current-progress.json"):"",gt=Promise.resolve();function ft(e){return e.includes("crawl")?"crawl":e.includes("deploy")?"deploy":e.includes("invalidate")?"invalidate":e}function Ir(e,t){let r={...e},s=new Set(["pagesQueued","pagesRendered","assetsQueued","sitemapsQueued","pagesDiscovered","assetsDiscovered","sitemapsDiscovered","pagesSaved","assetsSaved","donePages","doneAssets","doneSitemaps","changedTextFiles","uploaded","failed","index","totalFiles","pageQueue","assetQueue","sitemapQueue"]);for(let[n,i]of Object.entries(t)){let u=r[n];if(typeof u=="number"&&typeof i=="number"&&s.has(n)){r[n]=Math.max(u,i);continue}r[n]=i;}return r}function Lr(e,t,r){he&&(gt=gt.then(async()=>{let s=new Date,n=s.toISOString();await b.mkdir(f.dirname(he),{recursive:true});let i=await b.readFile(he,"utf8").then(m=>JSON.parse(m)).catch(()=>null),u=i&&typeof i.details=="object"&&i.details?i.details:{},l=ft(e),o=i?.currentStep||ft(i?.source||""),a=i?.startedAt||n,p={...i?.stepDurationsSec??{}},d=i?.stepStartedAt||n;if(o&&o!==l&&i?.stepStartedAt){let m=Math.max(0,Math.round((s.getTime()-new Date(i.stepStartedAt).getTime())/1e3));p[o]=(p[o]??0)+m,d=n;}let c=Math.max(0,Math.round((s.getTime()-new Date(d).getTime())/1e3)),g=Math.max(0,Math.round((s.getTime()-new Date(a).getTime())/1e3)),h={checkedAt:n,source:e,message:t,details:Ir(u,r??{}),startedAt:a,currentStep:l,stepStartedAt:d,stepElapsedSec:c,totalElapsedSec:g,stepDurationsSec:p};await b.writeFile(he,JSON.stringify(h,null,2),"utf8");}).catch(()=>{}));}async function $r(e,t){await b.mkdir(f.dirname(e),{recursive:true}),await b.appendFile(e,`${JSON.stringify(t)}
|
|
5
|
+
`,"utf8");}function Dr(e,t){let r=typeof t?.phase=="string"?t.phase.trim():"";return r||(e==="page"?"render-pages":e==="asset"?"download-assets":e==="sitemap"?"discovery":e==="timing"&&typeof t?.name=="string"&&t.name.trim()||"crawl")}function Or(e,t,r){return {checkedAt:new Date().toISOString(),currentStep:Dr(e,r),level:e,message:t,details:r??{}}}var ie=class{constructor(t,r="info"){this.logDir=t;this.level=typeof r=="boolean"?r?"debug":"info":r,this.ensureLogFileReady();}logDir;startedAt=Date.now();marks=new Map;initPromise=null;writeQueue=Promise.resolve();writeError=null;level;get logPath(){return f.join(this.logDir,"crawl.log.jsonl")}get currentEventPath(){return f.join(this.logDir,"current-crawl-event.json")}get rejectedPath(){return f.join(this.logDir,"rejected.jsonl")}get ignoredPath(){return f.join(this.logDir,"ignored.jsonl")}get skippedPath(){return f.join(this.logDir,"skipped-http.jsonl")}get errorsPath(){return f.join(this.logDir,"errors.jsonl")}get timingsPath(){return f.join(this.logDir,"timings.jsonl")}ensureLogFileReady(){return this.initPromise||(this.initPromise=(async()=>{await b.mkdir(this.logDir,{recursive:true}),await b.writeFile(this.logPath,"","utf8");})()),this.initPromise}enqueueTask(t){this.writeQueue=this.writeQueue.then(t).catch(r=>{this.writeError=r instanceof Error?r:new Error(String(r));});}enqueueLine(t){this.enqueueTask(async()=>{await this.ensureLogFileReady(),await b.appendFile(this.logPath,`${t}
|
|
6
|
+
`,"utf8");});}enqueueJsonLine(t,r){this.enqueueTask(()=>$r(t,r));}updateCurrentEvent(t,r,s){let n=Or(t,r,s);this.enqueueTask(async()=>{await b.mkdir(this.logDir,{recursive:true}),await b.writeFile(this.currentEventPath,JSON.stringify(n,null,2),"utf8");});}push(t,r,s){let n=JSON.stringify({time:new Date().toISOString(),level:t,message:r,...s||{}});this.enqueueLine(n),this.updateCurrentEvent(t,r,s),t==="error"?console.error(r,s||""):t==="warn"?console.warn(r,s||""):(B[this.level]>=B.debug||["summary","page","sitemap","asset","timing"].includes(t))&&console.log(r);}info(t,r){this.push("info",t,r);}debug(t,r){B[this.level]<B.debug||this.push("debug",t,r);}progress(t,r){Lr("crawl.log.jsonl",t,r),this.updateCurrentEvent("progress",t,r);}checkpoint(t,r){this.updateCurrentEvent("checkpoint",t,r);}page(t,r){this.push("page",t,r);}sitemap(t,r){this.push("sitemap",t,r);}asset(t,r){this.push("asset",t,r);}warn(t,r){this.push("warn",t,r);}error(t,r){this.enqueueJsonLine(this.errorsPath,{message:t,...r||{}}),this.push("error",t,r);}summary(t,r){this.push("summary",t,r);}mark(t){this.marks.set(t,Date.now());}endMark(t,r){let s=this.marks.get(t);if(!s)return;let n=Date.now()-s,i={name:t,ms:n,seconds:Number((n/1e3).toFixed(2)),...r||{}};this.enqueueJsonLine(this.timingsPath,i),this.push("timing",`Timing ${t}: ${i.seconds}s`,i);}reject(t,r,s,n){let i={kind:t,url:r,reason:s,source:n};this.enqueueJsonLine(this.rejectedPath,i),B[this.level]>=B.debug&&this.push("reject",`Rejected ${t} ${r}: ${s}`,i);}ignore(t,r,s,n){let i={kind:t,url:r,reason:s,source:n};this.enqueueJsonLine(this.ignoredPath,i),B[this.level]>=B.debug&&this.push("ignore",`Ignored ${t} ${r}: ${s}`,i);}skip(t,r,s,n){let i={kind:t,url:r,status:s,source:n};this.enqueueJsonLine(this.skippedPath,i),this.push("warn",`Skipped ${t} ${r}: HTTP ${s}`,i);}async flush(){let t=Date.now()-this.startedAt,r={name:"total",ms:t,seconds:Number((t/1e3).toFixed(2))};if(this.enqueueJsonLine(this.timingsPath,r),await this.writeQueue,this.writeError)throw this.writeError}};var Le="(?:css|js|mjs|json|map|xml|xsl|rss|atom|txt|enc|jws|png|jpe?g|gif|webp|avif|svg|ico|woff2?|ttf|otf|eot|pdf|mp4|webm)";function ht(e){return !!e&&/^(?:\.{1,2}\/)?[A-Za-z0-9@_][A-Za-z0-9@._/-]*\.(?:js|mjs)(?:[?#][^\s<>\\]*)?$/i.test(e)&&!e.startsWith("/")&&!e.startsWith("//")&&!/^[a-z][a-z0-9+.-]*:/i.test(e)&&!/(?:^|\/)node_modules(?:\/|$)|(?:^|\/)\.pnpm(?:\/|$)/i.test(e)}function mt(e){let t=new Set,r=[],s=/\bimport\s*\(\s*["'`]([^"'`\s<>\\]+)["'`]\s*\)/g,n=/\b(?:[A-Za-z_$][\w$]*\.)?u\s*=\s*(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>\s*["'`]([^"'`\s<>\\]+)["'`]/g;for(let i of e.matchAll(s))i[1]&&ht(i[1])&&r.push({index:i.index??0,value:i[1]});for(let i of e.matchAll(n))i[1]&&ht(i[1])&&r.push({index:i.index??0,value:i[1]});for(let i of r.sort((u,l)=>u.index-l.index))t.add(i.value);return [...t]}var Ur=["text/css","javascript","image/","font/","application/font","application/json","application/xml","text/xml","application/rss+xml","application/atom+xml","application/xslt+xml","text/xsl","image/svg+xml"],Mt=new Set([".css",".js",".mjs",".json",".map",".xml",".xsl",".rss",".atom",".txt",".enc",".jws",".png",".jpg",".jpeg",".gif",".webp",".avif",".svg",".ico",".woff",".woff2",".ttf",".otf",".eot",".pdf",".mp4",".webm"]),It=new Set(["",".html",".htm"]),qr=new Set([".css",".xml",".xsl",".svg",".json",".html",".htm",".txt",".enc",".jws"]),Nr=["/wp-content/","/wp-includes/","/wp-admin/","/static/","/assets/","/build/","/_next/"];function Qr(e){let t=[],r="full",s="full",n=false,i=false;for(let u=0;u<e.length;u++){let l=e[u];if(l==="--retry-timeouts")r="retry-timeouts",n=true;else if(l==="--resume")n=true;else if(l==="--resume-rewrite")n=true,i=true;else if(l==="--crawl-mode"){let o=e[++u];if(!o)throw new Error("--crawl-mode requires a value");s=o==="incremental"?"incremental":"full",n||=s==="incremental";}else if(l.startsWith("--crawl-mode="))s=l.slice(13)==="incremental"?"incremental":"full",n||=s==="incremental";else if(l==="--incremental")s="incremental",n=true;else if(l==="--url"){let o=e[++u];if(!o)throw new Error("--url requires a value");r="single-url",n=true,t.push(o);}else if(l.startsWith("--url="))r="single-url",n=true,t.push(l.slice(6));else if(l==="--urls"){let o=e[++u];if(!o)throw new Error("--urls requires a file path");r="single-url",n=true,t.push(`@${o}`);}}return {mode:r,crawlMode:s,urls:t,preserveOutput:n,resumeRewrite:i}}function Ue(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?f.resolve(e):""}function Wr(){let e=Ue();return e?f.resolve(e,".."):""}function _r(){let e=process.env.STATIC_PUBLISHER_WP_ROOT||process.env.WPSUITE_STATIC_PUBLISHER_WP_ROOT||"";return e.trim()?f.resolve(e):""}function Br(e){let t=e.trim(),r=[{alias:"@storage-root",root:Wr(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@runtime",root:Ue(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@wp-root",root:_r(),requiredEnv:"STATIC_PUBLISHER_WP_ROOT or WPSUITE_STATIC_PUBLISHER_WP_ROOT"}];for(let s of r){if(t!==s.alias&&!t.startsWith(`${s.alias}/`))continue;if(!s.root)return {resolvedPath:null,alias:s.alias,requiredEnv:s.requiredEnv};let n=t.slice(s.alias.length).replace(/^\/+/,"");return {resolvedPath:n?f.resolve(s.root,n):s.root,alias:s.alias}}return {resolvedPath:f.resolve(t)}}function Lt(e){let t=Ue();return t?f.join(t,"crawl-manifest.json"):f.join(e.outputDir,".crawl-manifest.json")}function $t(){return {schemaVersion:3,updatedAt:"",pages:{},assets:{}}}function wt(e){return {url:String(e.url||""),outputPath:String(e.outputPath||""),contentType:typeof e.contentType=="string"&&e.contentType?e.contentType:null,changeToken:typeof e.changeToken=="string"?e.changeToken:null,tokenSource:typeof e.tokenSource=="string"?e.tokenSource:null,sitemapLastmod:typeof e.sitemapLastmod=="string"?e.sitemapLastmod:null,discoveredPages:Array.isArray(e.discoveredPages)?e.discoveredPages.map(t=>String(t)):[],discoveredAssets:Array.isArray(e.discoveredAssets)?e.discoveredAssets.map(t=>String(t)):[],lastCrawledAt:String(e.lastCrawledAt||""),lastSeenRunId:String(e.lastSeenRunId||""),rewriteComplete:e.rewriteComplete===true}}function Hr(e){let t=e.isText===true;return {url:String(e.url||""),outputPath:String(e.outputPath||""),isText:t,contentType:typeof e.contentType=="string"&&e.contentType?e.contentType:null,discoveredAssets:Array.isArray(e.discoveredAssets)?e.discoveredAssets.map(r=>String(r)):[],lastCrawledAt:String(e.lastCrawledAt||""),lastSeenRunId:String(e.lastSeenRunId||""),rewriteComplete:e.rewriteComplete===true||!t}}function Oe(e){let t=e?.["content-type"]?.trim();return t||null}function zr(){return {rewriteTargets:new Set,changedFiles:new Set,deletedFiles:new Set}}function N(e,t,r){let s=te(t.outputDir,r);s&&(e.changedFiles.add(s),e.deletedFiles.delete(s));}function Pt(e,t,r){let s=te(t.outputDir,r);s&&(e.deletedFiles.add(s),e.changedFiles.delete(s));}function ae(e,t){e.rewriteTargets.add(f.resolve(t));}async function Jr(e){try{let t=await b.readFile(Lt(e),"utf8"),r=JSON.parse(t);if(r&&typeof r=="object"&&r.pages&&typeof r.pages=="object"){if((r.schemaVersion===2||r.schemaVersion===3)&&r.assets&&typeof r.assets=="object")return {schemaVersion:3,updatedAt:String(r.updatedAt||""),pages:Object.fromEntries(Object.entries(r.pages).map(([s,n])=>[s,wt(n)])),assets:Object.fromEntries(Object.entries(r.assets).map(([s,n])=>[s,Hr(n)]))};if(r.schemaVersion===1)return {schemaVersion:3,updatedAt:String(r.updatedAt||""),pages:Object.fromEntries(Object.entries(r.pages).map(([s,n])=>[s,wt(n)])),assets:{}}}}catch{}return $t()}function Ee(e){return JSON.parse(JSON.stringify(e))}async function Vr(e,t){let r=Lt(e);await b.mkdir(f.dirname(r),{recursive:true}),await b.writeFile(r,JSON.stringify(t,null,2),"utf8");}async function Y(e,t){if(!t.trackManifest)return;let r=async()=>{let s=Ee(t.manifest);s.updatedAt=new Date().toISOString(),t.manifest.updatedAt=s.updatedAt,await Vr(e,s);};t.manifestSaveChain=t.manifestSaveChain.then(r,r),await t.manifestSaveChain;}function oe(e){if(!e)return null;let t=e.trim();return t||null}function Gr(e,t){let r=new Set,s=new Set([...Object.keys(e),...Object.keys(t)]);for(let n of s){let i=e[n],u=t[n];!i||!u||i===u||r.add(n);}return r}async function Zr(e,t,r,s){let n=[...new Set(r.map(l=>l.trim()).filter(Boolean))],i=String(e.wpsuite?.runtimeToken||"").trim();if(n.length===0||!i)return new Map;let u=new URL("/wp-json/smartcloud-static-publisher/v1/change-tokens",e.sourceOrigin).toString();try{let l=await t.post(u,{timeout:3e4,failOnStatusCode:!1,headers:{"content-type":"application/json","x-static-publisher-token":i},data:JSON.stringify({urls:n})});if(!l.ok())return s.warn(`Change token lookup failed with HTTP ${l.status()}`,{endpoint:u,status:l.status()}),new Map;let o=await l.json().catch(()=>null);if(!o||!Array.isArray(o.items))return new Map;let a=new Map;for(let p of o.items)!p||typeof p.url!="string"||a.set(p.url,p);return a}catch(l){return s.warn("Change token lookup failed; falling back to sitemap metadata",{endpoint:u,error:String(l)}),new Map}}async function $e(e,t,r,s,n){if(!r.enabled&&!r.trackManifest)return null;if(r.changeTokenCache.has(s))return r.changeTokenCache.get(s)??null;let u=(await Zr(e,t,[s],n)).get(s)??null;return Qe(e,s)&&(!u||u.supported!==true||!u.token)&&(u=await Xr(e,t,s,n)),u=Kr(e,u),r.changeTokenCache.set(s,u),u}function Yr(e){return `subscriber=${e.wpsuite?.siteSettings?.subscriber===true?"1":"0"}`}function Kr(e,t){if(!t?.supported||!t.token)return t;let r=Yr(e);return {...t,token:se(`${t.token}
|
|
7
7
|
${r}`,40),tokenSource:t.tokenSource?`${t.tokenSource}+site-subscriber`:"site-subscriber"}}async function Xr(e,t,r,s){try{let n=await t.get(r,{timeout:Math.min(e.navigationTimeoutMs,15e3),failOnStatusCode:!1});if(n.status()!==404)return s.warn(`Generated 404 fallback token skipped for ${r}`,{url:r,status:n.status(),requestPath:e.generated404RequestPath,source:"generated-404-change-token-fallback"}),null;let i=await n.text().catch(()=>""),u=se(`${r}
|
|
8
8
|
404
|
|
9
|
-
${i}`,40);return s.info(`Using generated 404 fallback change token for ${r}`,{url:r,requestPath:e.generated404RequestPath,source:"generated-404-change-token-fallback"}),{url:r,supported:!0,token:u,tokenSource:"generated-404-response-hash",postId:null,dependencyPostIds:[],reason:null}}catch(n){return s.warn(`Generated 404 fallback token lookup failed for ${r}`,{url:r,error:String(n),requestPath:e.generated404RequestPath,source:"generated-404-change-token-fallback"}),null}}async function es(e,t,r,s,n,i){let u=Qe(e,n);if(!s.enabled)return {action:"render",changeToken:s.trackManifest?await De(e,t,s,n,i):null};let l=s.manifest.pages[n];if(!l)return {action:"render",changeToken:await De(e,t,s,n,i)};let o=await De(e,t,s,n,i);if(o?.supported&&o.token)return l.changeToken===o.token?u&&!await ts(e,t,n,i)?{action:"render",changeToken:o}:{action:"reuse",changeToken:o}:{action:"render",changeToken:o};let a=oe(r.sitemapLastmodByPage[n]);return a&&l.sitemapLastmod&&l.sitemapLastmod===a?{action:"reuse",changeToken:o}:{action:"render",changeToken:o}}async function ts(e,t,r,s){try{let i=(await t.get(r,{timeout:Math.min(e.navigationTimeoutMs,15e3),failOnStatusCode:!1})).status();return i===404?!0:(s.warn(`Generated 404 request path no longer returns 404 for ${r}`,{url:r,status:i,requestPath:e.generated404RequestPath,source:"generated-404-status-probe"}),!1)}catch(n){return s.warn(`Generated 404 status probe failed for ${r}`,{url:r,error:String(n),requestPath:e.generated404RequestPath,source:"generated-404-status-probe"}),false}}async function rs(e,t,r,s,n){let i=bt(r.previousManifest,void 0,s,"previous-manifest"),u=0;for(let[c,g]of Object.entries(r.manifest.pages))if(!r.seenPages.has(c)){Pt(n,e,g.outputPath);try{await b.unlink(g.outputPath);}catch(h){(h.code||"")!=="ENOENT"&&s.warn(`Failed to remove stale incremental page output for ${c}`,{url:c,outputPath:g.outputPath,error:String(h)});}delete r.manifest.pages[c],u++;}let l=bt(r.manifest,r.runId,s,"active-manifest"),o=new Set,a=new Set;for(let c of l){for(let m of ue(e,c))o.add(m);let g=r.manifest.assets[c]?.outputPath;g&&a.add(g);let h=le(e,t.assetMap,c);h&&a.add(h);}for(let c of Object.keys(r.manifest.assets))l.has(c)||delete r.manifest.assets[c];let p=0,d=0;for(let c of i){let g=new Set,h=r.previousManifest.assets[c]?.outputPath;h&&g.add(h);let m=le(e,t.assetMap,c);if(!l.has(c)&&m)g.add(m);else if(!l.has(c)){let w=bs(e,c,s,"incremental-cleanup");w&&(g.add(w.originalFilePath),w.hashedFilePath&&g.add(w.hashedFilePath));}for(let w of g)if(!a.has(w)){Pt(n,e,w);try{await b.unlink(w),p++;}catch(T){(T.code||"")!=="ENOENT"&&s.warn(`Failed to remove stale incremental asset output for ${c}`,{url:c,outputPath:w,error:String(T)});}}for(let w of ue(e,c))o.has(w)||Object.prototype.hasOwnProperty.call(t.assetMap,w)&&(delete t.assetMap[w],d++);}(u>0||p>0||d>0)&&s.info(`Incremental cleanup removed ${u} stale pages, ${p} stale assets, ${d} stale asset mappings`,{removedPages:u,removedAssets:p,removedAssetMappings:d,phase:"incremental-cleanup"});}function bt(e,t,r,s){let n=new Set,i=u=>{let l=u.trim();if(l){if(r){let o=V(l,r,"asset",s??"manifest");if(!o)return;n.add(o.toString());return}n.add(l);}};for(let u of Object.values(e.pages))for(let l of u.discoveredAssets||[])i(l);for(let[u,l]of Object.entries(e.assets||{}))t&&l.lastSeenRunId!==t||i(u);return n}function St(e,t,r){for(let s of t)for(let n of ue(e,s))if(r.has(n))return true;return false}function ss(e,t,r,s,n){let i=new Set(r.rewriteTargets);for(let l of Object.values(t.manifest.pages))l.rewriteComplete||i.add(f.resolve(l.outputPath));for(let l of Object.values(t.manifest.assets))l.isText&&!l.rewriteComplete&&i.add(f.resolve(l.outputPath));let u=Gr(s,n);if(u.size===0)return [...i];for(let l of Object.values(t.manifest.pages))St(e,l.discoveredAssets,u)&&i.add(f.resolve(l.outputPath));for(let[l,o]of Object.entries(t.manifest.assets)){o.isText&&St(e,o.discoveredAssets,u)&&i.add(f.resolve(o.outputPath));for(let a of ue(e,l))if(u.has(a)){N(r,e,o.outputPath),o.isText&&i.add(f.resolve(o.outputPath));break}}return [...i]}function ns(e,t){let r=t?new Set(Array.from(t,n=>f.resolve(n))):null,s=n=>r===null||r.has(f.resolve(n));for(let n of Object.values(e.manifest.pages))s(n.outputPath)&&(n.rewriteComplete=true);for(let n of Object.values(e.manifest.assets)){if(!n.isText){n.rewriteComplete=true;continue}s(n.outputPath)&&(n.rewriteComplete=true);}}function is(e,t,r){let s=new Set,n=i=>{if(!i)return;let u=te(e.outputDir,i);u&&s.add(u);};for(let i of t.donePages)n(H(e,i));for(let i of Object.values(r.manifest.pages))i.lastSeenRunId===r.runId&&n(i.outputPath);for(let i of t.doneAssets)n(le(e,t.assetMap,i));for(let i of Object.values(r.manifest.assets))i.lastSeenRunId===r.runId&&n(i.outputPath);return s}async function os(e,t,r,s,n){let i=[...s.deletedFiles].sort(),u=is(e,t,r),l=0;for(let p of [...u].sort()){try{if((await b.stat(f.join(e.outputDir,p))).isFile())continue}catch{}l++,n.warn(`Active output is missing after crawl: ${p}`,{phase:"deploy-plan",file:p,outputPath:f.join(e.outputDir,p)});}if(l>0&&n.warn(`Detected ${l} active output file(s) missing before deploy plan save.`,{phase:"deploy-plan",missingActiveOutputs:l}),i.length===0)return [];let o=[],a=0;for(let p of i){if(!u.has(p)){o.push(p);continue}a++;let d=f.join(e.outputDir,p),c;try{c=(await b.stat(d)).isFile();}catch{c=false;}n.warn(`Deploy plan protected active output from deletion: ${p}`,{phase:"deploy-plan",file:p,outputPath:d,exists:c});}return a>0&&n.info(`Deploy plan skipped ${a} active output deletion(s).`,{phase:"deploy-plan",protectedDeletes:a,deletedFiles:o.length}),o}function ue(e,t){let r=new Set([t]);try{let s=new URL(t),i=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{i.push(new URL(e.targetOrigin).origin);}catch{}for(let u of i)try{r.add(new URL(u).origin+s.pathname+s.search);}catch{}r.add(s.pathname+s.search),r.add(s.pathname);}catch{}return [...r]}function as(e,t){let r=new Set([t]);try{let s=new URL(t),i=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{i.push(new URL(e.targetOrigin).origin);}catch{}for(let u of i)try{r.add(new URL(u).origin+s.pathname+s.search);}catch{}r.add(s.pathname+s.search);}catch{}return [...r]}function $t(e,t){let r=e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/"?e.targetOrigin:"https://relative.invalid/";try{let s=new URL(t,r);return f.join(e.outputDir,Ne(s.pathname))}catch{return null}}function us(e,t,r){for(let s of as(e,r)){let n=t[s];if(!n)continue;let i=$t(e,n);if(i)return {outputPath:i,publicUrl:n}}return null}function ls(e,t,r){for(let s of ue(e,r)){let n=t[s];if(!n)continue;let i=$t(e,n);if(i)return i}return null}function le(e,t,r){let s=ls(e,t,r);if(s)return s;try{return We(e,r).originalFilePath}catch{return null}}function cs(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?f.join(f.resolve(e),"queue-runner-heartbeat.json"):""}async function yt(e){let t=cs();if(t)try{let r=await b.readFile(t,"utf8"),s=JSON.parse(r);if(!s||typeof s!="object")return;await b.writeFile(t,JSON.stringify({...s,checkedAt:new Date().toISOString(),status:"running",currentStep:"rewrite",message:e},null,2),"utf8");}catch{}}function ds(e,t){let r=new Set;for(let s of t.donePages)r.add(f.resolve(H(e,s)));for(let s of t.doneAssets){let n=le(e,t.assetMap,s);!n||!J(n)||r.add(f.resolve(n));}return [...r]}var be="re:",me=new Map;function ps(e){if(!e.startsWith(be))return null;let t=me.get(e);if(t!==void 0)return t||null;let r=e.slice(be.length).trim();if(!r)return me.set(e,false),null;try{let s=new RegExp(r);return me.set(e,s),s}catch{return console.warn(`[crawl] Ignoring invalid path matcher regex: ${e}`),me.set(e,false),null}}function qe(e,t){let r=ps(t);return r?r.test(e):t.startsWith(be)?false:e.startsWith(t)}function gs(e,t){return t.find(r=>qe(e,r))}function Ot(e,t){let r=gs(t.pathname,e.blockedPathPrefixes);if(r)return r.startsWith(be)?`blocked path regex: ${r}`:`blocked path prefix: ${r}`;let s=e.blockedSearchFragments.find(n=>t.search.includes(n));return s?`blocked search fragment: ${s}`:null}function fs(e){let t=new URL(e.sourceOrigin),r=new Set([t.hostname,...e.allowedAssetHosts]);if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{r.add(new URL(e.targetOrigin).hostname);}catch{}for(let s of Object.keys(e.extraReplacements||{}))try{r.add(new URL(s).hostname);}catch{}return r}function hs(e,t){return fs(e).has(t.hostname)}function ms(e){let t=U(e.trim()).replace(/\\\//g,"/").replace(/^['"]|['"]$/g,"").trim();return t=t.replace(/[)]+$/g,"").trim(),t=t.replace(/;.*$/g,"").trim(),t}function je(e){let t=U(e).replace(/\\\//g,"/");return /[{}]|\bwindow\.|\blocation\.|\bincludes\(|\?\?null|\+|%7B|%7D|%22|<|>|\s/.test(t)||/[()[\]'"]/.test(t)}function ws(e){let t=U(e).replace(/\\\//g,"/").trim(),r=f.extname(t).toLowerCase();return Mt.has(r)||It.has(r)?false:/^(?:this|[A-Za-z_$][\w$]*)\.[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/.test(t)}function Y(e){return Nr.some(t=>e.pathname.startsWith(t))}function L(e,t,r=e.sourceOrigin,s,n="url"){let i=ms(t);if(!i||i.startsWith("data:")||i.startsWith("blob:")||i.startsWith("mailto:")||i.startsWith("tel:")||i.startsWith("#"))return s?.ignore(n,t,"empty or unsupported scheme",r),null;if(je(i))return s?.ignore(n,t,"looks like JavaScript/code fragment",r),null;if(ws(i))return s?.ignore(n,t,"looks like JavaScript property access",r),null;try{let u=new URL(i,r);if(Et(u))return s?.reject(n,t,"malformed URL encoding",r),null;if(!["http:","https:"].includes(u.protocol))return s?.ignore(n,t,"unsupported protocol: ",r),null;if(!hs(e,u))return s?.ignore(n,u.toString(),"host not allowed",r),null;let l=Ot(e,u);if(l)return s?.reject(n,u.toString(),l,r),null;let o=new URL(e.sourceOrigin);return u.protocol=o.protocol,u.host=o.host,u.hash="",u}catch{return s?.reject(n,t,"invalid URL",r),null}}function Et(e){try{return decodeURIComponent(e.pathname),decodeURIComponent(e.search),decodeURIComponent(e.hash),!1}catch{return true}}function V(e,t,r,s){try{let n=new URL(e);return Et(n)?(t.reject(r,e,"malformed URL encoding",s),null):n.protocol!=="http:"&&n.protocol!=="https:"?(t.reject(r,e,`unsupported protocol: ${n.protocol}`,s),null):n}catch{return t.reject(r,e,"invalid URL",s),null}}function jt(e){return Mt.has(f.extname(e.pathname).toLowerCase())}function G(e){return Y(e)?false:It.has(f.extname(e.pathname).toLowerCase())}function pe(e){let t=e.pathname.toLowerCase();return t.endsWith(".xml")&&(t.includes("sitemap")||t.endsWith("/sitemap.xml"))}function A(e,t){return !!(pe(t)||t.pathname==="/robots.txt"||t.pathname==="/llms.txt"||t.pathname.toLowerCase().endsWith(".xsl")||e.assetPathPrefixes.length>0&&e.assetPathPrefixes.some(r=>qe(t.pathname,r))||jt(t)||!G(t)&&!Y(t))}function H(e,t){let r=new URL(t),s=Ne(r.pathname);return s.endsWith("/")?s+="index.html":f.extname(s)||(s+="/index.html"),f.join(e.outputDir,s)}function Ne(e){try{return decodeURIComponent(e)}catch{return e}}function Ps(e){if(!e.generated404RequestPath)return null;try{let t=new URL(e.generated404RequestPath,e.sourceOrigin);return !t.pathname.endsWith("/")&&f.extname(t.pathname)===""&&(t.pathname+="/"),t.hash="",t.toString()}catch{return null}}function Qe(e,t){let r=Ps(e);if(!r)return false;try{return new URL(t,e.sourceOrigin).toString()===r}catch{return false}}function We(e,t){let r=new URL(t),s=Ne(r.pathname);s.endsWith("/")&&(s+="index.html");let n=!!r.search,i=s,u=f.join(e.outputDir,i),l=Te(e.targetOrigin,i),o=`${l}${r.search}`;if(!n)return {originalPathname:i,originalFilePath:u,originalPublicUrl:l,originalPublicUrlWithSearch:o,preferQueryHashed:n};let a=f.extname(s),d=`${a?s.slice(0,-a.length):s}.${se(r.search)}${a||".bin"}`;return {originalPathname:i,originalFilePath:u,originalPublicUrl:l,originalPublicUrlWithSearch:o,preferQueryHashed:n,hashedPathname:d,hashedFilePath:f.join(e.outputDir,d),hashedPublicUrl:Te(e.targetOrigin,d)}}function bs(e,t,r,s){let n=V(t,r,"asset",s);return n?We(e,n.toString()):null}function Ss(e,t,r,s,n){t[r]=s;try{let i=new URL(r),l=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{l.push(new URL(e.targetOrigin).origin);}catch{}for(let o of l)try{let a=new URL(o);t[a.origin+i.pathname+i.search]=s;}catch{}try{let o=(()=>{let a=new URL(s,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin);return `${a.pathname}${a.search}`})();t[i.pathname+i.search]=o;}catch{}try{let o=new URL(s,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[i.pathname]=o;}catch{}try{let o=new URL(n,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[i.pathname]=o;}catch{}}catch{}}async function Ft(e){try{return await b.readFile(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}async function Ut(e){try{return await b.stat(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}function ys(e){let t=String(e["content-length"]||"").trim();if(!t)return null;let r=Number.parseInt(t,10);return Number.isFinite(r)&&r>=0?r:null}function qt(e){let t=String(e["last-modified"]||"").trim();if(!t)return null;let r=Date.parse(t);return Number.isFinite(r)?r:null}function vs(e,t){let r=qt(t),s=ys(t),n=e?.mtime.getTime();return r!==null&&Math.abs((n??0)-r)>=1e3||s!==null&&e?.size!==s?false:r!==null||s!==null}async function Cs(e,t){if(!t)return;let r=qt(t);if(r===null)return;let s=await Ut(e);if(!s)return;let n=new Date(r);await b.utimes(e,s.atime,n).catch(()=>{});}function vt(e,t){let r=f.extname(e.pathname).toLowerCase(),s=t["content-type"]||"";return qr.has(r)||Ur.some(n=>s.includes(n))&&!s.startsWith("image/")&&!s.includes("font")}function Rs(e){try{let t=f.extname(new URL(e).pathname).toLowerCase();return t===".js"||t===".mjs"}catch{return false}}function we(e,t){(e.doneAssets.size%25===0||e.doneAssets.size===1||e.doneAssets.size===e.stats.assetsQueued)&&t.progress(`Asset download progress: processed ${e.doneAssets.size}, discovered ${e.stats.assetsQueued}.`,{doneAssets:e.doneAssets.size,assetsQueued:e.stats.assetsQueued,phase:"download-assets"});}function ks(e){return se(e.toString("base64"),40)}function xs(e,t,r){let s=e.assetVariantDigestsByOriginalPath.get(t);if(!s||s.size===0)return false;for(let n of s)if(n!==r)return true;return false}function Ts(e,t,r){let s=e.assetVariantDigestsByOriginalPath.get(t);s||(s=new Set,e.assetVariantDigestsByOriginalPath.set(t,s)),s.add(r);}async function Fe(e,t,r,s,n,i,u){let l=We(e,r),o=ks(s),a=l.originalFilePath,p=l.originalPublicUrlWithSearch;if(l.preferQueryHashed&&l.hashedFilePath&&l.hashedPublicUrl&&xs(n,l.originalFilePath,o)){let h=us(e,t,r);h?(a=h.outputPath,p=h.publicUrl):(a=l.hashedFilePath,p=l.hashedPublicUrl);}Ss(e,t,r,p,l.originalPublicUrl);let d=J(a)?Buffer.from(Ie(s.toString("utf8"),e,t,a),"utf8"):s,c=await Ft(a),g=false;return (c===null||!c.equals(d))&&(await ne(a,d),g=true),i?.debug(`${g?"Saved":"Skipped unchanged"} asset output ${r}`,{phase:"download-assets",url:r,outputPath:a,bytes:d.length,wroteFile:g}),Ts(n,l.originalFilePath,o),await Cs(a,u),n.stats.assetsSaved++,i&&(n.stats.assetsSaved%50===0||n.stats.assetsSaved===1)&&i.progress(`Asset progress: saved ${n.stats.assetsSaved}, discovered ${n.stats.assetsQueued}, pending ${n.assetQueue.length}.`,{assetsSaved:n.stats.assetsSaved,assetsQueued:n.stats.assetsQueued,assetQueue:n.assetQueue.length,phase:"download-assets"}),{outputPath:a,publicUrl:p,wroteFile:g}}function ce(e,t,r,s,n){let i=()=>{let d=String(n??"").trim();if(!d)return {discoveredFrom:"",discoveredFromType:"unknown"};if(d==="seed-path"||d==="cli"||d==="generated-404-request-path")return {discoveredFrom:d,discoveredFromType:d};if(/^https?:\/\//i.test(d))try{let c=new URL(d);return pe(c)?{discoveredFrom:d,discoveredFromType:"sitemap"}:A(e,c)?{discoveredFrom:d,discoveredFromType:"asset"}:G(c)&&!Y(c)?{discoveredFrom:d,discoveredFromType:"page"}:{discoveredFrom:d,discoveredFromType:"url"}}catch{return {discoveredFrom:d,discoveredFromType:"url"}}return {discoveredFrom:d,discoveredFromType:"url"}},u=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,l=L(e,r,u,s,"page");if(!l)return;if(!G(l)||jt(l)){if(A(e,l)){s.info(`Seeded/non-page URL queued as asset: ${l.toString()}`,{url:l.toString(),source:n}),D(e,t,l.toString(),s,n);return}s.reject("page",l.toString(),Y(l)?"asset/internal path cannot be page":"not page-like",n);return}let o=l.toString(),{discoveredFrom:a,discoveredFromType:p}=i();a&&!t.pageDiscoverySources.has(o)&&t.pageDiscoverySources.set(o,a),!t.donePages.has(o)&&!t.queuedPages.has(o)&&(t.queuedPages.add(o),t.pageQueue.push(o),t.stats.pagesQueued++,s.debug(`Queued discovered page ${o}`,{phase:"discovery",url:o,discoveredFrom:a,discoveredFromType:p,outputPath:H(e,o)}),(t.stats.pagesQueued%25===0||t.stats.pagesQueued===1)&&s.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,pageQueue:t.pageQueue.length,phase:"discovery"}));}function D(e,t,r,s,n){let i=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,u=L(e,r,i,s,"asset");if(!u)return;if(!A(e,u)){s.reject("asset",u.toString(),"not a safe asset path/prefix",n);return}let l=u.toString();!t.doneAssets.has(l)&&!t.queuedAssets.has(l)&&(t.queuedAssets.add(l),t.assetQueue.push(l),t.stats.assetsQueued++,(t.stats.assetsQueued%100===0||t.stats.assetsQueued===1)&&s.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,assetQueue:t.assetQueue.length,phase:"discovery"}));}function _e(e,t,r,s,n){let i=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,u=L(e,r,i,s,"sitemap");if(!u)return;if(!pe(u)){s.reject("sitemap",u.toString(),"not sitemap-like",n);return}let l=u.toString();!t.doneSitemaps.has(l)&&!t.queuedSitemaps.has(l)&&(t.queuedSitemaps.add(l),t.sitemapQueue.push(l),t.stats.sitemapsQueued++,(t.stats.sitemapsQueued%10===0||t.stats.sitemapsQueued===1)&&s.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,sitemapQueue:t.sitemapQueue.length,phase:"discovery"}));}function As(e){let t=U(e),r=[...t.matchAll(/<url>\s*([\s\S]*?)\s*<\/url>/gi)].map(s=>s[1]);return r.length>0?r.map(s=>{let n=s.match(/<loc>\s*([^<]+?)\s*<\/loc>/i);if(!n?.[1])return null;let i=s.match(/<lastmod>\s*([^<]+?)\s*<\/lastmod>/i);return {loc:n[1].trim(),lastmod:oe(i?.[1]??null)}}).filter(s=>!!s):[...t.matchAll(/<loc>\s*([^<]+?)\s*<\/loc>/gi)].map(s=>({loc:s[1].trim(),lastmod:null})).filter(s=>s.loc)}function Ms(e){return e.split(",").map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function Is(e){let t=[],r=/url\(\s*(?:"([^"]+)"|'([^']+)'|([^)]*?))\s*\)/gi;for(let s of e.matchAll(r)){let n=e.slice(Math.max(0,s.index-8),s.index);if(/\bnew\s+$/i.test(n))continue;let i=(s[1]||s[2]||s[3]||"").trim();i&&t.push(i);}return t}function Ls(e){return e.replace(/<script\b[^>]*>[\s\S]*?<\/script\s*>/gi,"")}function Ds(e,t){if(t==="dom-style")return true;let r=(()=>{try{return f.extname(new URL(e).pathname).toLowerCase()}catch{return ""}})();return !(r===".js"||r===".mjs"||r===".map"||t.includes("javascript"))}function $e(e){return e.trim().replace(/\\/g,"/").replace(/^https?:\/\/[^/]+/i,"").replace(/^\/+/,"")}async function Nt(e,t,r,s){let n=[];await b.mkdir(t,{recursive:true});let i=await b.readdir(e,{withFileTypes:true});for(let u of i){let l=f.join(e,u.name),o=f.join(t,u.name);if(u.isDirectory()){n.push(...await Nt(l,o,r,s));continue}await Qt(l,o,r,s)&&n.push(o);}return n}async function $s(e,t){try{let[r,s]=await Promise.all([b.stat(e),b.stat(t)]);if(r.size!==s.size)return !1;let[n,i]=await Promise.all([b.readFile(e),b.readFile(t)]);return n.equals(i)}catch{return false}}async function Qt(e,t,r,s){let n=f.resolve(t);return r.has(n)?(s.debug("Skipped post-crawl copy over crawled page output",{phase:"copy-extra-paths",sourcePath:e,targetPath:t}),false):await $s(e,t)?(s.debug("Skipped unchanged post-crawl copy target",{phase:"copy-extra-paths",sourcePath:e,targetPath:t}),false):(await b.mkdir(f.dirname(t),{recursive:true}),await b.copyFile(e,t),true)}async function Os(e,t,r){let s=Object.entries(e.postCrawlCopyMap||{}).map(([l,o])=>({sourcePath:l.trim(),prefix:String(o||"").trim()}));if(s.length===0)return [];let n=0,i=[],u=new Set([...t.donePages].map(l=>f.resolve(H(e,l))));r.mark("copy-extra-paths");for(let l of s){let o=l.sourcePath,a=l.prefix;if(!o||!a){r.warn("Skipped post-crawl copy mapping with empty key/value",{sourcePath:o,prefixPath:a});continue}let p=Br(o);if(!p.resolvedPath){r.warn("Skipped post-crawl copy source because alias root is not configured",{sourcePath:o,alias:p.alias||"",requiredEnv:p.requiredEnv||"",prefixPath:a});continue}let d=p.resolvedPath,c=$e(a);if(!c){r.warn("Skipped post-crawl copy mapping with invalid export prefix",{sourcePath:o,prefixPath:a});continue}let g;try{g=await b.stat(d);}catch{r.warn("Skipped post-crawl copy source because it does not exist",{sourcePath:o,sourceAbs:d,prefixPath:a});continue}let h=f.resolve(e.outputDir,c);if(g.isDirectory()){let k=await Nt(d,h,u,r);i.push(...k),n+=k.length,k.length>0&&r.progress(`Copied static directory to export: ${d} -> /${c}`,{phase:"copy-extra-paths",sourcePath:d,targetPath:`/${c}`,copiedItems:n,changedFiles:k.length});continue}let m=f.basename(d),w=a.endsWith("/")?f.join(h,m):h;await Qt(d,w,u,r)&&(i.push(w),n++,r.progress(`Copied static file to export: ${d} -> /${$e(a.endsWith("/")?`${a}${m}`:a)}`,{phase:"copy-extra-paths",sourcePath:d,targetPath:`/${$e(a.endsWith("/")?`${a}${m}`:a)}`,copiedItems:n}));}return r.endMark("copy-extra-paths",{mappedSources:s.length,copiedItems:n}),i}function de(e,t,r,s,n){let i=new Set,u=U(r).replace(/\\\//g,"/"),l=n==="page-html"?Ls(u):u,o=Ds(t,n);if(o){for(let p of Is(l)){let d=L(e,p,t,s,`${n}:css-url`);d&&A(e,d)&&i.add(d.toString());}for(let p of l.matchAll(/@import\s+(?:url\()?\s*['"]?([^'"\s;]+)['"]?\s*\)?/gi)){let d=L(e,p[1],t,s,`${n}:css-import`);d&&A(e,d)&&i.add(d.toString());}}if(o||n==="page-html")for(let p of l.matchAll(/<\?xml-stylesheet[^>]+href=["']([^"']+)["'][^>]*\?>/gi)){let d=L(e,p[1],t,s,`${n}:xml-stylesheet`);d&&A(e,d)&&i.add(d.toString());}let a=new RegExp(`(?:https?:)?//[^\\s'"<>\\);]+\\.${Le}(?:\\?[^\\s'"<>\\);]*)?|(?<!\\.)/[^\\s'"<>\\);]+\\.${Le}(?:\\?[^\\s'"<>\\);]*)?`,"gi");for(let p of u.matchAll(a)){let d=p[0].startsWith("//")?`${new URL(e.sourceOrigin).protocol}${p[0]}`:p[0];if(je(d)){s.ignore(`${n}:serialized-url`,d,"looks like JavaScript/code fragment",t);continue}let c=L(e,d,t,s,`${n}:serialized-url`);c&&A(e,c)?i.add(c.toString()):c&&s.ignore("asset",c.toString(),"serialized URL did not pass safe asset path filter",t);}if(n!=="page-html"&&Rs(t))for(let p of mt(u)){if(je(p)||!/\.(?:js|mjs)(?:[?#]|$)/i.test(p))continue;let d=L(e,p,t,s,`${n}:relative-asset`);d&&A(e,d)&&i.add(d.toString());}return [...i]}function Es(e,t,r,s){let n=new Set,i=U(r);for(let u of i.matchAll(/href=["']([^"'#\s][^"']*?)["']/gi)){let l=u[1],o=L(e,l,t,s,"page-link");o&&(Ot(e,o)||G(o)&&!Y(o)&&!A(e,o)&&n.add(o.toString()));}return [...n]}async function Ct(e,t,r,s,n){for(;r.sitemapQueue.length>0;){let i=r.sitemapQueue.shift();r.queuedSitemaps.delete(i);let u=V(i,s,"sitemap","sitemap-queue");if(!u)continue;let l=u.toString();if(!r.doneSitemaps.has(l)){r.doneSitemaps.add(l),s.sitemap(`Fetching sitemap ${l}`,{url:l});try{let o=await t.get(l,{timeout:6e4});if(!o.ok()){s.skip("sitemap",l,o.status());continue}let a=await o.body(),p=o.url()||l,d=V(p,s,"sitemap-response",l);if(!d)continue;let c=d.toString(),g=await Fe(e,r.assetMap,c,a,r,s);N(n,e,g.outputPath),ae(n,g.outputPath);let h=a.toString("utf8");for(let m of de(e,c,h,s,"sitemap"))D(e,r,m,s,c);for(let m of As(h)){let w=L(e,m.loc,c,s,"sitemap-loc");w&&(pe(w)?_e(e,r,w.toString(),s,c):A(e,w)?D(e,r,w.toString(),s,c):G(w)?(m.lastmod&&(r.sitemapLastmodByPage[w.toString()]=m.lastmod),ce(e,r,w.toString(),s,c)):s.reject("sitemap-loc",w.toString(),"not page/sitemap/asset-like",c));}}catch(o){s.error(`Failed sitemap ${l}`,{url:l,error:String(o)});}}}}async function js(e,t,r,s,n,i,u){let l=L(e,s,e.sourceOrigin,n,"asset-fetch");if(!l||!A(e,l))return;let o=l.toString();if(r.doneAssets.has(o))return;let a=i.enabled?i.previousManifest.assets[o]:void 0,p=(d,c={})=>{if(!a)return false;i.manifest.assets[o]={...a,discoveredAssets:[...a.discoveredAssets||[]],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId},delete i.manifest.pages[o],r.doneAssets.add(o);for(let g of a.discoveredAssets||[])D(e,r,g,n,o);return n.warn(`Keeping previous incremental asset ${o} after fetch issue.`,{url:o,reason:d,preservedFromPreviousManifest:true,...c,phase:"download-assets"}),we(r,n),true};n.asset(`Fetching asset ${o}`,{url:o});try{let d=le(e,r.assetMap,o),c=d?await Ut(d):null;if(d&&c)try{let C=await M(`fetch asset headers ${o}`,6e4,()=>t.head(o,{timeout:6e4})),R=C.headers();if(C.ok()&&vs(c,R)){let $=await Ft(d);if($!==null){let Q=C.url()||o,S=V(Q,n,"asset-response",o);if(!S)return;let v=S.toString(),W=await Fe(e,r.assetMap,v,$,r,n,R);W.wroteFile&&(N(u,e,W.outputPath),J(W.outputPath)&&ae(u,W.outputPath)),r.doneAssets.add(o),n.info(`Reused existing asset ${o} based on response headers.`,{url:o,filePath:d,lastModified:R["last-modified"]||"",contentLength:R["content-length"]||"",phase:"download-assets"}),we(r,n);let X=vt(l,R),Se=a?.discoveredAssets?[...a.discoveredAssets]:[];if(X||a?.isText){let ee=$.toString("utf8"),He=de(e,v,ee,n,"asset:cached");(He.length>0||!a)&&(Se=He);for(let Bt of Se)D(e,r,Bt,n,v);}if(i.trackManifest){let ee=X||!!a?.isText;i.manifest.assets[o]={url:o,outputPath:W.outputPath,isText:ee,contentType:Oe(R)||a?.contentType||null,discoveredAssets:Se,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!ee},delete i.manifest.pages[o],i.enabled&&ee&&await K(e,i);}return}}}catch{}let g=await M(`fetch asset ${o}`,6e4,()=>t.get(o,{timeout:6e4}));if(!g.ok()){if(p(`http-${g.status()}`,{status:g.status()}))return;n.skip("asset",o,g.status());return}let h=await M(`read asset response ${o}`,6e4,()=>g.body()),m=g.url()||o,w=V(m,n,"asset-response",o);if(!w)return;let T=w.toString(),k=g.headers(),x=await Fe(e,r.assetMap,T,h,r,n,k);x.wroteFile&&(N(u,e,x.outputPath),J(x.outputPath)&&ae(u,x.outputPath)),r.doneAssets.add(o),we(r,n);let P=vt(l,k),y=[];if(P){let C=h.toString("utf8");y=de(e,T,C,n,`asset:${f.extname(l.pathname).toLowerCase()||k["content-type"]||"unknown"}`);for(let R of y)D(e,r,R,n,T);}i.trackManifest&&(i.manifest.assets[o]={url:o,outputPath:x.outputPath,isText:P,contentType:Oe(k),discoveredAssets:y,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!P},delete i.manifest.pages[o],i.enabled&&P&&await K(e,i));}catch(d){if(p("fetch-error",{error:String(d)}))return;n.error(`Failed asset ${o}`,{url:o,error:String(d)});}finally{r.doneAssets.has(o)||(r.doneAssets.add(o),we(r,n));}}async function Fs(e,t,r,s,n,i){let u=Math.max(1,Number(e.assetDownloadConcurrency||e.concurrency||1)),l=Array.from({length:u},async()=>{for(;r.assetQueue.length>0;){let o=r.assetQueue.shift();o&&(r.queuedAssets.delete(o),await js(e,t,r,o,s,n,i));}});await Promise.all(l);}function Us(e){let t=Math.ceil(e/1e3);return `${t} second${t===1?"":"s"}`}function q(e){return Math.max(6e4,e.navigationTimeoutMs*2,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+15e3)}function Pe(e){return Math.max(15e3,Math.min(6e4,q(e)))}function qs(e){return Math.max(15e3,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+1e4)}function Be(e){return e.stats.pagesCompleted}function Wt(e){let r=e.options?.browserProcess;return {pid:typeof r?.process?.pid=="number"?r.process.pid:null,kill:typeof r?.kill=="function"?r.kill.bind(r):null}}async function Ns(e,t,r){let s=Wt(e);try{if(s.kill){await s.kill(),t.warn(`Force-killed crawl worker browser after ${r}`,{browserPid:s.pid,reason:r});return}if(s.pid!==null){process.kill(s.pid,"SIGKILL"),t.warn(`Sent SIGKILL to crawl worker browser after ${r}`,{browserPid:s.pid,reason:r});return}t.warn(`Could not resolve crawl worker browser PID after ${r}`,{reason:r});}catch(n){t.error(`Failed to force-kill crawl worker browser after ${r}`,{browserPid:s.pid,reason:r,error:String(n)});}}async function M(e,t,r){let s;try{return await Promise.race([r(),new Promise((n,i)=>{s=globalThis.setTimeout(()=>{i(new Error(`${e} timed out after ${Us(t)}.`));},t);})])}finally{s!==void 0&&globalThis.clearTimeout(s);}}async function Qs(e,t){let r=qs(e);await t.evaluate(async s=>{await new Promise(n=>{let i=0,u=700,l=Date.now(),o=()=>{window.clearInterval(a),window.scrollTo(0,0),n();},a=window.setInterval(()=>{if(Date.now()-l>=s.maxDurationMs){o();return}window.scrollBy(0,u),i+=u;let p=document.body?.scrollHeight||0,d=document.documentElement?.scrollHeight||0,c=Math.max(p,d);i>=c+window.innerHeight&&o();},120);});},{maxDurationMs:r});}async function Ws(e,t){await t.waitForLoadState("domcontentloaded",{timeout:e.readiness.timeoutMs}).catch(()=>{}),e.readiness.waitForSelector&&await t.waitForSelector(e.readiness.waitForSelector,{timeout:e.readiness.timeoutMs}).catch(()=>{}),e.readiness.waitForFunction&&await t.waitForFunction(e.readiness.waitForFunction,void 0,{timeout:e.readiness.timeoutMs}).catch(()=>{}),await Qs(e,t),await t.waitForTimeout(e.readiness.fallbackWaitMs);}async function _s(e,t){await t.waitForLoadState("domcontentloaded",{timeout:e.readiness.timeoutMs}).catch(()=>{}),await t.waitForLoadState("load",{timeout:e.readiness.timeoutMs}).catch(()=>{}),e.readiness.waitForSelector&&await t.waitForSelector(e.readiness.waitForSelector,{timeout:e.readiness.timeoutMs}).catch(()=>{}),await t.waitForTimeout(e.readiness.fallbackWaitMs);}function Bs(e,t){return e.noJavaScriptRenderPathPrefixes.some(r=>qe(t,r))}async function Hs(e,t,r,s,n=true){let i=new Set;if(n){let l=await t.evaluate(()=>{let o=new Set,a=["href","src","poster","data-src","data-lazy-src","data-original","data-bg","data-background","data-href"],p=new Set,d=["srcset","data-srcset","data-lazy-srcset"];return document.querySelectorAll("*").forEach(c=>{for(let h of a){let m=c.getAttribute(h);m&&o.add(m);}for(let h of d){let m=c.getAttribute(h);m&&m.split(",").forEach(w=>{let T=w.trim().split(/\s+/)[0];T&&o.add(T);});}let g=c.getAttribute("style");g&&p.add(g);}),{attrs:[...o],styles:[...p]}});for(let o of l.attrs)for(let a of Ms(o)){let p=L(e,a,r,s,"dom-attr");p&&A(e,p)&&i.add(p.toString());}for(let o of l.styles)for(let a of de(e,r,o,s,"dom-style"))i.add(a);}let u=await t.content();for(let l of de(e,r,u,s,"page-html"))i.add(l);return [...i]}async function Rt(e,t,r,s,n){let i=H(e,t);await ne(i,r,"utf8");let u=await b.stat(i);n?.debug(`Saved page output ${t}`,{phase:"save-pages",url:t,outputPath:i,bytes:u.size}),s.stats.pagesSaved++;let l=Math.min(s.stats.pagesQueued,Be(s)+1);n&&(s.stats.pagesSaved%10===0||s.stats.pagesSaved===1)&&n.progress(`Page progress: processed ${l}, rendered ${s.stats.pagesRendered}, saved ${s.stats.pagesSaved}, discovered ${s.stats.pagesQueued}.`,{donePages:l,claimedPages:s.donePages.size,pagesRendered:s.stats.pagesRendered,pagesSaved:s.stats.pagesSaved,pagesQueued:s.stats.pagesQueued,pageQueue:s.pageQueue.length,phase:"save-pages"});}function zs(e){let t=Be(e);return t%5===0||t===1||t===e.stats.pagesQueued}function Js(e,t){let r=Be(e);t.progress(`Render progress: processed ${r}, rendered ${e.stats.pagesRendered}, saved ${e.stats.pagesSaved}, discovered ${e.stats.pagesQueued}.`,{donePages:r,claimedPages:e.donePages.size,pagesRendered:e.stats.pagesRendered,pagesSaved:e.stats.pagesSaved,pagesQueued:e.stats.pagesQueued,phase:"render-pages"});}async function Vs(e){await e.addInitScript(()=>{Object.defineProperty(window,"__WPSUITE_STATIC_EXPORT__",{value:true,writable:false,configurable:true});let t=r=>{if(r==null||String(r)==="")return true;try{let s=new URL(String(r),window.location.href),n=new URL(window.location.href);return s.hash="",n.hash="",s.href===n.href}catch{return false}};try{let r=window.location.assign.bind(window.location),s=window.location.replace.bind(window.location),n=window.location.reload.bind(window.location);Object.defineProperty(window.location,"assign",{configurable:!0,value:i=>{if(t(i)){console.warn("[smartcloud-static-publisher] blocked same-page location.assign",i??"");return}return r(i)}}),Object.defineProperty(window.location,"replace",{configurable:!0,value:i=>{if(t(i)){console.warn("[smartcloud-static-publisher] blocked same-page location.replace",i??"");return}return s(i)}}),Object.defineProperty(window.location,"reload",{configurable:!0,value:()=>{console.warn("[smartcloud-static-publisher] blocked location.reload");}});}catch{}});}async function Gs(e,t,r){let s=await e.newContext({viewport:t.viewport,userAgent:"WPSuiteStaticPublisher/0.8 Playwright SitemapOnly",ignoreHTTPSErrors:t.ignoreHttpsErrors,...r?{javaScriptEnabled:false}:{}});return r||await Vs(s),s}async function Zs(e,t,r,s,n,i,u){let l=await chromium.launch({headless:true}),o=Wt(l);o.pid!==null&&r.debug(`Launched crawl worker browser PID ${o.pid}`,{browserPid:o.pid});try{for(;t.pageQueue.length>0&&!(e.maxPages>0&&t.donePages.size>=e.maxPages);){let a=t.pageQueue.shift();if(!a)break;t.queuedPages.delete(a);let p=null,d=null;try{let c=V(a,r,"page","page-queue");if(!c)continue;let g=c.toString();if(a=g,t.queuedPages.delete(a),t.donePages.has(a))continue;t.donePages.add(a),i.enabled&&i.seenPages.add(a);let h=Qe(e,a),m=Bs(e,c.pathname);if(!G(c)||A(e,c)||Y(c)){if(A(e,c)){r.info(`Worker redirected non-page URL to asset queue: ${a}`,{url:a,source:"worker-guard"}),D(e,t,a,r,"worker-guard");continue}r.reject("page",a,"guard rejected non-page URL before rendering","worker");continue}let w=await es(e,n,t,i,a,r);if(i.enabled&&s!=="single-url"){let S=i.manifest.pages[a];if(w.action==="reuse"&&S){for(let v of S.discoveredAssets)D(e,t,v,r,a);for(let v of S.discoveredPages)ce(e,t,v,r,a);S.lastSeenRunId=i.runId,S.sitemapLastmod=oe(t.sitemapLastmodByPage[a])??S.sitemapLastmod,w.changeToken?.supported&&(S.changeToken=w.changeToken.token,S.tokenSource=w.changeToken.tokenSource??S.tokenSource),r.info(`Incremental reuse skipped unchanged page ${a}`,{url:a,mode:"incremental",reason:w.changeToken?.supported===!0?"change-token-match":"sitemap-lastmod-match"});continue}}p=await M(`create page context ${a}`,q(e),()=>Gs(l,e,m)),d=await M(`create page ${a}`,q(e),()=>p.newPage());let T=!1,k=new Set;await d.route("**/*",async S=>{let v=S.request();if(v.isNavigationRequest()&&v.frame()===d.mainFrame())try{let W=new URL(v.url()),X=new URL(g);if(W.hash="",X.hash="",W.href===X.href){if(T){r.warn(`Blocked same-page navigation/reload for ${a}`,{url:a,requestUrl:v.url()}),await S.abort("aborted");return}T=!0;}}catch{}await S.continue();}),d.on("response",S=>{try{let v=L(e,S.url(),e.sourceOrigin,r,"network-response");v&&A(e,v)&&(k.add(v.toString()),D(e,t,v.toString(),r,a));}catch{}}),r.page(`Rendering ${a}`,{url:a});let x=null,P=null;try{if(x=await d.goto(a,{waitUntil:"domcontentloaded",timeout:e.navigationTimeoutMs}),x&&x.ok())try{P=await M(`read response body ${a}`,q(e),()=>x.text());}catch{P=null;}}catch(S){r.warn(`Navigation issue for ${a}; saving current DOM if available`,{url:a,error:String(S)});}if(h){let S=x?.status()??null;if(S!==404){r.error(`Generated 404 request path returned unexpected status for ${a}`,{url:a,expectedStatus:404,status:S,requestPath:e.generated404RequestPath});continue}r.info(`Capturing rendered 404 page for ${a}`,{url:a,status:S,outputPath:H(e,a)});}else if(x&&!x.ok()){r.skip("page",a,x.status(),t.pageDiscoverySources.get(a)),await d.close();continue}m?(r.info(`Rendering without JS execution for ${a}`,{url:a,mode:"no-js"}),await M(`wait for rendered page ${a}`,q(e),()=>_s(e,d))):await M(`wait for rendered page ${a}`,q(e),()=>Ws(e,d)),t.stats.pagesRendered++;let y=await M(`extract rendered assets ${a}`,q(e),()=>Hs(e,d,g,r,!m));for(let S of y)D(e,t,S,r,a);let C=[...new Set([...y,...k])],R=P??await M(`capture rendered html ${a}`,q(e),()=>d.content()),$=s!=="single-url"&&!h?Es(e,a,R,r):[];if(s!=="single-url"&&!h)for(let S of $)ce(e,t,S,r,a);await Rt(e,a,R,t,r);let Q=H(e,a);if(N(u,e,Q),ae(u,Q),i.trackManifest){let S=x?.headers();i.manifest.pages[a]={url:a,outputPath:Q,contentType:Oe(S),changeToken:w.changeToken?.supported?w.changeToken.token:null,tokenSource:w.changeToken?.supported?w.changeToken.tokenSource??null:null,sitemapLastmod:oe(t.sitemapLastmodByPage[a])??null,discoveredPages:$,discoveredAssets:C,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!1},i.enabled&&await K(e,i);}}catch(c){try{let g=d?await M(`capture partial html ${a}`,q(e),()=>d.content()):"";if(g&&g.trim()){await Rt(e,a,g,t,r);let h=H(e,a);if(N(u,e,h),ae(u,h),i.trackManifest){let m=i.manifest.pages[a]??i.previousManifest.pages[a];i.manifest.pages[a]={url:a,outputPath:h,contentType:m?.contentType??null,changeToken:null,tokenSource:null,sitemapLastmod:oe(t.sitemapLastmodByPage[a])??m?.sitemapLastmod??null,discoveredPages:m?.discoveredPages?[...m.discoveredPages]:[],discoveredAssets:m?.discoveredAssets?[...m.discoveredAssets]:[],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!1},i.enabled&&await K(e,i);}r.warn(`Saved partial DOM for ${a}`,{url:a,error:String(c)});}}catch(g){r.error(`Could not save partial DOM for ${a}`,{url:a,error:String(g)});}r.error(`Failed page ${a}`,{url:a,error:String(c)});}finally{t.stats.pagesCompleted++,zs(t)&&Js(t,r),d&&await M(`close page ${a}`,Pe(e),()=>d.close()).catch(c=>{r.warn(`Timed out while closing page ${a}`,{url:a,browserPid:o.pid,error:String(c)});}),p&&await M(`close page context ${a}`,Pe(e),()=>p.close()).catch(c=>{r.warn(`Timed out while closing page context for ${a}`,{url:a,browserPid:o.pid,error:String(c)});});}}}finally{await M("close worker browser",Pe(e),()=>l.close()).catch(a=>(r.warn("Timed out while closing crawl worker browser",{browserPid:o.pid,error:String(a)}),Ns(l,r,"browser.close timeout")));}}async function Ks(e){try{let t=await b.readFile(e),s=(e.endsWith(".gz")?gunzipSync(t):t).toString("utf8").trim();if(!s)return [];try{let n=JSON.parse(s);if(Array.isArray(n))return n;if(n&&typeof n=="object")return [n]}catch{return s.split(/\r?\n/).map(n=>n.trim()).filter(Boolean).map(n=>{try{let i=JSON.parse(n);return i&&typeof i=="object"?i:null}catch{return null}}).filter(n=>n!==null)}return []}catch{return []}}function kt(e){let t=String(e||"").toLowerCase();return t.includes("timeout")||t.includes("timed out")||t.includes("navigation timeout")}function Ys(e){let t=String(e?.job?.command||"").trim(),r=String(e?.job?.crawlMode||"full").trim();return t!=="publish"&&t!=="crawl"?false:r!=="incremental"}function Xs(e){let t=[e?.archivedAt,e?.job?.endedAt,e?.job?.startedAt];for(let r of t){let s=Date.parse(String(r||""));if(Number.isFinite(s))return s}return 0}async function _t(e){try{let t=await b.readFile(e,"utf8"),r=JSON.parse(t);return r&&typeof r=="object"&&!Array.isArray(r)?r:null}catch{return null}}function xt(e){let t=String(e.originalFileName||"").toLowerCase();return t.endsWith("errors.jsonl")?0:t.endsWith("errors.json")?1:2}function en(e,t){let r=Array.isArray(t?.artifacts)?t.artifacts.filter(s=>String(s?.role||"").trim()==="errors"&&String(s?.storedFileName||"").trim()!=="").sort((s,n)=>xt(s)-xt(n)).map(s=>f.join(e,String(s.storedFileName))):[];return [...new Set([...r,f.join(e,"errors.jsonl"),f.join(e,"errors.json"),f.join(e,"errors.jsonl.gz"),f.join(e,"errors.json.gz")])]}async function Tt(e){let t=await _t(f.join(e,"job.json"));for(let r of en(e,t)){let s=await Ks(r);if(s.length>0)return s}return []}async function tn(e){let t=f.join(e.logDir,"archive"),r;try{r=await b.readdir(t);}catch{return ""}let s="",n=0;for(let i of r){let u=f.join(t,i);if(!(await b.stat(u).catch(()=>null))?.isDirectory())continue;let o=await _t(f.join(u,"job.json"));if(!Ys(o))continue;let a=Xs(o);a>=n&&(n=a,s=u);}return s}async function rn(e){let t=await tn(e),r=t!==""?await Tt(t):await Tt(e.logDir),s=new Set;for(let n of r)if(kt(n.error)||kt(n.message)){let i=n.url;typeof i=="string"&&i&&s.add(i);}return [...s]}async function sn(e){let t=[];for(let r of e)if(r.startsWith("@")){let s=r.slice(1),n=await b.readFile(s,"utf8");t.push(...n.split(/\r?\n/).map(i=>i.trim()).filter(i=>i&&!i.startsWith("#")));}else t.push(r);return t}async function nn(e){try{let t=await b.readFile(f.join(e.outputDir,"asset-map.json"),"utf8");return JSON.parse(t)}catch{return {}}}async function on(e){let t=["crawl.log.jsonl","current-crawl-event.json","rejected.jsonl","ignored.jsonl","skipped-http.jsonl","errors.jsonl","timings.jsonl","rejected.json","ignored.json","skipped-http.json","errors.json","timings.json"];await b.mkdir(e,{recursive:true}),await Promise.all(t.map(async r=>{try{await b.unlink(f.join(e,r));}catch(s){if(s.code!=="ENOENT")throw s}}));}function At(e,t,r,s,n){let i=L(e,r,e.sourceOrigin,s,"manual-url");i&&(pe(i)?_e(e,t,i.toString(),s,n):A(e,i)?D(e,t,i.toString(),s,n):G(i)?ce(e,t,i.toString(),s,n):s.reject("manual-url",i.toString(),"not page/sitemap/asset-like",n));}async function an(){let e=[],t=await xe(void 0,{onRemotePublisherConfigDiagnostic:P=>{e.push(P);}}),r=e.at(-1)??null,s=Qr(process.argv.slice(2));if(s.resumeRewrite&&s.mode!=="full")throw new Error("--resume-rewrite is only supported for full crawl/publish jobs.");let n=[];s.mode==="retry-timeouts"&&(n=await rn(t)),s.mode==="single-url"&&(n=await sn(s.urls));let i=s.crawlMode==="incremental"&&s.mode==="full",u=i&&typeof t.subscriptionType=="string"&&t.subscriptionType.trim()!=="",l=(s.mode==="full"||s.mode==="single-url")&&!s.resumeRewrite,o=s.mode!=="full"||s.resumeRewrite||u,a=o?await nn(t):{},p=u||s.mode==="single-url"?await Jr(t):Dt(),d={enabled:u,trackManifest:l,manifest:Ee(p),previousManifest:Ee(p),runId:`${Date.now()}`,seenPages:new Set,changeTokenCache:new Map,manifestSaveChain:Promise.resolve()};await on(t.logDir);let c=new ie(t.logDir,t.logLevel);if(r){let P={status:r.status,virtualAssetBaseUrl:r.virtualAssetBaseUrl,subscriptionType:r.subscriptionType??null,error:r.error,requests:r.requests,source:"remote-publisher-config"};r.status==="loaded"&&r.subscriptionType?c.info("Loaded remote WP Suite publisher configuration.",P):c.warn("Remote WP Suite publisher configuration is unavailable or has no active subscription type.",P);}if(i&&!u){let P="Incremental crawl requires an active remote publisher subscription; refusing to fall back to a destructive full crawl.";throw c.error(P,{requestedMode:s.crawlMode,subscriptionType:t.subscriptionType??null,source:"incremental-subscription-guard"}),await c.flush(),new Error(P)}let g={pageQueue:[],queuedPages:new Set,donePages:new Set,pageDiscoverySources:new Map,assetQueue:[],queuedAssets:new Set,doneAssets:new Set,sitemapQueue:[],queuedSitemaps:new Set,doneSitemaps:new Set,sitemapLastmodByPage:{},assetMap:{...a},assetVariantDigestsByOriginalPath:new Map,stats:{pagesQueued:0,pagesRendered:0,pagesCompleted:0,assetsQueued:0,sitemapsQueued:0,assetsSaved:0,pagesSaved:0}},h=zr();if(await Ke(t),await Ye(t,{startedAt:new Date().toISOString(),outputDir:f.resolve(t.outputDir)}),o||await b.rm(t.outputDir,{recursive:true,force:true}),await b.mkdir(t.outputDir,{recursive:true}),s.resumeRewrite)c.info("Resuming final rewrite from existing output.",{phase:"rewrite-text",mode:s.mode,crawlMode:s.crawlMode});else {let P=await request.newContext({ignoreHTTPSErrors:t.ignoreHttpsErrors});try{if(c.mark("discovery"),s.mode==="full"?(t.sitemapPaths.forEach(C=>_e(t,g,C,c)),await Ct(t,P,g,c,h),t.seedPaths.forEach(C=>At(t,g,C,c,"seed-path")),t.generated404RequestPath&&ce(t,g,t.generated404RequestPath,c,"generated-404-request-path")):(n.forEach(C=>At(t,g,C,c,"cli")),await Ct(t,P,g,c,h)),c.endMark("discovery",{pages:g.pageQueue.length,assets:g.assetQueue.length,sitemaps:g.sitemapQueue.length}),c.summary(`Queued ${g.pageQueue.length} pages, ${g.assetQueue.length} assets, ${g.sitemapQueue.length} sitemaps.`,{mode:s.mode,crawlMode:s.crawlMode,queuedPages:g.pageQueue.length,queuedAssets:g.assetQueue.length,queuedSitemaps:g.sitemapQueue.length}),s.mode==="retry-timeouts"&&g.pageQueue.length===0&&g.assetQueue.length===0&&g.sitemapQueue.length===0){c.summary("No timed-out URLs were queued. Skipping retry crawl.",{mode:s.mode,crawlMode:s.crawlMode,queuedPages:0,queuedAssets:0,queuedSitemaps:0}),await c.flush();return}c.mark("render-pages");let y=Array.from({length:Math.max(1,t.concurrency)},()=>Zs(t,g,c,s.mode,P,d,h));if(await Promise.all(y),c.endMark("render-pages",{pages:g.stats.pagesCompleted}),c.mark("download-assets"),c.progress("Asset download phase started.",{phase:"download-assets",doneAssets:g.doneAssets.size,assetsQueued:g.stats.assetsQueued,assetQueue:g.assetQueue.length}),await Fs(t,P,g,c,d,h),c.endMark("download-assets",{assets:g.doneAssets.size}),d.enabled&&t.maxPages===0&&await rs(t,g,d,c,h),s.mode==="full"){let C=await Os(t,g,c);for(let R of C)N(h,t,R);}}finally{await M("dispose crawl request context",Pe(t),()=>P.dispose()).catch(y=>{c.warn("Timed out while disposing crawl request context",{error:String(y)});});}}d.trackManifest&&await K(t,d),await b.writeFile(f.join(t.outputDir,"asset-map.json"),JSON.stringify(g.assetMap,null,2),"utf8"),JSON.stringify(a,null,2)!==JSON.stringify(g.assetMap,null,2)&&N(h,t,f.join(t.outputDir,"asset-map.json"));let m=s.mode==="single-url"?ds(t,g):d.enabled&&!s.resumeRewrite?ss(t,d,h,a,g.assetMap):void 0;c.mark("rewrite-text");let w=s.mode==="single-url"?`Rewriting text files touched by URL crawl: 0/${m?.length??0}`:"Rewriting text files...";c.progress(w,{phase:"rewrite-text",index:0,totalFiles:m?.length,changedTextFiles:0}),await yt(w);let T=Date.now(),k=await dt(t,g.assetMap,{files:m,previousAssetMap:a,onStart:({totalFiles:P,workerCount:y})=>{c.info(`Rewrite phase scanning ${P} text files.`,{phase:"rewrite-text",totalFiles:P,workerCount:y});},onProgress:async({index:P,totalFiles:y,changedTextFiles:C,file:R,changed:$})=>{$&&N(h,t,f.join(t.outputDir,R)),c.checkpoint(`Rewriting text file ${P}/${y}`,{phase:"rewrite-text",index:P,totalFiles:y,changedTextFiles:C,file:R}),c.debug(`${$?"Rewrote":"Checked unchanged"} text file ${P}/${y}: ${R}`,{phase:"rewrite-text",index:P,totalFiles:y,changedTextFiles:C,file:R,changed:$});let Q=Date.now();if(!(P===1||P===y||P%50===0||Q-T>=5e3))return;T=Q;let v=`Rewriting text files: ${P}/${y}`;c.progress(v,{phase:"rewrite-text",index:P,totalFiles:y,changedTextFiles:C,file:R}),await yt(v);}});d.trackManifest&&(ns(d,m),await K(t,d)),c.endMark("rewrite-text",{changedTextFiles:k});let x=d.enabled&&!s.resumeRewrite?await os(t,g,d,h,c):[];await Ze(t,{generatedAt:new Date().toISOString(),outputDir:f.resolve(t.outputDir),runMode:s.mode,crawlMode:s.crawlMode,fullSyncRequired:!(d.enabled&&!s.resumeRewrite),changedFiles:d.enabled&&!s.resumeRewrite?[...h.changedFiles].sort():[],deletedFiles:d.enabled&&!s.resumeRewrite?x:[],rewriteTargets:d.enabled&&!s.resumeRewrite?[...new Set((m||[]).map(P=>te(t.outputDir,f.isAbsolute(P)?P:f.join(t.outputDir,P))).filter(P=>P!==null))].sort():[]}),await Xe(t),c.summary(s.resumeRewrite?`Done. Resumed final rewrite over existing output and changed ${k} text files.`:`Done. Rendered ${g.stats.pagesRendered} pages, processed ${g.doneSitemaps.size} sitemaps, downloaded ${g.doneAssets.size} assets.`,{mode:s.mode,crawlMode:s.crawlMode,resumeRewrite:s.resumeRewrite,...g.stats,pagesRendered:g.stats.pagesRendered,donePages:g.stats.pagesCompleted,claimedPages:g.donePages.size,doneSitemaps:g.doneSitemaps.size,doneAssets:g.doneAssets.size,changedTextFiles:k}),await c.flush();}an().catch(async e=>{console.error(e);try{let r=(await xe().catch(()=>null))?.logDir??"logs",s=new ie(r,"debug");s.error(`Unhandled error: ${e instanceof Error?e.message:String(e)}`,e instanceof Error?{stack:e.stack}:void 0),await s.flush();}catch{}process.exit(1);});
|
|
9
|
+
${i}`,40);return s.info(`Using generated 404 fallback change token for ${r}`,{url:r,requestPath:e.generated404RequestPath,source:"generated-404-change-token-fallback"}),{url:r,supported:!0,token:u,tokenSource:"generated-404-response-hash",postId:null,dependencyPostIds:[],reason:null}}catch(n){return s.warn(`Generated 404 fallback token lookup failed for ${r}`,{url:r,error:String(n),requestPath:e.generated404RequestPath,source:"generated-404-change-token-fallback"}),null}}async function es(e,t,r,s,n,i){let u=Qe(e,n);if(!s.enabled)return {action:"render",changeToken:s.trackManifest?await $e(e,t,s,n,i):null};let l=s.manifest.pages[n];if(!l)return {action:"render",changeToken:await $e(e,t,s,n,i)};let o=await $e(e,t,s,n,i);if(o?.supported&&o.token)return l.changeToken===o.token?u&&!await ts(e,t,n,i)?{action:"render",changeToken:o}:{action:"reuse",changeToken:o}:{action:"render",changeToken:o};let a=oe(r.sitemapLastmodByPage[n]);return a&&l.sitemapLastmod&&l.sitemapLastmod===a?{action:"reuse",changeToken:o}:{action:"render",changeToken:o}}async function ts(e,t,r,s){try{let i=(await t.get(r,{timeout:Math.min(e.navigationTimeoutMs,15e3),failOnStatusCode:!1})).status();return i===404?!0:(s.warn(`Generated 404 request path no longer returns 404 for ${r}`,{url:r,status:i,requestPath:e.generated404RequestPath,source:"generated-404-status-probe"}),!1)}catch(n){return s.warn(`Generated 404 status probe failed for ${r}`,{url:r,error:String(n),requestPath:e.generated404RequestPath,source:"generated-404-status-probe"}),false}}async function rs(e,t,r,s,n){let i=bt(r.previousManifest,void 0,s,"previous-manifest"),u=0;for(let[c,g]of Object.entries(r.manifest.pages))if(!r.seenPages.has(c)){Pt(n,e,g.outputPath);try{await b.unlink(g.outputPath);}catch(h){(h.code||"")!=="ENOENT"&&s.warn(`Failed to remove stale incremental page output for ${c}`,{url:c,outputPath:g.outputPath,error:String(h)});}delete r.manifest.pages[c],u++;}let l=bt(r.manifest,r.runId,s,"active-manifest"),o=new Set,a=new Set;for(let c of l){for(let m of ue(e,c))o.add(m);let g=r.manifest.assets[c]?.outputPath;g&&a.add(g);let h=le(e,t.assetMap,c);h&&a.add(h);}for(let c of Object.keys(r.manifest.assets))l.has(c)||delete r.manifest.assets[c];let p=0,d=0;for(let c of i){let g=new Set,h=r.previousManifest.assets[c]?.outputPath;h&&g.add(h);let m=le(e,t.assetMap,c);if(!l.has(c)&&m)g.add(m);else if(!l.has(c)){let w=bs(e,c,s,"incremental-cleanup");w&&(g.add(w.originalFilePath),w.hashedFilePath&&g.add(w.hashedFilePath));}for(let w of g)if(!a.has(w)){Pt(n,e,w);try{await b.unlink(w),p++;}catch(T){(T.code||"")!=="ENOENT"&&s.warn(`Failed to remove stale incremental asset output for ${c}`,{url:c,outputPath:w,error:String(T)});}}for(let w of ue(e,c))o.has(w)||Object.prototype.hasOwnProperty.call(t.assetMap,w)&&(delete t.assetMap[w],d++);}(u>0||p>0||d>0)&&s.info(`Incremental cleanup removed ${u} stale pages, ${p} stale assets, ${d} stale asset mappings`,{removedPages:u,removedAssets:p,removedAssetMappings:d,phase:"incremental-cleanup"});}function bt(e,t,r,s){let n=new Set,i=u=>{let l=u.trim();if(l){if(r){let o=V(l,r,"asset",s??"manifest");if(!o)return;n.add(o.toString());return}n.add(l);}};for(let u of Object.values(e.pages))for(let l of u.discoveredAssets||[])i(l);for(let[u,l]of Object.entries(e.assets||{}))t&&l.lastSeenRunId!==t||i(u);return n}function St(e,t,r){for(let s of t)for(let n of ue(e,s))if(r.has(n))return true;return false}function ss(e,t,r,s,n){let i=new Set(r.rewriteTargets);for(let l of Object.values(t.manifest.pages))l.rewriteComplete||i.add(f.resolve(l.outputPath));for(let l of Object.values(t.manifest.assets))l.isText&&!l.rewriteComplete&&i.add(f.resolve(l.outputPath));let u=Gr(s,n);if(u.size===0)return [...i];for(let l of Object.values(t.manifest.pages))St(e,l.discoveredAssets,u)&&i.add(f.resolve(l.outputPath));for(let[l,o]of Object.entries(t.manifest.assets)){o.isText&&St(e,o.discoveredAssets,u)&&i.add(f.resolve(o.outputPath));for(let a of ue(e,l))if(u.has(a)){N(r,e,o.outputPath),o.isText&&i.add(f.resolve(o.outputPath));break}}return [...i]}function ns(e,t){let r=t?new Set(Array.from(t,n=>f.resolve(n))):null,s=n=>r===null||r.has(f.resolve(n));for(let n of Object.values(e.manifest.pages))s(n.outputPath)&&(n.rewriteComplete=true);for(let n of Object.values(e.manifest.assets)){if(!n.isText){n.rewriteComplete=true;continue}s(n.outputPath)&&(n.rewriteComplete=true);}}function is(e,t,r){let s=new Set,n=i=>{if(!i)return;let u=te(e.outputDir,i);u&&s.add(u);};for(let i of t.donePages)n(H(e,i));for(let i of Object.values(r.manifest.pages))i.lastSeenRunId===r.runId&&n(i.outputPath);for(let i of t.doneAssets)n(le(e,t.assetMap,i));for(let i of Object.values(r.manifest.assets))i.lastSeenRunId===r.runId&&n(i.outputPath);return s}async function os(e,t,r,s,n){let i=[...s.deletedFiles].sort(),u=is(e,t,r),l=0;for(let p of [...u].sort()){try{if((await b.stat(f.join(e.outputDir,p))).isFile())continue}catch{}l++,n.warn(`Active output is missing after crawl: ${p}`,{phase:"deploy-plan",file:p,outputPath:f.join(e.outputDir,p)});}if(l>0&&n.warn(`Detected ${l} active output file(s) missing before deploy plan save.`,{phase:"deploy-plan",missingActiveOutputs:l}),i.length===0)return [];let o=[],a=0;for(let p of i){if(!u.has(p)){o.push(p);continue}a++;let d=f.join(e.outputDir,p),c;try{c=(await b.stat(d)).isFile();}catch{c=false;}n.warn(`Deploy plan protected active output from deletion: ${p}`,{phase:"deploy-plan",file:p,outputPath:d,exists:c});}return a>0&&n.info(`Deploy plan skipped ${a} active output deletion(s).`,{phase:"deploy-plan",protectedDeletes:a,deletedFiles:o.length}),o}function ue(e,t){let r=new Set([t]);try{let s=new URL(t),i=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{i.push(new URL(e.targetOrigin).origin);}catch{}for(let u of i)try{r.add(new URL(u).origin+s.pathname+s.search);}catch{}r.add(s.pathname+s.search),r.add(s.pathname);}catch{}return [...r]}function as(e,t){let r=new Set([t]);try{let s=new URL(t),i=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{i.push(new URL(e.targetOrigin).origin);}catch{}for(let u of i)try{r.add(new URL(u).origin+s.pathname+s.search);}catch{}r.add(s.pathname+s.search);}catch{}return [...r]}function Dt(e,t){let r=e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/"?e.targetOrigin:"https://relative.invalid/";try{let s=new URL(t,r);return f.join(e.outputDir,Ne(s.pathname))}catch{return null}}function us(e,t,r){for(let s of as(e,r)){let n=t[s];if(!n)continue;let i=Dt(e,n);if(i)return {outputPath:i,publicUrl:n}}return null}function ls(e,t,r){for(let s of ue(e,r)){let n=t[s];if(!n)continue;let i=Dt(e,n);if(i)return i}return null}function le(e,t,r){let s=ls(e,t,r);if(s)return s;try{return We(e,r).originalFilePath}catch{return null}}function cs(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?f.join(f.resolve(e),"queue-runner-heartbeat.json"):""}async function yt(e){let t=cs();if(t)try{let r=await b.readFile(t,"utf8"),s=JSON.parse(r);if(!s||typeof s!="object")return;await b.writeFile(t,JSON.stringify({...s,checkedAt:new Date().toISOString(),status:"running",currentStep:"rewrite",message:e},null,2),"utf8");}catch{}}function ds(e,t){let r=new Set;for(let s of t.donePages)r.add(f.resolve(H(e,s)));for(let s of t.doneAssets){let n=le(e,t.assetMap,s);!n||!J(n)||r.add(f.resolve(n));}return [...r]}var be="re:",me=new Map;function ps(e){if(!e.startsWith(be))return null;let t=me.get(e);if(t!==void 0)return t||null;let r=e.slice(be.length).trim();if(!r)return me.set(e,false),null;try{let s=new RegExp(r);return me.set(e,s),s}catch{return console.warn(`[crawl] Ignoring invalid path matcher regex: ${e}`),me.set(e,false),null}}function qe(e,t){let r=ps(t);return r?r.test(e):t.startsWith(be)?false:e.startsWith(t)}function gs(e,t){return t.find(r=>qe(e,r))}function Ot(e,t){let r=gs(t.pathname,e.blockedPathPrefixes);if(r)return r.startsWith(be)?`blocked path regex: ${r}`:`blocked path prefix: ${r}`;let s=e.blockedSearchFragments.find(n=>t.search.includes(n));return s?`blocked search fragment: ${s}`:null}function fs(e){let t=new URL(e.sourceOrigin),r=new Set([t.hostname,...e.allowedAssetHosts]);if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{r.add(new URL(e.targetOrigin).hostname);}catch{}for(let s of Object.keys(e.extraReplacements||{}))try{r.add(new URL(s).hostname);}catch{}return r}function hs(e,t){return fs(e).has(t.hostname)}function ms(e){let t=U(e.trim()).replace(/\\\//g,"/").replace(/^['"]|['"]$/g,"").trim();return t=t.replace(/[)]+$/g,"").trim(),t=t.replace(/;.*$/g,"").trim(),t}function je(e){let t=U(e).replace(/\\\//g,"/");return /[{}]|\bwindow\.|\blocation\.|\bincludes\(|\?\?null|\+|%7B|%7D|%22|<|>|\s/.test(t)||/[()[\]'"]/.test(t)}function ws(e){let t=U(e).replace(/\\\//g,"/").trim(),r=f.extname(t).toLowerCase();return Mt.has(r)||It.has(r)?false:/^(?:this|[A-Za-z_$][\w$]*)\.[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/.test(t)}function K(e){return Nr.some(t=>e.pathname.startsWith(t))}function L(e,t,r=e.sourceOrigin,s,n="url"){let i=ms(t);if(!i||i.startsWith("data:")||i.startsWith("blob:")||i.startsWith("mailto:")||i.startsWith("tel:")||i.startsWith("#"))return s?.ignore(n,t,"empty or unsupported scheme",r),null;if(je(i))return s?.ignore(n,t,"looks like JavaScript/code fragment",r),null;if(ws(i))return s?.ignore(n,t,"looks like JavaScript property access",r),null;try{let u=new URL(i,r);if(Et(u))return s?.reject(n,t,"malformed URL encoding",r),null;if(!["http:","https:"].includes(u.protocol))return s?.ignore(n,t,"unsupported protocol: ",r),null;if(!hs(e,u))return s?.ignore(n,u.toString(),"host not allowed",r),null;let l=Ot(e,u);if(l)return s?.reject(n,u.toString(),l,r),null;let o=new URL(e.sourceOrigin);return u.protocol=o.protocol,u.host=o.host,u.hash="",u}catch{return s?.reject(n,t,"invalid URL",r),null}}function Et(e){try{return decodeURIComponent(e.pathname),decodeURIComponent(e.search),decodeURIComponent(e.hash),!1}catch{return true}}function V(e,t,r,s){try{let n=new URL(e);return Et(n)?(t.reject(r,e,"malformed URL encoding",s),null):n.protocol!=="http:"&&n.protocol!=="https:"?(t.reject(r,e,`unsupported protocol: ${n.protocol}`,s),null):n}catch{return t.reject(r,e,"invalid URL",s),null}}function jt(e){return Mt.has(f.extname(e.pathname).toLowerCase())}function G(e){return K(e)?false:It.has(f.extname(e.pathname).toLowerCase())}function pe(e){let t=e.pathname.toLowerCase();return t.endsWith(".xml")&&(t.includes("sitemap")||t.endsWith("/sitemap.xml"))}function A(e,t){return !!(pe(t)||t.pathname==="/robots.txt"||t.pathname==="/llms.txt"||t.pathname.toLowerCase().endsWith(".xsl")||e.assetPathPrefixes.length>0&&e.assetPathPrefixes.some(r=>qe(t.pathname,r))||jt(t)||!G(t)&&!K(t))}function H(e,t){let r=new URL(t),s=Ne(r.pathname);return s.endsWith("/")?s+="index.html":f.extname(s)||(s+="/index.html"),f.join(e.outputDir,s)}function Ne(e){try{return decodeURIComponent(e)}catch{return e}}function Ps(e){if(!e.generated404RequestPath)return null;try{let t=new URL(e.generated404RequestPath,e.sourceOrigin);return !t.pathname.endsWith("/")&&f.extname(t.pathname)===""&&(t.pathname+="/"),t.hash="",t.toString()}catch{return null}}function Qe(e,t){let r=Ps(e);if(!r)return false;try{return new URL(t,e.sourceOrigin).toString()===r}catch{return false}}function We(e,t){let r=new URL(t),s=Ne(r.pathname);s.endsWith("/")&&(s+="index.html");let n=!!r.search,i=s,u=f.join(e.outputDir,i),l=Te(e.targetOrigin,i),o=`${l}${r.search}`;if(!n)return {originalPathname:i,originalFilePath:u,originalPublicUrl:l,originalPublicUrlWithSearch:o,preferQueryHashed:n};let a=f.extname(s),d=`${a?s.slice(0,-a.length):s}.${se(r.search)}${a||".bin"}`;return {originalPathname:i,originalFilePath:u,originalPublicUrl:l,originalPublicUrlWithSearch:o,preferQueryHashed:n,hashedPathname:d,hashedFilePath:f.join(e.outputDir,d),hashedPublicUrl:Te(e.targetOrigin,d)}}function bs(e,t,r,s){let n=V(t,r,"asset",s);return n?We(e,n.toString()):null}function Ss(e,t,r,s,n){t[r]=s;try{let i=new URL(r),l=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{l.push(new URL(e.targetOrigin).origin);}catch{}for(let o of l)try{let a=new URL(o);t[a.origin+i.pathname+i.search]=s;}catch{}try{let o=(()=>{let a=new URL(s,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin);return `${a.pathname}${a.search}`})();t[i.pathname+i.search]=o;}catch{}try{let o=new URL(s,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[i.pathname]=o;}catch{}try{let o=new URL(n,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[i.pathname]=o;}catch{}}catch{}}async function Ft(e){try{return await b.readFile(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}async function Ut(e){try{return await b.stat(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}function ys(e){let t=String(e["content-length"]||"").trim();if(!t)return null;let r=Number.parseInt(t,10);return Number.isFinite(r)&&r>=0?r:null}function qt(e){let t=String(e["last-modified"]||"").trim();if(!t)return null;let r=Date.parse(t);return Number.isFinite(r)?r:null}function vs(e,t){let r=qt(t),s=ys(t),n=e?.mtime.getTime();return r!==null&&Math.abs((n??0)-r)>=1e3||s!==null&&e?.size!==s?false:r!==null||s!==null}async function Cs(e,t){if(!t)return;let r=qt(t);if(r===null)return;let s=await Ut(e);if(!s)return;let n=new Date(r);await b.utimes(e,s.atime,n).catch(()=>{});}function vt(e,t){let r=f.extname(e.pathname).toLowerCase(),s=t["content-type"]||"";return qr.has(r)||Ur.some(n=>s.includes(n))&&!s.startsWith("image/")&&!s.includes("font")}function Rs(e){try{let t=f.extname(new URL(e).pathname).toLowerCase();return t===".js"||t===".mjs"}catch{return false}}function we(e,t){(e.doneAssets.size%25===0||e.doneAssets.size===1||e.doneAssets.size===e.stats.assetsQueued)&&t.progress(`Asset download progress: processed ${e.doneAssets.size}, discovered ${e.stats.assetsQueued}.`,{doneAssets:e.doneAssets.size,assetsQueued:e.stats.assetsQueued,phase:"download-assets"});}function ks(e){return se(e.toString("base64"),40)}function xs(e,t,r){let s=e.assetVariantDigestsByOriginalPath.get(t);if(!s||s.size===0)return false;for(let n of s)if(n!==r)return true;return false}function Ts(e,t,r){let s=e.assetVariantDigestsByOriginalPath.get(t);s||(s=new Set,e.assetVariantDigestsByOriginalPath.set(t,s)),s.add(r);}async function Fe(e,t,r,s,n,i,u){let l=We(e,r),o=ks(s),a=l.originalFilePath,p=l.originalPublicUrlWithSearch;if(l.preferQueryHashed&&l.hashedFilePath&&l.hashedPublicUrl&&xs(n,l.originalFilePath,o)){let h=us(e,t,r);h?(a=h.outputPath,p=h.publicUrl):(a=l.hashedFilePath,p=l.hashedPublicUrl);}Ss(e,t,r,p,l.originalPublicUrl);let d=J(a)?Buffer.from(Ie(s.toString("utf8"),e,t,a),"utf8"):s,c=await Ft(a),g=false;return (c===null||!c.equals(d))&&(await ne(a,d),g=true),i?.debug(`${g?"Saved":"Skipped unchanged"} asset output ${r}`,{phase:"download-assets",url:r,outputPath:a,bytes:d.length,wroteFile:g}),Ts(n,l.originalFilePath,o),await Cs(a,u),n.stats.assetsSaved++,i&&(n.stats.assetsSaved%50===0||n.stats.assetsSaved===1)&&i.progress(`Asset progress: saved ${n.stats.assetsSaved}, discovered ${n.stats.assetsQueued}, pending ${n.assetQueue.length}.`,{assetsSaved:n.stats.assetsSaved,assetsQueued:n.stats.assetsQueued,assetQueue:n.assetQueue.length,phase:"download-assets"}),{outputPath:a,publicUrl:p,wroteFile:g}}function ce(e,t,r,s,n){let i=()=>{let d=String(n??"").trim();if(!d)return {discoveredFrom:"",discoveredFromType:"unknown"};if(d==="seed-path"||d==="cli"||d==="generated-404-request-path")return {discoveredFrom:d,discoveredFromType:d};if(/^https?:\/\//i.test(d))try{let c=new URL(d);return pe(c)?{discoveredFrom:d,discoveredFromType:"sitemap"}:A(e,c)?{discoveredFrom:d,discoveredFromType:"asset"}:G(c)&&!K(c)?{discoveredFrom:d,discoveredFromType:"page"}:{discoveredFrom:d,discoveredFromType:"url"}}catch{return {discoveredFrom:d,discoveredFromType:"url"}}return {discoveredFrom:d,discoveredFromType:"url"}},u=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,l=L(e,r,u,s,"page");if(!l)return;if(!G(l)||jt(l)){if(A(e,l)){s.info(`Seeded/non-page URL queued as asset: ${l.toString()}`,{url:l.toString(),source:n}),$(e,t,l.toString(),s,n);return}s.reject("page",l.toString(),K(l)?"asset/internal path cannot be page":"not page-like",n);return}let o=l.toString(),{discoveredFrom:a,discoveredFromType:p}=i();a&&!t.pageDiscoverySources.has(o)&&t.pageDiscoverySources.set(o,a),!t.donePages.has(o)&&!t.queuedPages.has(o)&&(t.queuedPages.add(o),t.pageQueue.push(o),t.stats.pagesQueued++,s.debug(`Queued discovered page ${o}`,{phase:"discovery",url:o,discoveredFrom:a,discoveredFromType:p,outputPath:H(e,o)}),(t.stats.pagesQueued%25===0||t.stats.pagesQueued===1)&&s.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,pageQueue:t.pageQueue.length,phase:"discovery"}));}function $(e,t,r,s,n){let i=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,u=L(e,r,i,s,"asset");if(!u)return;if(!A(e,u)){s.reject("asset",u.toString(),"not a safe asset path/prefix",n);return}let l=u.toString();!t.doneAssets.has(l)&&!t.queuedAssets.has(l)&&(t.queuedAssets.add(l),t.assetQueue.push(l),t.stats.assetsQueued++,(t.stats.assetsQueued%100===0||t.stats.assetsQueued===1)&&s.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,assetQueue:t.assetQueue.length,phase:"discovery"}));}function _e(e,t,r,s,n){let i=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,u=L(e,r,i,s,"sitemap");if(!u)return;if(!pe(u)){s.reject("sitemap",u.toString(),"not sitemap-like",n);return}let l=u.toString();!t.doneSitemaps.has(l)&&!t.queuedSitemaps.has(l)&&(t.queuedSitemaps.add(l),t.sitemapQueue.push(l),t.stats.sitemapsQueued++,(t.stats.sitemapsQueued%10===0||t.stats.sitemapsQueued===1)&&s.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,sitemapQueue:t.sitemapQueue.length,phase:"discovery"}));}function As(e){let t=U(e),r=[...t.matchAll(/<url>\s*([\s\S]*?)\s*<\/url>/gi)].map(s=>s[1]);return r.length>0?r.map(s=>{let n=s.match(/<loc>\s*([^<]+?)\s*<\/loc>/i);if(!n?.[1])return null;let i=s.match(/<lastmod>\s*([^<]+?)\s*<\/lastmod>/i);return {loc:n[1].trim(),lastmod:oe(i?.[1]??null)}}).filter(s=>!!s):[...t.matchAll(/<loc>\s*([^<]+?)\s*<\/loc>/gi)].map(s=>({loc:s[1].trim(),lastmod:null})).filter(s=>s.loc)}function Ms(e){return e.split(",").map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function Is(e){let t=[],r=/url\(\s*(?:"([^"]+)"|'([^']+)'|([^)]*?))\s*\)/gi;for(let s of e.matchAll(r)){let n=e.slice(Math.max(0,s.index-8),s.index);if(/\bnew\s+$/i.test(n))continue;let i=(s[1]||s[2]||s[3]||"").trim();i&&t.push(i);}return t}function Ls(e){return e.replace(/<script\b[^>]*>[\s\S]*?<\/script\s*>/gi,"")}function $s(e,t){if(t==="dom-style")return true;let r=(()=>{try{return f.extname(new URL(e).pathname).toLowerCase()}catch{return ""}})();return !(r===".js"||r===".mjs"||r===".map"||t.includes("javascript"))}function De(e){return e.trim().replace(/\\/g,"/").replace(/^https?:\/\/[^/]+/i,"").replace(/^\/+/,"")}async function Nt(e,t,r,s){let n=[];await b.mkdir(t,{recursive:true});let i=await b.readdir(e,{withFileTypes:true});for(let u of i){let l=f.join(e,u.name),o=f.join(t,u.name);if(u.isDirectory()){n.push(...await Nt(l,o,r,s));continue}await Qt(l,o,r,s)&&n.push(o);}return n}async function Ds(e,t){try{let[r,s]=await Promise.all([b.stat(e),b.stat(t)]);if(r.size!==s.size)return !1;let[n,i]=await Promise.all([b.readFile(e),b.readFile(t)]);return n.equals(i)}catch{return false}}async function Qt(e,t,r,s){let n=f.resolve(t);return r.has(n)?(s.debug("Skipped post-crawl copy over crawled page output",{phase:"copy-extra-paths",sourcePath:e,targetPath:t}),false):await Ds(e,t)?(s.debug("Skipped unchanged post-crawl copy target",{phase:"copy-extra-paths",sourcePath:e,targetPath:t}),false):(await b.mkdir(f.dirname(t),{recursive:true}),await b.copyFile(e,t),true)}async function Os(e,t,r){let s=Object.entries(e.postCrawlCopyMap||{}).map(([l,o])=>({sourcePath:l.trim(),prefix:String(o||"").trim()}));if(s.length===0)return [];let n=0,i=[],u=new Set([...t.donePages].map(l=>f.resolve(H(e,l))));r.mark("copy-extra-paths");for(let l of s){let o=l.sourcePath,a=l.prefix;if(!o||!a){r.warn("Skipped post-crawl copy mapping with empty key/value",{sourcePath:o,prefixPath:a});continue}let p=Br(o);if(!p.resolvedPath){r.warn("Skipped post-crawl copy source because alias root is not configured",{sourcePath:o,alias:p.alias||"",requiredEnv:p.requiredEnv||"",prefixPath:a});continue}let d=p.resolvedPath,c=De(a);if(!c){r.warn("Skipped post-crawl copy mapping with invalid export prefix",{sourcePath:o,prefixPath:a});continue}let g;try{g=await b.stat(d);}catch{r.warn("Skipped post-crawl copy source because it does not exist",{sourcePath:o,sourceAbs:d,prefixPath:a});continue}let h=f.resolve(e.outputDir,c);if(g.isDirectory()){let k=await Nt(d,h,u,r);i.push(...k),n+=k.length,k.length>0&&r.progress(`Copied static directory to export: ${d} -> /${c}`,{phase:"copy-extra-paths",sourcePath:d,targetPath:`/${c}`,copiedItems:n,changedFiles:k.length});continue}let m=f.basename(d),w=a.endsWith("/")?f.join(h,m):h;await Qt(d,w,u,r)&&(i.push(w),n++,r.progress(`Copied static file to export: ${d} -> /${De(a.endsWith("/")?`${a}${m}`:a)}`,{phase:"copy-extra-paths",sourcePath:d,targetPath:`/${De(a.endsWith("/")?`${a}${m}`:a)}`,copiedItems:n}));}return r.endMark("copy-extra-paths",{mappedSources:s.length,copiedItems:n}),i}function de(e,t,r,s,n){let i=new Set,u=U(r).replace(/\\\//g,"/"),l=n==="page-html"?Ls(u):u,o=$s(t,n);if(o){for(let p of Is(l)){let d=L(e,p,t,s,`${n}:css-url`);d&&A(e,d)&&i.add(d.toString());}for(let p of l.matchAll(/@import\s+(?:url\()?\s*['"]?([^'"\s;]+)['"]?\s*\)?/gi)){let d=L(e,p[1],t,s,`${n}:css-import`);d&&A(e,d)&&i.add(d.toString());}}if(o||n==="page-html")for(let p of l.matchAll(/<\?xml-stylesheet[^>]+href=["']([^"']+)["'][^>]*\?>/gi)){let d=L(e,p[1],t,s,`${n}:xml-stylesheet`);d&&A(e,d)&&i.add(d.toString());}let a=new RegExp(`(?:https?:)?//[^\\s'"<>\\);]+\\.${Le}(?:\\?[^\\s'"<>\\);]*)?|(?<!\\.)/[^\\s'"<>\\);]+\\.${Le}(?:\\?[^\\s'"<>\\);]*)?`,"gi");if(n==="page-html")for(let p of u.matchAll(a)){let d=p[0].startsWith("//")?`${new URL(e.sourceOrigin).protocol}${p[0]}`:p[0];if(je(d)){s.ignore(`${n}:serialized-url`,d,"looks like JavaScript/code fragment",t);continue}let c=L(e,d,t,s,`${n}:serialized-url`);c&&A(e,c)?i.add(c.toString()):c&&s.ignore("asset",c.toString(),"serialized URL did not pass safe asset path filter",t);}if(n!=="page-html"&&Rs(t))for(let p of mt(u)){if(je(p)||!/\.(?:js|mjs)(?:[?#]|$)/i.test(p))continue;let d=L(e,p,t,s,`${n}:relative-asset`);d&&A(e,d)&&i.add(d.toString());}return [...i]}function Es(e,t,r,s){let n=new Set,i=U(r);for(let u of i.matchAll(/href=["']([^"'#\s][^"']*?)["']/gi)){let l=u[1],o=L(e,l,t,s,"page-link");o&&(Ot(e,o)||G(o)&&!K(o)&&!A(e,o)&&n.add(o.toString()));}return [...n]}async function Ct(e,t,r,s,n){for(;r.sitemapQueue.length>0;){let i=r.sitemapQueue.shift();r.queuedSitemaps.delete(i);let u=V(i,s,"sitemap","sitemap-queue");if(!u)continue;let l=u.toString();if(!r.doneSitemaps.has(l)){r.doneSitemaps.add(l),s.sitemap(`Fetching sitemap ${l}`,{url:l});try{let o=await t.get(l,{timeout:6e4});if(!o.ok()){s.skip("sitemap",l,o.status());continue}let a=await o.body(),p=o.url()||l,d=V(p,s,"sitemap-response",l);if(!d)continue;let c=d.toString(),g=await Fe(e,r.assetMap,c,a,r,s);N(n,e,g.outputPath),ae(n,g.outputPath);let h=a.toString("utf8");for(let m of de(e,c,h,s,"sitemap"))$(e,r,m,s,c);for(let m of As(h)){let w=L(e,m.loc,c,s,"sitemap-loc");w&&(pe(w)?_e(e,r,w.toString(),s,c):A(e,w)?$(e,r,w.toString(),s,c):G(w)?(m.lastmod&&(r.sitemapLastmodByPage[w.toString()]=m.lastmod),ce(e,r,w.toString(),s,c)):s.reject("sitemap-loc",w.toString(),"not page/sitemap/asset-like",c));}}catch(o){s.error(`Failed sitemap ${l}`,{url:l,error:String(o)});}}}}async function js(e,t,r,s,n,i,u){let l=L(e,s,e.sourceOrigin,n,"asset-fetch");if(!l||!A(e,l))return;let o=l.toString();if(r.doneAssets.has(o))return;let a=i.enabled?i.previousManifest.assets[o]:void 0,p=(d,c={})=>{if(!a)return false;i.manifest.assets[o]={...a,discoveredAssets:[...a.discoveredAssets||[]],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId},delete i.manifest.pages[o],r.doneAssets.add(o);for(let g of a.discoveredAssets||[])$(e,r,g,n,o);return n.warn(`Keeping previous incremental asset ${o} after fetch issue.`,{url:o,reason:d,preservedFromPreviousManifest:true,...c,phase:"download-assets"}),we(r,n),true};n.asset(`Fetching asset ${o}`,{url:o});try{let d=le(e,r.assetMap,o),c=d?await Ut(d):null;if(d&&c)try{let C=await M(`fetch asset headers ${o}`,6e4,()=>t.head(o,{timeout:6e4})),R=C.headers();if(C.ok()&&vs(c,R)){let D=await Ft(d);if(D!==null){let Q=C.url()||o,S=V(Q,n,"asset-response",o);if(!S)return;let v=S.toString(),W=await Fe(e,r.assetMap,v,D,r,n,R);W.wroteFile&&(N(u,e,W.outputPath),J(W.outputPath)&&ae(u,W.outputPath)),r.doneAssets.add(o),n.info(`Reused existing asset ${o} based on response headers.`,{url:o,filePath:d,lastModified:R["last-modified"]||"",contentLength:R["content-length"]||"",phase:"download-assets"}),we(r,n);let X=vt(l,R),Se=a?.discoveredAssets?[...a.discoveredAssets]:[];if(X||a?.isText){let ee=D.toString("utf8"),He=de(e,v,ee,n,"asset:cached");(He.length>0||!a)&&(Se=He);for(let Bt of Se)$(e,r,Bt,n,v);}if(i.trackManifest){let ee=X||!!a?.isText;i.manifest.assets[o]={url:o,outputPath:W.outputPath,isText:ee,contentType:Oe(R)||a?.contentType||null,discoveredAssets:Se,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!ee},delete i.manifest.pages[o],i.enabled&&ee&&await Y(e,i);}return}}}catch{}let g=await M(`fetch asset ${o}`,6e4,()=>t.get(o,{timeout:6e4}));if(!g.ok()){if(p(`http-${g.status()}`,{status:g.status()}))return;n.skip("asset",o,g.status());return}let h=await M(`read asset response ${o}`,6e4,()=>g.body()),m=g.url()||o,w=V(m,n,"asset-response",o);if(!w)return;let T=w.toString(),k=g.headers(),x=await Fe(e,r.assetMap,T,h,r,n,k);x.wroteFile&&(N(u,e,x.outputPath),J(x.outputPath)&&ae(u,x.outputPath)),r.doneAssets.add(o),we(r,n);let P=vt(l,k),y=[];if(P){let C=h.toString("utf8");y=de(e,T,C,n,`asset:${f.extname(l.pathname).toLowerCase()||k["content-type"]||"unknown"}`);for(let R of y)$(e,r,R,n,T);}i.trackManifest&&(i.manifest.assets[o]={url:o,outputPath:x.outputPath,isText:P,contentType:Oe(k),discoveredAssets:y,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!P},delete i.manifest.pages[o],i.enabled&&P&&await Y(e,i));}catch(d){if(p("fetch-error",{error:String(d)}))return;n.error(`Failed asset ${o}`,{url:o,error:String(d)});}finally{r.doneAssets.has(o)||(r.doneAssets.add(o),we(r,n));}}async function Fs(e,t,r,s,n,i){let u=Math.max(1,Number(e.assetDownloadConcurrency||e.concurrency||1)),l=Array.from({length:u},async()=>{for(;r.assetQueue.length>0;){let o=r.assetQueue.shift();o&&(r.queuedAssets.delete(o),await js(e,t,r,o,s,n,i));}});await Promise.all(l);}function Us(e){let t=Math.ceil(e/1e3);return `${t} second${t===1?"":"s"}`}function q(e){return Math.max(6e4,e.navigationTimeoutMs*2,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+15e3)}function Pe(e){return Math.max(15e3,Math.min(6e4,q(e)))}function qs(e){return Math.max(15e3,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+1e4)}function Be(e){return e.stats.pagesCompleted}function Wt(e){let r=e.options?.browserProcess;return {pid:typeof r?.process?.pid=="number"?r.process.pid:null,kill:typeof r?.kill=="function"?r.kill.bind(r):null}}async function Ns(e,t,r){let s=Wt(e);try{if(s.kill){await s.kill(),t.warn(`Force-killed crawl worker browser after ${r}`,{browserPid:s.pid,reason:r});return}if(s.pid!==null){process.kill(s.pid,"SIGKILL"),t.warn(`Sent SIGKILL to crawl worker browser after ${r}`,{browserPid:s.pid,reason:r});return}t.warn(`Could not resolve crawl worker browser PID after ${r}`,{reason:r});}catch(n){t.error(`Failed to force-kill crawl worker browser after ${r}`,{browserPid:s.pid,reason:r,error:String(n)});}}async function M(e,t,r){let s;try{return await Promise.race([r(),new Promise((n,i)=>{s=globalThis.setTimeout(()=>{i(new Error(`${e} timed out after ${Us(t)}.`));},t);})])}finally{s!==void 0&&globalThis.clearTimeout(s);}}async function Qs(e,t){let r=qs(e);await t.evaluate(async s=>{await new Promise(n=>{let i=0,u=700,l=Date.now(),o=()=>{window.clearInterval(a),window.scrollTo(0,0),n();},a=window.setInterval(()=>{if(Date.now()-l>=s.maxDurationMs){o();return}window.scrollBy(0,u),i+=u;let p=document.body?.scrollHeight||0,d=document.documentElement?.scrollHeight||0,c=Math.max(p,d);i>=c+window.innerHeight&&o();},120);});},{maxDurationMs:r});}async function Ws(e,t){await t.waitForLoadState("domcontentloaded",{timeout:e.readiness.timeoutMs}).catch(()=>{}),e.readiness.waitForSelector&&await t.waitForSelector(e.readiness.waitForSelector,{timeout:e.readiness.timeoutMs}).catch(()=>{}),e.readiness.waitForFunction&&await t.waitForFunction(e.readiness.waitForFunction,void 0,{timeout:e.readiness.timeoutMs}).catch(()=>{}),await Qs(e,t),await t.waitForTimeout(e.readiness.fallbackWaitMs);}async function _s(e,t){await t.waitForLoadState("domcontentloaded",{timeout:e.readiness.timeoutMs}).catch(()=>{}),await t.waitForLoadState("load",{timeout:e.readiness.timeoutMs}).catch(()=>{}),e.readiness.waitForSelector&&await t.waitForSelector(e.readiness.waitForSelector,{timeout:e.readiness.timeoutMs}).catch(()=>{}),await t.waitForTimeout(e.readiness.fallbackWaitMs);}function Bs(e,t){return e.noJavaScriptRenderPathPrefixes.some(r=>qe(t,r))}async function Hs(e,t,r,s,n=true){let i=new Set;if(n){let l=await t.evaluate(()=>{let o=new Set,a=["href","src","poster","data-src","data-lazy-src","data-original","data-bg","data-background","data-href"],p=new Set,d=["srcset","data-srcset","data-lazy-srcset"];return document.querySelectorAll("*").forEach(c=>{for(let h of a){let m=c.getAttribute(h);m&&o.add(m);}for(let h of d){let m=c.getAttribute(h);m&&m.split(",").forEach(w=>{let T=w.trim().split(/\s+/)[0];T&&o.add(T);});}let g=c.getAttribute("style");g&&p.add(g);}),{attrs:[...o],styles:[...p]}});for(let o of l.attrs)for(let a of Ms(o)){let p=L(e,a,r,s,"dom-attr");p&&A(e,p)&&i.add(p.toString());}for(let o of l.styles)for(let a of de(e,r,o,s,"dom-style"))i.add(a);}let u=await t.content();for(let l of de(e,r,u,s,"page-html"))i.add(l);return [...i]}async function Rt(e,t,r,s,n){let i=H(e,t);await ne(i,r,"utf8");let u=await b.stat(i);n?.debug(`Saved page output ${t}`,{phase:"save-pages",url:t,outputPath:i,bytes:u.size}),s.stats.pagesSaved++;let l=Math.min(s.stats.pagesQueued,Be(s)+1);n&&(s.stats.pagesSaved%10===0||s.stats.pagesSaved===1)&&n.progress(`Page progress: processed ${l}, rendered ${s.stats.pagesRendered}, saved ${s.stats.pagesSaved}, discovered ${s.stats.pagesQueued}.`,{donePages:l,claimedPages:s.donePages.size,pagesRendered:s.stats.pagesRendered,pagesSaved:s.stats.pagesSaved,pagesQueued:s.stats.pagesQueued,pageQueue:s.pageQueue.length,phase:"save-pages"});}function zs(e){let t=Be(e);return t%5===0||t===1||t===e.stats.pagesQueued}function Js(e,t){let r=Be(e);t.progress(`Render progress: processed ${r}, rendered ${e.stats.pagesRendered}, saved ${e.stats.pagesSaved}, discovered ${e.stats.pagesQueued}.`,{donePages:r,claimedPages:e.donePages.size,pagesRendered:e.stats.pagesRendered,pagesSaved:e.stats.pagesSaved,pagesQueued:e.stats.pagesQueued,phase:"render-pages"});}async function Vs(e){await e.addInitScript(()=>{Object.defineProperty(window,"__WPSUITE_STATIC_EXPORT__",{value:true,writable:false,configurable:true});let t=r=>{if(r==null||String(r)==="")return true;try{let s=new URL(String(r),window.location.href),n=new URL(window.location.href);return s.hash="",n.hash="",s.href===n.href}catch{return false}};try{let r=window.location.assign.bind(window.location),s=window.location.replace.bind(window.location),n=window.location.reload.bind(window.location);Object.defineProperty(window.location,"assign",{configurable:!0,value:i=>{if(t(i)){console.warn("[smartcloud-static-publisher] blocked same-page location.assign",i??"");return}return r(i)}}),Object.defineProperty(window.location,"replace",{configurable:!0,value:i=>{if(t(i)){console.warn("[smartcloud-static-publisher] blocked same-page location.replace",i??"");return}return s(i)}}),Object.defineProperty(window.location,"reload",{configurable:!0,value:()=>{console.warn("[smartcloud-static-publisher] blocked location.reload");}});}catch{}});}async function Gs(e,t,r){let s=await e.newContext({viewport:t.viewport,userAgent:"WPSuiteStaticPublisher/0.8 Playwright SitemapOnly",ignoreHTTPSErrors:t.ignoreHttpsErrors,...r?{javaScriptEnabled:false}:{}});return r||await Vs(s),s}async function Zs(e,t,r,s,n,i,u){let l=await chromium.launch({headless:true}),o=Wt(l);o.pid!==null&&r.debug(`Launched crawl worker browser PID ${o.pid}`,{browserPid:o.pid});try{for(;t.pageQueue.length>0&&!(e.maxPages>0&&t.donePages.size>=e.maxPages);){let a=t.pageQueue.shift();if(!a)break;t.queuedPages.delete(a);let p=null,d=null;try{let c=V(a,r,"page","page-queue");if(!c)continue;let g=c.toString();if(a=g,t.queuedPages.delete(a),t.donePages.has(a))continue;t.donePages.add(a),i.enabled&&i.seenPages.add(a);let h=Qe(e,a),m=Bs(e,c.pathname);if(!G(c)||A(e,c)||K(c)){if(A(e,c)){r.info(`Worker redirected non-page URL to asset queue: ${a}`,{url:a,source:"worker-guard"}),$(e,t,a,r,"worker-guard");continue}r.reject("page",a,"guard rejected non-page URL before rendering","worker");continue}let w=await es(e,n,t,i,a,r);if(i.enabled&&s!=="single-url"){let S=i.manifest.pages[a];if(w.action==="reuse"&&S){for(let v of S.discoveredAssets)$(e,t,v,r,a);for(let v of S.discoveredPages)ce(e,t,v,r,a);S.lastSeenRunId=i.runId,S.sitemapLastmod=oe(t.sitemapLastmodByPage[a])??S.sitemapLastmod,w.changeToken?.supported&&(S.changeToken=w.changeToken.token,S.tokenSource=w.changeToken.tokenSource??S.tokenSource),r.info(`Incremental reuse skipped unchanged page ${a}`,{url:a,mode:"incremental",reason:w.changeToken?.supported===!0?"change-token-match":"sitemap-lastmod-match"});continue}}p=await M(`create page context ${a}`,q(e),()=>Gs(l,e,m)),d=await M(`create page ${a}`,q(e),()=>p.newPage());let T=!1,k=new Set;await d.route("**/*",async S=>{let v=S.request();if(v.isNavigationRequest()&&v.frame()===d.mainFrame())try{let W=new URL(v.url()),X=new URL(g);if(W.hash="",X.hash="",W.href===X.href){if(T){r.warn(`Blocked same-page navigation/reload for ${a}`,{url:a,requestUrl:v.url()}),await S.abort("aborted");return}T=!0;}}catch{}await S.continue();}),d.on("response",S=>{try{let v=L(e,S.url(),e.sourceOrigin,r,"network-response");v&&A(e,v)&&(k.add(v.toString()),$(e,t,v.toString(),r,a));}catch{}}),r.page(`Rendering ${a}`,{url:a});let x=null,P=null;try{if(x=await d.goto(a,{waitUntil:"domcontentloaded",timeout:e.navigationTimeoutMs}),x&&x.ok())try{P=await M(`read response body ${a}`,q(e),()=>x.text());}catch{P=null;}}catch(S){r.warn(`Navigation issue for ${a}; saving current DOM if available`,{url:a,error:String(S)});}if(h){let S=x?.status()??null;if(S!==404){r.error(`Generated 404 request path returned unexpected status for ${a}`,{url:a,expectedStatus:404,status:S,requestPath:e.generated404RequestPath});continue}r.info(`Capturing rendered 404 page for ${a}`,{url:a,status:S,outputPath:H(e,a)});}else if(x&&!x.ok()){r.skip("page",a,x.status(),t.pageDiscoverySources.get(a)),await d.close();continue}m?(r.info(`Rendering without JS execution for ${a}`,{url:a,mode:"no-js"}),await M(`wait for rendered page ${a}`,q(e),()=>_s(e,d))):await M(`wait for rendered page ${a}`,q(e),()=>Ws(e,d)),t.stats.pagesRendered++;let y=await M(`extract rendered assets ${a}`,q(e),()=>Hs(e,d,g,r,!m));for(let S of y)$(e,t,S,r,a);let C=[...new Set([...y,...k])],R=P??await M(`capture rendered html ${a}`,q(e),()=>d.content()),D=s!=="single-url"&&!h?Es(e,a,R,r):[];if(s!=="single-url"&&!h)for(let S of D)ce(e,t,S,r,a);await Rt(e,a,R,t,r);let Q=H(e,a);if(N(u,e,Q),ae(u,Q),i.trackManifest){let S=x?.headers();i.manifest.pages[a]={url:a,outputPath:Q,contentType:Oe(S),changeToken:w.changeToken?.supported?w.changeToken.token:null,tokenSource:w.changeToken?.supported?w.changeToken.tokenSource??null:null,sitemapLastmod:oe(t.sitemapLastmodByPage[a])??null,discoveredPages:D,discoveredAssets:C,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!1},i.enabled&&await Y(e,i);}}catch(c){try{let g=d?await M(`capture partial html ${a}`,q(e),()=>d.content()):"";if(g&&g.trim()){await Rt(e,a,g,t,r);let h=H(e,a);if(N(u,e,h),ae(u,h),i.trackManifest){let m=i.manifest.pages[a]??i.previousManifest.pages[a];i.manifest.pages[a]={url:a,outputPath:h,contentType:m?.contentType??null,changeToken:null,tokenSource:null,sitemapLastmod:oe(t.sitemapLastmodByPage[a])??m?.sitemapLastmod??null,discoveredPages:m?.discoveredPages?[...m.discoveredPages]:[],discoveredAssets:m?.discoveredAssets?[...m.discoveredAssets]:[],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!1},i.enabled&&await Y(e,i);}r.warn(`Saved partial DOM for ${a}`,{url:a,error:String(c)});}}catch(g){r.error(`Could not save partial DOM for ${a}`,{url:a,error:String(g)});}r.error(`Failed page ${a}`,{url:a,error:String(c)});}finally{t.stats.pagesCompleted++,zs(t)&&Js(t,r),d&&await M(`close page ${a}`,Pe(e),()=>d.close()).catch(c=>{r.warn(`Timed out while closing page ${a}`,{url:a,browserPid:o.pid,error:String(c)});}),p&&await M(`close page context ${a}`,Pe(e),()=>p.close()).catch(c=>{r.warn(`Timed out while closing page context for ${a}`,{url:a,browserPid:o.pid,error:String(c)});});}}}finally{await M("close worker browser",Pe(e),()=>l.close()).catch(a=>(r.warn("Timed out while closing crawl worker browser",{browserPid:o.pid,error:String(a)}),Ns(l,r,"browser.close timeout")));}}async function Ys(e){try{let t=await b.readFile(e),s=(e.endsWith(".gz")?gunzipSync(t):t).toString("utf8").trim();if(!s)return [];try{let n=JSON.parse(s);if(Array.isArray(n))return n;if(n&&typeof n=="object")return [n]}catch{return s.split(/\r?\n/).map(n=>n.trim()).filter(Boolean).map(n=>{try{let i=JSON.parse(n);return i&&typeof i=="object"?i:null}catch{return null}}).filter(n=>n!==null)}return []}catch{return []}}function kt(e){let t=String(e||"").toLowerCase();return t.includes("timeout")||t.includes("timed out")||t.includes("navigation timeout")}function Ks(e){let t=String(e?.job?.command||"").trim(),r=String(e?.job?.crawlMode||"full").trim();return t!=="publish"&&t!=="crawl"?false:r!=="incremental"}function Xs(e){let t=[e?.archivedAt,e?.job?.endedAt,e?.job?.startedAt];for(let r of t){let s=Date.parse(String(r||""));if(Number.isFinite(s))return s}return 0}async function _t(e){try{let t=await b.readFile(e,"utf8"),r=JSON.parse(t);return r&&typeof r=="object"&&!Array.isArray(r)?r:null}catch{return null}}function xt(e){let t=String(e.originalFileName||"").toLowerCase();return t.endsWith("errors.jsonl")?0:t.endsWith("errors.json")?1:2}function en(e,t){let r=Array.isArray(t?.artifacts)?t.artifacts.filter(s=>String(s?.role||"").trim()==="errors"&&String(s?.storedFileName||"").trim()!=="").sort((s,n)=>xt(s)-xt(n)).map(s=>f.join(e,String(s.storedFileName))):[];return [...new Set([...r,f.join(e,"errors.jsonl"),f.join(e,"errors.json"),f.join(e,"errors.jsonl.gz"),f.join(e,"errors.json.gz")])]}async function Tt(e){let t=await _t(f.join(e,"job.json"));for(let r of en(e,t)){let s=await Ys(r);if(s.length>0)return s}return []}async function tn(e){let t=f.join(e.logDir,"archive"),r;try{r=await b.readdir(t);}catch{return ""}let s="",n=0;for(let i of r){let u=f.join(t,i);if(!(await b.stat(u).catch(()=>null))?.isDirectory())continue;let o=await _t(f.join(u,"job.json"));if(!Ks(o))continue;let a=Xs(o);a>=n&&(n=a,s=u);}return s}async function rn(e){let t=await tn(e),r=t!==""?await Tt(t):await Tt(e.logDir),s=new Set;for(let n of r)if(kt(n.error)||kt(n.message)){let i=n.url;typeof i=="string"&&i&&s.add(i);}return [...s]}async function sn(e){let t=[];for(let r of e)if(r.startsWith("@")){let s=r.slice(1),n=await b.readFile(s,"utf8");t.push(...n.split(/\r?\n/).map(i=>i.trim()).filter(i=>i&&!i.startsWith("#")));}else t.push(r);return t}async function nn(e){try{let t=await b.readFile(f.join(e.outputDir,"asset-map.json"),"utf8");return JSON.parse(t)}catch{return {}}}async function on(e){let t=["crawl.log.jsonl","current-crawl-event.json","rejected.jsonl","ignored.jsonl","skipped-http.jsonl","errors.jsonl","timings.jsonl","rejected.json","ignored.json","skipped-http.json","errors.json","timings.json"];await b.mkdir(e,{recursive:true}),await Promise.all(t.map(async r=>{try{await b.unlink(f.join(e,r));}catch(s){if(s.code!=="ENOENT")throw s}}));}function At(e,t,r,s,n){let i=L(e,r,e.sourceOrigin,s,"manual-url");i&&(pe(i)?_e(e,t,i.toString(),s,n):A(e,i)?$(e,t,i.toString(),s,n):G(i)?ce(e,t,i.toString(),s,n):s.reject("manual-url",i.toString(),"not page/sitemap/asset-like",n));}async function an(){let e=[],t=await xe(void 0,{onRemotePublisherConfigDiagnostic:P=>{e.push(P);}}),r=e.at(-1)??null,s=Qr(process.argv.slice(2));if(s.resumeRewrite&&s.mode!=="full")throw new Error("--resume-rewrite is only supported for full crawl/publish jobs.");let n=[];s.mode==="retry-timeouts"&&(n=await rn(t)),s.mode==="single-url"&&(n=await sn(s.urls));let i=s.crawlMode==="incremental"&&s.mode==="full",u=i&&typeof t.subscriptionType=="string"&&t.subscriptionType.trim()!=="",l=(s.mode==="full"||s.mode==="single-url")&&!s.resumeRewrite,o=s.mode!=="full"||s.resumeRewrite||u,a=o?await nn(t):{},p=u||s.mode==="single-url"?await Jr(t):$t(),d={enabled:u,trackManifest:l,manifest:Ee(p),previousManifest:Ee(p),runId:`${Date.now()}`,seenPages:new Set,changeTokenCache:new Map,manifestSaveChain:Promise.resolve()};await on(t.logDir);let c=new ie(t.logDir,t.logLevel);if(r){let P={status:r.status,virtualAssetBaseUrl:r.virtualAssetBaseUrl,subscriptionType:r.subscriptionType??null,error:r.error,requests:r.requests,source:"remote-publisher-config"};r.status==="loaded"&&r.subscriptionType?c.info("Loaded remote WP Suite publisher configuration.",P):c.warn("Remote WP Suite publisher configuration is unavailable or has no active subscription type.",P);}if(i&&!u){let P="Incremental crawl requires an active remote publisher subscription; refusing to fall back to a destructive full crawl.";throw c.error(P,{requestedMode:s.crawlMode,subscriptionType:t.subscriptionType??null,source:"incremental-subscription-guard"}),await c.flush(),new Error(P)}let g={pageQueue:[],queuedPages:new Set,donePages:new Set,pageDiscoverySources:new Map,assetQueue:[],queuedAssets:new Set,doneAssets:new Set,sitemapQueue:[],queuedSitemaps:new Set,doneSitemaps:new Set,sitemapLastmodByPage:{},assetMap:{...a},assetVariantDigestsByOriginalPath:new Map,stats:{pagesQueued:0,pagesRendered:0,pagesCompleted:0,assetsQueued:0,sitemapsQueued:0,assetsSaved:0,pagesSaved:0}},h=zr();if(await Ye(t),await Ke(t,{startedAt:new Date().toISOString(),outputDir:f.resolve(t.outputDir)}),o||await b.rm(t.outputDir,{recursive:true,force:true}),await b.mkdir(t.outputDir,{recursive:true}),s.resumeRewrite)c.info("Resuming final rewrite from existing output.",{phase:"rewrite-text",mode:s.mode,crawlMode:s.crawlMode});else {let P=await request.newContext({ignoreHTTPSErrors:t.ignoreHttpsErrors});try{if(c.mark("discovery"),s.mode==="full"?(t.sitemapPaths.forEach(C=>_e(t,g,C,c)),await Ct(t,P,g,c,h),t.seedPaths.forEach(C=>At(t,g,C,c,"seed-path")),t.generated404RequestPath&&ce(t,g,t.generated404RequestPath,c,"generated-404-request-path")):(n.forEach(C=>At(t,g,C,c,"cli")),await Ct(t,P,g,c,h)),c.endMark("discovery",{pages:g.pageQueue.length,assets:g.assetQueue.length,sitemaps:g.sitemapQueue.length}),c.summary(`Queued ${g.pageQueue.length} pages, ${g.assetQueue.length} assets, ${g.sitemapQueue.length} sitemaps.`,{mode:s.mode,crawlMode:s.crawlMode,queuedPages:g.pageQueue.length,queuedAssets:g.assetQueue.length,queuedSitemaps:g.sitemapQueue.length}),s.mode==="retry-timeouts"&&g.pageQueue.length===0&&g.assetQueue.length===0&&g.sitemapQueue.length===0){c.summary("No timed-out URLs were queued. Skipping retry crawl.",{mode:s.mode,crawlMode:s.crawlMode,queuedPages:0,queuedAssets:0,queuedSitemaps:0}),await c.flush();return}c.mark("render-pages");let y=Array.from({length:Math.max(1,t.concurrency)},()=>Zs(t,g,c,s.mode,P,d,h));if(await Promise.all(y),c.endMark("render-pages",{pages:g.stats.pagesCompleted}),c.mark("download-assets"),c.progress("Asset download phase started.",{phase:"download-assets",doneAssets:g.doneAssets.size,assetsQueued:g.stats.assetsQueued,assetQueue:g.assetQueue.length}),await Fs(t,P,g,c,d,h),c.endMark("download-assets",{assets:g.doneAssets.size}),d.enabled&&t.maxPages===0&&await rs(t,g,d,c,h),s.mode==="full"){let C=await Os(t,g,c);for(let R of C)N(h,t,R);}}finally{await M("dispose crawl request context",Pe(t),()=>P.dispose()).catch(y=>{c.warn("Timed out while disposing crawl request context",{error:String(y)});});}}d.trackManifest&&await Y(t,d),await b.writeFile(f.join(t.outputDir,"asset-map.json"),JSON.stringify(g.assetMap,null,2),"utf8"),JSON.stringify(a,null,2)!==JSON.stringify(g.assetMap,null,2)&&N(h,t,f.join(t.outputDir,"asset-map.json"));let m=s.mode==="single-url"?ds(t,g):d.enabled&&!s.resumeRewrite?ss(t,d,h,a,g.assetMap):void 0;c.mark("rewrite-text");let w=s.mode==="single-url"?`Rewriting text files touched by URL crawl: 0/${m?.length??0}`:"Rewriting text files...";c.progress(w,{phase:"rewrite-text",index:0,totalFiles:m?.length,changedTextFiles:0}),await yt(w);let T=Date.now(),k=await dt(t,g.assetMap,{files:m,previousAssetMap:a,onStart:({totalFiles:P,workerCount:y})=>{c.info(`Rewrite phase scanning ${P} text files.`,{phase:"rewrite-text",totalFiles:P,workerCount:y});},onProgress:async({index:P,totalFiles:y,changedTextFiles:C,file:R,changed:D})=>{D&&N(h,t,f.join(t.outputDir,R)),c.checkpoint(`Rewriting text file ${P}/${y}`,{phase:"rewrite-text",index:P,totalFiles:y,changedTextFiles:C,file:R}),c.debug(`${D?"Rewrote":"Checked unchanged"} text file ${P}/${y}: ${R}`,{phase:"rewrite-text",index:P,totalFiles:y,changedTextFiles:C,file:R,changed:D});let Q=Date.now();if(!(P===1||P===y||P%50===0||Q-T>=5e3))return;T=Q;let v=`Rewriting text files: ${P}/${y}`;c.progress(v,{phase:"rewrite-text",index:P,totalFiles:y,changedTextFiles:C,file:R}),await yt(v);}});d.trackManifest&&(ns(d,m),await Y(t,d)),c.endMark("rewrite-text",{changedTextFiles:k});let x=d.enabled&&!s.resumeRewrite?await os(t,g,d,h,c):[];await Ze(t,{generatedAt:new Date().toISOString(),outputDir:f.resolve(t.outputDir),runMode:s.mode,crawlMode:s.crawlMode,fullSyncRequired:!(d.enabled&&!s.resumeRewrite),changedFiles:d.enabled&&!s.resumeRewrite?[...h.changedFiles].sort():[],deletedFiles:d.enabled&&!s.resumeRewrite?x:[],rewriteTargets:d.enabled&&!s.resumeRewrite?[...new Set((m||[]).map(P=>te(t.outputDir,f.isAbsolute(P)?P:f.join(t.outputDir,P))).filter(P=>P!==null))].sort():[]}),await Xe(t),c.summary(s.resumeRewrite?`Done. Resumed final rewrite over existing output and changed ${k} text files.`:`Done. Rendered ${g.stats.pagesRendered} pages, processed ${g.doneSitemaps.size} sitemaps, downloaded ${g.doneAssets.size} assets.`,{mode:s.mode,crawlMode:s.crawlMode,resumeRewrite:s.resumeRewrite,...g.stats,pagesRendered:g.stats.pagesRendered,donePages:g.stats.pagesCompleted,claimedPages:g.donePages.size,doneSitemaps:g.doneSitemaps.size,doneAssets:g.doneAssets.size,changedTextFiles:k}),await c.flush();}an().catch(async e=>{console.error(e);try{let r=(await xe().catch(()=>null))?.logDir??"logs",s=new ie(r,"debug");s.error(`Unhandled error: ${e instanceof Error?e.message:String(e)}`,e instanceof Error?{stack:e.stack}:void 0),await s.flush();}catch{}process.exit(1);});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@smart-cloud/publisher-exporter",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.36",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Headless Playwright static publisher for WordPress/Elementor sites with sitemap-only page discovery, strict asset capture, escaped URL rewrite, structured logs, and targeted retry modes.",
|
|
@@ -45,6 +45,8 @@
|
|
|
45
45
|
"@aws-sdk/lib-storage": "^3.1100.0",
|
|
46
46
|
"@smart-cloud/publisher-core": "^1.1.5",
|
|
47
47
|
"@smart-cloud/wpsuite-core": "^2.3.2",
|
|
48
|
+
"baseline-browser-mapping": "^2.11.12",
|
|
49
|
+
"caniuse-lite": "^1.0.30001809",
|
|
48
50
|
"fast-glob": "^3.3.3",
|
|
49
51
|
"jose": "^6.2.8",
|
|
50
52
|
"mime-types": "^3.0.2",
|