@smart-cloud/publisher-exporter 1.1.72 → 1.1.73
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -0
- package/dist/content-sync.js +15 -15
- package/dist/crawl.js +13 -13
- package/package.json +3 -2
package/dist/crawl.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import {request,chromium}from'playwright';import M,{readFile}from'fs/promises';import w from'path';import {gunzipSync}from'zlib';import gs from'fast-glob';import Hr from'mime-types';import Rr,{createHash}from'crypto';import es from'http';import ts from'https';import {availableParallelism}from'os';import {Worker}from'worker_threads';import {LambdaClient,InvokeCommand}from'@aws-sdk/client-lambda';import {DynamoDBClient,GetItemCommand}from'@aws-sdk/client-dynamodb';import {S3Client,GetObjectCommand,PutObjectCommand,CopyObjectCommand}from'@aws-sdk/client-s3';import {fromTemporaryCredentials}from'@aws-sdk/credential-providers';var Bn=".deploy-plan.json",Vn="deploy-plan.json",Hn=".crawl-incomplete.json",zn="crawl-incomplete.json";function or(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?w.resolve(e):""}function ir(e){let t=String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").trim(),r=w.posix.normalize(t);return !t||!r||r==="."||/^[a-zA-Z]:/.test(r)||r.startsWith("../")||r===".."?null:r}function Qn(e){let t=String(e||"").trim();if(!t.startsWith("/")||t.startsWith("//")||t.includes("*")||t.includes("#"))return null;try{let r=new URL(t,"https://content-sync.invalid");return r.origin!=="https://content-sync.invalid"?null:`${w.posix.normalize(r.pathname)}${r.search}`}catch{return null}}function se(e){return [...new Set(e.map(ir).filter(t=>t!==null))]}function Kn(e,t){let r={generatedAt:String(t.generatedAt||new Date().toISOString()),outputDir:w.resolve(e.outputDir),runMode:t.runMode,crawlMode:t.crawlMode,fullSyncRequired:!!t.fullSyncRequired,changedFiles:se(t.changedFiles||[]),deletedFiles:se(t.deletedFiles||[]),rewriteTargets:se(t.rewriteTargets||[]),revalidateFiles:se(t.revalidateFiles||[])};return t.schemaVersion===2?{...r,schemaVersion:2,runMode:"content-sync",crawlMode:"incremental",fullSyncRequired:false,consumerId:String(t.consumerId||"").trim(),fromSequence:Math.max(0,Number(t.fromSequence)||0),toSequence:Math.max(0,Number(t.toSequence)||0),impactHash:String(t.impactHash||"").trim(),resolvedSitemapUrls:[...new Set((t.resolvedSitemapUrls||[]).map(n=>String(n||"").trim()).filter(n=>{try{let s=new URL(n);return s.protocol==="http:"||s.protocol==="https:"}catch{return false}}))],uploadGroups:{assets:se(t.uploadGroups?.assets||[]),content:se(t.uploadGroups?.content||[]),listings:se(t.uploadGroups?.listings||[]),resources:se(t.uploadGroups?.resources||[]),sitemapLeaves:se(t.uploadGroups?.sitemapLeaves||[]),sitemapIndexes:se(t.uploadGroups?.sitemapIndexes||[])},invalidationPaths:[...new Set((t.invalidationPaths||[]).map(Qn).filter(n=>n!==null))].sort()}:{schemaVersion:1,...r,runMode:t.runMode}}function ar(e){let t=w.join(w.resolve(e.outputDir),Bn),r=or();return r?[w.join(r,Vn),t]:[t]}function cr(e){let t=w.join(w.resolve(e.outputDir),Hn),r=or();return r?[w.join(r,zn),t]:[t]}function G(e,t){let r=w.resolve(e),n=w.resolve(t),s=w.relative(r,n).replace(/\\/g,"/");return ir(s)}async function Pt(e,t){let r=Kn(e,t);for(let n of ar(e)){await M.mkdir(w.dirname(n),{recursive:true});let s=`${n}.${process.pid}.${Date.now()}.tmp`;await M.writeFile(s,JSON.stringify(r,null,2),"utf8"),await M.rename(s,n);}}async function ur(e){for(let t of ar(e))try{await M.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}async function lr(e,t){let r={schemaVersion:1,startedAt:String(t.startedAt||new Date().toISOString()),outputDir:w.resolve(e.outputDir)};for(let n of cr(e)){await M.mkdir(w.dirname(n),{recursive:true});let s=`${n}.${process.pid}.tmp`;await M.writeFile(s,JSON.stringify(r,null,2),"utf8"),await M.rename(s,n);}}async function dr(e){for(let t of cr(e))try{await M.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}function Gn(e){return new URL(e).pathname.split("/").filter(Boolean).some(r=>{try{return decodeURIComponent(r).endsWith("__trashed")}catch{return r.endsWith("__trashed")}})}function Rt(e){return Array.isArray(e)?e.map(Rt):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).sort(([t],[r])=>t.localeCompare(r)).map(([t,r])=>[t,Rt(r)])):e}function Zn(e){return JSON.stringify(Rt(e))}function Yn(e){return createHash("sha256").update(Zn(e)).digest("hex")}function pr(e){let{impactHash:t,...r}=e;if(e.schemaVersion!==1||!t)throw new Error("Invalid content-sync impact plan schema.");if(!Array.isArray(e.resourceRenderUrls)||!Array.isArray(e.resourceDeleteUrls))throw new Error("Invalid content-sync resource impact contract.");if(Yn(r)!==t)throw new Error("Content-sync impact plan hash mismatch.");for(let n of [...e.directRenderUrls,...e.deleteUrls,...e.resourceRenderUrls,...e.resourceDeleteUrls])if(Gn(n))throw new Error(`Content-sync impact contains a WordPress trash alias instead of the last public URL: ${n}`)}var vt=["/sitemap_index.xml","/wp-sitemap.xml","/sitemap.xml"];function mr(e){let t=new Set;for(let r of [...e,...vt]){let n=String(r||"").trim();n&&t.add(n);}return [...t]}function kt(e){let t=e.pathname.toLowerCase();return t.endsWith(".xml")&&(t.includes("sitemap")||t.endsWith("/sitemap.xml"))}function hr(e){if(!e||!/^https?:\/\//i.test(e))return false;try{return kt(new URL(e))}catch{return false}}function fr(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function rs(e){let t=String(e??"").trim();if(!t)return "";let r=t;if(/^https?:\/\//i.test(r))try{r=new URL(r).pathname;}catch{return ""}if(r=r.split(/[?#]/,1)[0]?.replace(/\\/g,"/").trim()??"",!r)return "";let n=r.endsWith("/"),s=r.replace(/^\/+/,"").split("/").map(i=>i.replace(/[^A-Za-z0-9._-]/g,"")).filter(i=>i.length>0&&i!=="."&&i!=="..");if(s.length===0)return "";let o=`/${s.join("/")}`;return n&&w.extname(o)===""&&(o+="/"),o==="/"?"":o}function Ct(e){return !e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).map(([t,r])=>[t.trim(),String(r??"")]).filter(([t])=>t.length>0))}function ns(e){if(!e||typeof e!="object")return {};let t={};for(let[r,n]of Object.entries(e)){let s=r.trim();if(!s||!n||typeof n!="object")continue;let o=n,i={};if(typeof o.targetOrigin=="string"){let a=fr(o.targetOrigin);a&&(i.targetOrigin=a);}let c=Ct(o.extraReplacements);if(Object.keys(c).length>0&&(i.extraReplacements=c),o.s3&&typeof o.s3=="object"){let a={},l=o.s3;typeof l.bucket=="string"&&(a.bucket=l.bucket.trim()),typeof l.prefix=="string"&&(a.prefix=l.prefix.trim()),typeof l.region=="string"&&(a.region=l.region.trim()),typeof l.htmlCacheControl=="string"&&(a.htmlCacheControl=l.htmlCacheControl.trim()),typeof l.assetCacheControl=="string"&&(a.assetCacheControl=l.assetCacheControl.trim()),Object.keys(a).length>0&&(i.s3=a);}if(o.cloudFront&&typeof o.cloudFront=="object"){let a={},l=o.cloudFront;typeof l.distributionId=="string"&&(a.distributionId=l.distributionId.trim()),Array.isArray(l.invalidationPaths)&&(a.invalidationPaths=l.invalidationPaths.map(d=>String(d??"").trim()).filter(d=>d.length>0)),Object.keys(a).length>0&&(i.cloudFront=a);}t[s]=i;}return t}function At(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function ss(e,t){if(!e||typeof e!="object")return null;let r=e,n=r.command;if(n!=="publish"&&n!=="crawl"&&n!=="deploy"&&n!=="invalidate"&&n!=="retry-timeouts"&&n!=="url"&&n!=="content-sync")return null;let s=Number.parseInt(String(r.intervalMinutes??"0"),10);if(!Number.isFinite(s)||s<1)return null;let o=String(r.id??`${n}-${t+1}`).trim();if(!o)return null;let i=String(r.deploymentProfile??"").trim(),c=String(r.url??"").trim(),a=Array.isArray(r.postTypes)?[...new Set(r.postTypes.map(d=>String(d??"").trim().toLowerCase().replace(/[^a-z0-9_-]/g,"")).filter(Boolean))]:[],l=Array.isArray(r.listingPaths)?[...new Set(r.listingPaths.map(d=>String(d??"").trim()).filter(Boolean))]:[];return n==="content-sync"&&a.length===0?null:{id:o,enabled:r.enabled!==false,command:n,intervalMinutes:s,...n==="publish"||n==="crawl"?{crawlMode:r.crawlMode==="incremental"?"incremental":"full"}:{},...(n==="publish"||n==="deploy"||n==="invalidate"||n==="content-sync")&&i?{deploymentProfile:i}:{},...c?{url:c}:{},...a.length>0?{postTypes:a}:{},...l.length>0?{listingPaths:l}:{},...typeof r.includeSubsites=="boolean"?{includeSubsites:r.includeSubsites}:{},...typeof r.includePostTypeArchives=="boolean"?{includePostTypeArchives:r.includePostTypeArchives}:{},...typeof r.includeTaxonomyArchives=="boolean"?{includeTaxonomyArchives:r.includeTaxonomyArchives}:{},...typeof r.includeAuthorArchives=="boolean"?{includeAuthorArchives:r.includeAuthorArchives}:{},...typeof r.includeDateArchives=="boolean"?{includeDateArchives:r.includeDateArchives}:{},...typeof r.includePostsPage=="boolean"?{includePostsPage:r.includePostsPage}:{},...typeof r.includeSitemapChain=="boolean"?{includeSitemapChain:r.includeSitemapChain}:{}}}function wr(e){let t=e&&typeof e=="object"?e:{},r=Array.isArray(t.rules)?t.rules.map((n,s)=>ss(n,s)).filter(n=>!!n):[];return {enabled:t.enabled===true,timezone:typeof t.timezone=="string"&&t.timezone.trim()!==""?t.timezone.trim():"UTC",rules:r}}function os(e){let t=e&&typeof e=="object"?e:{},r=t.render&&typeof t.render=="object"?t.render:{},n=Number(r.concurrency??0),s=Number(r.batchSize??0),o=Number(r.maxAttempts??0),i=t.rewrite&&typeof t.rewrite=="object"?t.rewrite:{},c=t.deploy&&typeof t.deploy=="object"?t.deploy:{},a=(l,d)=>({enabled:typeof l.enabled=="boolean"?l.enabled:r.enabled===true,concurrency:Math.min(100,Math.max(1,Number(l.concurrency||d.concurrency))),batchSize:Math.min(500,Math.max(1,Number(l.batchSize||d.batchSize))),maxAttempts:Math.min(5,Math.max(1,Number(l.maxAttempts||2)))});return {render:{enabled:r.enabled===true,...Number.isInteger(n)&&n>0?{concurrency:n}:{},batchSize:Number.isInteger(s)&&s>0?Math.min(20,s):5,...Number.isInteger(o)&&o>0?{maxAttempts:Math.min(5,o)}:{}},rewrite:a(i,{concurrency:8,batchSize:25}),deploy:a(c,{concurrency:8,batchSize:50})}}function is(e){if(!e||typeof e!="object")return;let t=e,r={};for(let s of ["accountId","siteId"]){let o=t[s];typeof o=="string"&&o.trim()!==""&&(r[s]=o.trim());}let n=Number(t.lastUpdate??0);return Number.isFinite(n)&&n>0&&(r.lastUpdate=Math.floor(n)),t.subscriber===true&&(r.subscriber=true),Object.keys(r).length>0?r:void 0}function Tt(e){let t=e&&typeof e=="object"?e:{},r=String(t.accountId??"").trim(),n=String(t.siteId??"").trim(),s=t.subscriber===true,o=is(t.siteSettings),i={...o??{},...r?{accountId:o?.accountId??r}:{},...n?{siteId:o?.siteId??n}:{},...o?.subscriber===true||s?{subscriber:true}:{}},c={},a=String(t.apiBase??"").trim();a&&(c.apiBase=a);let l=String(t.runtimeToken??t.nonce??"").trim();l&&(c.runtimeToken=l);let d=String(t.virtualAssetBaseUrl??t.uploadUrl??"").trim();d&&(c.virtualAssetBaseUrl=d),Object.keys(i).length>0&&(c.siteSettings=i);let u=At(t.subscriptionType);return u&&(c.subscriptionType=u),c}function as(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function yr(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function cs(e,t){let r=new Headers(e instanceof Request?e.headers:void 0);if(t?.headers)for(let[n,s]of new Headers(t.headers).entries())r.set(n,s);return r}async function br(e,t,r=5){let n=new URL(yr(e)),s=String(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase(),o=n.protocol==="http:"?es:ts,i=cs(e,t);return await new Promise((c,a)=>{let l=o.request(n,{method:s,headers:Object.fromEntries(i.entries()),...n.protocol==="https:"?{rejectUnauthorized:false}:{}},d=>{let u=[];d.on("data",h=>{u.push(Buffer.isBuffer(h)?h:Buffer.from(h));}),d.on("error",a),d.on("end",()=>{let h=d.statusCode??0,f=d.headers.location;if(r>0&&f&&[301,302,303,307,308].includes(h)){c(br(new URL(f,n),{method:h===303?"GET":s},r-1));return}let g=new Headers;for(let[y,p]of Object.entries(d.headers))Array.isArray(p)?g.set(y,p.join(", ")):typeof p=="string"&&g.set(y,p);c(new Response(Buffer.concat(u),{status:h,statusText:d.statusMessage??"",headers:g}));});});l.on("error",a),l.end();})}function us(e){let t=Tt(e.wpsuite),r={...t.siteSettings??{},...t.siteSettings?.subscriber===true||t.subscriptionType==="PROFESSIONAL"||t.subscriptionType==="AGENCY"?{subscriber:true}:{}},n=String(r.accountId??"").trim(),s=String(r.siteId??"").trim(),o=String(t.virtualAssetBaseUrl??t.uploadUrl??"").trim();if(e.wpsuite={...t.apiBase?{apiBase:t.apiBase}:{},...t.runtimeToken?{runtimeToken:t.runtimeToken}:{},...o?{virtualAssetBaseUrl:o}:{},...Object.keys(r).length>0?{siteSettings:r}:{},...t.subscriptionType?{subscriptionType:t.subscriptionType}:{}},!n||!s||!o)return false;as(e.sourceOrigin);let i=globalThis,a={...i.WpSuite??{},siteSettings:r,uploadUrl:o};return t.apiBase&&(a.apiBase=t.apiBase),i.WpSuite=a,true}async function ls(e){let t=String(e.wpsuite?.virtualAssetBaseUrl??e.wpsuite?.uploadUrl??"").trim();if(!us(e)){let s=e.wpsuite?.siteSettings,o=[String(s?.accountId??"").trim()?"":"accountId",String(s?.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): ${o.join(", ")}.`,requests:[]}}}let r=globalThis.fetch,n=[];try{typeof r=="function"&&/^https?:\/\//i.test(t)&&(globalThis.fetch=(async(a,l)=>{let d=yr(a);if(d.startsWith(t)){let u=(()=>{try{return new URL(d).pathname}catch{return d}})();try{let h=e.ignoreHttpsErrors&&d.startsWith("https://")?await br(a,l):await r(a,l);return n.push({path:u,status:h.status,ok:h.ok,error:null}),h}catch(h){throw n.push({path:u,status:null,ok:!1,error:h instanceof Error?h.message:String(h)}),h}}return r(a,l)}));let{getConfig:s}=await import('@smart-cloud/wpsuite-core'),o=await s("publisher"),i=o&&typeof o=="object"?o:null,c=At(i?.subscriptionType);return {remote:i,diagnostic:{status:i?"loaded":"unavailable",virtualAssetBaseUrl:t,subscriptionType:c??null,error:i?null:"WP Suite publisher config loader returned no configuration.",requests:n}}}catch(s){return {remote:null,diagnostic:{status:"unavailable",virtualAssetBaseUrl:t,subscriptionType:null,error:s instanceof Error?s.message:String(s),requests:n}}}finally{typeof r=="function"&&(globalThis.fetch=r);}}function ds(e,t){let r=ns(t?.deploymentProfiles),n=String(t?.defaultDeploymentProfile??"").trim(),s=r[n]?n:"",o=At(t?.subscriptionType),i=Tt(e.wpsuite);return {...e,scheduler:wr(t?.scheduler),deploymentProfiles:r,defaultDeploymentProfile:s,...o?{subscriptionType:o}:{},wpsuite:{...i,...i.siteSettings||o?{siteSettings:{...i.siteSettings??{},...i.siteSettings?.subscriber===true||o==="PROFESSIONAL"||o==="AGENCY"?{subscriber:true}:{}}}:{},...o?{subscriptionType:o}:{}}}}function xt(e,t){let n=String(e||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!n)return t;let s=n.split("/").map(o=>o.trim()).filter(o=>o.length>0&&o!=="."&&o!=="..");return s.length>0?s.join("/"):t}function ps(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?w.resolve(e):""}function gr(e,t,r){let n=String(t||"").trim();return n&&w.isAbsolute(n)?w.resolve(n):w.resolve(e,xt(n,r))}async function tt(e,t={}){let r=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",n=await M.readFile(r,"utf8"),s=JSON.parse(n);s.sourceOrigin=s.sourceOrigin.replace(/\/$/,""),s.targetOrigin=fr(s.targetOrigin),s.ignoreHttpsErrors??=false,s.outputDir=String(s.outputDir||"export").trim()||"export",s.urlRewriteMode||=s.targetOrigin==="."?"relative":"absolute",s.noJavaScriptRenderPathPrefixes||=[],s.seedPaths||=[],s.generated404RequestPath=rs(s.generated404RequestPath),s.sitemapPaths||=[...vt],s.allowedAssetHosts||=[],s.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],s.blockedPathPrefixes||=[],s.blockedSearchFragments||=[];let o=Number(s.processingConcurrency)>0?Math.min(100,Math.max(1,Number(s.processingConcurrency))):null;s.concurrency=o??s.concurrency??1,s.maxPages||=0,s.extraReplacements=Ct(s.extraReplacements),s.postCrawlCopyMap=Ct(s.postCrawlCopyMap),s.logDir=String(s.logDir||"logs").trim()||"logs",s.verbose??=false,s.logLevel||=s.verbose?"debug":"info",s.s3SyncMode||="sdk-upload-delete",s.readiness||={waitForSelector:null,waitForFunction:null,timeoutMs:1500,fallbackWaitMs:1500},s.readiness.timeoutMs??=1500,s.readiness.fallbackWaitMs??=1500,s.viewport||={width:1440,height:1200},s.navigationTimeoutMs||=3e4,s.assetDownloadConcurrency=o??(Number(s.assetDownloadConcurrency)>0?Number(s.assetDownloadConcurrency):s.concurrency),s.rewriteConcurrency=o??(Number(s.rewriteConcurrency)>0?Number(s.rewriteConcurrency):s.assetDownloadConcurrency),s.wpsuite=Tt(s.wpsuite),s.scheduler=wr(void 0),s.remoteWorkers=os(s.remoteWorkers),typeof s.lambdaDelegationEnabled=="boolean"&&(s.remoteWorkers.render??={},s.remoteWorkers.rewrite??={},s.remoteWorkers.deploy??={},s.remoteWorkers.render.enabled=s.lambdaDelegationEnabled,s.remoteWorkers.rewrite.enabled=s.lambdaDelegationEnabled,s.remoteWorkers.deploy.enabled=s.lambdaDelegationEnabled),o!==null&&(s.processingConcurrency=o,s.remoteWorkers.render??={},s.remoteWorkers.rewrite??={},s.remoteWorkers.deploy??={},s.remoteWorkers.render.concurrency=o,s.remoteWorkers.rewrite.concurrency=o,s.remoteWorkers.deploy.concurrency=o),s.deploymentProfiles={},s.defaultDeploymentProfile="",s.deploymentTargetOverride=String(s.deploymentTargetOverride??"").trim();let i=await ls(s);t.onRemotePublisherConfigDiagnostic?.(i.diagnostic);let c=ds(s,i.remote),a=ps(),l=a?w.resolve(a,".."):"";return l?(c.outputDir=gr(l,c.outputDir,"export"),c.logDir=gr(l,c.logDir,"logs")):(w.isAbsolute(c.outputDir)||(c.outputDir=xt(c.outputDir,"export")),w.isAbsolute(c.logDir)||(c.logDir=xt(c.logDir,"logs"))),c}function oe(e,t=10){return Rr.createHash("sha1").update(e).digest("hex").slice(0,t)}async function ms(e){await M.mkdir(w.dirname(e),{recursive:true});}async function me(e,t,r){await ms(e);let n=w.join(w.dirname(e),`.${w.basename(e)}.${process.pid}.${Date.now()}.${Rr.randomBytes(6).toString("hex")}.tmp`);try{typeof t=="string"?await M.writeFile(n,t,r??"utf8"):await M.writeFile(n,t),await M.rename(n,e);}catch(s){throw await M.unlink(n).catch(()=>{}),s}}function ie(e){return [".html",".htm",".css",".js",".mjs",".json",".xml",".xsl",".txt",".svg",".map",".enc",".jws"].includes(w.extname(e).toLowerCase())}function he(e){return e.replace(/"/g,'"').replace(/"/g,'"').replace(/'/g,"'").replace(/'/g,"'").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function $e(e){return e.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">")}function rt(e){return e.replace(/\//g,"\\/")}function Sr(e){return e.replace(/\//g,"\\\\/")}function hs(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 Pr(e,t,r){if(!t)return;e[t]=r;let n=rt(t),s=rt(r);e[n]=s;let o=Sr(t),i=Sr(r);e[o]=i;let c=$e(t),a=$e(r);e[c]=a;let l=$e(n),d=$e(s);e[l]=d;let u=$e(o),h=$e(i);e[u]=h;}function nt(e,t,r){Pr(e,t,r);let n=hs(t);n&&n!==t&&Pr(e,n,r);}function It(e,t){let r=t.startsWith("/")?t:`/${t}`,n=(e||"").replace(/\/$/,"");return !n||n==="."||n==="/"?r:`${n}${r}`}function vr(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function kr(e,t,r){if(!t)return r;let n=w.dirname(w.resolve(t)),s=w.resolve(e,r.replace(/^\/+/,"")),o=w.relative(n,s).replace(/\\/g,"/");return o?(o.startsWith(".")||(o=`./${o}`),o):"."}async function Mt(e,t){return (t?[...new Set(t)].map(n=>w.resolve(n)).filter(n=>n.startsWith(w.resolve(e.outputDir))).map(n=>w.relative(e.outputDir,n).replace(/\\/g,"/")).filter(n=>n.length>0):await gs(["**/*"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(n=>n!=="asset-map.json"&&ie(n))}var bs=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],Ss=new Set([".html",".htm"]),Cr="WPSuite.io Static Publisher",Ps=Cr.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function Rs(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function vs(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function ks(e,t,r){return vs(t)?e.replace(new RegExp(`(?<!:)${Rs(t)}`,"g"),r):e.split(t).join(r)}function Cs(e,t,r){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let s=w.extname(r).toLowerCase();return Ss.has(s)?/<head\b|<html\b|<!doctype html/i.test(t):false}function xs(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${Ps}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${Cr}" />`;if(e.match(/(\r?\n)([ \t]*)<\/head>/i))return e.replace(/(\r?\n)([ \t]*)<\/head>/i,`$1$2${t}$1$2</head>`);let n=e.includes(`\r
|
|
1
|
+
import {request,chromium}from'playwright';import M,{readFile}from'fs/promises';import y from'path';import {gunzipSync}from'zlib';import {setTimeout as setTimeout$1}from'timers/promises';import Ss from'fast-glob';import Gr from'mime-types';import xr,{createHash}from'crypto';import os from'http';import is from'https';import {availableParallelism}from'os';import {Worker}from'worker_threads';import {LambdaClient,InvokeCommand}from'@aws-sdk/client-lambda';import {DynamoDBClient,GetItemCommand}from'@aws-sdk/client-dynamodb';import {S3Client,GetObjectCommand,PutObjectCommand,CopyObjectCommand}from'@aws-sdk/client-s3';import {fromTemporaryCredentials}from'@aws-sdk/credential-providers';var Kn=".deploy-plan.json",Jn="deploy-plan.json",Gn=".crawl-incomplete.json",Zn="crawl-incomplete.json";function lr(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?y.resolve(e):""}function dr(e){let t=String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").trim(),r=y.posix.normalize(t);return !t||!r||r==="."||/^[a-zA-Z]:/.test(r)||r.startsWith("../")||r===".."?null:r}function Yn(e){let t=String(e||"").trim();if(!t.startsWith("/")||t.startsWith("//")||t.includes("*")||t.includes("#"))return null;try{let r=new URL(t,"https://content-sync.invalid");return r.origin!=="https://content-sync.invalid"?null:`${y.posix.normalize(r.pathname)}${r.search}`}catch{return null}}function ae(e){return [...new Set(e.map(dr).filter(t=>t!==null))]}function Xn(e,t){let r={generatedAt:String(t.generatedAt||new Date().toISOString()),outputDir:y.resolve(e.outputDir),runMode:t.runMode,crawlMode:t.crawlMode,fullSyncRequired:!!t.fullSyncRequired,changedFiles:ae(t.changedFiles||[]),deletedFiles:ae(t.deletedFiles||[]),rewriteTargets:ae(t.rewriteTargets||[]),revalidateFiles:ae(t.revalidateFiles||[])};return t.schemaVersion===2?{...r,schemaVersion:2,runMode:"content-sync",crawlMode:"incremental",fullSyncRequired:false,consumerId:String(t.consumerId||"").trim(),fromSequence:Math.max(0,Number(t.fromSequence)||0),toSequence:Math.max(0,Number(t.toSequence)||0),impactHash:String(t.impactHash||"").trim(),resolvedSitemapUrls:[...new Set((t.resolvedSitemapUrls||[]).map(n=>String(n||"").trim()).filter(n=>{try{let s=new URL(n);return s.protocol==="http:"||s.protocol==="https:"}catch{return false}}))],uploadGroups:{assets:ae(t.uploadGroups?.assets||[]),content:ae(t.uploadGroups?.content||[]),listings:ae(t.uploadGroups?.listings||[]),resources:ae(t.uploadGroups?.resources||[]),sitemapLeaves:ae(t.uploadGroups?.sitemapLeaves||[]),sitemapIndexes:ae(t.uploadGroups?.sitemapIndexes||[])},invalidationPaths:[...new Set((t.invalidationPaths||[]).map(Yn).filter(n=>n!==null))].sort()}:{schemaVersion:1,...r,runMode:t.runMode}}function pr(e){let t=y.join(y.resolve(e.outputDir),Kn),r=lr();return r?[y.join(r,Jn),t]:[t]}function mr(e){let t=y.join(y.resolve(e.outputDir),Gn),r=lr();return r?[y.join(r,Zn),t]:[t]}function Y(e,t){let r=y.resolve(e),n=y.resolve(t),s=y.relative(r,n).replace(/\\/g,"/");return dr(s)}async function kt(e,t){let r=Xn(e,t);for(let n of pr(e)){await M.mkdir(y.dirname(n),{recursive:true});let s=`${n}.${process.pid}.${Date.now()}.tmp`;await M.writeFile(s,JSON.stringify(r,null,2),"utf8"),await M.rename(s,n);}}async function gr(e){for(let t of pr(e))try{await M.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}async function Ct(e,t){let r={schemaVersion:1,startedAt:String(t.startedAt||new Date().toISOString()),outputDir:y.resolve(e.outputDir)};for(let n of mr(e)){await M.mkdir(y.dirname(n),{recursive:true});let s=`${n}.${process.pid}.tmp`;await M.writeFile(s,JSON.stringify(r,null,2),"utf8"),await M.rename(s,n);}}async function hr(e){for(let t of mr(e))try{await M.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}function ts(e){return new URL(e).pathname.split("/").filter(Boolean).some(r=>{try{return decodeURIComponent(r).endsWith("__trashed")}catch{return r.endsWith("__trashed")}})}function xt(e){return Array.isArray(e)?e.map(xt):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).sort(([t],[r])=>t.localeCompare(r)).map(([t,r])=>[t,xt(r)])):e}function rs(e){return JSON.stringify(xt(e))}function ns(e){return createHash("sha256").update(rs(e)).digest("hex")}function fr(e){let{impactHash:t,...r}=e;if(e.schemaVersion!==1||!t)throw new Error("Invalid content-sync impact plan schema.");if(!Array.isArray(e.resourceRenderUrls)||!Array.isArray(e.resourceDeleteUrls))throw new Error("Invalid content-sync resource impact contract.");if(ns(r)!==t)throw new Error("Content-sync impact plan hash mismatch.");for(let n of [...e.directRenderUrls,...e.deleteUrls,...e.resourceRenderUrls,...e.resourceDeleteUrls])if(ts(n))throw new Error(`Content-sync impact contains a WordPress trash alias instead of the last public URL: ${n}`)}var Tt=["/sitemap_index.xml","/wp-sitemap.xml","/sitemap.xml"];function wr(e){let t=new Set;for(let r of [...e,...Tt]){let n=String(r||"").trim();n&&t.add(n);}return [...t]}function At(e){let t=e.pathname.toLowerCase();return t.endsWith(".xml")&&(t.includes("sitemap")||t.endsWith("/sitemap.xml"))}function yr(e){if(!e||!/^https?:\/\//i.test(e))return false;try{return At(new URL(e))}catch{return false}}function Sr(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function as(e){let t=String(e??"").trim();if(!t)return "";let r=t;if(/^https?:\/\//i.test(r))try{r=new URL(r).pathname;}catch{return ""}if(r=r.split(/[?#]/,1)[0]?.replace(/\\/g,"/").trim()??"",!r)return "";let n=r.endsWith("/"),s=r.replace(/^\/+/,"").split("/").map(i=>i.replace(/[^A-Za-z0-9._-]/g,"")).filter(i=>i.length>0&&i!=="."&&i!=="..");if(s.length===0)return "";let o=`/${s.join("/")}`;return n&&y.extname(o)===""&&(o+="/"),o==="/"?"":o}function It(e){return !e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).map(([t,r])=>[t.trim(),String(r??"")]).filter(([t])=>t.length>0))}function us(e){if(!e||typeof e!="object")return {};let t={};for(let[r,n]of Object.entries(e)){let s=r.trim();if(!s||!n||typeof n!="object")continue;let o=n,i={};if(typeof o.targetOrigin=="string"){let a=Sr(o.targetOrigin);a&&(i.targetOrigin=a);}let u=It(o.extraReplacements);if(Object.keys(u).length>0&&(i.extraReplacements=u),o.s3&&typeof o.s3=="object"){let a={},l=o.s3;typeof l.bucket=="string"&&(a.bucket=l.bucket.trim()),typeof l.prefix=="string"&&(a.prefix=l.prefix.trim()),typeof l.region=="string"&&(a.region=l.region.trim()),typeof l.htmlCacheControl=="string"&&(a.htmlCacheControl=l.htmlCacheControl.trim()),typeof l.assetCacheControl=="string"&&(a.assetCacheControl=l.assetCacheControl.trim()),Object.keys(a).length>0&&(i.s3=a);}if(o.cloudFront&&typeof o.cloudFront=="object"){let a={},l=o.cloudFront;typeof l.distributionId=="string"&&(a.distributionId=l.distributionId.trim()),Array.isArray(l.invalidationPaths)&&(a.invalidationPaths=l.invalidationPaths.map(d=>String(d??"").trim()).filter(d=>d.length>0)),Object.keys(a).length>0&&(i.cloudFront=a);}t[s]=i;}return t}function Ot(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function cs(e,t){if(!e||typeof e!="object")return null;let r=e,n=r.command;if(n!=="publish"&&n!=="crawl"&&n!=="deploy"&&n!=="invalidate"&&n!=="retry-timeouts"&&n!=="url"&&n!=="content-sync")return null;let s=Number.parseInt(String(r.intervalMinutes??"0"),10);if(!Number.isFinite(s)||s<1)return null;let o=String(r.id??`${n}-${t+1}`).trim();if(!o)return null;let i=String(r.deploymentProfile??"").trim(),u=String(r.url??"").trim(),a=Array.isArray(r.postTypes)?[...new Set(r.postTypes.map(d=>String(d??"").trim().toLowerCase().replace(/[^a-z0-9_-]/g,"")).filter(Boolean))]:[],l=Array.isArray(r.listingPaths)?[...new Set(r.listingPaths.map(d=>String(d??"").trim()).filter(Boolean))]:[];return n==="content-sync"&&a.length===0?null:{id:o,enabled:r.enabled!==false,command:n,intervalMinutes:s,...n==="publish"||n==="crawl"?{crawlMode:r.crawlMode==="incremental"?"incremental":"full"}:{},...(n==="publish"||n==="deploy"||n==="invalidate"||n==="content-sync")&&i?{deploymentProfile:i}:{},...u?{url:u}:{},...a.length>0?{postTypes:a}:{},...l.length>0?{listingPaths:l}:{},...typeof r.includeSubsites=="boolean"?{includeSubsites:r.includeSubsites}:{},...typeof r.includePostTypeArchives=="boolean"?{includePostTypeArchives:r.includePostTypeArchives}:{},...typeof r.includeTaxonomyArchives=="boolean"?{includeTaxonomyArchives:r.includeTaxonomyArchives}:{},...typeof r.includeAuthorArchives=="boolean"?{includeAuthorArchives:r.includeAuthorArchives}:{},...typeof r.includeDateArchives=="boolean"?{includeDateArchives:r.includeDateArchives}:{},...typeof r.includePostsPage=="boolean"?{includePostsPage:r.includePostsPage}:{},...typeof r.includeSitemapChain=="boolean"?{includeSitemapChain:r.includeSitemapChain}:{}}}function Pr(e){let t=e&&typeof e=="object"?e:{},r=Array.isArray(t.rules)?t.rules.map((n,s)=>cs(n,s)).filter(n=>!!n):[];return {enabled:t.enabled===true,timezone:typeof t.timezone=="string"&&t.timezone.trim()!==""?t.timezone.trim():"UTC",rules:r}}function ls(e){let t=e&&typeof e=="object"?e:{},r=t.render&&typeof t.render=="object"?t.render:{},n=Number(r.concurrency??0),s=Number(r.batchSize??0),o=Number(r.maxAttempts??0),i=t.rewrite&&typeof t.rewrite=="object"?t.rewrite:{},u=t.deploy&&typeof t.deploy=="object"?t.deploy:{},a=(l,d)=>({enabled:typeof l.enabled=="boolean"?l.enabled:r.enabled===true,concurrency:Math.min(100,Math.max(1,Number(l.concurrency||d.concurrency))),batchSize:Math.min(500,Math.max(1,Number(l.batchSize||d.batchSize))),maxAttempts:Math.min(5,Math.max(1,Number(l.maxAttempts||2)))});return {render:{enabled:r.enabled===true,...Number.isInteger(n)&&n>0?{concurrency:n}:{},batchSize:Number.isInteger(s)&&s>0?Math.min(20,s):5,...Number.isInteger(o)&&o>0?{maxAttempts:Math.min(5,o)}:{}},rewrite:a(i,{concurrency:8,batchSize:25}),deploy:a(u,{concurrency:8,batchSize:50})}}function ds(e){if(!e||typeof e!="object")return;let t=e,r={};for(let s of ["accountId","siteId"]){let o=t[s];typeof o=="string"&&o.trim()!==""&&(r[s]=o.trim());}let n=Number(t.lastUpdate??0);return Number.isFinite(n)&&n>0&&(r.lastUpdate=Math.floor(n)),t.subscriber===true&&(r.subscriber=true),Object.keys(r).length>0?r:void 0}function Mt(e){let t=e&&typeof e=="object"?e:{},r=String(t.accountId??"").trim(),n=String(t.siteId??"").trim(),s=t.subscriber===true,o=ds(t.siteSettings),i={...o??{},...r?{accountId:o?.accountId??r}:{},...n?{siteId:o?.siteId??n}:{},...o?.subscriber===true||s?{subscriber:true}:{}},u={},a=String(t.apiBase??"").trim();a&&(u.apiBase=a);let l=String(t.runtimeToken??t.nonce??"").trim();l&&(u.runtimeToken=l);let d=String(t.virtualAssetBaseUrl??t.uploadUrl??"").trim();d&&(u.virtualAssetBaseUrl=d),Object.keys(i).length>0&&(u.siteSettings=i);let c=Ot(t.subscriptionType);return c&&(u.subscriptionType=c),u}function ps(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function Rr(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function ms(e,t){let r=new Headers(e instanceof Request?e.headers:void 0);if(t?.headers)for(let[n,s]of new Headers(t.headers).entries())r.set(n,s);return r}async function vr(e,t,r=5){let n=new URL(Rr(e)),s=String(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase(),o=n.protocol==="http:"?os:is,i=ms(e,t);return await new Promise((u,a)=>{let l=o.request(n,{method:s,headers:Object.fromEntries(i.entries()),...n.protocol==="https:"?{rejectUnauthorized:false}:{}},d=>{let c=[];d.on("data",m=>{c.push(Buffer.isBuffer(m)?m:Buffer.from(m));}),d.on("error",a),d.on("end",()=>{let m=d.statusCode??0,h=d.headers.location;if(r>0&&h&&[301,302,303,307,308].includes(m)){u(vr(new URL(h,n),{method:m===303?"GET":s},r-1));return}let f=new Headers;for(let[b,p]of Object.entries(d.headers))Array.isArray(p)?f.set(b,p.join(", ")):typeof p=="string"&&f.set(b,p);u(new Response(Buffer.concat(c),{status:m,statusText:d.statusMessage??"",headers:f}));});});l.on("error",a),l.end();})}function gs(e){let t=Mt(e.wpsuite),r={...t.siteSettings??{},...t.siteSettings?.subscriber===true||t.subscriptionType==="PROFESSIONAL"||t.subscriptionType==="AGENCY"?{subscriber:true}:{}},n=String(r.accountId??"").trim(),s=String(r.siteId??"").trim(),o=String(t.virtualAssetBaseUrl??t.uploadUrl??"").trim();if(e.wpsuite={...t.apiBase?{apiBase:t.apiBase}:{},...t.runtimeToken?{runtimeToken:t.runtimeToken}:{},...o?{virtualAssetBaseUrl:o}:{},...Object.keys(r).length>0?{siteSettings:r}:{},...t.subscriptionType?{subscriptionType:t.subscriptionType}:{}},!n||!s||!o)return false;ps(e.sourceOrigin);let i=globalThis,a={...i.WpSuite??{},siteSettings:r,uploadUrl:o};return t.apiBase&&(a.apiBase=t.apiBase),i.WpSuite=a,true}async function hs(e){let t=String(e.wpsuite?.virtualAssetBaseUrl??e.wpsuite?.uploadUrl??"").trim();if(!gs(e)){let s=e.wpsuite?.siteSettings,o=[String(s?.accountId??"").trim()?"":"accountId",String(s?.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): ${o.join(", ")}.`,requests:[]}}}let r=globalThis.fetch,n=[];try{typeof r=="function"&&/^https?:\/\//i.test(t)&&(globalThis.fetch=(async(a,l)=>{let d=Rr(a);if(d.startsWith(t)){let c=(()=>{try{return new URL(d).pathname}catch{return d}})();try{let m=e.ignoreHttpsErrors&&d.startsWith("https://")?await vr(a,l):await r(a,l);return n.push({path:c,status:m.status,ok:m.ok,error:null}),m}catch(m){throw n.push({path:c,status:null,ok:!1,error:m instanceof Error?m.message:String(m)}),m}}return r(a,l)}));let{getConfig:s}=await import('@smart-cloud/wpsuite-core'),o=await s("publisher"),i=o&&typeof o=="object"?o:null,u=Ot(i?.subscriptionType);return {remote:i,diagnostic:{status:i?"loaded":"unavailable",virtualAssetBaseUrl:t,subscriptionType:u??null,error:i?null:"WP Suite publisher config loader returned no configuration.",requests:n}}}catch(s){return {remote:null,diagnostic:{status:"unavailable",virtualAssetBaseUrl:t,subscriptionType:null,error:s instanceof Error?s.message:String(s),requests:n}}}finally{typeof r=="function"&&(globalThis.fetch=r);}}function fs(e,t){let r=us(t?.deploymentProfiles),n=String(t?.defaultDeploymentProfile??"").trim(),s=r[n]?n:"",o=Ot(t?.subscriptionType),i=Mt(e.wpsuite);return {...e,scheduler:Pr(t?.scheduler),deploymentProfiles:r,defaultDeploymentProfile:s,...o?{subscriptionType:o}:{},wpsuite:{...i,...i.siteSettings||o?{siteSettings:{...i.siteSettings??{},...i.siteSettings?.subscriber===true||o==="PROFESSIONAL"||o==="AGENCY"?{subscriber:true}:{}}}:{},...o?{subscriptionType:o}:{}}}}function Et(e,t){let n=String(e||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!n)return t;let s=n.split("/").map(o=>o.trim()).filter(o=>o.length>0&&o!=="."&&o!=="..");return s.length>0?s.join("/"):t}function ws(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?y.resolve(e):""}function br(e,t,r){let n=String(t||"").trim();return n&&y.isAbsolute(n)?y.resolve(n):y.resolve(e,Et(n,r))}async function rt(e,t={}){let r=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",n=await M.readFile(r,"utf8"),s=JSON.parse(n);s.sourceOrigin=s.sourceOrigin.replace(/\/$/,""),s.targetOrigin=Sr(s.targetOrigin),s.ignoreHttpsErrors??=false,s.outputDir=String(s.outputDir||"export").trim()||"export",s.urlRewriteMode||=s.targetOrigin==="."?"relative":"absolute",s.noJavaScriptRenderPathPrefixes||=[],s.seedPaths||=[],s.generated404RequestPath=as(s.generated404RequestPath),s.sitemapPaths||=[...Tt],s.allowedAssetHosts||=[],s.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],s.blockedPathPrefixes||=[],s.blockedSearchFragments||=[];let o=Number(s.processingConcurrency)>0?Math.min(100,Math.max(1,Number(s.processingConcurrency))):null;s.concurrency=o??s.concurrency??1,s.maxPages||=0,s.extraReplacements=It(s.extraReplacements),s.postCrawlCopyMap=It(s.postCrawlCopyMap),s.logDir=String(s.logDir||"logs").trim()||"logs",s.verbose??=false,s.logLevel||=s.verbose?"debug":"info",s.s3SyncMode||="sdk-upload-delete",s.readiness||={waitForSelector:null,waitForFunction:null,timeoutMs:1500,fallbackWaitMs:1500},s.readiness.timeoutMs??=1500,s.readiness.fallbackWaitMs??=1500,s.viewport||={width:1440,height:1200},s.navigationTimeoutMs||=3e4,s.assetDownloadConcurrency=o??(Number(s.assetDownloadConcurrency)>0?Number(s.assetDownloadConcurrency):s.concurrency),s.rewriteConcurrency=o??(Number(s.rewriteConcurrency)>0?Number(s.rewriteConcurrency):s.assetDownloadConcurrency),s.wpsuite=Mt(s.wpsuite),s.scheduler=Pr(void 0),s.remoteWorkers=ls(s.remoteWorkers),typeof s.lambdaDelegationEnabled=="boolean"&&(s.remoteWorkers.render??={},s.remoteWorkers.rewrite??={},s.remoteWorkers.deploy??={},s.remoteWorkers.render.enabled=s.lambdaDelegationEnabled,s.remoteWorkers.rewrite.enabled=s.lambdaDelegationEnabled,s.remoteWorkers.deploy.enabled=s.lambdaDelegationEnabled),o!==null&&(s.processingConcurrency=o,s.remoteWorkers.render??={},s.remoteWorkers.rewrite??={},s.remoteWorkers.deploy??={},s.remoteWorkers.render.concurrency=o,s.remoteWorkers.rewrite.concurrency=o,s.remoteWorkers.deploy.concurrency=o),s.deploymentProfiles={},s.defaultDeploymentProfile="",s.deploymentTargetOverride=String(s.deploymentTargetOverride??"").trim();let i=await hs(s);t.onRemotePublisherConfigDiagnostic?.(i.diagnostic);let u=fs(s,i.remote),a=ws(),l=a?y.resolve(a,".."):"";return l?(u.outputDir=br(l,u.outputDir,"export"),u.logDir=br(l,u.logDir,"logs")):(y.isAbsolute(u.outputDir)||(u.outputDir=Et(u.outputDir,"export")),y.isAbsolute(u.logDir)||(u.logDir=Et(u.logDir,"logs"))),u}function ue(e,t=10){return xr.createHash("sha1").update(e).digest("hex").slice(0,t)}async function ys(e){await M.mkdir(y.dirname(e),{recursive:true});}async function he(e,t,r){await ys(e);let n=y.join(y.dirname(e),`.${y.basename(e)}.${process.pid}.${Date.now()}.${xr.randomBytes(6).toString("hex")}.tmp`);try{typeof t=="string"?await M.writeFile(n,t,r??"utf8"):await M.writeFile(n,t),await M.rename(n,e);}catch(s){throw await M.unlink(n).catch(()=>{}),s}}function ce(e){return [".html",".htm",".css",".js",".mjs",".json",".xml",".xsl",".txt",".svg",".map",".enc",".jws"].includes(y.extname(e).toLowerCase())}function fe(e){return e.replace(/"/g,'"').replace(/"/g,'"').replace(/'/g,"'").replace(/'/g,"'").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function je(e){return e.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">")}function nt(e){return e.replace(/\//g,"\\/")}function kr(e){return e.replace(/\//g,"\\\\/")}function bs(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 Cr(e,t,r){if(!t)return;e[t]=r;let n=nt(t),s=nt(r);e[n]=s;let o=kr(t),i=kr(r);e[o]=i;let u=je(t),a=je(r);e[u]=a;let l=je(n),d=je(s);e[l]=d;let c=je(o),m=je(i);e[c]=m;}function st(e,t,r){Cr(e,t,r);let n=bs(t);n&&n!==t&&Cr(e,n,r);}function $t(e,t){let r=t.startsWith("/")?t:`/${t}`,n=(e||"").replace(/\/$/,"");return !n||n==="."||n==="/"?r:`${n}${r}`}function Tr(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function Ar(e,t,r){if(!t)return r;let n=y.dirname(y.resolve(t)),s=y.resolve(e,r.replace(/^\/+/,"")),o=y.relative(n,s).replace(/\\/g,"/");return o?(o.startsWith(".")||(o=`./${o}`),o):"."}async function Lt(e,t){return (t?[...new Set(t)].map(n=>y.resolve(n)).filter(n=>n.startsWith(y.resolve(e.outputDir))).map(n=>y.relative(e.outputDir,n).replace(/\\/g,"/")).filter(n=>n.length>0):await Ss(["**/*"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(n=>n!=="asset-map.json"&&ce(n))}var ks=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],Cs=new Set([".html",".htm"]),Ir="WPSuite.io Static Publisher",xs=Ir.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function Ts(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function As(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function Is(e,t,r){return As(t)?e.replace(new RegExp(`(?<!:)${Ts(t)}`,"g"),r):e.split(t).join(r)}function Es(e,t,r){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let s=y.extname(r).toLowerCase();return Cs.has(s)?/<head\b|<html\b|<!doctype html/i.test(t):false}function Os(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${xs}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${Ir}" />`;if(e.match(/(\r?\n)([ \t]*)<\/head>/i))return e.replace(/(\r?\n)([ \t]*)<\/head>/i,`$1$2${t}$1$2</head>`);let n=e.includes(`\r
|
|
2
2
|
`)?`\r
|
|
3
3
|
`:`
|
|
4
|
-
`;return e.replace(/<head\b[^>]*>/i,s=>`${s}${n} ${t}`)}function
|
|
5
|
-
`,"utf8");}function
|
|
6
|
-
`,"utf8");});}enqueueJsonLine(t,r){this.enqueueTask(()=>
|
|
4
|
+
`;return e.replace(/<head\b[^>]*>/i,s=>`${s}${n} ${t}`)}function Ms(e){let t=fe(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function $s(e,t){let r=[...new Set(t)].filter(o=>o.includes("/")&&!/\\+\//.test(o)).map(o=>[o,nt(o)]).filter(([o,i])=>o!==i).sort((o,i)=>i[0].length-o[0].length);if(!r.length)return e;let n=o=>{let i=o;for(let[u,a]of r)i=i.split(u).join(a);return i},s=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(o,i,u,a)=>`${i}${n(u)}${a}`);return s=s.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(o,i,u,a,l)=>Ms(a)?`${i}${n(a)}${l}`:o),s}function js(e,t){if(!t)return null;let r=y.dirname(y.resolve(t)),n=y.resolve(e.outputDir),s=y.relative(r,n).replace(/\\/g,"/");return s?(s.startsWith(".")||(s=`./${s}`),s.endsWith("/")?s:`${s}/`):"./"}function Us(e,t,r){let n=js(t,r);if(!n)return e;let s=e;for(let o of ks){let i=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),u=new RegExp(`(?:\\.{1,}/)+${i}`,"g"),a=new RegExp(`(?<!\\.)/${i}`,"g");s=s.replace(u,`${n}${o}`).replace(a,`${n}${o}`);let l=o.replace(/\//g,"\\/"),d=n.replace(/\//g,"\\/"),c=l.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),m=new RegExp(`(?:\\.{1,}\\\\/)+${c}`,"g"),h=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${c}`,"g"),f=new RegExp(`(?<![\\.\\\\])\\/${c}`,"g");s=s.replace(m,`${d}${l}`).replace(h,`${d}${l}`).replace(f,`${d}${l}`);}return s}function Ut(e,t,r){if(e.urlRewriteMode==="absolute")return t;let n=(()=>{try{return new URL(t,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin)}catch{return null}})(),s=n?n.pathname:Tr(t,e.targetOrigin),o=n?`${n.search}${n.hash}`:"";return e.urlRewriteMode==="root-relative"?`${s}${o}`:`${Ar(e.outputDir,r,s)}${o}`}function jt(e,t,r,n,s){st(e,r,Ut(t,n,s));}function Ls(e,t,r,n,s){if(!r||r===n)return;st(e,r,n);let o=Ut(t,r,s),i=Ut(t,n,s);st(e,o,i);}function Dt(e,t,r,n,s={}){let o=e,i={};jt(i,t,t.sourceOrigin,t.targetOrigin,n);for(let[a,l]of Object.entries(t.extraReplacements))jt(i,t,a,l,n);for(let[a,l]of Object.entries(r))jt(i,t,a,l,n);for(let[a,l]of Object.entries(s)){let d=r[a];!d||d===l||Ls(i,t,l,d,n);}let u=Object.entries(i).sort((a,l)=>l[0].length-a[0].length);for(let[a,l]of u)o=Is(o,a,l);return t.urlRewriteMode!=="absolute"&&(o=Us(o,t,n)),o=$s(o,u.map(([,a])=>a)),Es(t,o,n)&&(o=Os(o)),o}async function Ds(e,t,r,n){let s=y.join(e.outputDir,n),o=y.extname(s).toLowerCase(),i;try{i=await M.readFile(s,"utf8");}catch(l){if(l.code!=="ENOENT")throw l;return {changed:false}}let a=Dt(i,e,t,o===".js"||o===".mjs"?void 0:s,r);return a!==i?(await he(s,a,"utf8"),{changed:true}):{changed:false}}async function Fs(e,t){return await new Promise((r,n)=>{let s=a=>{if(u(),a?.error){n(new Error(a.error));return}r({changed:!!a?.changed});},o=a=>{u(),n(a);},i=a=>{u(),a!==0&&n(new Error(`Rewrite worker exited with code ${a}.`));},u=()=>{e.off("message",s),e.off("error",o),e.off("exit",i);};e.on("message",s),e.on("error",o),e.on("exit",i),e.postMessage({file:t});})}async function Er(e,t,r={}){let n=await Lt(e,r.files),s=0;if(n.length===0)return 0;let o=Math.max(1,Number(e.rewriteConcurrency||e.assetDownloadConcurrency||1)),i=Math.max(1,Math.min(o,n.length,availableParallelism()));await r.onStart?.({totalFiles:n.length,workerCount:i});let u=0,a=0,l=null;if(i===1){for(let c of n){let m=await Ds(e,t,r.previousAssetMap??{},c);m.changed&&(s+=1),a+=1,await r.onProgress?.({index:a,totalFiles:n.length,changedTextFiles:s,file:c,changed:m.changed});}return s}let d=Array.from({length:i},async()=>{let c=new Worker(new URL("./rewrite-worker.js",import.meta.url),{workerData:{config:e,assetMap:t,previousAssetMap:r.previousAssetMap??{}}});try{for(;!l;){let m=u;if(m>=n.length)return;u+=1;let h=n[m],f=await Fs(c,h);f.changed&&(s+=1),a+=1,await r.onProgress?.({index:a,totalFiles:n.length,changedTextFiles:s,file:h,changed:f.changed});}}catch(m){throw l=m instanceof Error?m:new Error(String(m)),l}finally{await c.terminate().catch(()=>{});}});return await Promise.all(d),s}var Ce={error:0,warn:1,info:2,debug:3},Ws=/^(?:authorization|proxyAuthorization|runtimeToken|siteKey|nonce|accessToken|refreshToken|accessKeyId|secretAccessKey|sessionToken|xStaticPublisherToken|xApiKey)$/i;function we(e){return e.replace(/((?:x-static-publisher-token|authorization|proxy-authorization|x-api-key|aws-access-key-id|aws-secret-access-key|aws-session-token)\s*:\s*)[^\r\n]+/gi,"$1[REDACTED]").replace(/\b(Basic|Bearer)\s+[^\s]+/gi,"$1 [REDACTED]").replace(/([?&](?:token|access_token|refresh_token|api_key|key|nonce)=)[^&\s]+/gi,"$1[REDACTED]").replace(/((?:"|')?(?:runtimeToken|siteKey|nonce|accessToken|refreshToken|accessKeyId|secretAccessKey|sessionToken)(?:"|')?\s*[:=]\s*(?:"|'))[^"']+/gi,"$1[REDACTED]")}function it(e){return typeof e=="string"?we(e):Array.isArray(e)?e.map(t=>it(t)):e instanceof Error?{name:e.name,message:we(e.message),...e.stack?{stack:we(e.stack)}:{}}:e&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,r])=>[t,Ws.test(t)?"[REDACTED]":it(r)])):e}function Ft(e){return e?it(e):void 0}var Or=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",ot=Or?y.join(Or,"current-progress.json"):"",Mr=Promise.resolve();function $r(e){return e.includes("crawl")?"crawl":e.includes("deploy")?"deploy":e.includes("invalidate")?"invalidate":e}function qs(e,t){let r={...e},n=typeof e.phase=="string"?e.phase.trim():"",s=typeof t.phase=="string"?t.phase.trim():"";if(s!==""&&(s==="deploy"||s.startsWith("deploy-"))&&n!==s)for(let u of ["index","totalFiles","staged","uploaded","skipped","failed","deleted","workerCount","completedBatches","totalBatches"])delete r[u];let i=new Set(["pagesQueued","pagesRendered","assetsQueued","sitemapsQueued","pagesDiscovered","assetsDiscovered","sitemapsDiscovered","pagesSaved","assetsSaved","donePages","doneAssets","doneSitemaps","changedTextFiles","uploaded","failed","index","totalFiles","completedBatches","totalBatches","pageQueue","assetQueue","sitemapQueue"]);for(let[u,a]of Object.entries(t)){let l=r[u];if(typeof l=="number"&&typeof a=="number"&&i.has(u)){r[u]=Math.max(l,a);continue}r[u]=a;}return r}function Ns(e,t,r){ot&&(Mr=Mr.then(async()=>{let n=new Date,s=n.toISOString();await M.mkdir(y.dirname(ot),{recursive:true});let o=await M.readFile(ot,"utf8").then(g=>JSON.parse(g)).catch(()=>null),i=o&&typeof o.details=="object"&&o.details?o.details:{},u=$r(e),a=o?.currentStep||$r(o?.source||""),l=o?.startedAt||s,d={...o?.stepDurationsSec??{}},c=o?.stepStartedAt||s;if(a&&a!==u&&o?.stepStartedAt){let g=Math.max(0,Math.round((n.getTime()-new Date(o.stepStartedAt).getTime())/1e3));d[a]=(d[a]??0)+g,c=s;}let m=Math.max(0,Math.round((n.getTime()-new Date(c).getTime())/1e3)),h=Math.max(0,Math.round((n.getTime()-new Date(l).getTime())/1e3)),f=we(t),b=Ft(r)??{},p={checkedAt:s,source:e,message:f,details:qs(i,b),startedAt:l,currentStep:u,stepStartedAt:c,stepElapsedSec:m,totalElapsedSec:h,stepDurationsSec:d};await M.writeFile(ot,JSON.stringify(p,null,2),"utf8");}).catch(()=>{}));}async function _s(e,t){await M.mkdir(y.dirname(e),{recursive:true}),await M.appendFile(e,`${JSON.stringify(it(t))}
|
|
5
|
+
`,"utf8");}function Hs(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 Bs(e,t,r){let n=Ft(r);return {checkedAt:new Date().toISOString(),currentStep:Hs(e,n),level:e,message:we(t),details:n??{}}}var Ue=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 y.join(this.logDir,"crawl.log.jsonl")}get currentEventPath(){return y.join(this.logDir,"current-crawl-event.json")}get rejectedPath(){return y.join(this.logDir,"rejected.jsonl")}get ignoredPath(){return y.join(this.logDir,"ignored.jsonl")}get skippedPath(){return y.join(this.logDir,"skipped-http.jsonl")}get errorsPath(){return y.join(this.logDir,"errors.jsonl")}get timingsPath(){return y.join(this.logDir,"timings.jsonl")}ensureLogFileReady(){return this.initPromise||(this.initPromise=(async()=>{await M.mkdir(this.logDir,{recursive:true}),await M.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 M.appendFile(this.logPath,`${t}
|
|
6
|
+
`,"utf8");});}enqueueJsonLine(t,r){this.enqueueTask(()=>_s(t,r));}updateCurrentEvent(t,r,n){let s=Bs(t,r,n);this.enqueueTask(async()=>{await M.mkdir(this.logDir,{recursive:true}),await M.writeFile(this.currentEventPath,JSON.stringify(s,null,2),"utf8");});}push(t,r,n){let s=we(r),o=Ft(n),i=JSON.stringify({time:new Date().toISOString(),level:t,message:s,...o||{}});this.enqueueLine(i),this.updateCurrentEvent(t,s,o),t==="error"?console.error(s,o||""):t==="warn"?console.warn(s,o||""):(Ce[this.level]>=Ce.debug||["summary","page","sitemap","asset","timing"].includes(t))&&console.log(s);}info(t,r){this.push("info",t,r);}debug(t,r){Ce[this.level]<Ce.debug||this.push("debug",t,r);}progress(t,r){Ns("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 n=this.marks.get(t);if(!n)return;let s=Date.now()-n,o={name:t,ms:s,seconds:Number((s/1e3).toFixed(2)),...r||{}};this.enqueueJsonLine(this.timingsPath,o),this.push("timing",`Timing ${t}: ${o.seconds}s`,o);}reject(t,r,n,s){let o={kind:t,url:r,reason:n,source:s};this.enqueueJsonLine(this.rejectedPath,o),Ce[this.level]>=Ce.debug&&this.push("reject",`Rejected ${t} ${r}: ${n}`,o);}ignore(t,r,n,s){let o={kind:t,url:r,reason:n,source:s};this.enqueueJsonLine(this.ignoredPath,o),Ce[this.level]>=Ce.debug&&this.push("ignore",`Ignored ${t} ${r}: ${n}`,o);}skip(t,r,n,s){let o={kind:t,url:r,status:n,source:s};this.enqueueJsonLine(this.skippedPath,o),this.push("warn",`Skipped ${t} ${r}: HTTP ${n}`,o);}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 jr="(?: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 Lr(e){let t=new RegExp(`(?:https?:)?//[^\\s'"<>\\);]+\\.${jr}(?:[?#][^\\s'"<>\\);]*)?(?=[\\s'"<>\\);]|$)|(?<![A-Za-z0-9._-])/[^\\s'"<>\\);]+\\.${jr}(?:[?#][^\\s'"<>\\);]*)?(?=[\\s'"<>\\);]|$)`,"gi");return [...e.matchAll(t)].map(r=>r[0])}function Ur(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 Dr(e){let t=new Set,r=[],n=/\bimport\s*\(\s*["'`]([^"'`\s<>\\]+)["'`]\s*\)/g,s=/\b(?:[A-Za-z_$][\w$]*\.)?u\s*=\s*(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>\s*["'`]([^"'`\s<>\\]+)["'`]/g;for(let o of e.matchAll(n))o[1]&&Ur(o[1])&&r.push({index:o.index??0,value:o[1]});for(let o of e.matchAll(s))o[1]&&Ur(o[1])&&r.push({index:o.index??0,value:o[1]});for(let o of r.sort((i,u)=>i.index-u.index))t.add(o.value);return [...t]}function Fr(e,t){let r=y.relative(t,e);return r===""||!r.startsWith("..")&&!y.isAbsolute(r)}function Wr(e,t,r,n){let s=y.resolve(e),o=y.resolve(t),i=y.extname(s).toLowerCase();return !Fr(s,o)||i!==".html"&&i!==".htm"||r.has(s)?false:!n.some(u=>Fr(s,y.resolve(u)))}function Wt(e,t){return typeof e=="string"&&e.length>0&&t?.supported===true&&typeof t.token=="string"&&t.token.length>0&&e===t.token}function qt(e,t){try{let r=new URL(e),n=new URL(t,r);if(n.origin!==r.origin)return !1;let s=r.pathname.replace(/\/+$/,"");if(s&&n.pathname!==s&&!n.pathname.startsWith(`${s}/`))return !1;let o=s?n.pathname.slice(s.length)||"/":n.pathname;return ["/wp-includes/","/wp-content/plugins/","/wp-content/themes/","/wp-content/mu-plugins/"].some(i=>o.startsWith(i))}catch{return false}}function qr(e){return e<1}function Nr(e){let t=String(e??"").toLowerCase();return t==="strict"?"Strict":t==="lax"?"Lax":t==="none"?"None":"Unspecified"}function zs(e){let t=e.pathname||"/";if(!t.startsWith("/")||t==="/")return "/";let r=t.lastIndexOf("/");return r<=0?"/":t.slice(0,r)}function Be(e){return `${e.name.toLowerCase()}
|
|
7
7
|
${e.domain.toLowerCase()}
|
|
8
|
-
${e.path}`}function
|
|
9
|
-
`,{encoding:"utf8",mode:384}),await M.rename(r,e);}function Ve(e){let t=e;for(let n=0;n<3;n+=1){if(/%(?:2f|5c)/i.test(t))return null;try{let s=decodeURIComponent(t);if(s===t)break;t=s;}catch{return null}}return t.includes("\0")||t.includes("\\")||t.split("/").some(n=>n==="."||n==="..")?null:t}function He(e,t){let r=Ve(t);if(r===null)throw new Error(`Unsafe output URL pathname: ${t}`);let n=w.resolve(e),s=w.resolve(n,r.replace(/^\/+/,""));if(s!==n&&!s.startsWith(`${n}${w.sep}`))throw new Error(`Output path escapes configured root: ${t}`);return s}var B=1,qr=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;function X(e,t){let r=String(e??"").trim();if(!qr.test(r))throw new Error(`${t} must match ${qr.source} and be at most 128 characters.`);return r}function Nr(e){let t=String(e??"").trim().replace(/^\/+|\/+$/g,"");if(!t)return "";let r=t.split("/").filter(Boolean);if(r.some(n=>n==="."||n===".."))throw new Error("S3 prefix contains an unsafe dot path segment.");return `${r.join("/")}/`}function Wt(e,...t){let r=Nr(e),n=t.map((s,o)=>{let i=String(s??"").replace(/^\/+|\/+$/g,"");if(!i||i.split("/").some(c=>c==="."||c===".."))throw new Error(`Unsafe S3 key segment at index ${o}.`);return i});return `${r}${n.join("/")}`}function ee(e){return createHash("sha256").update(e).digest("hex")}function fe(e,t){let r=String(e??"").replace(/^\/+/,""),n=Nr(t);if(!r||r.includes("\0"))throw new Error("S3 object key is empty or invalid.");if(n&&!r.startsWith(n))throw new Error(`S3 object key is outside the configured workspace prefix: ${r}`);if(r.split("/").some(s=>s===".."))throw new Error("S3 object key contains an unsafe parent segment.");return r}function z(e,t,{optional:r=false}={}){if(!(r&&(e==null||e===""))){if(typeof e!="string"||!e.trim())throw new Error(`${t} must be a non-empty string.`);return e.trim()}}function eo(e){if(!e||typeof e!="object")throw new Error("Remote worker config must be a JSON object.");let t=e;if(t.schemaVersion!==1)throw new Error(`Unsupported remote worker config version: ${String(t.schemaVersion)}.`);if(t.protocolVersion!==B)throw new Error(`Remote worker protocol mismatch: expected ${B}, received ${String(t.protocolVersion)}.`);let r=t.workspace,n=t.functions;if(!r||!n)throw new Error("Remote worker config requires workspace and functions objects.");return {schemaVersion:1,region:z(t.region,"region"),...z(t.roleArn,"roleArn",{optional:true})?{roleArn:z(t.roleArn,"roleArn")}:{},...z(t.roleSessionName,"roleSessionName",{optional:true})?{roleSessionName:z(t.roleSessionName,"roleSessionName")}:{},workspace:{bucket:z(r.bucket,"workspace.bucket"),prefix:String(r.prefix??"")},...t.status&&typeof t.status=="object"?{status:{tableName:z(t.status.tableName,"status.tableName")}}:{},functions:{render:z(n.render,"functions.render"),...z(n.asset,"functions.asset",{optional:true})?{asset:z(n.asset,"functions.asset")}:{},rewrite:z(n.rewrite,"functions.rewrite"),"deploy-copy":z(n["deploy-copy"],"functions.deploy-copy")},targets:Array.isArray(t.targets)?t.targets.map((s,o)=>{if(!s||typeof s!="object")throw new Error(`targets[${o}] must be an object.`);let i=s;return {id:z(i.id,`targets[${o}].id`),bucketName:z(i.bucketName,`targets[${o}].bucketName`),prefix:String(i.prefix??""),region:z(i.region,`targets[${o}].region`)}}):[],protocolVersion:B}}async function Vr(e){let t=w.resolve(e);try{return eo(JSON.parse(await readFile(t,"utf8")))}catch(r){throw new Error(`Unable to load remote worker config ${t}: ${r instanceof Error?r.message:String(r)}`,{cause:r})}}var ct=class{config;lambda;s3;dynamodb;#e;constructor(t,r={},n={}){this.config=t;let s=t.roleArn?fromTemporaryCredentials({params:{RoleArn:t.roleArn,RoleSessionName:t.roleSessionName??"publisher-exporter-remote-worker"},clientConfig:{region:t.region}}):void 0;this.lambda=new LambdaClient({region:t.region,...s?{credentials:s}:{},...r}),this.s3=new S3Client({region:t.region,...s?{credentials:s}:{}}),this.dynamodb=t.status?new DynamoDBClient({region:t.region,...s?{credentials:s}:{}}):null,this.#e=n;}async#n(t){if(!this.dynamodb||!this.config.status)return null;let n=(await this.dynamodb.send(new GetItemCommand({TableName:this.config.status.tableName,ConsistentRead:true,Key:{jobId:{S:t.jobId},taskId:{S:t.taskId}}}))).Item;if(!n)return null;let s=n.operation?.S,o=n.status?.S;return !s||!["render","asset","rewrite","deploy-copy"].includes(s)||!o||!["running","succeeded","partial","failed"].includes(o)?null:{jobId:n.jobId?.S??t.jobId,taskId:n.taskId?.S??t.taskId,operation:s,status:o,completedItems:Number(n.completedItems?.N??0),failedItems:Number(n.failedItems?.N??0),totalItems:Number(n.totalItems?.N??0),sequence:Number(n.sequence?.N??0),updatedAt:n.updatedAt?.S??new Date(0).toISOString(),requestId:n.requestId?.S??null}}async#t(t,r){let n=this.lambda.send(new InvokeCommand({FunctionName:r,InvocationType:"RequestResponse",Payload:Buffer.from(JSON.stringify(t),"utf8")}));if(t.operation==="health"||!this.dynamodb||!this.#e.onProgress)return await n;let s=false,o=n.finally(()=>{s=true;}),i=Math.max(500,Math.min(3e4,this.#e.progressPollIntervalMs??2e3)),c=-1;for(;!s;){await Promise.race([o.then(()=>{},()=>{}),new Promise(a=>setTimeout(a,i))]);try{let a=await this.#n(t);a&&a.sequence>c&&(c=a.sequence,await this.#e.onProgress(a));}catch(a){await this.#e.onProgressError?.(a instanceof Error?a:new Error(String(a)));}}return await o}async invoke(t){let r=t.operation==="health"?this.config.functions.render:this.config.functions[t.operation];if(!r)throw new Error(`Remote worker configuration does not provide a ${t.operation} function. Redeploy the Lambda workers and reinstall remote-workers.json.`);let n=await this.#t(t,r),s=n.Payload?JSON.parse(new TextDecoder().decode(n.Payload)):null;if(n.FunctionError)throw new Error(`Remote ${t.operation} worker failed (${n.FunctionError}): ${JSON.stringify(s)}`);if(!s||typeof s!="object")throw new Error(`Remote ${t.operation} worker returned no JSON response.`);let o=s;if(o.schemaVersion!==B||o.operation!==t.operation||o.jobId!==t.jobId||o.taskId!==t.taskId)throw new Error(`Remote ${t.operation} worker returned a mismatched response.`);return o}async readResult(t){if(!t.resultKey)throw new Error(`Remote ${t.operation} response does not contain a resultKey.`);let r=fe(t.resultKey,this.config.workspace.prefix),n=await this.s3.send(new GetObjectCommand({Bucket:this.config.workspace.bucket,Key:r}));if(!n.Body)throw new Error(`Remote worker result has no body: ${r}`);return JSON.parse(await n.Body.transformToString("utf8"))}async readObject(t){if(t.bucket!==this.config.workspace.bucket)throw new Error(`Remote worker object bucket mismatch: ${t.bucket}.`);let r=fe(t.key,this.config.workspace.prefix),n=await this.s3.send(new GetObjectCommand({Bucket:this.config.workspace.bucket,Key:r,...t.versionId?{VersionId:t.versionId}:{}}));if(!n.Body)throw new Error(`Remote worker object has no body: ${r}`);let s=await n.Body.transformToByteArray();if(s.byteLength!==t.bytes)throw new Error(`Remote worker object length mismatch for ${r}: expected ${t.bytes}, received ${s.byteLength}.`);if(ee(s)!==t.sha256)throw new Error(`Remote worker object checksum mismatch for ${r}.`);return s}async readObjectText(t){return new TextDecoder("utf8",{fatal:true}).decode(await this.readObject(t))}async health(t){let r=this.config.functions[t];if(!r)throw new Error(`Remote worker configuration does not provide a ${t} function.`);let n=`${t}-${Date.now()}`,s=await this.lambda.send(new InvokeCommand({FunctionName:r,InvocationType:"RequestResponse",Payload:Buffer.from(JSON.stringify({schemaVersion:B,operation:"health",jobId:"health",taskId:n}),"utf8")})),o=s.Payload?JSON.parse(new TextDecoder().decode(s.Payload)):null;if(s.FunctionError||!o||typeof o!="object")throw new Error(`Remote ${t} health check failed: ${JSON.stringify(o)}`);return o}async writeWorkspaceObject(t){let r=fe(t.key,this.config.workspace.prefix),n=typeof t.body=="string"?Buffer.from(t.body,"utf8"):t.body,s=ee(n),o=await this.s3.send(new PutObjectCommand({Bucket:this.config.workspace.bucket,Key:r,Body:n,ContentType:t.contentType,...t.cacheControl?{CacheControl:t.cacheControl}:{},Metadata:{sha256:s,...t.metadata??{}}}));return {bucket:this.config.workspace.bucket,key:r,sha256:s,bytes:n.byteLength,contentType:t.contentType,...o.ETag?{etag:o.ETag}:{},...o.VersionId?{versionId:o.VersionId}:{}}}async copyWorkspaceObject(t,r){if(t.bucket!==this.config.workspace.bucket)throw new Error(`Remote worker object bucket mismatch: ${t.bucket}.`);let n=fe(t.key,this.config.workspace.prefix),s=fe(r,this.config.workspace.prefix),o=`${t.bucket}/${n.split("/").map(c=>encodeURIComponent(c)).join("/")}`,i=await this.s3.send(new CopyObjectCommand({Bucket:t.bucket,Key:s,CopySource:o,MetadataDirective:"COPY"}));return {...t,key:s,...i.CopyObjectResult?.ETag?{etag:i.CopyObjectResult.ETag}:{},...i.VersionId?{versionId:i.VersionId}:{}}}};function to(e,t,r){if(!e||typeof e!="object")throw new Error("Remote render result must be a JSON object.");let n=e;if(n.schemaVersion!==B||!n.response||n.response.operation!=="render"||n.response.jobId!==t.jobId||n.response.taskId!==t.taskId||!n.detail||!Array.isArray(n.detail.pages)||n.detail.pages.length!==r.length)throw new Error("Remote render result has an invalid envelope.");for(let[s,o]of r.entries())if(n.detail.pages[s]?.requestedUrl!==o)throw new Error("Remote render result does not match the requested URLs.");return n}function qt(e){return e instanceof Error?e.message:String(e)}var ut=class{#e;#n;#t;#s;#c;#u;#r=[];#l=0;#o=0;#i=false;constructor(t){this.#e=t.client,this.#n=X(t.jobId,"jobId"),this.#t=Math.max(1,Math.min(5,t.maxAttempts??2)),this.#s=t.onRetry,this.#c=Math.max(1,Math.min(20,t.batchSize??1)),this.#u=Math.max(1,Math.min(100,t.maxConcurrentBatches??1));}async renderBatch(t){let r=[...new Set(t.urls)];if(r.length<1||r.length>20)throw new Error("Remote render batches require between 1 and 20 unique URLs.");let n=new Map,s=new Map,o=r;for(let i=1;i<=this.#t&&o.length>0;i+=1){this.#l+=1;let c=X(`render-${this.#l}-${ee(o.join(`
|
|
10
|
-
`)).slice(0,24)}-a${
|
|
11
|
-
`)).slice(0,24)}-a${s}`,"taskId");try{let i=await this.#e.invoke({schemaVersion:
|
|
12
|
-
`)).slice(0,16)}`,"taskId"),
|
|
13
|
-
`)).slice(0,16)}`,"taskId");try{let A=await n.client.invoke({schemaVersion:
|
|
14
|
-
`,"utf8");}async function
|
|
15
|
-
${r}`,40),tokenSource:t.tokenSource?`${t.tokenSource}+site-subscriber`:"site-subscriber"}}async function
|
|
8
|
+
${e.path}`}function _r(e,t){let r;try{r=new URL(t);}catch{return null}let n=e.split(";"),s=n.shift()?.trim()??"",o=s.indexOf("=");if(o<=0)return null;let i=s.slice(0,o).trim();if(!i||[...i].some(b=>b<=" "||"=;,".includes(b)))return null;let u=r.hostname.toLowerCase(),a=zs(r),l=null,d=true,c=false,m=false,h="Unspecified",f=false;for(let b of n){let p=b.indexOf("="),g=(p<0?b:b.slice(0,p)).trim().toLowerCase(),w=p<0?"":b.slice(p+1).trim();if(g==="domain"&&w)u=w.toLowerCase();else if(g==="path"&&w.startsWith("/"))a=w;else if(g==="expires"){let k=Date.parse(w);Number.isFinite(k)&&(l=Math.floor(k/1e3),d=false);}else if(g==="max-age"&&/^-?\d+$/u.test(w)){let k=Number.parseInt(w,10);l=Math.floor(Date.now()/1e3)+k,d=false;}else g==="secure"?c=true:g==="httponly"?m=true:g==="samesite"?h=Nr(w):g==="partitioned"&&(f=true);}return {name:i,domain:u,path:a,expires:l,session:d,secure:c,httpOnly:m,sameSite:h,partitioned:f}}function Qs(e){let t=!Number.isFinite(e.expires)||e.expires<=0;return {name:e.name,domain:e.domain.toLowerCase(),path:e.path||"/",expires:t?null:e.expires,session:t,secure:e.secure,httpOnly:e.httpOnly,sameSite:Nr(e.sameSite),partitioned:e.partitioned===true}}function Hr(e,t){let r=new Map(e.map(n=>[Be(n),n.value]));return t.filter(n=>r.get(Be(n))!==n.value).map(Qs)}function Ks(e,t){let r=e.session||t.session;return {...e,expires:r?null:Math.max(e.expires??0,t.expires??0)||null,session:r,secure:e.secure&&t.secure,httpOnly:e.httpOnly&&t.httpOnly,sameSite:e.sameSite===t.sameSite?e.sameSite:"Unspecified",partitioned:e.partitioned&&t.partitioned}}var at=class{#e=new Map;add(t){if(!t)return;let r={...t,domain:t.domain.toLowerCase(),path:t.path||"/"},n=Be(r),s=this.#e.get(n);this.#e.set(n,s?Ks(s,r):r);}addAll(t){for(let r of t)this.add(r);}artifact(){return {schemaVersion:1,observations:[...this.#e.values()].sort((t,r)=>Be(t).localeCompare(Be(r)))}}};async function ut(e,t){await M.mkdir(y.dirname(e),{recursive:true});let r=`${e}.${process.pid}.tmp`;await M.writeFile(r,`${JSON.stringify(t,null,2)}
|
|
9
|
+
`,{encoding:"utf8",mode:384}),await M.rename(r,e);}function Ve(e){let t=e;for(let n=0;n<3;n+=1){if(/%(?:2f|5c)/i.test(t))return null;try{let s=decodeURIComponent(t);if(s===t)break;t=s;}catch{return null}}return t.includes("\0")||t.includes("\\")||t.split("/").some(n=>n==="."||n==="..")?null:t}function ze(e,t){let r=Ve(t);if(r===null)throw new Error(`Unsafe output URL pathname: ${t}`);let n=y.resolve(e),s=y.resolve(n,r.replace(/^\/+/,""));if(s!==n&&!s.startsWith(`${n}${y.sep}`))throw new Error(`Output path escapes configured root: ${t}`);return s}var H=1,Br=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;function te(e,t){let r=String(e??"").trim();if(!Br.test(r))throw new Error(`${t} must match ${Br.source} and be at most 128 characters.`);return r}function Vr(e){let t=String(e??"").trim().replace(/^\/+|\/+$/g,"");if(!t)return "";let r=t.split("/").filter(Boolean);if(r.some(n=>n==="."||n===".."))throw new Error("S3 prefix contains an unsafe dot path segment.");return `${r.join("/")}/`}function Ht(e,...t){let r=Vr(e),n=t.map((s,o)=>{let i=String(s??"").replace(/^\/+|\/+$/g,"");if(!i||i.split("/").some(u=>u==="."||u===".."))throw new Error(`Unsafe S3 key segment at index ${o}.`);return i});return `${r}${n.join("/")}`}function re(e){return createHash("sha256").update(e).digest("hex")}function ye(e,t){let r=String(e??"").replace(/^\/+/,""),n=Vr(t);if(!r||r.includes("\0"))throw new Error("S3 object key is empty or invalid.");if(n&&!r.startsWith(n))throw new Error(`S3 object key is outside the configured workspace prefix: ${r}`);if(r.split("/").some(s=>s===".."))throw new Error("S3 object key contains an unsafe parent segment.");return r}function Q(e,t,{optional:r=false}={}){if(!(r&&(e==null||e===""))){if(typeof e!="string"||!e.trim())throw new Error(`${t} must be a non-empty string.`);return e.trim()}}function oo(e){if(!e||typeof e!="object")throw new Error("Remote worker config must be a JSON object.");let t=e;if(t.schemaVersion!==1)throw new Error(`Unsupported remote worker config version: ${String(t.schemaVersion)}.`);if(t.protocolVersion!==H)throw new Error(`Remote worker protocol mismatch: expected ${H}, received ${String(t.protocolVersion)}.`);let r=t.workspace,n=t.functions;if(!r||!n)throw new Error("Remote worker config requires workspace and functions objects.");return {schemaVersion:1,region:Q(t.region,"region"),...Q(t.roleArn,"roleArn",{optional:true})?{roleArn:Q(t.roleArn,"roleArn")}:{},...Q(t.roleSessionName,"roleSessionName",{optional:true})?{roleSessionName:Q(t.roleSessionName,"roleSessionName")}:{},workspace:{bucket:Q(r.bucket,"workspace.bucket"),prefix:String(r.prefix??"")},...t.status&&typeof t.status=="object"?{status:{tableName:Q(t.status.tableName,"status.tableName")}}:{},functions:{render:Q(n.render,"functions.render"),...Q(n.asset,"functions.asset",{optional:true})?{asset:Q(n.asset,"functions.asset")}:{},rewrite:Q(n.rewrite,"functions.rewrite"),"deploy-copy":Q(n["deploy-copy"],"functions.deploy-copy")},targets:Array.isArray(t.targets)?t.targets.map((s,o)=>{if(!s||typeof s!="object")throw new Error(`targets[${o}] must be an object.`);let i=s;return {id:Q(i.id,`targets[${o}].id`),bucketName:Q(i.bucketName,`targets[${o}].bucketName`),prefix:String(i.prefix??""),region:Q(i.region,`targets[${o}].region`)}}):[],protocolVersion:H}}async function Kr(e){let t=y.resolve(e);try{return oo(JSON.parse(await readFile(t,"utf8")))}catch(r){throw new Error(`Unable to load remote worker config ${t}: ${r instanceof Error?r.message:String(r)}`,{cause:r})}}var ct=class{config;lambda;s3;dynamodb;#e;constructor(t,r={},n={}){this.config=t;let s=t.roleArn?fromTemporaryCredentials({params:{RoleArn:t.roleArn,RoleSessionName:t.roleSessionName??"publisher-exporter-remote-worker"},clientConfig:{region:t.region}}):void 0;this.lambda=new LambdaClient({region:t.region,...s?{credentials:s}:{},...r}),this.s3=new S3Client({region:t.region,...s?{credentials:s}:{}}),this.dynamodb=t.status?new DynamoDBClient({region:t.region,...s?{credentials:s}:{}}):null,this.#e=n;}async#n(t){if(!this.dynamodb||!this.config.status)return null;let n=(await this.dynamodb.send(new GetItemCommand({TableName:this.config.status.tableName,ConsistentRead:true,Key:{jobId:{S:t.jobId},taskId:{S:t.taskId}}}))).Item;if(!n)return null;let s=n.operation?.S,o=n.status?.S;return !s||!["render","asset","rewrite","deploy-copy"].includes(s)||!o||!["running","succeeded","partial","failed"].includes(o)?null:{jobId:n.jobId?.S??t.jobId,taskId:n.taskId?.S??t.taskId,operation:s,status:o,completedItems:Number(n.completedItems?.N??0),failedItems:Number(n.failedItems?.N??0),totalItems:Number(n.totalItems?.N??0),sequence:Number(n.sequence?.N??0),updatedAt:n.updatedAt?.S??new Date(0).toISOString(),requestId:n.requestId?.S??null}}async#t(t,r){let n=this.lambda.send(new InvokeCommand({FunctionName:r,InvocationType:"RequestResponse",Payload:Buffer.from(JSON.stringify(t),"utf8")}));if(t.operation==="health"||!this.dynamodb||!this.#e.onProgress)return await n;let s=false,o=n.finally(()=>{s=true;}),i=Math.max(500,Math.min(3e4,this.#e.progressPollIntervalMs??2e3)),u=-1;for(;!s;){await Promise.race([o.then(()=>{},()=>{}),new Promise(a=>setTimeout(a,i))]);try{let a=await this.#n(t);a&&a.sequence>u&&(u=a.sequence,await this.#e.onProgress(a));}catch(a){await this.#e.onProgressError?.(a instanceof Error?a:new Error(String(a)));}}return await o}async invoke(t){let r=t.operation==="health"?this.config.functions.render:this.config.functions[t.operation];if(!r)throw new Error(`Remote worker configuration does not provide a ${t.operation} function. Redeploy the Lambda workers and reinstall remote-workers.json.`);let n=await this.#t(t,r),s=n.Payload?JSON.parse(new TextDecoder().decode(n.Payload)):null;if(n.FunctionError)throw new Error(`Remote ${t.operation} worker failed (${n.FunctionError}): ${JSON.stringify(s)}`);if(!s||typeof s!="object")throw new Error(`Remote ${t.operation} worker returned no JSON response.`);let o=s;if(o.schemaVersion!==H||o.operation!==t.operation||o.jobId!==t.jobId||o.taskId!==t.taskId)throw new Error(`Remote ${t.operation} worker returned a mismatched response.`);return o}async readResult(t){if(!t.resultKey)throw new Error(`Remote ${t.operation} response does not contain a resultKey.`);let r=ye(t.resultKey,this.config.workspace.prefix),n=await this.s3.send(new GetObjectCommand({Bucket:this.config.workspace.bucket,Key:r}));if(!n.Body)throw new Error(`Remote worker result has no body: ${r}`);return JSON.parse(await n.Body.transformToString("utf8"))}async readObject(t){if(t.bucket!==this.config.workspace.bucket)throw new Error(`Remote worker object bucket mismatch: ${t.bucket}.`);let r=ye(t.key,this.config.workspace.prefix),n=await this.s3.send(new GetObjectCommand({Bucket:this.config.workspace.bucket,Key:r,...t.versionId?{VersionId:t.versionId}:{}}));if(!n.Body)throw new Error(`Remote worker object has no body: ${r}`);let s=await n.Body.transformToByteArray();if(s.byteLength!==t.bytes)throw new Error(`Remote worker object length mismatch for ${r}: expected ${t.bytes}, received ${s.byteLength}.`);if(re(s)!==t.sha256)throw new Error(`Remote worker object checksum mismatch for ${r}.`);return s}async readObjectText(t){return new TextDecoder("utf8",{fatal:true}).decode(await this.readObject(t))}async health(t){let r=this.config.functions[t];if(!r)throw new Error(`Remote worker configuration does not provide a ${t} function.`);let n=`${t}-${Date.now()}`,s=await this.lambda.send(new InvokeCommand({FunctionName:r,InvocationType:"RequestResponse",Payload:Buffer.from(JSON.stringify({schemaVersion:H,operation:"health",jobId:"health",taskId:n}),"utf8")})),o=s.Payload?JSON.parse(new TextDecoder().decode(s.Payload)):null;if(s.FunctionError||!o||typeof o!="object")throw new Error(`Remote ${t} health check failed: ${JSON.stringify(o)}`);return o}async writeWorkspaceObject(t){let r=ye(t.key,this.config.workspace.prefix),n=typeof t.body=="string"?Buffer.from(t.body,"utf8"):t.body,s=re(n),o=await this.s3.send(new PutObjectCommand({Bucket:this.config.workspace.bucket,Key:r,Body:n,ContentType:t.contentType,...t.cacheControl?{CacheControl:t.cacheControl}:{},Metadata:{sha256:s,...t.metadata??{}}}));return {bucket:this.config.workspace.bucket,key:r,sha256:s,bytes:n.byteLength,contentType:t.contentType,...o.ETag?{etag:o.ETag}:{},...o.VersionId?{versionId:o.VersionId}:{}}}async copyWorkspaceObject(t,r){if(t.bucket!==this.config.workspace.bucket)throw new Error(`Remote worker object bucket mismatch: ${t.bucket}.`);let n=ye(t.key,this.config.workspace.prefix),s=ye(r,this.config.workspace.prefix),o=`${t.bucket}/${n.split("/").map(u=>encodeURIComponent(u)).join("/")}`,i=await this.s3.send(new CopyObjectCommand({Bucket:t.bucket,Key:s,CopySource:o,MetadataDirective:"COPY"}));return {...t,key:s,...i.CopyObjectResult?.ETag?{etag:i.CopyObjectResult.ETag}:{},...i.VersionId?{versionId:i.VersionId}:{}}}};function lt(e){return Number.isInteger(e)&&e>=500&&e<=599}var Bt=3;function dt(e){return Math.min(3e4,5e3*2**Math.max(0,e-1))}var ee=class extends Error{constructor(r,n,s,o){let i=`Page failed after ${s} attempt(s), last server response HTTP ${n}: ${r}`;super(i+(o&&o!==i?`; ${o}`:""));this.url=r;this.status=n;this.attempts=s;this.name="PageHttpError";}url;status;attempts};function Jr(e){if(e.size===0)return;let t=[...e.values()].slice(0,5).map(r=>`HTTP ${r.status}: ${r.url}`).join("; ");throw new Error(`Crawl incomplete: ${e.size} page(s) failed after HTTP 5xx retries. Deployment is blocked; no complete deploy plan was produced. ${t}`)}function ao(e,t,r){if(!e||typeof e!="object")throw new Error("Remote render result must be a JSON object.");let n=e;if(n.schemaVersion!==H||!n.response||n.response.operation!=="render"||n.response.jobId!==t.jobId||n.response.taskId!==t.taskId||!n.detail||!Array.isArray(n.detail.pages)||n.detail.pages.length!==r.length)throw new Error("Remote render result has an invalid envelope.");for(let[s,o]of r.entries())if(n.detail.pages[s]?.requestedUrl!==o)throw new Error("Remote render result does not match the requested URLs.");return n}function Vt(e){return e instanceof Error?e.message:String(e)}var pt=class{#e;#n;#t;#s;#u;#c;#l;#r=[];#d=0;#o=0;#i=false;constructor(t){this.#e=t.client,this.#n=te(t.jobId,"jobId"),this.#t=Math.max(1,Math.min(5,t.maxAttempts??2)),this.#s=t.onRetry,this.#l=t.sleep??setTimeout$1,this.#u=Math.max(1,Math.min(20,t.batchSize??1)),this.#c=Math.max(1,Math.min(100,t.maxConcurrentBatches??1));}async renderBatch(t){let r=[...new Set(t.urls)];if(r.length<1||r.length>20)throw new Error("Remote render batches require between 1 and 20 unique URLs.");let n=new Map,s=new Map,o=new Map,i=new Map,u=r;for(let a=1;a<=this.#t&&u.length>0;a+=1){this.#d+=1;let l=te(`render-${this.#d}-${re(u.join(`
|
|
10
|
+
`)).slice(0,24)}-a${a}`,"taskId"),d=[];try{let c=await this.#e.invoke({schemaVersion:H,operation:"render",jobId:this.#n,taskId:l,sourceOrigin:new URL(t.sourceOrigin).origin,urls:u,options:t.options}),m=ao(await this.#e.readResult(c),c,u);for(let h of m.detail.pages){if(o.delete(h.requestedUrl),lt(h.httpStatus)){let f=h.httpStatus;o.set(h.requestedUrl,f),i.set(h.requestedUrl,f),s.set(h.requestedUrl,new ee(h.requestedUrl,f,a).message),d.push(h.requestedUrl);continue}if(h.httpStatus!==null&&h.httpStatus!==void 0)i.delete(h.requestedUrl);else if(i.has(h.requestedUrl)){s.set(h.requestedUrl,h.error||"Remote render returned no HTTP status after a server error."),d.push(h.requestedUrl);continue}if(h.outcome==="failed"||h.outcome==="deferred"||!h.html){let f=h.error||`Remote render ended with ${h.outcome}.`;s.set(h.requestedUrl,f),d.push(h.requestedUrl);continue}try{n.set(h.requestedUrl,{page:h,html:t.downloadHtml===!1?null:await this.#e.readObjectText(h.html),taskId:l,attempts:a}),s.delete(h.requestedUrl);}catch(f){s.set(h.requestedUrl,Vt(f)),d.push(h.requestedUrl);}}}catch(c){let m=Vt(c);for(let h of u)o.delete(h),s.set(h,m),d.push(h);}if(a<this.#t){let c=d.some(m=>o.has(m))?dt(a):0;for(let m of d){let h=o.get(m);this.#s?.({url:m,attempt:a,maxAttempts:this.#t,reason:s.get(m)??"Remote render failed.",...h===void 0?{}:{status:h,delayMs:c}});}c>0&&await this.#l(c);}u=d;}return {pages:r.flatMap(a=>{let l=n.get(a);return l?[l]:[]}),failures:u.map(a=>({url:a,attempts:this.#t,error:s.get(a)??"Remote render failed.",...i.has(a)?{httpStatus:i.get(a)}:{}}))}}async render(t){let r=JSON.stringify({sourceOrigin:new URL(t.sourceOrigin).origin,options:t.options,downloadHtml:t.downloadHtml!==false});return await new Promise((n,s)=>{this.#r.push({input:t,key:r,resolve:n,reject:s}),this.#a();})}#a(){this.#i||this.#r.length===0||(this.#i=true,setTimeout(()=>{this.#i=false,this.#p();},0));}#p(){for(;this.#o<this.#c&&this.#r.length>0;){let t=this.#r.shift();if(!t)break;let r=[t];for(let n=0;n<this.#r.length&&r.length<this.#u;){let s=this.#r[n];s?.key===t.key?(r.push(s),this.#r.splice(n,1)):n+=1;}this.#o+=1,this.renderBatch({sourceOrigin:t.input.sourceOrigin,urls:r.map(n=>n.input.url),options:t.input.options,...t.input.downloadHtml===void 0?{}:{downloadHtml:t.input.downloadHtml}}).then(n=>{let s=new Map(n.pages.map(i=>[i.page.requestedUrl,i])),o=new Map(n.failures.map(i=>[i.url,i]));for(let i of r){let u=s.get(i.input.url);if(u){i.resolve(u);continue}let a=o.get(i.input.url);i.reject(a?.httpStatus===void 0?new Error(`Remote render failed after ${a?.attempts??this.#t} attempt(s) for ${i.input.url}: ${a?.error??"Unknown remote render failure."}`):new ee(i.input.url,a.httpStatus,a.attempts,a.error));}}).catch(n=>{let s=Vt(n);for(let o of r)o.reject(new Error(s,{cause:n}));}).finally(()=>{this.#o-=1,this.#a();});}this.#r.length>0&&this.#a();}};function uo(e,t,r){if(!e||typeof e!="object")throw new Error("Remote asset result must be a JSON object.");let n=e;if(n.schemaVersion!==H||n.response?.operation!=="asset"||n.response.jobId!==t.jobId||n.response.taskId!==t.taskId||!n.detail||!Array.isArray(n.detail.assets)||n.detail.assets.length!==r.length)throw new Error("Remote asset result has an invalid envelope.");for(let s=0;s<r.length;s+=1)if(n.detail.assets[s]?.requestedUrl!==r[s])throw new Error("Remote asset result does not match the requested URLs.");return n}var mt=class{#e;#n;#t;#s=0;constructor(t){this.#e=t.client,this.#n=te(t.jobId,"jobId"),this.#t=Math.max(1,Math.min(5,t.maxAttempts??2));}async fetch(t){let r=[...t.urls];if(r.length<1||r.length>20)throw new Error("Remote asset batches require between 1 and 20 URLs.");let n=null;for(let s=1;s<=this.#t;s+=1){this.#s+=1;let o=te(`asset-${this.#s}-${re(r.join(`
|
|
11
|
+
`)).slice(0,24)}-a${s}`,"taskId");try{let i=await this.#e.invoke({schemaVersion:H,operation:"asset",jobId:this.#n,taskId:o,urls:r,options:{ignoreHttpsErrors:t.ignoreHttpsErrors,timeoutMs:Math.max(1e3,Math.min(12e4,t.timeoutMs??6e4))}});return {assets:uo(await this.#e.readResult(i),i,r).detail.assets,taskId:o,attempts:s}}catch(i){n=i;}}throw new Error(`Remote asset batch failed after ${this.#t} attempt(s): ${n instanceof Error?n.message:String(n)}`,{cause:n})}};function Zr(e,t){let r=[];for(let n=0;n<e.length;n+=t)r.push(e.slice(n,n+t));return r}function Yr(e){return {sourceOrigin:e.sourceOrigin,targetOrigin:e.targetOrigin,urlRewriteMode:e.urlRewriteMode,outputDir:"/workspace",extraReplacements:e.extraReplacements,wpsuite:{...e.wpsuite?.subscriptionType?{subscriptionType:e.wpsuite.subscriptionType}:{},...e.wpsuite?.siteSettings?{siteSettings:{subscriber:e.wpsuite.siteSettings.subscriber===true}}:{}}}}function Xr(e,t){if(!e||typeof e!="object")throw new Error("Remote rewrite result must be a JSON object.");let r=e;if(r.schemaVersion!==H||r.response?.operation!=="rewrite"||r.response.jobId!==t.jobId||r.response.taskId!==t.taskId||!r.detail||!Array.isArray(r.detail.objects))throw new Error("Remote rewrite result has an invalid envelope.");return r}async function en(e,t,r){let n=r.options??{},s=await Lt(e,n.files);if(s.length===0)return 0;let o=te(r.jobId,"jobId"),i=Ht(r.client.config.workspace.prefix,"jobs",o,"rewrite-inputs"),u=`${i}/config.json`.replace(/\/+/g,"/"),a=`${i}/asset-map.json`.replace(/\/+/g,"/"),l=`${i}/previous-asset-map.json`.replace(/\/+/g,"/");await Promise.all([r.client.writeWorkspaceObject({key:u,body:JSON.stringify(Yr(e)),contentType:"application/json; charset=utf-8"}),r.client.writeWorkspaceObject({key:a,body:JSON.stringify(t),contentType:"application/json; charset=utf-8"}),r.client.writeWorkspaceObject({key:l,body:JSON.stringify(n.previousAssetMap??{}),contentType:"application/json; charset=utf-8"})]);let d=Math.max(1,Math.min(500,r.batchSize)),c=Math.ceil(s.length/d),m=Math.max(1,Math.min(Math.max(1,r.concurrency),c));await n.onStart?.({totalFiles:s.length,workerCount:m});let h=[],f=0,b=0;await Promise.all(Array.from({length:Math.min(16,s.length)},async()=>{for(;;){let I=f;if(I>=s.length)return;f+=1;let A=s[I],R=y.join(e.outputDir,A),v=Gr.lookup(A),E=v?Gr.contentType(v)||v:"text/plain; charset=utf-8",x=`${i}/files/${re(A)}.txt`.replace(/\/+/g,"/");await r.client.writeWorkspaceObject({key:x,body:await M.readFile(R),contentType:E}),h[I]={relativePath:A,key:x,fullPath:R,contentType:E},b+=1,await r.onStageProgress?.({index:b,totalFiles:s.length,file:A});}}));let p=Zr(h,d),g=0,w=0,k=0,C=Array.from({length:m},async()=>{for(;;){let I=g;if(I>=p.length)return;g+=1;let A=p[I],R=null,v=null;for(let E=1;E<=Math.max(1,Math.min(5,r.maxAttempts));E+=1){let x=te(`rewrite-${I+1}-a${E}-${re(A.map(L=>L.relativePath).join(`
|
|
12
|
+
`)).slice(0,16)}`,"taskId"),z={schemaVersion:H,operation:"rewrite",jobId:o,taskId:x,configKey:u,assetMapKey:a,previousAssetMapKey:l,items:A.map(L=>({inputKey:L.key,outputKey:L.key,relativePath:L.relativePath,contentType:L.contentType}))};try{let L=await r.client.invoke(z);v=Xr(await r.client.readResult(L),L);break}catch(L){R=L;}}if(!v)throw new Error(`Remote rewrite batch ${I+1}/${p.length} failed: ${R instanceof Error?R.message:String(R)}`,{cause:R});for(let E of A){let x=v.detail.objects.find(z=>z.outputKey===E.key);if(!x)throw new Error(`Remote rewrite result omitted ${E.relativePath}.`);await he(E.fullPath,Buffer.from(await r.client.readObject(x.output))),x.changed&&(k+=1),w+=1,await n.onProgress?.({index:w,totalFiles:s.length,changedTextFiles:k,file:E.relativePath,changed:x.changed});}}});return await Promise.all(C),k}async function tn(e,t,r,n){let s=n.relativePaths?new Set([...n.relativePaths].map(p=>p.replace(/\\/g,"/"))):null,o=Object.values(t.objects).filter(p=>p.isText&&(!s||s.has(p.relativePath))).sort((p,g)=>p.relativePath.localeCompare(g.relativePath));if(o.length===0)return 0;let i=te(n.jobId,"jobId"),u=Ht(n.client.config.workspace.prefix,"jobs",i,"rewrite-config"),a=`${u}/config.json`.replace(/\/+/g,"/"),l=`${u}/asset-map.json`.replace(/\/+/g,"/");await Promise.all([n.client.writeWorkspaceObject({key:a,body:JSON.stringify(Yr(e)),contentType:"application/json; charset=utf-8"}),n.client.writeWorkspaceObject({key:l,body:JSON.stringify(r),contentType:"application/json; charset=utf-8"})]);let d=Math.max(1,Math.min(500,n.batchSize)),c=Zr(o,d),m=Math.max(1,Math.min(Math.max(1,n.concurrency),c.length)),h=0,f=0,b=0;return await Promise.all(Array.from({length:m},async()=>{for(;;){let p=h;if(p>=c.length)return;h+=1;let g=c[p],w=null,k=null;for(let C=1;C<=Math.max(1,Math.min(5,n.maxAttempts));C+=1){let I=te(`rewrite-object-${p+1}-a${C}-${re(g.map(A=>A.relativePath).join(`
|
|
13
|
+
`)).slice(0,16)}`,"taskId");try{let A=await n.client.invoke({schemaVersion:H,operation:"rewrite",jobId:i,taskId:I,configKey:a,assetMapKey:l,items:g.map(R=>({inputKey:R.object.key,outputKey:R.object.key,relativePath:R.relativePath,contentType:R.contentType||R.object.contentType}))});w=Xr(await n.client.readResult(A),A);break}catch(A){k=A;}}if(!w)throw new Error(`Remote object rewrite batch ${p+1}/${c.length} failed: ${k instanceof Error?k.message:String(k)}`,{cause:k});for(let C of g){let I=w.detail.objects.find(A=>A.outputKey===C.object.key);if(!I)throw new Error(`Remote rewrite result omitted ${C.relativePath}.`);C.object=I.output,I.changed&&(b+=1),f+=1,await n.onProgress?.({index:f,totalFiles:o.length,changedTextFiles:b,file:C.relativePath,changed:I.changed});}}})),t.assetMap={...r},t.generatedAt=new Date().toISOString(),b}var po="remote-workers.json";function rn(e={}){let t=String(e.explicitPath??"").trim();if(t)return y.resolve(t);let r=String(e.runtimeDir??process.env.STATIC_PUBLISHER_RUNTIME_DIR??process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR??"").trim();return r?y.join(y.resolve(r),po):""}function nn(e,t,r,n=250){let s=Math.max(1,Math.floor(n)),o=[],i=new Set;for(let u of [e,...t]){let a=u.trim();if(!(!a||i.has(a)||r(a))&&(i.add(a),o.push(a),o.length>=s))break}return o}function mo(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?y.resolve(e):""}function gt(e){let t=String(process.env.STATIC_PUBLISHER_REMOTE_EXPORT_MANIFEST_PATH||"").trim();if(t)return y.resolve(t);let r=mo();if(r)return y.join(r,"remote-export-manifest.json");let n=y.resolve(e.outputDir);return y.join(y.dirname(n),`.${y.basename(n)}-remote-export-manifest.json`)}function Qt(e){let t=y.posix.normalize(String(e||"").replace(/\\/g,"/").replace(/^\/+/,""));if(!t||t==="."||t===".."||t.startsWith("../")||/^[A-Za-z]:/.test(t))throw new Error(`Invalid remote export relative path: ${e}`);return t}function on(e,t,r){let n=r?.workspace.bucket===t.workspace.bucket&&r.workspace.prefix===t.workspace.prefix;return {schemaVersion:1,generatedAt:new Date().toISOString(),jobId:e,workspace:{...t.workspace},objects:n?{...r.objects}:{},assetMap:n?{...r.assetMap}:{}}}function De(e,t){let r=Qt(t.relativePath);if(t.object.bucket!==e.workspace.bucket)throw new Error(`Remote export object bucket mismatch for ${r}.`);ye(t.object.key,e.workspace.prefix),e.objects[r]={...t,relativePath:r},e.generatedAt=new Date().toISOString();}function an(e,t){delete e.objects[Qt(t)],e.generatedAt=new Date().toISOString();}async function un(e,t){t.generatedAt=new Date().toISOString();let r=gt(e);await M.mkdir(y.dirname(r),{recursive:true}),await he(r,`${JSON.stringify(t,null,2)}
|
|
14
|
+
`,"utf8");}async function cn(e){try{let t=JSON.parse(await M.readFile(gt(e),"utf8"));if(t.schemaVersion!==1||typeof t.jobId!="string"||!t.workspace||typeof t.workspace.bucket!="string"||typeof t.workspace.prefix!="string"||!t.objects||typeof t.objects!="object"||!t.assetMap||typeof t.assetMap!="object")return null;let r=t;for(let[n,s]of Object.entries(r.objects)){if(Qt(n),!s||s.relativePath!==n||s.object?.bucket!==r.workspace.bucket)return null;ye(s.object.key,r.workspace.prefix);}return r}catch{return null}}var yo=["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"],Rn=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"]),vn=new Set(["",".html",".htm"]),bo=new Set([".css",".xml",".xsl",".svg",".json",".html",".htm",".txt",".enc",".jws"]),So=["/wp-content/","/wp-includes/","/wp-admin/","/static/","/assets/","/build/","/_next/"];function Po(e){let t=[],r="full",n="full",s=false,o=false,i="",u=null,a="";for(let l=0;l<e.length;l++){let d=e[l];if(d==="--retry-timeouts")r="retry-timeouts",s=true;else if(d==="--resume")s=true;else if(d==="--resume-rewrite")s=true,o=true;else if(d==="--crawl-mode"){let c=e[++l];if(!c)throw new Error("--crawl-mode requires a value");n=c==="incremental"?"incremental":"full",s||=n==="incremental";}else if(d.startsWith("--crawl-mode="))n=d.slice(13)==="incremental"?"incremental":"full",s||=n==="incremental";else if(d==="--incremental")n="incremental",s=true;else if(d==="--url"){let c=e[++l];if(!c)throw new Error("--url requires a value");r="single-url",s=true,t.push(c);}else if(d.startsWith("--url="))r="single-url",s=true,t.push(d.slice(6));else if(d==="--urls"){let c=e[++l];if(!c)throw new Error("--urls requires a file path");r="single-url",s=true,t.push(`@${c}`);}else if(d==="--content-sync-plan"){let c=e[++l];if(!c)throw new Error("--content-sync-plan requires a file path");r="content-sync",n="incremental",s=true,i=y.resolve(c);}else if(d.startsWith("--content-sync-plan="))r="content-sync",n="incremental",s=true,i=y.resolve(d.slice(20));else if(d==="--remote-render")u=true;else if(d==="--local-render")u=false;else if(d==="--remote-worker-config"){let c=e[++l];if(!c)throw new Error("--remote-worker-config requires a file path");a=y.resolve(c);}else d.startsWith("--remote-worker-config=")&&(a=y.resolve(d.slice(23)));}return {mode:r,crawlMode:n,urls:t,preserveOutput:s,resumeRewrite:o,contentSyncPlanPath:i,remoteRender:u,remoteWorkerConfigPath:a}}function Ye(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?y.resolve(e):""}function Ro(){let e=Ye();return e?y.join(e,"privacy","cookie-observations.json"):null}function vo(){let e=Ye();return e?y.resolve(e,".."):""}function ko(){let e=process.env.STATIC_PUBLISHER_WP_ROOT||process.env.WPSUITE_STATIC_PUBLISHER_WP_ROOT||"";return e.trim()?y.resolve(e):""}function Co(e){let t=e.trim(),r=[{alias:"@storage-root",root:vo(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@runtime",root:Ye(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@wp-root",root:ko(),requiredEnv:"STATIC_PUBLISHER_WP_ROOT or WPSUITE_STATIC_PUBLISHER_WP_ROOT"}];for(let n of r){if(t!==n.alias&&!t.startsWith(`${n.alias}/`))continue;if(!n.root)return {resolvedPath:null,alias:n.alias,requiredEnv:n.requiredEnv};let s=t.slice(n.alias.length).replace(/^\/+/,"");return {resolvedPath:s?y.resolve(n.root,s):n.root,alias:n.alias}}return {resolvedPath:y.resolve(t)}}function kn(e){let t=String(process.env.STATIC_PUBLISHER_CRAWL_MANIFEST_PATH||"").trim();if(t)return y.resolve(t);let r=Ye();return r?y.join(r,"crawl-manifest.json"):y.join(e.outputDir,".crawl-manifest.json")}function Cn(){return {schemaVersion:6,updatedAt:"",pages:{},assets:{}}}function dn(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 xo(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,cacheControl:typeof e.cacheControl=="string"&&e.cacheControl?e.cacheControl:null,changeToken:typeof e.changeToken=="string"?e.changeToken:null,tokenSource:typeof e.tokenSource=="string"?e.tokenSource:null,discoveredAssets:Array.isArray(e.discoveredAssets)?e.discoveredAssets.map(r=>String(r)):[],lastCrawledAt:String(e.lastCrawledAt||""),lastSeenRunId:String(e.lastSeenRunId||""),unreferencedRuns:Math.max(0,Number(e.unreferencedRuns)||0),rewriteComplete:e.rewriteComplete===true||!t}}function Gt(e){let t=e?.["content-type"]?.trim();return t||null}function Zt(e){let t=e?.["cache-control"]?.trim();return t||null}function To(e){return e?e.split(",").map(t=>t.trim().toLowerCase()).some(t=>t==="no-cache"||t==="no-store"||/^max-age\s*=\s*0$/.test(t)):false}function Ao(){return {rewriteTargets:new Set,changedFiles:new Set,deletedFiles:new Set,revalidateFiles:new Set}}function Fe(e,t,r,n){let s=Y(t.outputDir,r);s&&(To(n)?e.revalidateFiles.add(s):e.revalidateFiles.delete(s));}function G(e,t,r){let n=Y(t.outputDir,r);n&&(e.changedFiles.add(n),e.deletedFiles.delete(n));}function Yt(e,t,r){let n=Y(t.outputDir,r);n&&(e.deletedFiles.add(n),e.changedFiles.delete(n),e.revalidateFiles.delete(n));}function ne(e,t){e.rewriteTargets.add(y.resolve(t));}async function Io(e){try{let t=await M.readFile(kn(e),"utf8"),r=JSON.parse(t);if(r&&typeof r=="object"&&r.pages&&typeof r.pages=="object"){if((r.schemaVersion===2||r.schemaVersion===3||r.schemaVersion===4||r.schemaVersion===5||r.schemaVersion===6)&&r.assets&&typeof r.assets=="object")return {schemaVersion:6,updatedAt:String(r.updatedAt||""),pages:Object.fromEntries(Object.entries(r.pages).map(([n,s])=>[n,dn(s)])),assets:Object.fromEntries(Object.entries(r.assets).map(([n,s])=>[n,xo(s)]))};if(r.schemaVersion===1)return {schemaVersion:6,updatedAt:String(r.updatedAt||""),pages:Object.fromEntries(Object.entries(r.pages).map(([n,s])=>[n,dn(s)])),assets:{}}}}catch{}return Cn()}function Xt(e){return JSON.parse(JSON.stringify(e))}async function Eo(e,t){let r=kn(e);await M.mkdir(y.dirname(r),{recursive:true}),await M.writeFile(r,JSON.stringify(t,null,2),"utf8");}async function Pe(e,t,r=false){if(!t.trackManifest)return;t.manifestPendingChanges+=1;let n=Date.now();if(!r&&t.manifestPendingChanges<25&&n-t.lastManifestSavedAt<5e3)return;t.manifestPendingChanges=0,t.lastManifestSavedAt=n;let s=async()=>{let o=Xt(t.manifest);o.updatedAt=new Date().toISOString(),t.manifest.updatedAt=o.updatedAt,await Eo(e,o);};t.manifestSaveChain=t.manifestSaveChain.then(s,s),await t.manifestSaveChain;}function Ee(e){if(!e)return null;let t=e.trim();return t||null}function Oo(e,t){let r=new Set,n=new Set([...Object.keys(e),...Object.keys(t)]);for(let s of n){let o=e[s],i=t[s];!o||!i||o===i||r.add(s);}return r}async function xn(e,t,r,n){let s=[...new Set(r.map(u=>u.trim()).filter(Boolean))],o=String(e.wpsuite?.runtimeToken||"").trim();if(s.length===0||!o)return new Map;let i=new URL("/wp-json/smartcloud-static-publisher/v1/change-tokens",e.sourceOrigin).toString();try{let u=await t.post(i,{timeout:3e4,failOnStatusCode:!1,headers:{"content-type":"application/json","x-static-publisher-token":o},data:JSON.stringify({urls:s})});if(!u.ok())return n.warn(`Change token lookup failed with HTTP ${u.status()}`,{endpoint:i,status:u.status()}),new Map;let a=await u.json().catch(()=>null);if(!a||!Array.isArray(a.items))return new Map;let l=new Map;for(let d of a.items)!d||typeof d.url!="string"||l.set(d.url,d);return l}catch(u){return n.warn("Change token lookup failed; falling back to sitemap metadata",{endpoint:i,error:u instanceof Error?`${u.name}: ${u.message.split(/\r?\n/u,1)[0]}`:"Unknown change-token request failure"}),new Map}}async function ft(e,t,r,n,s){if(!r.enabled&&!r.trackManifest)return null;if(r.changeTokenCache.has(n))return r.changeTokenCache.get(n)??null;let i=(await xn(e,t,[n],s)).get(n)??null;return vt(e,n)&&(!i||i.supported!==true||!i.token)&&(i=await jo(e,t,n,s)),i=Tn(e,i),r.changeTokenCache.set(n,i),i}async function ir(e,t,r,n,s){if(!r.trackManifest)return;let o=[...new Set(n.map(i=>i.trim()).filter(Boolean))].filter(i=>!r.changeTokenCache.has(i));for(let i=0;i<o.length;i+=250){let u=o.slice(i,i+250),a=await xn(e,t,u,s);for(let l of u)r.changeTokenCache.set(l,Tn(e,a.get(l)??null));}}async function Mo(e,t,r,n,s,o){if(!(!n.trackManifest||n.changeTokenCache.has(s)))for(;!n.changeTokenCache.has(s);){if(!n.pageChangeTokenPrimePromise){let i=nn(s,r.pageQueue,a=>n.changeTokenCache.has(a));if(i.length===0)return;o.info(`Loading ${i.length} page change tokens in bulk.`,{phase:"prime-page-change-tokens",batchSize:i.length,remainingPages:r.pageQueue.length});let u=ir(e,t,n,i,o).finally(()=>{n.pageChangeTokenPrimePromise===u&&(n.pageChangeTokenPrimePromise=null);});n.pageChangeTokenPrimePromise=u;}await n.pageChangeTokenPrimePromise;}}function $o(e){return `subscriber=${e.wpsuite?.siteSettings?.subscriber===true?"1":"0"}`}function Tn(e,t){if(!t?.supported||!t.token||t.tokenSource==="wp-media-file")return t;let r=$o(e);return {...t,token:ue(`${t.token}
|
|
15
|
+
${r}`,40),tokenSource:t.tokenSource?`${t.tokenSource}+site-subscriber`:"site-subscriber"}}async function jo(e,t,r,n){try{let s=await t.get(r,{timeout:Math.min(e.navigationTimeoutMs,15e3),failOnStatusCode:!1});if(s.status()!==404)return n.warn(`Generated 404 fallback token skipped for ${r}`,{url:r,status:s.status(),requestPath:e.generated404RequestPath,source:"generated-404-change-token-fallback"}),null;let o=await s.text().catch(()=>""),i=ue(`${r}
|
|
16
16
|
404
|
|
17
|
-
${o}`,40);return n.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:i,tokenSource:"generated-404-response-hash",postId:null,dependencyPostIds:[],reason:null}}catch(s){return n.warn(`Generated 404 fallback token lookup failed for ${r}`,{url:r,error:String(s),requestPath:e.generated404RequestPath,source:"generated-404-change-token-fallback"}),null}}async function vn(e,t,r,n,s,o){let i=St(e,s);if(await Co(e,t,r,n,s,o),!n.enabled)return {action:"render",changeToken:n.trackManifest?await mt(e,t,n,s,o):null};let c=n.manifest.pages[s];if(!c)return {action:"render",changeToken:await mt(e,t,n,s,o)};let a=await mt(e,t,n,s,o);if(a?.supported&&a.token)return c.changeToken===a.token?i&&!await To(e,t,s,o)?{action:"render",changeToken:a}:{action:"reuse",changeToken:a}:{action:"render",changeToken:a};let l=Ie(r.sitemapLastmodByPage[s]);return l&&c.sitemapLastmod&&c.sitemapLastmod===l?{action:"reuse",changeToken:a}:{action:"render",changeToken:a}}async function To(e,t,r,n){try{let o=(await t.get(r,{timeout:Math.min(e.navigationTimeoutMs,15e3),failOnStatusCode:!1})).status();return o===404?!0:(n.warn(`Generated 404 request path no longer returns 404 for ${r}`,{url:r,status:o,requestPath:e.generated404RequestPath,source:"generated-404-status-probe"}),!1)}catch(s){return n.warn(`Generated 404 status probe failed for ${r}`,{url:r,error:String(s),requestPath:e.generated404RequestPath,source:"generated-404-status-probe"}),false}}async function Io(e,t,r,n,s){let o=an(r.previousManifest,void 0,n,"previous-manifest"),i=0;for(let[h,f]of Object.entries(r.manifest.pages))if(!r.seenPages.has(h)){Qt(s,e,f.outputPath);try{await M.unlink(f.outputPath);}catch(g){(g.code||"")!=="ENOENT"&&n.warn(`Failed to remove stale incremental page output for ${h}`,{url:h,outputPath:f.outputPath,error:String(g)});}delete r.manifest.pages[h],i++;}let c=an(r.manifest,r.runId,n,"active-manifest"),a=new Set,l=new Set;for(let h of c){for(let y of Ke(e,h))a.add(y);let f=r.manifest.assets[h]?.outputPath;f&&l.add(f);let g=Fe(e,t.assetMap,h);g&&l.add(g);}for(let h of Object.keys(r.manifest.assets)){if(c.has(h)){r.manifest.assets[h].unreferencedRuns=0;continue}let f=r.manifest.assets[h];if(Lr(f.unreferencedRuns)){f.unreferencedRuns+=1,n.warn(`Deferred deletion of newly unreferenced incremental asset ${h}.`,{url:h,unreferencedRuns:f.unreferencedRuns,phase:"incremental-cleanup",source:"asset-deletion-grace"});continue}delete r.manifest.assets[h];}let d=0,u=0;for(let h of o){if(r.manifest.assets[h])continue;let f=new Set,g=r.previousManifest.assets[h]?.outputPath;g&&f.add(g);let y=Fe(e,t.assetMap,h);if(!c.has(h)&&y)f.add(y);else if(!c.has(h)){let p=zo(e,h,n,"incremental-cleanup");p&&(f.add(p.originalFilePath),p.hashedFilePath&&f.add(p.hashedFilePath));}for(let p of f)if(!l.has(p)){Qt(s,e,p);try{await M.unlink(p),d++;}catch(m){(m.code||"")!=="ENOENT"&&n.warn(`Failed to remove stale incremental asset output for ${h}`,{url:h,outputPath:p,error:String(m)});}}for(let p of Ke(e,h))a.has(p)||Object.prototype.hasOwnProperty.call(t.assetMap,p)&&(delete t.assetMap[p],u++);}(i>0||d>0||u>0)&&n.info(`Incremental cleanup removed ${i} stale pages, ${d} stale assets, ${u} stale asset mappings`,{removedPages:i,removedAssets:d,removedAssetMappings:u,phase:"incremental-cleanup"});}async function Eo(e,t,r,n){let s=new Set([...Object.values(t.manifest.pages),...Object.values(t.manifest.assets)].map(a=>String(a.outputPath||"").trim()).filter(Boolean).map(a=>w.resolve(a))),o=Object.values(e.postCrawlCopyMap||{}).map(a=>ht(String(a||""))).filter(a=>!!a).map(a=>w.resolve(e.outputDir,a)),c=(await gs(["**/*.html","**/*.htm"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(a=>Ur(w.join(e.outputDir,a),e.outputDir,s,o));for(let a of c){let l=w.join(e.outputDir,a);Qt(n,e,l),await M.unlink(l);}c.length>0&&r.info(`Removed ${c.length} orphaned HTML output file(s) that are absent from the current crawl manifest.`,{phase:"incremental-cleanup",source:"manifest-output-reconciliation",removedPages:c.length,samples:c.slice(0,20)});}function an(e,t,r,n){let s=new Set,o=i=>{let c=i.trim();if(c){if(r){let a=re(c,r,"asset",n??"manifest");if(!a)return;s.add(a.toString());return}s.add(c);}};for(let i of Object.values(e.pages))for(let c of i.discoveredAssets||[])o(c);for(let[i,c]of Object.entries(e.assets||{}))t&&c.lastSeenRunId!==t||o(i);return s}function cn(e,t,r){for(let n of t)for(let s of Ke(e,n))if(r.has(s))return true;return false}function Oo(e,t,r,n,s){let o=new Set(r.rewriteTargets);for(let c of r.changedFiles)o.add(w.resolve(e.outputDir,c));for(let c of Object.values(t.manifest.pages))c.rewriteComplete||o.add(w.resolve(c.outputPath));for(let c of Object.values(t.manifest.assets))c.isText&&!c.rewriteComplete&&o.add(w.resolve(c.outputPath));let i=ko(n,s);if(i.size===0)return [...o];for(let c of Object.values(t.manifest.pages))cn(e,c.discoveredAssets,i)&&o.add(w.resolve(c.outputPath));for(let[c,a]of Object.entries(t.manifest.assets)){a.isText&&cn(e,a.discoveredAssets,i)&&o.add(w.resolve(a.outputPath));for(let l of Ke(e,c))if(i.has(l)){J(r,e,a.outputPath),a.isText&&o.add(w.resolve(a.outputPath));break}}return [...o]}function Mo(e,t){let r=t?new Set(Array.from(t,s=>w.resolve(s))):null,n=s=>r===null||r.has(w.resolve(s));for(let s of Object.values(e.manifest.pages))n(s.outputPath)&&(s.rewriteComplete=true);for(let s of Object.values(e.manifest.assets)){if(!s.isText){s.rewriteComplete=true;continue}n(s.outputPath)&&(s.rewriteComplete=true);}}function $o(e,t,r){let n=new Set,s=o=>{if(!o)return;let i=G(e.outputDir,o);i&&n.add(i);};for(let o of t.donePages)s(le(e,o));for(let o of Object.values(r.manifest.pages))o.lastSeenRunId===r.runId&&s(o.outputPath);for(let o of t.doneAssets)s(Fe(e,t.assetMap,o));for(let o of Object.values(r.manifest.assets))o.lastSeenRunId===r.runId&&s(o.outputPath);return n}async function jo(e,t,r,n,s,o){let i=[...n.deletedFiles].sort(),c=$o(e,t,r),a=0;for(let u of [...c].sort())if(!o?.objects[u]){try{if((await M.stat(w.join(e.outputDir,u))).isFile())continue}catch{}a++,s.warn(`Active output is missing after crawl: ${u}`,{phase:"deploy-plan",file:u,outputPath:w.join(e.outputDir,u)});}if(a>0&&s.warn(`Detected ${a} active output file(s) missing before deploy plan save.`,{phase:"deploy-plan",missingActiveOutputs:a}),i.length===0)return [];let l=[],d=0;for(let u of i){if(!c.has(u)){l.push(u);continue}d++;let h=w.join(e.outputDir,u),f;try{f=(await M.stat(h)).isFile();}catch{f=false;}s.warn(`Deploy plan protected active output from deletion: ${u}`,{phase:"deploy-plan",file:u,outputPath:h,exists:f});}return d>0&&s.info(`Deploy plan skipped ${d} active output deletion(s).`,{phase:"deploy-plan",protectedDeletes:d,deletedFiles:l.length}),l}function Ke(e,t){let r=new Set([t]);try{let n=new URL(t),o=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{o.push(new URL(e.targetOrigin).origin);}catch{}for(let i of o)try{r.add(new URL(i).origin+n.pathname+n.search);}catch{}r.add(n.pathname+n.search),r.add(n.pathname);}catch{}return [...r]}function Uo(e,t){let r=new Set([t]);try{let n=new URL(t),o=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{o.push(new URL(e.targetOrigin).origin);}catch{}for(let i of o)try{r.add(new URL(i).origin+n.pathname+n.search);}catch{}r.add(n.pathname+n.search);}catch{}return [...r]}function kn(e,t){let r=e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/"?e.targetOrigin:"https://relative.invalid/";try{let n=new URL(t,r);return He(e.outputDir,n.pathname)}catch{return null}}function Cn(e,t,r){for(let n of Uo(e,r)){let s=t[n];if(!s)continue;let o=kn(e,s);if(o)return {outputPath:o,publicUrl:s}}return null}function Lo(e,t,r){for(let n of Ke(e,r)){let s=t[n];if(!s)continue;let o=kn(e,s);if(o)return o}return null}function Fe(e,t,r){let n=Lo(e,t,r);if(n)return n;try{return Ye(e,r).originalFilePath}catch{return null}}function Do(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?w.join(w.resolve(e),"queue-runner-heartbeat.json"):""}async function Bt(e){let t=Do();if(t)try{let r=await M.readFile(t,"utf8"),n=JSON.parse(r);if(!n||typeof n!="object")return;await M.writeFile(t,JSON.stringify({...n,checkedAt:new Date().toISOString(),status:"running",currentStep:"rewrite",message:e},null,2),"utf8");}catch{}}function Fo(e,t){let r=new Set;for(let n of t.donePages)r.add(w.resolve(le(e,n)));for(let n of t.doneAssets){let s=Fe(e,t.assetMap,n);!s||!ie(s)||r.add(w.resolve(s));}for(let n of t.doneSitemaps){let s=Fe(e,t.assetMap,n);!s||!ie(s)||r.add(w.resolve(s));}return [...r]}var gt="re:",pt=new Map;function Wo(e){if(!e.startsWith(gt))return null;let t=pt.get(e);if(t!==void 0)return t||null;let r=e.slice(gt.length).trim();if(!r)return pt.set(e,false),null;try{let n=new RegExp(r);return pt.set(e,n),n}catch{return console.warn(`[crawl] Ignoring invalid path matcher regex: ${e}`),pt.set(e,false),null}}function rr(e,t){let r=Wo(t);return r?r.test(e):t.startsWith(gt)?false:e.startsWith(t)}function qo(e,t){return t.find(r=>rr(e,r))}function xn(e,t){let r=qo(t.pathname,e.blockedPathPrefixes);if(r)return r.startsWith(gt)?`blocked path regex: ${r}`:`blocked path prefix: ${r}`;let n=e.blockedSearchFragments.find(s=>t.search.includes(s));return n?`blocked search fragment: ${n}`:null}function No(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 n of Object.keys(e.extraReplacements||{}))try{r.add(new URL(n).hostname);}catch{}return r}function _o(e,t){return No(e).has(t.hostname)}function Bo(e){let t=he(e.trim()).replace(/\\\//g,"/").replace(/^['"]|['"]$/g,"").trim();return t=t.replace(/[)]+$/g,"").trim(),t=t.replace(/;.*$/g,"").trim(),t}function Jt(e){let t=he(e).replace(/\\\//g,"/");return /[{}]|\bwindow\.|\blocation\.|\bincludes\(|\?\?null|\+|%7B|%7D|%22|<|>|\s/.test(t)||/[()[\]'"]/.test(t)}function Vo(e){let t=he(e).replace(/\\\//g,"/").trim(),r=w.extname(t).toLowerCase();return wn.has(r)||yn.has(r)?false:/^(?:this|[A-Za-z_$][\w$]*)\.[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/.test(t)}function Ee(e){return mo.some(t=>e.pathname.startsWith(t))}function H(e,t,r=e.sourceOrigin,n,s="url",o=false){let i=Bo(t);if(!i||i.startsWith("data:")||i.startsWith("blob:")||i.startsWith("mailto:")||i.startsWith("tel:")||i.startsWith("#"))return n?.ignore(s,t,"empty or unsupported scheme",r),null;if(Jt(i))return n?.ignore(s,t,"looks like JavaScript/code fragment",r),null;if(Vo(i))return n?.ignore(s,t,"looks like JavaScript property access",r),null;try{let c=new URL(i,r);if(An(c))return n?.reject(s,t,"malformed URL encoding",r),null;if(!["http:","https:"].includes(c.protocol))return n?.ignore(s,t,"unsupported protocol: ",r),null;if(!_o(e,c))return n?.ignore(s,c.toString(),"host not allowed",r),null;let a=xn(e,c);if(a&&!(o&&kt(c)))return n?.reject(s,c.toString(),a,r),null;let l=new URL(e.sourceOrigin);return c.protocol=l.protocol,c.host=l.host,c.hash="",c}catch{return n?.reject(s,t,"invalid URL",r),null}}function An(e){try{return decodeURIComponent(e.pathname),decodeURIComponent(e.search),decodeURIComponent(e.hash),!1}catch{return true}}function re(e,t,r,n){try{let s=new URL(e);return An(s)?(t.reject(r,e,"malformed URL encoding",n),null):Ve(s.pathname)===null?(t.reject(r,e,"unsafe URL pathname",n),null):s.protocol!=="http:"&&s.protocol!=="https:"?(t.reject(r,e,`unsupported protocol: ${s.protocol}`,n),null):s}catch{return t.reject(r,e,"invalid URL",n),null}}function Tn(e){return wn.has(w.extname(e.pathname).toLowerCase())}function Se(e){return Ee(e)?false:yn.has(w.extname(e.pathname).toLowerCase())}function qe(e){let t=e.pathname.toLowerCase();return t.endsWith(".xml")&&(t.includes("sitemap")||t.endsWith("/sitemap.xml"))}function q(e,t){return !!(qe(t)||t.pathname==="/robots.txt"||t.pathname==="/llms.txt"||t.pathname.toLowerCase().endsWith(".xsl")||e.assetPathPrefixes.length>0&&e.assetPathPrefixes.some(r=>rr(t.pathname,r))||Tn(t)||!Se(t)&&!Ee(t))}function le(e,t){let r=new URL(t),n=Ve(r.pathname);if(n===null)throw new Error(`Unsafe page URL pathname: ${r.pathname}`);return n.endsWith("/")?n+="index.html":w.extname(n)||(n+="/index.html"),He(e.outputDir,n)}function Ho(e){if(!e.generated404RequestPath)return null;try{let t=new URL(e.generated404RequestPath,e.sourceOrigin);return !t.pathname.endsWith("/")&&w.extname(t.pathname)===""&&(t.pathname+="/"),t.hash="",t.toString()}catch{return null}}function St(e,t){let r=Ho(e);if(!r)return false;try{return new URL(t,e.sourceOrigin).toString()===r}catch{return false}}function Ye(e,t){let r=new URL(t),n=Ve(r.pathname);if(n===null)throw new Error(`Unsafe asset URL pathname: ${r.pathname}`);n.endsWith("/")&&(n+="index.html");let s=!!r.search,o=n,i=He(e.outputDir,o),c=It(e.targetOrigin,o),a=`${c}${r.search}`;if(!s)return {originalPathname:o,originalFilePath:i,originalPublicUrl:c,originalPublicUrlWithSearch:a,preferQueryHashed:s};let l=w.extname(n),u=`${l?n.slice(0,-l.length):n}.${oe(r.search)}${l||".bin"}`;return {originalPathname:o,originalFilePath:i,originalPublicUrl:c,originalPublicUrlWithSearch:a,preferQueryHashed:s,hashedPathname:u,hashedFilePath:He(e.outputDir,u),hashedPublicUrl:It(e.targetOrigin,u)}}function zo(e,t,r,n){let s=re(t,r,"asset",n);return s?Ye(e,s.toString()):null}function Gt(e,t,r,n,s){t[r]=n;try{let o=new URL(r),c=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{c.push(new URL(e.targetOrigin).origin);}catch{}for(let a of c)try{let l=new URL(a);t[l.origin+o.pathname+o.search]=n;}catch{}try{let a=(()=>{let l=new URL(n,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin);return `${l.pathname}${l.search}`})();t[o.pathname+o.search]=a;}catch{}try{let a=new URL(n,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[o.pathname]=a;}catch{}try{let a=new URL(s,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[o.pathname]=a;}catch{}}catch{}}async function In(e){try{return await M.readFile(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}async function xe(e){try{return await M.stat(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}function Qo(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 En(e){let t=String(e["last-modified"]||"").trim();if(!t)return null;let r=Date.parse(t);return Number.isFinite(r)?r:null}function Ko(e,t){let r=En(t),n=Qo(t),s=e?.mtime.getTime();return r!==null&&Math.abs((s??0)-r)>=1e3||n!==null&&e?.size!==n?false:r!==null||n!==null}async function Jo(e,t){if(!t)return;let r=En(t);if(r===null)return;let n=await xe(e);if(!n)return;let s=new Date(r);await M.utimes(e,n.atime,s).catch(()=>{});}function Zt(e,t){let r=w.extname(e.pathname).toLowerCase(),n=t["content-type"]||"";return po.has(r)||lo.some(s=>n.includes(s))&&!n.startsWith("image/")&&!n.includes("font")}function Go(e){try{let t=w.extname(new URL(e).pathname).toLowerCase();return t===".js"||t===".mjs"}catch{return false}}function Ce(e,t){(e.doneAssets.size%25===0||e.doneAssets.size===1||e.doneAssets.size===e.stats.assetsQueued)&&t.progress(`Asset processing progress: processed ${e.doneAssets.size}, discovered ${e.stats.assetsQueued}.`,{doneAssets:e.doneAssets.size,assetsQueued:e.stats.assetsQueued,phase:"download-assets"});}function Zo(e){return oe(e.toString("base64"),40)}function On(e,t,r){let n=e.assetVariantDigestsByOriginalPath.get(t);if(!n||n.size===0)return false;for(let s of n)if(s!==r)return true;return false}function Mn(e,t,r){let n=e.assetVariantDigestsByOriginalPath.get(t);n||(n=new Set,e.assetVariantDigestsByOriginalPath.set(t,n)),n.add(r);}async function Yt(e,t,r,n,s,o,i){let c=Ye(e,r),a=Zo(n),l=c.originalFilePath,d=c.originalPublicUrlWithSearch;if(c.preferQueryHashed&&c.hashedFilePath&&c.hashedPublicUrl&&On(s,c.originalFilePath,a)){let g=Cn(e,t,r);g?(l=g.outputPath,d=g.publicUrl):(l=c.hashedFilePath,d=c.hashedPublicUrl);}Gt(e,t,r,d,c.originalPublicUrl);let u=ie(l)?Buffer.from($t(n.toString("utf8"),e,t,l),"utf8"):n,h=await In(l),f=false;return (h===null||!h.equals(u))&&(await me(l,u),f=true),o?.debug(`${f?"Saved":"Skipped unchanged"} asset output ${r}`,{phase:"download-assets",url:r,outputPath:l,bytes:u.length,wroteFile:f}),Mn(s,c.originalFilePath,a),await Jo(l,i),s.stats.assetsSaved++,o&&(s.stats.assetsSaved%50===0||s.stats.assetsSaved===1)&&o.progress(`Asset progress: saved ${s.stats.assetsSaved}, discovered ${s.stats.assetsQueued}, pending ${s.assetQueue.length}.`,{assetsSaved:s.stats.assetsSaved,assetsQueued:s.stats.assetsQueued,assetQueue:s.assetQueue.length,phase:"download-assets"}),{outputPath:l,publicUrl:d,wroteFile:f}}function Oe(e,t,r,n,s){let o=()=>{let u=String(s??"").trim();if(!u)return {discoveredFrom:"",discoveredFromType:"unknown"};if(u==="seed-path"||u==="cli"||u==="generated-404-request-path")return {discoveredFrom:u,discoveredFromType:u};if(/^https?:\/\//i.test(u))try{let h=new URL(u);return qe(h)?{discoveredFrom:u,discoveredFromType:"sitemap"}:q(e,h)?{discoveredFrom:u,discoveredFromType:"asset"}:Se(h)&&!Ee(h)?{discoveredFrom:u,discoveredFromType:"page"}:{discoveredFrom:u,discoveredFromType:"url"}}catch{return {discoveredFrom:u,discoveredFromType:"url"}}return {discoveredFrom:u,discoveredFromType:"url"}},i=s&&/^https?:\/\//i.test(s)?s:e.sourceOrigin,c=H(e,r,i,n,"page");if(!c)return;if(!Se(c)||Tn(c)){if(q(e,c)){n.info(`Seeded/non-page URL queued as asset: ${c.toString()}`,{url:c.toString(),source:s}),W(e,t,c.toString(),n,s);return}n.reject("page",c.toString(),Ee(c)?"asset/internal path cannot be page":"not page-like",s);return}let a=c.toString(),{discoveredFrom:l,discoveredFromType:d}=o();l&&!t.pageDiscoverySources.has(a)&&t.pageDiscoverySources.set(a,l),!t.donePages.has(a)&&!t.queuedPages.has(a)&&(t.queuedPages.add(a),t.pageQueue.push(a),t.stats.pagesQueued++,n.debug(`Queued discovered page ${a}`,{phase:"discovery",url:a,discoveredFrom:l,discoveredFromType:d,outputPath:le(e,a)}),(t.stats.pagesQueued%25===0||t.stats.pagesQueued===1)&&n.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,pageQueue:t.pageQueue.length,phase:"discovery"}));}function W(e,t,r,n,s){let o=s&&/^https?:\/\//i.test(s)?s:e.sourceOrigin,i=H(e,r,o,n,"asset");if(!i)return;if(!q(e,i)){n.reject("asset",i.toString(),"not a safe asset path/prefix",s);return}let c=i.toString();!t.doneAssets.has(c)&&!t.queuedAssets.has(c)&&(t.queuedAssets.add(c),t.assetQueue.push(c),t.stats.assetsQueued++,(t.stats.assetsQueued%100===0||t.stats.assetsQueued===1)&&n.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 ft(e,t,r,n,s){let o=s&&/^https?:\/\//i.test(s)?s:e.sourceOrigin,i=H(e,r,o,n,"sitemap",hr(s));if(!i)return;if(!qe(i)){n.reject("sitemap",i.toString(),"not sitemap-like",s);return}let c=i.toString();!t.doneSitemaps.has(c)&&!t.queuedSitemaps.has(c)&&(t.queuedSitemaps.add(c),t.sitemapQueue.push(c),t.stats.sitemapsQueued++,(t.stats.sitemapsQueued%10===0||t.stats.sitemapsQueued===1)&&n.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 Yo(e){let t=he(e),r=[...t.matchAll(/<url>\s*([\s\S]*?)\s*<\/url>/gi)].map(n=>n[1]);return r.length>0?r.map(n=>{let s=n.match(/<loc>\s*([^<]+?)\s*<\/loc>/i);if(!s?.[1])return null;let o=n.match(/<lastmod>\s*([^<]+?)\s*<\/lastmod>/i);return {loc:s[1].trim(),lastmod:Ie(o?.[1]??null)}}).filter(n=>!!n):[...t.matchAll(/<loc>\s*([^<]+?)\s*<\/loc>/gi)].map(n=>({loc:n[1].trim(),lastmod:null})).filter(n=>n.loc)}function Xo(e){return e.split(",").map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function ei(e){let t=[],r=/url\(\s*(?:"([^"]+)"|'([^']+)'|([^)]*?))\s*\)/gi;for(let n of e.matchAll(r)){let s=e.slice(Math.max(0,n.index-8),n.index);if(/\bnew\s+$/i.test(s))continue;let o=(n[1]||n[2]||n[3]||"").trim();o&&t.push(o);}return t}function ti(e){return e.replace(/<script\b[^>]*>[\s\S]*?<\/script\s*>/gi,"")}function ri(e,t){if(t==="dom-style")return true;let r=(()=>{try{return w.extname(new URL(e).pathname).toLowerCase()}catch{return ""}})();return !(r===".js"||r===".mjs"||r===".map"||t.includes("javascript"))}function ht(e){return e.trim().replace(/\\/g,"/").replace(/^https?:\/\/[^/]+/i,"").replace(/^\/+/,"")}async function $n(e,t,r,n){let s=[];await M.mkdir(t,{recursive:true});let o=await M.readdir(e,{withFileTypes:true});for(let i of o){let c=w.join(e,i.name),a=w.join(t,i.name);if(i.isDirectory()){s.push(...await $n(c,a,r,n));continue}await jn(c,a,r,n)&&s.push(a);}return s}async function ni(e,t){try{let[r,n]=await Promise.all([M.stat(e),M.stat(t)]);if(r.size!==n.size)return !1;let[s,o]=await Promise.all([M.readFile(e),M.readFile(t)]);return s.equals(o)}catch{return false}}async function jn(e,t,r,n){let s=w.resolve(t);return r.has(s)?(n.debug("Skipped post-crawl copy over crawled page output",{phase:"copy-extra-paths",sourcePath:e,targetPath:t}),false):await ni(e,t)?(n.debug("Skipped unchanged post-crawl copy target",{phase:"copy-extra-paths",sourcePath:e,targetPath:t}),false):(await M.mkdir(w.dirname(t),{recursive:true}),await M.copyFile(e,t),true)}async function si(e,t,r){let n=Object.entries(e.postCrawlCopyMap||{}).map(([c,a])=>({sourcePath:c.trim(),prefix:String(a||"").trim()}));if(n.length===0)return [];let s=0,o=[],i=new Set([...t.donePages].map(c=>w.resolve(le(e,c))));r.mark("copy-extra-paths");for(let c of n){let a=c.sourcePath,l=c.prefix;if(!a||!l){r.warn("Skipped post-crawl copy mapping with empty key/value",{sourcePath:a,prefixPath:l});continue}let d=yo(a);if(!d.resolvedPath){r.warn("Skipped post-crawl copy source because alias root is not configured",{sourcePath:a,alias:d.alias||"",requiredEnv:d.requiredEnv||"",prefixPath:l});continue}let u=d.resolvedPath,h=ht(l);if(!h){r.warn("Skipped post-crawl copy mapping with invalid export prefix",{sourcePath:a,prefixPath:l});continue}let f;try{f=await M.stat(u);}catch{r.warn("Skipped post-crawl copy source because it does not exist",{sourcePath:a,sourceAbs:u,prefixPath:l});continue}let g=w.resolve(e.outputDir,h);if(f.isDirectory()){let b=await $n(u,g,i,r);o.push(...b),s+=b.length,b.length>0&&r.progress(`Copied static directory to export: ${u} -> /${h}`,{phase:"copy-extra-paths",sourcePath:u,targetPath:`/${h}`,copiedItems:s,changedFiles:b.length});continue}let y=w.basename(u),p=l.endsWith("/")?w.join(g,y):g;await jn(u,p,i,r)&&(o.push(p),s++,r.progress(`Copied static file to export: ${u} -> /${ht(l.endsWith("/")?`${l}${y}`:l)}`,{phase:"copy-extra-paths",sourcePath:u,targetPath:`/${ht(l.endsWith("/")?`${l}${y}`:l)}`,copiedItems:s}));}return r.endMark("copy-extra-paths",{mappedSources:n.length,copiedItems:s}),o}function We(e,t,r,n,s){let o=new Set,i=he(r).replace(/\\\//g,"/"),c=s==="page-html"?ti(i):i,a=ri(t,s);if(a){for(let l of ei(c)){let d=H(e,l,t,n,`${s}:css-url`);d&&q(e,d)&&o.add(d.toString());}for(let l of c.matchAll(/@import\s+(?:url\()?\s*['"]?([^'"\s;]+)['"]?\s*\)?/gi)){let d=H(e,l[1],t,n,`${s}:css-import`);d&&q(e,d)&&o.add(d.toString());}}if(a||s==="page-html")for(let l of c.matchAll(/<\?xml-stylesheet[^>]+href=["']([^"']+)["'][^>]*\?>/gi)){let d=H(e,l[1],t,n,`${s}:xml-stylesheet`);d&&q(e,d)&&o.add(d.toString());}if(s==="page-html")for(let l of Mr(i)){let d=l.startsWith("//")?`${new URL(e.sourceOrigin).protocol}${l}`:l;if(Jt(d)){n.ignore(`${s}:serialized-url`,d,"looks like JavaScript/code fragment",t);continue}let u=H(e,d,t,n,`${s}:serialized-url`);u&&q(e,u)?o.add(u.toString()):u&&n.ignore("asset",u.toString(),"serialized URL did not pass safe asset path filter",t);}if(s!=="page-html"&&Go(t))for(let l of $r(i)){if(Jt(l)||!/\.(?:js|mjs)(?:[?#]|$)/i.test(l))continue;let d=H(e,l,t,n,`${s}:relative-asset`);d&&q(e,d)&&o.add(d.toString());}return [...o]}function Un(e,t,r,n){let s=new Set,o=he(r);for(let i of o.matchAll(/href=["']([^"'#\s][^"']*?)["']/gi)){let c=i[1],a=H(e,c,t,n,"page-link");a&&(xn(e,a)||Se(a)&&!Ee(a)&&!q(e,a)&&s.add(a.toString()));}return [...s]}async function un(e,t,r,n,s,o,i=false,c=[]){let a=new Set(c),l=0,d=new Map,u=(h,f)=>{let g=[f],y=new Set;for(;g.length>0;){let p=g.pop();if(p===h)return true;y.has(p)||(y.add(p),g.push(...d.get(p)??[]));}return false};for(;r.sitemapQueue.length>0;){let h=r.sitemapQueue.shift();r.queuedSitemaps.delete(h);let f=re(h,n,"sitemap","sitemap-queue");if(!f)continue;let g=f.toString();if(r.doneSitemaps.has(g))continue;r.doneSitemaps.add(g),n.sitemap(`Fetching sitemap ${g}`,{url:g});let y=true;try{let p=await t.get(g,{timeout:6e4});if(y=!1,!p.ok()){if(n.skip("sitemap",g,p.status()),i&&!a.has(g))throw new Error(`Required child content-sync sitemap returned HTTP ${p.status()}: ${g}`);continue}let m=await p.body(),b=p.url()||g,k=re(b,n,"sitemap-response",g);if(!k)continue;let R=k.toString();r.successfulSitemaps.add(g),r.successfulSitemaps.add(R),a.has(g)&&(r.resolvedSitemapRoots.add(R),l+=1);let O=await Yt(e,r.assetMap,R,m,r,n);J(s,e,O.outputPath),te(s,O.outputPath);let A=m.toString("utf8");/<sitemapindex(?:\s|>)/i.test(A)?r.sitemapIndexUrls.add(R):r.sitemapLeafUrls.add(R);let C=We(e,R,A,n,"sitemap");for(let x of C)W(e,r,x,n,R);let v=[];for(let x of Yo(A)){let T=H(e,x.loc,R,n,"sitemap-loc",!0);if(!T){if(i)throw new Error(`Content-sync sitemap contains an inadmissible location: ${x.loc}`);continue}if(qe(T)){if(u(R,T.toString()))throw new Error(`Sitemap index cycle detected: ${R} -> ${T.toString()}`);if(d.has(R)||d.set(R,new Set),d.get(R).add(T.toString()),v.push(T.toString()),i&&r.doneSitemaps.has(T.toString())&&!r.successfulSitemaps.has(T.toString()))throw new Error(`Required child content-sync sitemap was not resolved: ${T.toString()}`);ft(e,r,T.toString(),n,R);}else if(i){if(Se(T)&&!q(e,T)){let Q=o.requiredUrls.has(T.toString()),D=o.manifest.pages[T.toString()],P=!!D&&!!await xe(D.outputPath);if(!Q&&!P)throw new Error(`Content-sync sitemap coverage is incomplete for ${T.toString()}.`)}n.ignore("sitemap-loc",T.toString(),"content-sync sitemap-only traversal does not enqueue urlset locations",R);}else q(e,T)?W(e,r,T.toString(),n,R):Se(T)?(x.lastmod&&(r.sitemapLastmodByPage[T.toString()]=x.lastmod),Oe(e,r,T.toString(),n,R)):n.reject("sitemap-loc",T.toString(),"not page/sitemap/asset-like",R);}o.trackManifest&&(o.manifest.assets[R]={url:R,outputPath:O.outputPath,isText:!0,contentType:p.headers()["content-type"]??"application/xml",cacheControl:zt(p.headers()),changeToken:null,tokenSource:null,discoveredAssets:[...new Set([...C,...v])],lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,unreferencedRuns:0,rewriteComplete:!1},await be(e,o));}catch(p){n.error(`Failed sitemap ${g}`,{url:g,error:String(p)});let m=i&&a.has(g)&&y;if(i&&!m)throw p}}if(i&&a.size>0&&l===0)throw new Error(`None of the configured content-sync sitemap roots could be resolved: ${[...a].join(", ")}`)}async function oi(e,t,r,n,s,o,i){let c=H(e,n,e.sourceOrigin,s,"asset-fetch");if(!c||!q(e,c))return;let a=c.toString();if(r.doneAssets.has(a))return;let l=o.enabled||o.strictTargeted?o.previousManifest.assets[a]:void 0,d=o.trackManifest?await mt(e,t,o,a,s):null,u=d?.token??null,h=Ut(l?.changeToken,d),f=o.strictTargeted&&(!d?.supported||!d.token)&&Lt(e.sourceOrigin,a),g=o.strictTargeted?o.manifest.assets[a]:void 0;if(g?.lastSeenRunId===o.runId&&await xe(g.outputPath)){r.doneAssets.add(a);for(let p of g.discoveredAssets||[])W(e,r,p,s,a);J(i,e,g.outputPath),De(i,e,g.outputPath,g.cacheControl),g.isText&&te(i,g.outputPath),s.info(`Resumed completed content-sync asset ${a}`,{url:a,source:"content-sync-checkpoint"}),Ce(r,s);return}if(l&&(h||f)&&await xe(l.outputPath)){o.manifest.assets[a]={...l,changeToken:u,tokenSource:d?.tokenSource??l.tokenSource,discoveredAssets:[...l.discoveredAssets||[]],lastSeenRunId:o.runId,unreferencedRuns:0},delete o.manifest.pages[a],r.doneAssets.add(a);for(let p of l.discoveredAssets||[])W(e,r,p,s,a);De(i,e,l.outputPath,l.cacheControl),s.info(`Reused unchanged trusted asset ${a}.`,{url:a,tokenSource:d?.tokenSource??"unknown",phase:"download-assets",source:h?"asset-change-token-match":"content-sync-release-fingerprint"}),Ce(r,s);return}let y=(p,m={})=>{if(!l||o.strictTargeted)return false;o.manifest.assets[a]={...l,discoveredAssets:[...l.discoveredAssets||[]],lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,unreferencedRuns:0},delete o.manifest.pages[a],r.doneAssets.add(a);for(let b of l.discoveredAssets||[])W(e,r,b,s,a);return s.warn(`Keeping previous incremental asset ${a} after fetch issue.`,{url:a,reason:p,preservedFromPreviousManifest:true,...m,phase:"download-assets"}),Ce(r,s),true};s.asset(`Fetching asset ${a}`,{url:a});try{let p=Fe(e,r.assetMap,a),m=p?await xe(p):null;if(p&&m&&!o.strictTargeted)try{let D=await V(`fetch asset headers ${a}`,6e4,()=>t.head(a,{timeout:6e4})),P=D.headers();if(D.ok()&&Ko(m,P)){let j=await In(p);if(j!==null){let Y=D.url()||a,I=re(Y,s,"asset-response",a);if(!I)return;let F=I.toString(),U=await Yt(e,r.assetMap,F,j,r,s,P);U.wroteFile&&(J(i,e,U.outputPath),ie(U.outputPath)&&te(i,U.outputPath));let ne=zt(P)||l?.cacheControl||null;De(i,e,U.outputPath,ne),r.doneAssets.add(a),s.info(`Reused existing asset ${a} based on response headers.`,{url:a,filePath:p,lastModified:P["last-modified"]||"",contentLength:P["content-length"]||"",phase:"download-assets"}),Ce(r,s);let de=Zt(c,P),Pe=l?.discoveredAssets?[...l.discoveredAssets]:[];if(de||l?.isText){let Z=j.toString("utf8"),Ne=We(e,F,Z,s,"asset:cached");(Ne.length>0||!l)&&(Pe=Ne);for(let Xe of Pe)W(e,r,Xe,s,F);}if(o.trackManifest){let Z=de||!!l?.isText;o.manifest.assets[a]={url:a,outputPath:U.outputPath,isText:Z,contentType:Ht(P)||l?.contentType||null,cacheControl:ne,changeToken:d?.supported?d.token:null,tokenSource:d?.supported?d.tokenSource??null:null,discoveredAssets:Pe,lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,unreferencedRuns:0,rewriteComplete:!Z},delete o.manifest.pages[a],(o.enabled||o.strictTargeted)&&Z&&await be(e,o);}return}}}catch{}let b=await V(`fetch asset ${a}`,6e4,()=>t.get(a,{timeout:6e4}));if(!b.ok()){if(y(`http-${b.status()}`,{status:b.status()}))return;if(o.strictTargeted)throw new Error(`Required content-sync asset returned HTTP ${b.status()}: ${a}`);s.skip("asset",a,b.status());return}let k=await V(`read asset response ${a}`,6e4,()=>b.body()),R=b.url()||a,O=re(R,s,"asset-response",a);if(!O)return;let A=O.toString(),C=b.headers(),v=await Yt(e,r.assetMap,A,k,r,s,C);v.wroteFile&&(J(i,e,v.outputPath),ie(v.outputPath)&&te(i,v.outputPath));let x=zt(C);De(i,e,v.outputPath,x),r.doneAssets.add(a),Ce(r,s);let T=Zt(c,C),Q=[];if(T){let D=k.toString("utf8");Q=We(e,A,D,s,`asset:${w.extname(c.pathname).toLowerCase()||C["content-type"]||"unknown"}`);for(let P of Q)W(e,r,P,s,A);}o.trackManifest&&(o.manifest.assets[a]={url:a,outputPath:v.outputPath,isText:T,contentType:Ht(C),cacheControl:x,changeToken:d?.supported?d.token:null,tokenSource:d?.supported?d.tokenSource??null:null,discoveredAssets:Q,lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,unreferencedRuns:0,rewriteComplete:!T},delete o.manifest.pages[a],(o.enabled||o.strictTargeted)&&T&&await be(e,o));}catch(p){if(y("fetch-error",{error:String(p)}))return;if(s.error(`Failed asset ${a}`,{url:a,error:String(p)}),o.strictTargeted)throw p}finally{r.doneAssets.has(a)||(r.doneAssets.add(a),Ce(r,s));}}async function ii(e,t,r,n,s,o){let i=Math.max(1,Number(e.assetDownloadConcurrency||e.concurrency||1)),c=Array.from({length:i},async()=>{for(;r.assetQueue.length>0;){let a=r.assetQueue.shift();a&&(r.queuedAssets.delete(a),await oi(e,t,r,a,n,s,o));}});await Promise.all(c);}function wt(e,t){let r=G(e.outputDir,t);if(!r)throw new Error(`Remote export output is outside outputDir: ${t}`);return r}function ai(e,t){return Zt(e,{"content-type":t})}function ln(e){return /(?:^|\/)index\.html?$|\.html?$/i.test(e)}async function ci(e,t,r,n,s,o,i,c,a){let l=Math.max(1,Math.min(100,a)),d=20;for(;r.assetQueue.length>0;){let u=r.assetQueue.splice(0,l*d);for(let y of u)r.queuedAssets.delete(y);await tr(e,t,s,u,n);let h=[];for(let y of u){let p=s.manifest.assets[y],m=p?G(e.outputDir,p.outputPath):null,b=m?i.objects[m]:void 0,k=s.changeTokenCache.get(y)??null;if(!(s.enabled&&p&&b?.kind==="asset"&&b.sourceUrl===y&&(Ut(p.changeToken,k)||(!k?.supported||!k.token)&&Lt(e.sourceOrigin,y)))||!p||!m||!b){h.push(y);continue}s.manifest.assets[y]={...p,changeToken:k?.token??null,tokenSource:k?.tokenSource??p.tokenSource,lastSeenRunId:s.runId,unreferencedRuns:0};for(let O of p.discoveredAssets||[])W(e,r,O,n,y);r.doneAssets.add(y),De(o,e,p.outputPath,p.cacheControl),n.info(`Reused unchanged S3-native asset ${y}.`,{url:y,relativePath:m,tokenSource:k?.tokenSource??"release-fingerprint",phase:"download-assets",execution:"lambda"}),Ce(r,n);}if(h.length===0)continue;let f=[];for(let y=0;y<h.length;y+=d)f.push(h.slice(y,y+d));let g=await Promise.all(f.map(y=>c.fetch({urls:y,ignoreHttpsErrors:e.ignoreHttpsErrors,timeoutMs:6e4})));for(let y of g)for(let p of y.assets){let m=p.requestedUrl;try{if(p.outcome!=="fetched"||!p.object||!p.finalUrl){let x=p.error||`Remote asset fetch ended with ${p.outcome}.`;if(n.error(`Failed remote asset ${m}`,{url:m,status:p.httpStatus,outcome:p.outcome,error:x,execution:"lambda"}),s.strictTargeted)throw new Error(x);continue}let b=re(p.finalUrl,n,"remote-asset-response",m);if(!b)continue;let k=Ye(e,b.toString()),R=k.originalFilePath,O=k.originalPublicUrlWithSearch;if(k.preferQueryHashed&&k.hashedFilePath&&k.hashedPublicUrl&&On(r,k.originalFilePath,p.object.sha256)){let x=Cn(e,r.assetMap,b.toString());R=x?.outputPath??k.hashedFilePath,O=x?.publicUrl??k.hashedPublicUrl;}Gt(e,r.assetMap,b.toString(),O,k.originalPublicUrl),b.toString()!==m&&Gt(e,r.assetMap,m,O,k.originalPublicUrl),Mn(r,k.originalFilePath,p.object.sha256);let A=wt(e,R),C=p.contentType?.trim()||"application/octet-stream",v=ai(b,C);Le(i,{relativePath:A,sourceUrl:m,kind:"asset",contentType:C,cacheControl:p.cacheControl,isText:v,object:p.object}),J(o,e,R),v&&te(o,R),De(o,e,R,p.cacheControl);for(let x of p.discoveredAssets)W(e,r,x,n,b.toString());r.stats.assetsSaved++,s.trackManifest&&(s.manifest.assets[m]={url:m,outputPath:R,isText:v,contentType:C,cacheControl:p.cacheControl,changeToken:null,tokenSource:null,discoveredAssets:[...p.discoveredAssets],lastCrawledAt:new Date().toISOString(),lastSeenRunId:s.runId,unreferencedRuns:0,rewriteComplete:!v},delete s.manifest.pages[m]),n.debug(`Remote asset fetch completed ${m}`,{url:m,finalUrl:b.toString(),relativePath:A,bytes:p.object.bytes,taskId:y.taskId,attempts:y.attempts,execution:"lambda"});}finally{r.doneAssets.add(m),Ce(r,n);}}}}async function ui(e,t,r,n){for(let s of [...t.changedFiles].sort()){if(r.objects[s])continue;let o=w.join(e.outputDir,s),i=await M.readFile(o).catch(d=>{throw new Error(`Coordinator-owned output is missing before S3 staging: ${s}`,{cause:d})}),c=ie(o),a=String(Hr.lookup(s)||"")||(c?"text/plain; charset=utf-8":"application/octet-stream"),l=await n.writeWorkspaceObject({key:`${r.workspace.prefix}jobs/${r.jobId}/coordinator/${oe(s,40)}-${w.basename(s)}`,body:i,contentType:a,cacheControl:ln(s)?e.s3.htmlCacheControl:e.s3.assetCacheControl});Le(r,{relativePath:s,sourceUrl:null,kind:"generated",contentType:a,cacheControl:ln(s)?e.s3.htmlCacheControl:e.s3.assetCacheControl,isText:c,object:l});}}function li(e){let t=Math.ceil(e/1e3);return `${t} second${t===1?"":"s"}`}function ye(e){return Math.max(6e4,e.navigationTimeoutMs*2,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+15e3)}function Qe(e){return Math.max(15e3,Math.min(6e4,ye(e)))}function Ln(e){return Math.max(15e3,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+1e4)}function nr(e){return e.stats.pagesCompleted}function Xt(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 Vt(e,t,r){let n=Xt(e);try{if(n.kill){await n.kill(),t.warn(`Force-killed crawl worker browser after ${r}`,{browserPid:n.pid,reason:r});return}if(n.pid!==null){process.kill(n.pid,"SIGKILL"),t.warn(`Sent SIGKILL to crawl worker browser after ${r}`,{browserPid:n.pid,reason:r});return}t.warn(`Could not resolve crawl worker browser PID after ${r}`,{reason:r});}catch(s){t.error(`Failed to force-kill crawl worker browser after ${r}`,{browserPid:n.pid,reason:r,error:String(s)});}}async function V(e,t,r){let n;try{return await Promise.race([r(),new Promise((s,o)=>{n=globalThis.setTimeout(()=>{o(new Je(e,t));},t);})])}finally{n!==void 0&&globalThis.clearTimeout(n);}}var Je=class extends Error{constructor(r,n){super(`${r} timed out after ${li(n)}.`);this.operation=r;this.timeoutMs=n;this.name="OperationTimeoutError";}operation;timeoutMs};async function di(e,t){let r=Ln(e);await t.evaluate(async n=>{await new Promise(s=>{let o=0,i=700,c=Date.now(),a=()=>{window.clearInterval(l),window.scrollTo(0,0),s();},l=window.setInterval(()=>{if(Date.now()-c>=n.maxDurationMs){a();return}window.scrollBy(0,i),o+=i;let d=document.body?.scrollHeight||0,u=document.documentElement?.scrollHeight||0,h=Math.max(d,u);o>=h+window.innerHeight&&a();},120);});},{maxDurationMs:r});}async function pi(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 di(e,t),await t.waitForTimeout(e.readiness.fallbackWaitMs);}async function mi(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 Dn(e,t){return e.noJavaScriptRenderPathPrefixes.some(r=>rr(t,r))}async function hi(e,t,r,n,s=true){let o=new Set;if(s){let c=await t.evaluate(()=>{let a=new Set,l=["href","src","poster","data-src","data-lazy-src","data-original","data-bg","data-background","data-href","data-resource-url"],d=new Set,u=["srcset","data-srcset","data-lazy-srcset"],h=f=>{f.querySelectorAll("*").forEach(g=>{for(let p of l){let m=g.getAttribute(p);m&&a.add(m);}for(let p of u){let m=g.getAttribute(p);m&&m.split(",").forEach(b=>{let k=b.trim().split(/\s+/)[0];k&&a.add(k);});}let y=g.getAttribute("style");y&&d.add(y),g.shadowRoot&&h(g.shadowRoot);});};return h(document),{attrs:[...a],styles:[...d]}});for(let a of c.attrs)for(let l of Xo(a)){let d=H(e,l,r,n,"dom-attr");d&&q(e,d)&&o.add(d.toString());}for(let a of c.styles)for(let l of We(e,r,a,n,"dom-style"))o.add(l);}let i=await t.content();for(let c of We(e,r,i,n,"page-html"))o.add(c);return [...o]}async function dn(e){return await e.evaluate(()=>{document.querySelectorAll("#wpsuite-consent-root").forEach(t=>t.remove()),document.documentElement.classList.remove("wpsuite-consent-scroll-locked"),document.body.classList.remove("wpsuite-consent-scroll-locked");}),e.content()}async function er(e,t,r,n,s){let o=le(e,t);await me(o,r,"utf8");let i=await M.stat(o);s?.debug(`Saved page output ${t}`,{phase:"save-pages",url:t,outputPath:o,bytes:i.size});let c=yt(n,o),a=Math.min(n.stats.pagesQueued,nr(n)+1);s&&c&&(n.stats.pagesSaved%10===0||n.stats.pagesSaved===1)&&s.progress(`Page progress: processed ${a}, rendered ${n.stats.pagesRendered}, saved ${n.stats.pagesSaved}, discovered ${n.stats.pagesQueued}.`,{donePages:a,claimedPages:n.donePages.size,pagesRendered:n.stats.pagesRendered,pagesSaved:n.stats.pagesSaved,pagesQueued:n.stats.pagesQueued,pageQueue:n.pageQueue.length,phase:"save-pages"});}function yt(e,t){let r=w.resolve(t);return e.savedPageOutputs.has(r)?false:(e.savedPageOutputs.add(r),e.stats.pagesSaved=e.savedPageOutputs.size,true)}async function bt(e,t,r,n,s){let o=G(e.outputDir,n);if(!o)return;if(s){let c=s.objects[o];c?.kind==="page"&&c.sourceUrl===r&&c.object?.bucket===s.workspace.bucket&&typeof c.object.key=="string"&&c.object.key.startsWith(s.workspace.prefix)&&yt(t,n);return}(await xe(n).catch(()=>null))?.isFile()&&yt(t,n);}function Fn(e){let t=nr(e);return t%5===0||t===1||t===e.stats.pagesQueued}function Wn(e,t){let r=nr(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 gi(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 n=new URL(String(r),window.location.href),s=new URL(window.location.href);return n.hash="",s.hash="",n.href===s.href}catch{return false}};try{let r=window.location.assign.bind(window.location),n=window.location.replace.bind(window.location),s=window.location.reload.bind(window.location);Object.defineProperty(window.location,"assign",{configurable:!0,value:o=>{if(t(o)){console.warn("[smartcloud-static-publisher] blocked same-page location.assign",o??"");return}return r(o)}}),Object.defineProperty(window.location,"replace",{configurable:!0,value:o=>{if(t(o)){console.warn("[smartcloud-static-publisher] blocked same-page location.replace",o??"");return}return n(o)}}),Object.defineProperty(window.location,"reload",{configurable:!0,value:()=>{console.warn("[smartcloud-static-publisher] blocked location.reload");}});}catch{}});}async function fi(e,t,r){let n=await e.newContext({viewport:t.viewport,userAgent:"WPSuiteStaticPublisher/0.8 Playwright SitemapOnly",ignoreHTTPSErrors:t.ignoreHttpsErrors,...r?{javaScriptEnabled:false}:{}});return r||await gi(n),n}async function wi(e,t,r,n,s,o,i,c,a,l){for(;t.pageQueue.length>0&&!(e.maxPages>0&&t.donePages.size>=e.maxPages);){let d=t.pageQueue.shift();if(!d)break;t.queuedPages.delete(d);try{let u=re(d,r,"page","page-queue");if(!u)continue;let h=u.toString();if(d=h,t.queuedPages.delete(d),t.donePages.has(d))continue;t.donePages.add(d),o.enabled&&o.seenPages.add(d);let f=St(e,d),g=Dn(e,u.pathname);if(!Se(u)||q(e,u)||Ee(u)){if(q(e,u)){r.info(`Remote worker redirected non-page URL to asset queue: ${d}`,{url:d,source:"remote-worker-guard"}),W(e,t,d,r,"remote-worker-guard");continue}r.reject("page",d,"guard rejected non-page URL before remote rendering","remote-worker");continue}let y=o.strictTargeted?o.manifest.pages[d]:void 0;if(y?.lastSeenRunId===o.runId&&await xe(y.outputPath)){o.seenPages.add(d);for(let v of y.discoveredAssets||[])W(e,t,v,r,d);J(i,e,y.outputPath),te(i,y.outputPath),await bt(e,t,d,y.outputPath,l),r.info(`Resumed completed content-sync page ${d}`,{url:d,source:"content-sync-checkpoint"});continue}let p=await vn(e,s,t,o,d,r);if(o.enabled&&n!=="single-url"&&n!=="content-sync"){let v=o.manifest.pages[d];if(p.action==="reuse"&&v){for(let x of v.discoveredAssets)W(e,t,x,r,d);for(let x of v.discoveredPages)Oe(e,t,x,r,d);v.lastSeenRunId=o.runId,v.sitemapLastmod=Ie(t.sitemapLastmodByPage[d])??v.sitemapLastmod,p.changeToken?.supported&&(v.changeToken=p.changeToken.token,v.tokenSource=p.changeToken.tokenSource??v.tokenSource),await bt(e,t,d,v.outputPath,l),r.info(`Incremental reuse skipped unchanged page ${d}`,{url:d,mode:"incremental",reason:p.changeToken?.supported===!0?"change-token-match":"sitemap-lastmod-match"});continue}}r.page(`Rendering remotely ${d}`,{url:d,execution:"lambda"});let m=await a.render({sourceOrigin:e.sourceOrigin,url:d,options:{ignoreHttpsErrors:e.ignoreHttpsErrors,javaScriptEnabled:!g,viewport:e.viewport,navigationTimeoutMs:e.navigationTimeoutMs,autoScrollTimeoutMs:Ln(e),readiness:e.readiness},downloadHtml:!l}),b=m.page,k=b.finalUrl?re(b.finalUrl,r,"remote-final-response",d)?.toString():void 0;if(n==="content-sync"&&k&&k!==h){if(o.deleteOnMissingUrls.has(d)){await Ge(e,o,i,d,o.deleteOnMissingUrls),r.info(`Removed stale content-sync archive route redirected to ${k}`,{url:d,finalResponseUrl:k,source:"content-sync-tombstone"});continue}throw new Error(`Required content-sync route redirected outside its planned URL: ${d} -> ${k}`)}let R=b.httpStatus;if(f){if(R!==404){r.error(`Generated 404 request path returned unexpected status for ${d}`,{url:d,expectedStatus:404,status:R,requestPath:e.generated404RequestPath,execution:"lambda"});continue}}else if(R!==null&&R>=400){if(n==="content-sync"&&(R===404||R===410)&&o.deleteOnMissingUrls.has(d)){await Ge(e,o,i,d,o.deleteOnMissingUrls),r.info(`Removed stale content-sync archive page ${d}`,{url:d,status:R,source:"content-sync-tombstone"});continue}if(n==="content-sync")throw new Error(`Required content-sync route returned HTTP ${R}: ${d}`);r.skip("page",d,R,t.pageDiscoverySources.get(d));continue}t.stats.pagesRendered++;let O=new Set;if(!l){if(m.html===null)throw new Error("Remote render did not return HTML for local output mode.");for(let v of We(e,h,m.html,r,"remote-page-html"))O.add(v);}for(let v of [...b.discoveredAssets,...b.networkUrls]){let x=H(e,v,h,r,"remote-render");x&&q(e,x)&&O.add(x.toString());}for(let v of O)W(e,t,v,r,d);let A=n!=="single-url"&&n!=="content-sync"&&!f?[...new Set([...!l&&m.html!==null?Un(e,d,m.html,r):[],...b.discoveredPages])]:[];for(let v of A)Oe(e,t,v,r,d);for(let v of b.cookies){let x=v.sameSite==="Strict"||v.sameSite==="Lax"||v.sameSite==="None"?v.sameSite:"Unspecified",T=!Number.isFinite(v.expires)||v.expires<=0;c.add({name:v.name,domain:v.domain,path:v.path||"/",expires:T?null:v.expires,session:T,secure:v.secure,httpOnly:v.httpOnly,sameSite:x,partitioned:v.partitioned===!0});}let C=le(e,d);if(l){if(!b.html)throw new Error("Remote render completed without a workspace HTML object.");Le(l,{relativePath:wt(e,C),sourceUrl:d,kind:"page",contentType:b.contentType?.trim()||"text/html; charset=utf-8",cacheControl:e.s3.htmlCacheControl,isText:!0,object:b.html}),yt(t,C);}else {if(m.html===null)throw new Error("Remote render did not return HTML for local output mode.");await er(e,d,m.html,t,r);}J(i,e,C),te(i,C),o.trackManifest&&(o.manifest.pages[d]={url:d,outputPath:C,contentType:b.contentType?.trim()||null,changeToken:p.changeToken?.supported?p.changeToken.token:null,tokenSource:p.changeToken?.supported?p.changeToken.tokenSource??null:null,sitemapLastmod:Ie(t.sitemapLastmodByPage[d])??null,discoveredPages:A,discoveredAssets:[...O],lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,rewriteComplete:!1},(o.enabled||o.strictTargeted)&&await be(e,o)),r.debug(`Remote render completed ${d}`,{url:d,taskId:m.taskId,attempts:m.attempts,execution:"lambda"});}catch(u){if(r.error(`Failed remote page ${d}`,{url:d,error:String(u),execution:"lambda"}),o.strictTargeted)throw u}finally{t.stats.pagesCompleted++,Fn(t)&&Wn(t,r);}}}async function yi(e,t,r,n,s,o,i,c){let a=await chromium.launch({headless:true}),l=Xt(a);l.pid!==null&&r.debug(`Launched crawl worker browser PID ${l.pid}`,{browserPid:l.pid});try{for(;t.pageQueue.length>0;){a||(a=await chromium.launch({headless:!0}),l=Xt(a),l.pid!==null&&r.debug(`Relaunched crawl worker browser PID ${l.pid}`,{browserPid:l.pid}));let d=a;if(e.maxPages>0&&t.donePages.size>=e.maxPages)break;let u=t.pageQueue.shift();if(!u)break;t.queuedPages.delete(u);let h=null,f=null,g=!1,y=[],p=new Set;try{let m=re(u,r,"page","page-queue");if(!m)continue;let b=m.toString();if(u=b,t.queuedPages.delete(u),t.donePages.has(u))continue;t.donePages.add(u),o.enabled&&o.seenPages.add(u);let k=St(e,u),R=Dn(e,m.pathname);if(!Se(m)||q(e,m)||Ee(m)){if(q(e,m)){r.info(`Worker redirected non-page URL to asset queue: ${u}`,{url:u,source:"worker-guard"}),W(e,t,u,r,"worker-guard");continue}r.reject("page",u,"guard rejected non-page URL before rendering","worker");continue}let O=o.strictTargeted?o.manifest.pages[u]:void 0;if(O?.lastSeenRunId===o.runId&&await xe(O.outputPath)){o.seenPages.add(u);for(let I of O.discoveredAssets||[])W(e,t,I,r,u);J(i,e,O.outputPath),te(i,O.outputPath),await bt(e,t,u,O.outputPath),r.info(`Resumed completed content-sync page ${u}`,{url:u,source:"content-sync-checkpoint"});continue}let A=await vn(e,s,t,o,u,r);if(o.enabled&&n!=="single-url"&&n!=="content-sync"){let I=o.manifest.pages[u];if(A.action==="reuse"&&I){for(let F of I.discoveredAssets)W(e,t,F,r,u);for(let F of I.discoveredPages)Oe(e,t,F,r,u);I.lastSeenRunId=o.runId,I.sitemapLastmod=Ie(t.sitemapLastmodByPage[u])??I.sitemapLastmod,A.changeToken?.supported&&(I.changeToken=A.changeToken.token,I.tokenSource=A.changeToken.tokenSource??I.tokenSource),await bt(e,t,u,I.outputPath),r.info(`Incremental reuse skipped unchanged page ${u}`,{url:u,mode:"incremental",reason:A.changeToken?.supported===!0?"change-token-match":"sitemap-lastmod-match"});continue}}h=await V(`create page context ${u}`,ye(e),()=>fi(d,e,R)),f=await V(`create page ${u}`,ye(e),()=>h.newPage()),y=await h.cookies();let C=!1,v=new Set;await f.route("**/*",async I=>{let F=I.request();try{let U=H(e,F.url(),e.sourceOrigin,r,"network-request");U&&q(e,U)&&(v.add(U.toString()),W(e,t,U.toString(),r,u));}catch{}if(F.isNavigationRequest()&&F.frame()===f.mainFrame())try{let U=new URL(F.url()),ne=new URL(b);if(U.hash="",ne.hash="",U.href===ne.href){if(C){r.warn(`Blocked same-page navigation/reload for ${u}`,{url:u,requestUrl:F.url()});try{await I.abort("aborted");}catch(de){r.debug(`Ignored canceled route while blocking reload for ${u}`,{url:u,error:String(de)});}return}C=!0;}}catch{}try{await I.continue();}catch(U){r.debug(`Ignored canceled network route for ${u}`,{url:u,requestUrl:F.url(),error:String(U)});}}),f.on("response",I=>{try{let U=H(e,I.url(),e.sourceOrigin,r,"network-response");U&&q(e,U)&&(v.add(U.toString()),W(e,t,U.toString(),r,u));}catch{}let F=I.headerValues("set-cookie").then(U=>{for(let ne of U)c.add(Fr(ne,I.url()));}).catch(()=>{}).then(()=>{});p.add(F),F.finally(()=>p.delete(F));}),r.page(`Rendering ${u}`,{url:u});let x=null,T=null;try{if(x=await f.goto(u,{waitUntil:"domcontentloaded",timeout:e.navigationTimeoutMs}),x&&x.ok())try{T=await V(`read response body ${u}`,ye(e),()=>x.text());}catch{T=null;}}catch(I){r.warn(`Navigation issue for ${u}; saving current DOM if available`,{url:u,error:String(I)});}if(n==="content-sync"&&x){let I=re(x.url(),r,"content-sync-final-response",u)?.toString();if(I&&I!==b){if(o.deleteOnMissingUrls.has(u)){await Ge(e,o,i,u,o.deleteOnMissingUrls),r.info(`Removed stale content-sync archive route redirected to ${I}`,{url:u,finalResponseUrl:I,source:"content-sync-tombstone"});continue}throw new Error(`Required content-sync route redirected outside its planned URL: ${u} -> ${I}`)}}if(k){let I=x?.status()??null;if(I!==404){r.error(`Generated 404 request path returned unexpected status for ${u}`,{url:u,expectedStatus:404,status:I,requestPath:e.generated404RequestPath});continue}r.info(`Capturing rendered 404 page for ${u}`,{url:u,status:I,outputPath:le(e,u)});}else if(x&&!x.ok()){if(n==="content-sync"&&(x.status()===404||x.status()===410)&&o.deleteOnMissingUrls.has(u)){await Ge(e,o,i,u,o.deleteOnMissingUrls),r.info(`Removed stale content-sync archive page ${u}`,{url:u,status:x.status(),source:"content-sync-tombstone"}),await f.close();continue}if(n==="content-sync")throw new Error(`Required content-sync route returned HTTP ${x.status()}: ${u}`);r.skip("page",u,x.status(),t.pageDiscoverySources.get(u)),await f.close();continue}R?(r.info(`Rendering without JS execution for ${u}`,{url:u,mode:"no-js"}),await V(`wait for rendered page ${u}`,ye(e),()=>mi(e,f))):await V(`wait for rendered page ${u}`,ye(e),()=>pi(e,f)),t.stats.pagesRendered++;let Q=await V(`extract rendered assets ${u}`,ye(e),()=>hi(e,f,b,r,!R));for(let I of Q)W(e,t,I,r,u);let D=[...new Set([...Q,...v])],P=T??await V(`capture rendered html ${u}`,ye(e),()=>dn(f)),j=n!=="single-url"&&n!=="content-sync"&&!k?Un(e,u,P,r):[];if(n!=="single-url"&&n!=="content-sync"&&!k)for(let I of j)Oe(e,t,I,r,u);await er(e,u,P,t,r);let Y=le(e,u);if(J(i,e,Y),te(i,Y),o.trackManifest){let I=x?.headers();o.manifest.pages[u]={url:u,outputPath:Y,contentType:Ht(I),changeToken:A.changeToken?.supported?A.changeToken.token:null,tokenSource:A.changeToken?.supported?A.changeToken.tokenSource??null:null,sitemapLastmod:Ie(t.sitemapLastmodByPage[u])??null,discoveredPages:j,discoveredAssets:D,lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,rewriteComplete:!1},(o.enabled||o.strictTargeted)&&await be(e,o);}}catch(m){if(g=m instanceof Je,o.strictTargeted)throw r.error(`Failed required content-sync page ${u}`,{url:u,error:String(m)}),m;if(g)r.warn(`Skipped partial DOM for timed-out page ${u}`,{url:u,error:String(m),recovery:"recycle-worker-browser"});else try{let b=f?await V(`capture partial html ${u}`,ye(e),()=>dn(f)):"";if(b&&b.trim()){await er(e,u,b,t,r);let k=le(e,u);if(J(i,e,k),te(i,k),o.trackManifest){let R=o.manifest.pages[u]??o.previousManifest.pages[u];o.manifest.pages[u]={url:u,outputPath:k,contentType:R?.contentType??null,changeToken:null,tokenSource:null,sitemapLastmod:Ie(t.sitemapLastmodByPage[u])??R?.sitemapLastmod??null,discoveredPages:R?.discoveredPages?[...R.discoveredPages]:[],discoveredAssets:R?.discoveredAssets?[...R.discoveredAssets]:[],lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,rewriteComplete:!1},(o.enabled||o.strictTargeted)&&await be(e,o);}r.warn(`Saved partial DOM for ${u}`,{url:u,error:String(m)});}}catch(b){b instanceof Je&&(g=!0),r.error(`Could not save partial DOM for ${u}`,{url:u,error:String(b)});}r.error(`Failed page ${u}`,{url:u,error:String(m)});}finally{if(!g&&f&&await V(`drain network routes ${u}`,Qe(e),()=>f.unrouteAll({behavior:"wait"})).catch(m=>{g=!0,r.warn(`Could not drain network routes for ${u}`,{url:u,browserPid:l.pid,error:String(m),recovery:"recycle-worker-browser"});}),g&&(a=null,await Vt(d,r,`page operation timeout for ${u}`),await d.close().catch(()=>{})),p.size>0&&await Promise.allSettled([...p]),!g&&h)try{let m=await h.cookies();c.addAll(Wr(y,m));}catch{}t.stats.pagesCompleted++,Fn(t)&&Wn(t,r),!g&&f&&await V(`close page ${u}`,Qe(e),()=>f.close()).catch(m=>{g=!0,r.warn(`Timed out while closing page ${u}`,{url:u,browserPid:l.pid,error:String(m),recovery:"recycle-worker-browser"});}),!g&&h&&await V(`close page context ${u}`,Qe(e),()=>h.close()).catch(m=>{g=!0,r.warn(`Timed out while closing page context for ${u}`,{url:u,browserPid:l.pid,error:String(m),recovery:"recycle-worker-browser"});}),g&&a===d&&(a=null,await Vt(d,r,`page cleanup timeout for ${u}`),await d.close().catch(()=>{}));}}}finally{if(a){let d=a;await V("close worker browser",Qe(e),()=>d.close()).catch(u=>(r.warn("Timed out while closing crawl worker browser",{browserPid:l.pid,error:String(u)}),Vt(d,r,"browser.close timeout")));}}}async function bi(e){try{let t=await M.readFile(e),n=(e.endsWith(".gz")?gunzipSync(t):t).toString("utf8").trim();if(!n)return [];try{let s=JSON.parse(n);if(Array.isArray(s))return s;if(s&&typeof s=="object")return [s]}catch{return n.split(/\r?\n/).map(s=>s.trim()).filter(Boolean).map(s=>{try{let o=JSON.parse(s);return o&&typeof o=="object"?o:null}catch{return null}}).filter(s=>s!==null)}return []}catch{return []}}function pn(e){let t=String(e||"").toLowerCase();return t.includes("timeout")||t.includes("timed out")||t.includes("navigation timeout")}function Si(e){let t=String(e?.job?.command||"").trim(),r=String(e?.job?.crawlMode||"full").trim();return t!=="publish"&&t!=="crawl"?false:r!=="incremental"}function Pi(e){let t=[e?.archivedAt,e?.job?.endedAt,e?.job?.startedAt];for(let r of t){let n=Date.parse(String(r||""));if(Number.isFinite(n))return n}return 0}async function qn(e){try{let t=await M.readFile(e,"utf8"),r=JSON.parse(t);return r&&typeof r=="object"&&!Array.isArray(r)?r:null}catch{return null}}function mn(e){let t=String(e.originalFileName||"").toLowerCase();return t.endsWith("errors.jsonl")?0:t.endsWith("errors.json")?1:2}function Ri(e,t){let r=Array.isArray(t?.artifacts)?t.artifacts.filter(n=>String(n?.role||"").trim()==="errors"&&String(n?.storedFileName||"").trim()!=="").sort((n,s)=>mn(n)-mn(s)).map(n=>w.join(e,String(n.storedFileName))):[];return [...new Set([...r,w.join(e,"errors.jsonl"),w.join(e,"errors.json"),w.join(e,"errors.jsonl.gz"),w.join(e,"errors.json.gz")])]}async function hn(e){let t=await qn(w.join(e,"job.json"));for(let r of Ri(e,t)){let n=await bi(r);if(n.length>0)return n}return []}async function vi(e){let t=w.join(e.logDir,"archive"),r;try{r=await M.readdir(t);}catch{return ""}let n="",s=0;for(let o of r){let i=w.join(t,o);if(!(await M.stat(i).catch(()=>null))?.isDirectory())continue;let a=await qn(w.join(i,"job.json"));if(!Si(a))continue;let l=Pi(a);l>=s&&(s=l,n=i);}return n}async function ki(e){let t=await vi(e),r=t!==""?await hn(t):await hn(e.logDir),n=new Set;for(let s of r)if(pn(s.error)||pn(s.message)){let o=s.url;typeof o=="string"&&o&&n.add(o);}return [...n]}async function Ci(e){let t=[];for(let r of e)if(r.startsWith("@")){let n=r.slice(1),s=await M.readFile(n,"utf8");t.push(...s.split(/\r?\n/).map(o=>o.trim()).filter(o=>o&&!o.startsWith("#")));}else t.push(r);return t}async function xi(e){if(!e)throw new Error("Content-sync crawl requires an immutable impact plan.");let t=JSON.parse(await M.readFile(e,"utf8"));return pr(t),t}function Ai(e,t){let r;try{r=new URL(e);}catch{return false}return t.archiveFamilies.some(n=>{let s=new URL(n.url);if(r.origin!==s.origin)return false;if(r.toString()===s.toString())return true;if(r.searchParams.has("paged")&&r.pathname===s.pathname)return /^\d+$/.test(r.searchParams.get("paged")||"");let o=s.pathname.replace(/\/+$/,""),i=r.pathname.slice(o.length).replace(/^\/+/,""),c=String(n.paginationBase||"page").replace(/^\/+|\/+$/g,"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return r.pathname.startsWith(`${o}/`)&&new RegExp(`^${c}/\\d+/?$`).test(i)})}function ze(e,t,r){let n=r==="page"?le(e,t):Ye(e,t).originalFilePath;return G(e.outputDir,n)}async function Ge(e,t,r,n,s){let o=t.manifest.pages[n];if(!o)return;let i=G(e.outputDir,o.outputPath);if(!i)throw new Error(`Manifest-owned page path escaped output root: ${n}`);let c=w.resolve(o.outputPath);Object.entries(t.manifest.pages).some(([l,d])=>l!==n&&!s.has(l)&&w.resolve(d.outputPath)===c)||(await M.rm(o.outputPath,{force:true}),r.deletedFiles.add(i),r.revalidateFiles.delete(i)),delete t.manifest.pages[n];}async function Ti(e,t,r,n,s){let o=t.manifest.assets[n];if(!o)return;let i=G(e.outputDir,o.outputPath);if(!i)throw new Error(`Manifest-owned resource path escaped output root: ${n}`);let c=w.resolve(o.outputPath);Object.entries(t.manifest.assets).some(([l,d])=>l!==n&&!s.has(l)&&w.resolve(d.outputPath)===c)||(await M.rm(o.outputPath,{force:true}),r.deletedFiles.add(i)),delete t.manifest.assets[n];}function Ii(e,t){let r=new Set,n=[...t];for(;n.length>0;){let s=n.shift();if(r.has(s))continue;r.add(s);let o=e.assets[s];for(let i of o?.discoveredAssets??[])try{qe(new URL(i))&&n.push(i);}catch{}}return r}async function Ei(e,t,r,n,s){let o=Ii(r.previousManifest,s);for(let i of o){if(t.successfulSitemaps.has(i))continue;let c=r.previousManifest.assets[i];if(!c)continue;let a=G(e.outputDir,c.outputPath);if(!a)throw new Error(`Manifest-owned sitemap path escaped output root: ${i}`);await M.rm(c.outputPath,{force:true}),n.deletedFiles.add(a),delete r.manifest.assets[i];}await be(e,r);}async function Oi(e){try{let t=await M.readFile(w.join(e.outputDir,"asset-map.json"),"utf8");return JSON.parse(t)}catch{return {}}}async function Mi(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 M.mkdir(e,{recursive:true}),await Promise.all(t.map(async r=>{try{await M.unlink(w.join(e,r));}catch(n){if(n.code!=="ENOENT")throw n}}));}function gn(e,t,r,n,s){let o=H(e,r,e.sourceOrigin,n,"manual-url");o&&(qe(o)?ft(e,t,o.toString(),n,s):q(e,o)?W(e,t,o.toString(),n,s):Se(o)?Oe(e,t,o.toString(),n,s):n.reject("manual-url",o.toString(),"not page/sitemap/asset-like",s));}async function Nn(e=process.argv.slice(2)){let t=[],r=await tt(void 0,{onRemotePublisherConfigDiagnostic:S=>{t.push(S);}}),n=mr(r.sitemapPaths),s=t.at(-1)??null,o=ho(e),i=o.mode==="content-sync"?await xi(o.contentSyncPlanPath):null;if(o.resumeRewrite&&o.mode!=="full")throw new Error("--resume-rewrite is only supported for full crawl/publish jobs.");let c=[];o.mode==="retry-timeouts"&&(c=await ki(r)),o.mode==="single-url"&&(c=await Ci(o.urls)),i&&(c=[...i.directRenderUrls,...i.archiveFamilyUrls,...i.resourceRenderUrls]);let a=o.crawlMode==="incremental"&&o.mode==="full",l=a&&typeof r.subscriptionType=="string"&&r.subscriptionType.trim()!=="";if(i&&r.subscriptionType!=="PROFESSIONAL"&&r.subscriptionType!=="AGENCY")throw new Error("Content-sync requires an active Professional or Agency subscription.");let d=(o.mode==="full"||o.mode==="single-url"||o.mode==="content-sync")&&!o.resumeRewrite,u=o.mode!=="full"||o.resumeRewrite||l,h=u?await Oi(r):{},f=l||o.mode==="single-url"||o.mode==="content-sync"?await Ro(r):Sn(),g=new Set(c),y=new Set;if(i){for(let S of i.archiveFamilies)if(S.foundPosts===0)for(let $ of S.pageUrls)y.add($);for(let S of Object.keys(f.pages))Ai(S,i)&&!g.has(S)&&(c.push(S),y.add(S));}let p={enabled:l,trackManifest:d,manifest:Kt(f),previousManifest:Kt(f),runId:i?.jobId??`${Date.now()}`,seenPages:new Set,changeTokenCache:new Map,pageChangeTokenPrimePromise:null,manifestSaveChain:Promise.resolve(),manifestPendingChanges:0,lastManifestSavedAt:Date.now(),strictTargeted:!!i,requiredUrls:g,deleteOnMissingUrls:y};await Mi(r.logDir);let m=new je(r.logDir,r.logLevel),b=o.remoteRender??r.remoteWorkers?.render?.enabled===true,k=Zr({explicitPath:o.remoteWorkerConfigPath,runtimeDir:Ze()}),R=null,O=null,A=null,C=null,v=Math.max(1,r.concurrency),x=1,T=r.remoteWorkers?.rewrite?.enabled===true,Q=r.remoteWorkers?.deploy?.enabled===true,D=b&&T&&Q&&!o.resumeRewrite;if(!D&&o.mode==="full"&&!o.resumeRewrite&&await M.rm(dt(r),{force:true}),b&&!o.resumeRewrite||T){if(!k)throw new Error("Remote Lambda workers are enabled, but the runtime directory is unknown. Run through queue-runner with --runtime-dir, set STATIC_PUBLISHER_RUNTIME_DIR, or use --remote-worker-config for a diagnostic run.");let S=await Vr(k),$=false;if(A=new ct(S,{},{onProgress:E=>{m.progress(`Lambda ${E.operation} batch: ${E.completedItems+E.failedItems}/${E.totalItems}`,{remoteWorkerOperation:E.operation,remoteWorkerTaskId:E.taskId,remoteWorkerStatus:E.status,remoteWorkerCompletedItems:E.completedItems,remoteWorkerFailedItems:E.failedItems,remoteWorkerTotalItems:E.totalItems,remoteWorkerUpdatedAt:E.updatedAt});},onProgressError:E=>{$||($=true,m.warn("Lambda progress status could not be read; task execution continues.",{error:E.message}));}}),D){if(!S.functions.asset)throw new Error("Full Lambda delegation requires an asset worker. Redeploy the Lambda worker stack and reinstall remote-workers.json.");let E=u?await nn(r):null;C=en(`crawl-${oe(p.runId,40)}`,S,E),O=new lt({client:A,jobId:C.jobId,maxAttempts:2}),m.info("S3-native Lambda data plane is enabled.",{execution:"lambda",assetWorker:S.functions.asset,workspaceBucket:S.workspace.bucket,workspacePrefix:S.workspace.prefix});}}if(b&&!o.resumeRewrite){if(!A)throw new Error("Remote render worker client was not initialized.");v=Math.max(1,Math.min(100,D?r.concurrency:r.remoteWorkers?.render?.concurrency??r.concurrency)),x=Math.max(1,Math.min(20,r.remoteWorkers?.render?.batchSize??5)),R=new ut({client:A,jobId:`crawl-${oe(p.runId,40)}`,maxAttempts:r.remoteWorkers?.render?.maxAttempts??2,batchSize:x,maxConcurrentBatches:v,onRetry:S=>{m.warn(`Retrying remote render for ${S.url}`,{url:S.url,attempt:S.attempt,maxAttempts:S.maxAttempts,reason:S.reason,execution:"lambda"});}}),m.info("Lambda page rendering is enabled.",{remoteWorkerConfigPath:w.resolve(k),concurrency:v,maxAttempts:r.remoteWorkers?.render?.maxAttempts??2,batchSize:x,execution:"lambda"});}if(s){let S={status:s.status,virtualAssetBaseUrl:s.virtualAssetBaseUrl,subscriptionType:s.subscriptionType??null,error:s.error,requests:s.requests,source:"remote-publisher-config"};s.status==="loaded"&&s.subscriptionType?m.info("Loaded remote WP Suite publisher configuration.",S):m.warn("Remote WP Suite publisher configuration is unavailable or has no active subscription type.",S);}if(a&&!l){let S="Incremental crawl requires an active remote publisher subscription; refusing to fall back to a destructive full crawl.";throw m.error(S,{requestedMode:o.crawlMode,subscriptionType:r.subscriptionType??null,source:"incremental-subscription-guard"}),await m.flush(),new Error(S)}let P={pageQueue:[],queuedPages:new Set,donePages:new Set,savedPageOutputs:new Set,pageDiscoverySources:new Map,assetQueue:[],queuedAssets:new Set,doneAssets:new Set,sitemapQueue:[],queuedSitemaps:new Set,doneSitemaps:new Set,successfulSitemaps:new Set,resolvedSitemapRoots:new Set,sitemapIndexUrls:new Set,sitemapLeafUrls:new Set,sitemapLastmodByPage:{},assetMap:{...h},assetVariantDigestsByOriginalPath:new Map,stats:{pagesQueued:0,pagesRendered:0,pagesCompleted:0,assetsQueued:0,sitemapsQueued:0,assetsSaved:0,pagesSaved:0}},j=Po(),Y=new it,I=go();if(I&&!o.resumeRewrite&&await at(I,Y.artifact()),await ur(r),await lr(r,{startedAt:new Date().toISOString(),outputDir:w.resolve(r.outputDir)}),u||await M.rm(r.outputDir,{recursive:true,force:true}),await M.mkdir(r.outputDir,{recursive:true}),i){let S=new Set([...i.deleteUrls,...p.deleteOnMissingUrls]);for(let E of i.deleteUrls)await Ge(r,p,j,E,S);let $=new Set(i.resourceDeleteUrls);for(let E of i.resourceDeleteUrls)await Ti(r,p,j,E,$);}if(o.resumeRewrite)m.info("Resuming final rewrite from existing output.",{phase:"rewrite-text",mode:o.mode,crawlMode:o.crawlMode});else {let S=await request.newContext({ignoreHTTPSErrors:r.ignoreHttpsErrors});try{if(m.mark("discovery"),o.mode==="full"?(n.forEach(E=>ft(r,P,E,m)),await un(r,S,P,m,j,p),r.seedPaths.forEach(E=>gn(r,P,E,m,"seed-path")),r.generated404RequestPath&&Oe(r,P,r.generated404RequestPath,m,"generated-404-request-path")):(c.forEach(E=>gn(r,P,E,m,"cli")),i?.sitemapUrls.forEach(E=>ft(r,P,E,m,"content-sync-impact")),await un(r,S,P,m,j,p,o.mode==="content-sync",i?.sitemapUrls??[]),i&&await Ei(r,P,p,j,i.sitemapUrls)),m.endMark("discovery",{pages:P.pageQueue.length,assets:P.assetQueue.length,sitemaps:P.sitemapQueue.length}),m.summary(`Queued ${P.pageQueue.length} pages, ${P.assetQueue.length} assets, ${P.sitemapQueue.length} sitemaps.`,{mode:o.mode,crawlMode:o.crawlMode,queuedPages:P.pageQueue.length,queuedAssets:P.assetQueue.length,queuedSitemaps:P.sitemapQueue.length}),o.mode==="retry-timeouts"&&P.pageQueue.length===0&&P.assetQueue.length===0&&P.sitemapQueue.length===0){m.summary("No timed-out URLs were queued. Skipping retry crawl.",{mode:o.mode,crawlMode:o.crawlMode,queuedPages:0,queuedAssets:0,queuedSitemaps:0}),await m.flush(),I&&await at(I,Y.artifact());return}m.mark("render-pages");let $=Array.from({length:R?v*x:v},()=>R?wi(r,P,m,o.mode,S,p,j,Y,R,C??void 0):yi(r,P,m,o.mode,S,p,j,Y));if(await Promise.all($),I&&await at(I,Y.artifact()),m.endMark("render-pages",{pages:P.stats.pagesCompleted}),m.mark("download-assets"),m.progress("Asset download phase started.",{phase:"download-assets",doneAssets:P.doneAssets.size,assetsQueued:P.stats.assetsQueued,assetQueue:P.assetQueue.length}),C&&O?await ci(r,S,P,m,p,j,C,O,r.concurrency):(await tr(r,S,p,[...P.assetQueue],m),await ii(r,S,P,m,p,j)),m.endMark("download-assets",{assets:P.doneAssets.size}),p.enabled&&r.maxPages===0&&(await Io(r,P,p,m,j),o.mode==="full"&&await Eo(r,p,m,j)),o.mode==="full"){let E=await si(r,P,m);for(let N of E)if(J(j,r,N),C&&A){let K=wt(r,N),Ae=await M.readFile(N),Te=ie(N),Me=String(Hr.lookup(K)||"")||(Te?"text/plain; charset=utf-8":"application/octet-stream"),et=await A.writeWorkspaceObject({key:`${C.workspace.prefix}jobs/${C.jobId}/copied/${oe(K,40)}-${w.basename(K)}`,body:Ae,contentType:Me});Le(C,{relativePath:K,sourceUrl:null,kind:"generated",contentType:et.contentType,cacheControl:null,isText:Te,object:et}),Te&&te(j,N);}}}finally{await V("dispose crawl request context",Qe(r),()=>S.dispose()).catch($=>{m.warn("Timed out while disposing crawl request context",{error:String($)});});}}if(p.trackManifest&&await be(r,p,true),C)for(let S of j.deletedFiles)tn(C,S);let F=JSON.stringify(P.assetMap,null,2);if(await M.writeFile(w.join(r.outputDir,"asset-map.json"),F,"utf8"),C&&A){let S=await A.writeWorkspaceObject({key:`${C.workspace.prefix}jobs/${C.jobId}/generated/asset-map.json`,body:F,contentType:"application/json; charset=utf-8"});Le(C,{relativePath:"asset-map.json",sourceUrl:null,kind:"generated",contentType:"application/json; charset=utf-8",cacheControl:r.s3.assetCacheControl,isText:true,object:S});}JSON.stringify(h,null,2)!==JSON.stringify(P.assetMap,null,2)&&J(j,r,w.join(r.outputDir,"asset-map.json")),C&&A&&await ui(r,j,C,A);let U=o.mode==="single-url"||o.mode==="content-sync"?Fo(r,P):p.enabled&&!o.resumeRewrite?Oo(r,p,j,h,P.assetMap):void 0;m.mark("rewrite-text");let ne=o.mode==="single-url"||o.mode==="content-sync"?`Rewriting text files touched by URL crawl: 0/${U?.length??0}`:"Rewriting text files...";m.progress(ne,{phase:"rewrite-text",index:0,totalFiles:U?.length,changedTextFiles:0}),await Bt(ne);let de=Date.now(),Pe={files:U,previousAssetMap:h,onStart:({totalFiles:S,workerCount:$})=>{m.info(`Rewrite phase scanning ${S} text files.`,{phase:"rewrite-text",totalFiles:S,workerCount:$});},onProgress:async({index:S,totalFiles:$,changedTextFiles:E,file:N,changed:K})=>{K&&J(j,r,w.join(r.outputDir,N)),m.checkpoint(`Rewriting text file ${S}/${$}`,{phase:"rewrite-text",index:S,totalFiles:$,changedTextFiles:E,file:N}),m.debug(`${K?"Rewrote":"Checked unchanged"} text file ${S}/${$}: ${N}`,{phase:"rewrite-text",index:S,totalFiles:$,changedTextFiles:E,file:N,changed:K});let Ae=Date.now();if(!(S===1||S===$||S%50===0||Ae-de>=5e3))return;de=Ae;let Me=`Rewriting text files: ${S}/${$}`;m.progress(Me,{phase:"rewrite-text",index:S,totalFiles:$,changedTextFiles:E,file:N}),await Bt(Me);}},Z;if(C&&A){let S=U?.map(E=>wt(r,w.isAbsolute(E)?E:w.join(r.outputDir,E))),$=Object.values(C.objects).filter(E=>E.isText&&(!S||S.includes(E.relativePath))).length;await Pe.onStart?.({totalFiles:$,workerCount:Math.min(r.concurrency,$)}),Z=await Gr(r,C,P.assetMap,{client:A,jobId:C.jobId,concurrency:r.concurrency,batchSize:25,maxAttempts:2,...S?{relativePaths:S}:{},onProgress:Pe.onProgress}),await rn(r,C);}else T&&A?Z=await Jr(r,P.assetMap,{client:A,jobId:`crawl-${oe(p.runId,40)}`,concurrency:r.remoteWorkers?.rewrite?.concurrency??r.rewriteConcurrency,batchSize:r.remoteWorkers?.rewrite?.batchSize??25,maxAttempts:r.remoteWorkers?.rewrite?.maxAttempts??2,onStageProgress:async({index:S,totalFiles:$,file:E})=>{let N=Date.now();if(S!==1&&S!==$&&S%25!==0&&N-de<5e3)return;de=N;let K=`Staging text files for Lambda rewrite: ${S}/${$}`;m.progress(K,{phase:"rewrite-stage",index:S,totalFiles:$,file:E,execution:"lambda"}),await Bt(K);},options:Pe}):Z=await xr(r,P.assetMap,Pe);p.trackManifest&&(Mo(p,U),await be(r,p,true)),m.endMark("rewrite-text",{changedTextFiles:Z});let Ne=i?[...j.deletedFiles].sort():p.enabled&&!o.resumeRewrite?await jo(r,P,p,j,m,C):[],Xe=[...new Set((U||[]).map(S=>G(r.outputDir,w.isAbsolute(S)?S:w.join(r.outputDir,S))).filter(S=>S!==null))].sort();if(i){let S=[...j.changedFiles].sort(),$=new Set(S),E=new Set(i.directRenderUrls.map(L=>ze(r,L,"page")).filter(L=>!!L&&$.has(L))),N=new Set(i.archiveFamilyUrls.map(L=>ze(r,L,"page")).filter(L=>!!L&&$.has(L))),K=new Set(i.resourceRenderUrls.map(L=>ze(r,L,"asset")).filter(L=>!!L&&$.has(L))),Ae=new Set([...P.sitemapLeafUrls].map(L=>ze(r,L,"asset")).filter(L=>!!L&&$.has(L))),Te=new Set([...P.sitemapIndexUrls].map(L=>ze(r,L,"asset")).filter(L=>!!L&&$.has(L))),Me=new Set([...E,...N,...K,...Ae,...Te]),et=S.filter(L=>!Me.has(L)),_n=[...new Set([...i.directRenderUrls,...i.archiveFamilyUrls,...P.resolvedSitemapRoots,...P.sitemapLeafUrls,...P.sitemapIndexUrls,...i.deleteUrls,...i.resourceRenderUrls,...i.resourceDeleteUrls].map(L=>{let sr=new URL(L);return `${sr.pathname}${sr.search}`}))].sort();await Pt(r,{schemaVersion:2,generatedAt:new Date().toISOString(),outputDir:w.resolve(r.outputDir),runMode:"content-sync",crawlMode:"incremental",fullSyncRequired:false,changedFiles:S,deletedFiles:Ne,rewriteTargets:Xe,revalidateFiles:[...j.revalidateFiles].sort(),consumerId:i.consumerId,fromSequence:i.fromSequence,toSequence:i.toSequence,impactHash:i.impactHash,resolvedSitemapUrls:[...P.resolvedSitemapRoots],uploadGroups:{assets:et,content:[...E].sort(),listings:[...N].sort(),resources:[...K].sort(),sitemapLeaves:[...Ae].sort(),sitemapIndexes:[...Te].reverse()},invalidationPaths:_n});}else await Pt(r,{schemaVersion:1,generatedAt:new Date().toISOString(),outputDir:w.resolve(r.outputDir),runMode:o.mode,crawlMode:o.crawlMode,fullSyncRequired:!(p.enabled&&!o.resumeRewrite),changedFiles:p.enabled&&!o.resumeRewrite?[...j.changedFiles].sort():[],deletedFiles:p.enabled&&!o.resumeRewrite?Ne:[],rewriteTargets:p.enabled&&!o.resumeRewrite?Xe:[],revalidateFiles:[...j.revalidateFiles].sort()});await dr(r),m.summary(o.resumeRewrite?`Done. Resumed final rewrite over existing output and changed ${Z} text files.`:`Done. Rendered ${P.stats.pagesRendered} pages, processed ${P.doneSitemaps.size} sitemaps and ${P.doneAssets.size} assets.`,{mode:o.mode,crawlMode:o.crawlMode,resumeRewrite:o.resumeRewrite,...P.stats,pagesRendered:P.stats.pagesRendered,donePages:P.stats.pagesCompleted,claimedPages:P.donePages.size,doneSitemaps:P.doneSitemaps.size,doneAssets:P.doneAssets.size,changedTextFiles:Z}),await m.flush();}Nn().catch(async e=>{let t=ge(e instanceof Error?e.message:String(e));console.error(t);try{let n=(await tt().catch(()=>null))?.logDir??"logs",s=new je(n,"debug");s.error(`Unhandled error: ${t}`,e instanceof Error&&e.stack?{stack:ge(e.stack)}:void 0),await s.flush();}catch{}process.exit(1);});
|
|
17
|
+
${o}`,40);return n.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:i,tokenSource:"generated-404-response-hash",postId:null,dependencyPostIds:[],reason:null}}catch(s){return n.warn(`Generated 404 fallback token lookup failed for ${r}`,{url:r,error:String(s),requestPath:e.generated404RequestPath,source:"generated-404-change-token-fallback"}),null}}async function An(e,t,r,n,s,o){let i=vt(e,s);if(await Mo(e,t,r,n,s,o),!n.enabled)return {action:"render",changeToken:n.trackManifest?await ft(e,t,n,s,o):null};let u=n.manifest.pages[s];if(!u)return {action:"render",changeToken:await ft(e,t,n,s,o)};let a=await ft(e,t,n,s,o);if(a?.supported&&a.token)return u.changeToken===a.token?i&&!await Uo(e,t,s,o)?{action:"render",changeToken:a}:{action:"reuse",changeToken:a}:{action:"render",changeToken:a};let l=Ee(r.sitemapLastmodByPage[s]);return l&&u.sitemapLastmod&&u.sitemapLastmod===l?{action:"reuse",changeToken:a}:{action:"render",changeToken:a}}async function Uo(e,t,r,n){try{let o=(await t.get(r,{timeout:Math.min(e.navigationTimeoutMs,15e3),failOnStatusCode:!1})).status();return o===404?!0:(n.warn(`Generated 404 request path no longer returns 404 for ${r}`,{url:r,status:o,requestPath:e.generated404RequestPath,source:"generated-404-status-probe"}),!1)}catch(s){return n.warn(`Generated 404 status probe failed for ${r}`,{url:r,error:String(s),requestPath:e.generated404RequestPath,source:"generated-404-status-probe"}),false}}async function Lo(e,t,r,n,s){let o=pn(r.previousManifest,void 0,n,"previous-manifest"),i=0;for(let[m,h]of Object.entries(r.manifest.pages))if(!r.seenPages.has(m)){Yt(s,e,h.outputPath);try{await M.unlink(h.outputPath);}catch(f){(f.code||"")!=="ENOENT"&&n.warn(`Failed to remove stale incremental page output for ${m}`,{url:m,outputPath:h.outputPath,error:String(f)});}delete r.manifest.pages[m],i++;}let u=pn(r.manifest,r.runId,n,"active-manifest"),a=new Set,l=new Set;for(let m of u){for(let b of Je(e,m))a.add(b);let h=r.manifest.assets[m]?.outputPath;h&&l.add(h);let f=We(e,t.assetMap,m);f&&l.add(f);}for(let m of Object.keys(r.manifest.assets)){if(u.has(m)){r.manifest.assets[m].unreferencedRuns=0;continue}let h=r.manifest.assets[m];if(qr(h.unreferencedRuns)){h.unreferencedRuns+=1,n.warn(`Deferred deletion of newly unreferenced incremental asset ${m}.`,{url:m,unreferencedRuns:h.unreferencedRuns,phase:"incremental-cleanup",source:"asset-deletion-grace"});continue}delete r.manifest.assets[m];}let d=0,c=0;for(let m of o){if(r.manifest.assets[m])continue;let h=new Set,f=r.previousManifest.assets[m]?.outputPath;f&&h.add(f);let b=We(e,t.assetMap,m);if(!u.has(m)&&b)h.add(b);else if(!u.has(m)){let p=Xo(e,m,n,"incremental-cleanup");p&&(h.add(p.originalFilePath),p.hashedFilePath&&h.add(p.hashedFilePath));}for(let p of h)if(!l.has(p)){Yt(s,e,p);try{await M.unlink(p),d++;}catch(g){(g.code||"")!=="ENOENT"&&n.warn(`Failed to remove stale incremental asset output for ${m}`,{url:m,outputPath:p,error:String(g)});}}for(let p of Je(e,m))a.has(p)||Object.prototype.hasOwnProperty.call(t.assetMap,p)&&(delete t.assetMap[p],c++);}(i>0||d>0||c>0)&&n.info(`Incremental cleanup removed ${i} stale pages, ${d} stale assets, ${c} stale asset mappings`,{removedPages:i,removedAssets:d,removedAssetMappings:c,phase:"incremental-cleanup"});}async function Do(e,t,r,n){let s=new Set([...Object.values(t.manifest.pages),...Object.values(t.manifest.assets)].map(a=>String(a.outputPath||"").trim()).filter(Boolean).map(a=>y.resolve(a))),o=Object.values(e.postCrawlCopyMap||{}).map(a=>wt(String(a||""))).filter(a=>!!a).map(a=>y.resolve(e.outputDir,a)),u=(await Ss(["**/*.html","**/*.htm"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(a=>Wr(y.join(e.outputDir,a),e.outputDir,s,o));for(let a of u){let l=y.join(e.outputDir,a);Yt(n,e,l),await M.unlink(l);}u.length>0&&r.info(`Removed ${u.length} orphaned HTML output file(s) that are absent from the current crawl manifest.`,{phase:"incremental-cleanup",source:"manifest-output-reconciliation",removedPages:u.length,samples:u.slice(0,20)});}function pn(e,t,r,n){let s=new Set,o=i=>{let u=i.trim();if(u){if(r){let a=se(u,r,"asset",n??"manifest");if(!a)return;s.add(a.toString());return}s.add(u);}};for(let i of Object.values(e.pages))for(let u of i.discoveredAssets||[])o(u);for(let[i,u]of Object.entries(e.assets||{}))t&&u.lastSeenRunId!==t||o(i);return s}function mn(e,t,r){for(let n of t)for(let s of Je(e,n))if(r.has(s))return true;return false}function Fo(e,t,r,n,s){let o=new Set(r.rewriteTargets);for(let u of r.changedFiles)o.add(y.resolve(e.outputDir,u));for(let u of Object.values(t.manifest.pages))u.rewriteComplete||o.add(y.resolve(u.outputPath));for(let u of Object.values(t.manifest.assets))u.isText&&!u.rewriteComplete&&o.add(y.resolve(u.outputPath));let i=Oo(n,s);if(i.size===0)return [...o];for(let u of Object.values(t.manifest.pages))mn(e,u.discoveredAssets,i)&&o.add(y.resolve(u.outputPath));for(let[u,a]of Object.entries(t.manifest.assets)){a.isText&&mn(e,a.discoveredAssets,i)&&o.add(y.resolve(a.outputPath));for(let l of Je(e,u))if(i.has(l)){G(r,e,a.outputPath),a.isText&&o.add(y.resolve(a.outputPath));break}}return [...o]}function Wo(e,t){let r=t?new Set(Array.from(t,s=>y.resolve(s))):null,n=s=>r===null||r.has(y.resolve(s));for(let s of Object.values(e.manifest.pages))n(s.outputPath)&&(s.rewriteComplete=true);for(let s of Object.values(e.manifest.assets)){if(!s.isText){s.rewriteComplete=true;continue}n(s.outputPath)&&(s.rewriteComplete=true);}}function qo(e,t,r){let n=new Set,s=o=>{if(!o)return;let i=Y(e.outputDir,o);i&&n.add(i);};for(let o of t.donePages)s(me(e,o));for(let o of Object.values(r.manifest.pages))o.lastSeenRunId===r.runId&&s(o.outputPath);for(let o of t.doneAssets)s(We(e,t.assetMap,o));for(let o of Object.values(r.manifest.assets))o.lastSeenRunId===r.runId&&s(o.outputPath);return n}async function No(e,t,r,n,s,o){let i=[...n.deletedFiles].sort(),u=qo(e,t,r),a=0;for(let c of [...u].sort())if(!o?.objects[c]){try{if((await M.stat(y.join(e.outputDir,c))).isFile())continue}catch{}a++,s.warn(`Active output is missing after crawl: ${c}`,{phase:"deploy-plan",file:c,outputPath:y.join(e.outputDir,c)});}if(a>0&&s.warn(`Detected ${a} active output file(s) missing before deploy plan save.`,{phase:"deploy-plan",missingActiveOutputs:a}),i.length===0)return [];let l=[],d=0;for(let c of i){if(!u.has(c)){l.push(c);continue}d++;let m=y.join(e.outputDir,c),h;try{h=(await M.stat(m)).isFile();}catch{h=false;}s.warn(`Deploy plan protected active output from deletion: ${c}`,{phase:"deploy-plan",file:c,outputPath:m,exists:h});}return d>0&&s.info(`Deploy plan skipped ${d} active output deletion(s).`,{phase:"deploy-plan",protectedDeletes:d,deletedFiles:l.length}),l}function Je(e,t){let r=new Set([t]);try{let n=new URL(t),o=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{o.push(new URL(e.targetOrigin).origin);}catch{}for(let i of o)try{r.add(new URL(i).origin+n.pathname+n.search);}catch{}r.add(n.pathname+n.search),r.add(n.pathname);}catch{}return [...r]}function _o(e,t){let r=new Set([t]);try{let n=new URL(t),o=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{o.push(new URL(e.targetOrigin).origin);}catch{}for(let i of o)try{r.add(new URL(i).origin+n.pathname+n.search);}catch{}r.add(n.pathname+n.search);}catch{}return [...r]}function In(e,t){let r=e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/"?e.targetOrigin:"https://relative.invalid/";try{let n=new URL(t,r);return ze(e.outputDir,n.pathname)}catch{return null}}function En(e,t,r){for(let n of _o(e,r)){let s=t[n];if(!s)continue;let o=In(e,s);if(o)return {outputPath:o,publicUrl:s}}return null}function Ho(e,t,r){for(let n of Je(e,r)){let s=t[n];if(!s)continue;let o=In(e,s);if(o)return o}return null}function We(e,t,r){let n=Ho(e,t,r);if(n)return n;try{return Xe(e,r).originalFilePath}catch{return null}}function Bo(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?y.join(y.resolve(e),"queue-runner-heartbeat.json"):""}async function Kt(e){let t=Bo();if(t)try{let r=await M.readFile(t,"utf8"),n=JSON.parse(r);if(!n||typeof n!="object")return;await M.writeFile(t,JSON.stringify({...n,checkedAt:new Date().toISOString(),status:"running",currentStep:"rewrite",message:e},null,2),"utf8");}catch{}}function Vo(e,t){let r=new Set;for(let n of t.donePages)r.add(y.resolve(me(e,n)));for(let n of t.doneAssets){let s=We(e,t.assetMap,n);!s||!ce(s)||r.add(y.resolve(s));}for(let n of t.doneSitemaps){let s=We(e,t.assetMap,n);!s||!ce(s)||r.add(y.resolve(s));}return [...r]}var yt="re:",ht=new Map;function zo(e){if(!e.startsWith(yt))return null;let t=ht.get(e);if(t!==void 0)return t||null;let r=e.slice(yt.length).trim();if(!r)return ht.set(e,false),null;try{let n=new RegExp(r);return ht.set(e,n),n}catch{return console.warn(`[crawl] Ignoring invalid path matcher regex: ${e}`),ht.set(e,false),null}}function ar(e,t){let r=zo(t);return r?r.test(e):t.startsWith(yt)?false:e.startsWith(t)}function Qo(e,t){return t.find(r=>ar(e,r))}function On(e,t){let r=Qo(t.pathname,e.blockedPathPrefixes);if(r)return r.startsWith(yt)?`blocked path regex: ${r}`:`blocked path prefix: ${r}`;let n=e.blockedSearchFragments.find(s=>t.search.includes(s));return n?`blocked search fragment: ${n}`:null}function Ko(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 n of Object.keys(e.extraReplacements||{}))try{r.add(new URL(n).hostname);}catch{}return r}function Jo(e,t){return Ko(e).has(t.hostname)}function Go(e){let t=fe(e.trim()).replace(/\\\//g,"/").replace(/^['"]|['"]$/g,"").trim();return t=t.replace(/[)]+$/g,"").trim(),t=t.replace(/;.*$/g,"").trim(),t}function er(e){let t=fe(e).replace(/\\\//g,"/");return /[{}]|\bwindow\.|\blocation\.|\bincludes\(|\?\?null|\+|%7B|%7D|%22|<|>|\s/.test(t)||/[()[\]'"]/.test(t)}function Zo(e){let t=fe(e).replace(/\\\//g,"/").trim(),r=y.extname(t).toLowerCase();return Rn.has(r)||vn.has(r)?false:/^(?:this|[A-Za-z_$][\w$]*)\.[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/.test(t)}function Oe(e){return So.some(t=>e.pathname.startsWith(t))}function V(e,t,r=e.sourceOrigin,n,s="url",o=false){let i=Go(t);if(!i||i.startsWith("data:")||i.startsWith("blob:")||i.startsWith("mailto:")||i.startsWith("tel:")||i.startsWith("#"))return n?.ignore(s,t,"empty or unsupported scheme",r),null;if(er(i))return n?.ignore(s,t,"looks like JavaScript/code fragment",r),null;if(Zo(i))return n?.ignore(s,t,"looks like JavaScript property access",r),null;try{let u=new URL(i,r);if(Mn(u))return n?.reject(s,t,"malformed URL encoding",r),null;if(!["http:","https:"].includes(u.protocol))return n?.ignore(s,t,"unsupported protocol: ",r),null;if(!Jo(e,u))return n?.ignore(s,u.toString(),"host not allowed",r),null;let a=On(e,u);if(a&&!(o&&At(u)))return n?.reject(s,u.toString(),a,r),null;let l=new URL(e.sourceOrigin);return u.protocol=l.protocol,u.host=l.host,u.hash="",u}catch{return n?.reject(s,t,"invalid URL",r),null}}function Mn(e){try{return decodeURIComponent(e.pathname),decodeURIComponent(e.search),decodeURIComponent(e.hash),!1}catch{return true}}function se(e,t,r,n){try{let s=new URL(e);return Mn(s)?(t.reject(r,e,"malformed URL encoding",n),null):Ve(s.pathname)===null?(t.reject(r,e,"unsafe URL pathname",n),null):s.protocol!=="http:"&&s.protocol!=="https:"?(t.reject(r,e,`unsupported protocol: ${s.protocol}`,n),null):s}catch{return t.reject(r,e,"invalid URL",n),null}}function $n(e){return Rn.has(y.extname(e.pathname).toLowerCase())}function Re(e){return Oe(e)?false:vn.has(y.extname(e.pathname).toLowerCase())}function Ne(e){let t=e.pathname.toLowerCase();return t.endsWith(".xml")&&(t.includes("sitemap")||t.endsWith("/sitemap.xml"))}function q(e,t){return !!(Ne(t)||t.pathname==="/robots.txt"||t.pathname==="/llms.txt"||t.pathname.toLowerCase().endsWith(".xsl")||e.assetPathPrefixes.length>0&&e.assetPathPrefixes.some(r=>ar(t.pathname,r))||$n(t)||!Re(t)&&!Oe(t))}function me(e,t){let r=new URL(t),n=Ve(r.pathname);if(n===null)throw new Error(`Unsafe page URL pathname: ${r.pathname}`);return n.endsWith("/")?n+="index.html":y.extname(n)||(n+="/index.html"),ze(e.outputDir,n)}function Yo(e){if(!e.generated404RequestPath)return null;try{let t=new URL(e.generated404RequestPath,e.sourceOrigin);return !t.pathname.endsWith("/")&&y.extname(t.pathname)===""&&(t.pathname+="/"),t.hash="",t.toString()}catch{return null}}function vt(e,t){let r=Yo(e);if(!r)return false;try{return new URL(t,e.sourceOrigin).toString()===r}catch{return false}}function Xe(e,t){let r=new URL(t),n=Ve(r.pathname);if(n===null)throw new Error(`Unsafe asset URL pathname: ${r.pathname}`);n.endsWith("/")&&(n+="index.html");let s=!!r.search,o=n,i=ze(e.outputDir,o),u=$t(e.targetOrigin,o),a=`${u}${r.search}`;if(!s)return {originalPathname:o,originalFilePath:i,originalPublicUrl:u,originalPublicUrlWithSearch:a,preferQueryHashed:s};let l=y.extname(n),c=`${l?n.slice(0,-l.length):n}.${ue(r.search)}${l||".bin"}`;return {originalPathname:o,originalFilePath:i,originalPublicUrl:u,originalPublicUrlWithSearch:a,preferQueryHashed:s,hashedPathname:c,hashedFilePath:ze(e.outputDir,c),hashedPublicUrl:$t(e.targetOrigin,c)}}function Xo(e,t,r,n){let s=se(t,r,"asset",n);return s?Xe(e,s.toString()):null}function tr(e,t,r,n,s){t[r]=n;try{let o=new URL(r),u=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{u.push(new URL(e.targetOrigin).origin);}catch{}for(let a of u)try{let l=new URL(a);t[l.origin+o.pathname+o.search]=n;}catch{}try{let a=(()=>{let l=new URL(n,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin);return `${l.pathname}${l.search}`})();t[o.pathname+o.search]=a;}catch{}try{let a=new URL(n,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[o.pathname]=a;}catch{}try{let a=new URL(s,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[o.pathname]=a;}catch{}}catch{}}async function jn(e){try{return await M.readFile(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}async function Te(e){try{return await M.stat(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}function ei(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 Un(e){let t=String(e["last-modified"]||"").trim();if(!t)return null;let r=Date.parse(t);return Number.isFinite(r)?r:null}function ti(e,t){let r=Un(t),n=ei(t),s=e?.mtime.getTime();return r!==null&&Math.abs((s??0)-r)>=1e3||n!==null&&e?.size!==n?false:r!==null||n!==null}async function ri(e,t){if(!t)return;let r=Un(t);if(r===null)return;let n=await Te(e);if(!n)return;let s=new Date(r);await M.utimes(e,n.atime,s).catch(()=>{});}function rr(e,t){let r=y.extname(e.pathname).toLowerCase(),n=t["content-type"]||"";return bo.has(r)||yo.some(s=>n.includes(s))&&!n.startsWith("image/")&&!n.includes("font")}function ni(e){try{let t=y.extname(new URL(e).pathname).toLowerCase();return t===".js"||t===".mjs"}catch{return false}}function xe(e,t){(e.doneAssets.size%25===0||e.doneAssets.size===1||e.doneAssets.size===e.stats.assetsQueued)&&t.progress(`Asset processing progress: processed ${e.doneAssets.size}, discovered ${e.stats.assetsQueued}.`,{doneAssets:e.doneAssets.size,assetsQueued:e.stats.assetsQueued,phase:"download-assets"});}function si(e){return ue(e.toString("base64"),40)}function Ln(e,t,r){let n=e.assetVariantDigestsByOriginalPath.get(t);if(!n||n.size===0)return false;for(let s of n)if(s!==r)return true;return false}function Dn(e,t,r){let n=e.assetVariantDigestsByOriginalPath.get(t);n||(n=new Set,e.assetVariantDigestsByOriginalPath.set(t,n)),n.add(r);}async function nr(e,t,r,n,s,o,i){let u=Xe(e,r),a=si(n),l=u.originalFilePath,d=u.originalPublicUrlWithSearch;if(u.preferQueryHashed&&u.hashedFilePath&&u.hashedPublicUrl&&Ln(s,u.originalFilePath,a)){let f=En(e,t,r);f?(l=f.outputPath,d=f.publicUrl):(l=u.hashedFilePath,d=u.hashedPublicUrl);}tr(e,t,r,d,u.originalPublicUrl);let c=ce(l)?Buffer.from(Dt(n.toString("utf8"),e,t,l),"utf8"):n,m=await jn(l),h=false;return (m===null||!m.equals(c))&&(await he(l,c),h=true),o?.debug(`${h?"Saved":"Skipped unchanged"} asset output ${r}`,{phase:"download-assets",url:r,outputPath:l,bytes:c.length,wroteFile:h}),Dn(s,u.originalFilePath,a),await ri(l,i),s.stats.assetsSaved++,o&&(s.stats.assetsSaved%50===0||s.stats.assetsSaved===1)&&o.progress(`Asset progress: saved ${s.stats.assetsSaved}, discovered ${s.stats.assetsQueued}, pending ${s.assetQueue.length}.`,{assetsSaved:s.stats.assetsSaved,assetsQueued:s.stats.assetsQueued,assetQueue:s.assetQueue.length,phase:"download-assets"}),{outputPath:l,publicUrl:d,wroteFile:h}}function Me(e,t,r,n,s){let o=()=>{let c=String(s??"").trim();if(!c)return {discoveredFrom:"",discoveredFromType:"unknown"};if(c==="seed-path"||c==="cli"||c==="generated-404-request-path")return {discoveredFrom:c,discoveredFromType:c};if(/^https?:\/\//i.test(c))try{let m=new URL(c);return Ne(m)?{discoveredFrom:c,discoveredFromType:"sitemap"}:q(e,m)?{discoveredFrom:c,discoveredFromType:"asset"}:Re(m)&&!Oe(m)?{discoveredFrom:c,discoveredFromType:"page"}:{discoveredFrom:c,discoveredFromType:"url"}}catch{return {discoveredFrom:c,discoveredFromType:"url"}}return {discoveredFrom:c,discoveredFromType:"url"}},i=s&&/^https?:\/\//i.test(s)?s:e.sourceOrigin,u=V(e,r,i,n,"page");if(!u)return;if(!Re(u)||$n(u)){if(q(e,u)){n.info(`Seeded/non-page URL queued as asset: ${u.toString()}`,{url:u.toString(),source:s}),W(e,t,u.toString(),n,s);return}n.reject("page",u.toString(),Oe(u)?"asset/internal path cannot be page":"not page-like",s);return}let a=u.toString(),{discoveredFrom:l,discoveredFromType:d}=o();l&&!t.pageDiscoverySources.has(a)&&t.pageDiscoverySources.set(a,l),!t.donePages.has(a)&&!t.queuedPages.has(a)&&(t.queuedPages.add(a),t.pageQueue.push(a),t.stats.pagesQueued++,n.debug(`Queued discovered page ${a}`,{phase:"discovery",url:a,discoveredFrom:l,discoveredFromType:d,outputPath:me(e,a)}),(t.stats.pagesQueued%25===0||t.stats.pagesQueued===1)&&n.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,pageQueue:t.pageQueue.length,phase:"discovery"}));}function W(e,t,r,n,s){let o=s&&/^https?:\/\//i.test(s)?s:e.sourceOrigin,i=V(e,r,o,n,"asset");if(!i)return;if(!q(e,i)){n.reject("asset",i.toString(),"not a safe asset path/prefix",s);return}let u=i.toString();!t.doneAssets.has(u)&&!t.queuedAssets.has(u)&&(t.queuedAssets.add(u),t.assetQueue.push(u),t.stats.assetsQueued++,(t.stats.assetsQueued%100===0||t.stats.assetsQueued===1)&&n.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 bt(e,t,r,n,s){let o=s&&/^https?:\/\//i.test(s)?s:e.sourceOrigin,i=V(e,r,o,n,"sitemap",yr(s));if(!i)return;if(!Ne(i)){n.reject("sitemap",i.toString(),"not sitemap-like",s);return}let u=i.toString();!t.doneSitemaps.has(u)&&!t.queuedSitemaps.has(u)&&(t.queuedSitemaps.add(u),t.sitemapQueue.push(u),t.stats.sitemapsQueued++,(t.stats.sitemapsQueued%10===0||t.stats.sitemapsQueued===1)&&n.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 oi(e){let t=fe(e),r=[...t.matchAll(/<url>\s*([\s\S]*?)\s*<\/url>/gi)].map(n=>n[1]);return r.length>0?r.map(n=>{let s=n.match(/<loc>\s*([^<]+?)\s*<\/loc>/i);if(!s?.[1])return null;let o=n.match(/<lastmod>\s*([^<]+?)\s*<\/lastmod>/i);return {loc:s[1].trim(),lastmod:Ee(o?.[1]??null)}}).filter(n=>!!n):[...t.matchAll(/<loc>\s*([^<]+?)\s*<\/loc>/gi)].map(n=>({loc:n[1].trim(),lastmod:null})).filter(n=>n.loc)}function ii(e){return e.split(",").map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function ai(e){let t=[],r=/url\(\s*(?:"([^"]+)"|'([^']+)'|([^)]*?))\s*\)/gi;for(let n of e.matchAll(r)){let s=e.slice(Math.max(0,n.index-8),n.index);if(/\bnew\s+$/i.test(s))continue;let o=(n[1]||n[2]||n[3]||"").trim();o&&t.push(o);}return t}function ui(e){return e.replace(/<script\b[^>]*>[\s\S]*?<\/script\s*>/gi,"")}function ci(e,t){if(t==="dom-style")return true;let r=(()=>{try{return y.extname(new URL(e).pathname).toLowerCase()}catch{return ""}})();return !(r===".js"||r===".mjs"||r===".map"||t.includes("javascript"))}function wt(e){return e.trim().replace(/\\/g,"/").replace(/^https?:\/\/[^/]+/i,"").replace(/^\/+/,"")}async function Fn(e,t,r,n){let s=[];await M.mkdir(t,{recursive:true});let o=await M.readdir(e,{withFileTypes:true});for(let i of o){let u=y.join(e,i.name),a=y.join(t,i.name);if(i.isDirectory()){s.push(...await Fn(u,a,r,n));continue}await Wn(u,a,r,n)&&s.push(a);}return s}async function li(e,t){try{let[r,n]=await Promise.all([M.stat(e),M.stat(t)]);if(r.size!==n.size)return !1;let[s,o]=await Promise.all([M.readFile(e),M.readFile(t)]);return s.equals(o)}catch{return false}}async function Wn(e,t,r,n){let s=y.resolve(t);return r.has(s)?(n.debug("Skipped post-crawl copy over crawled page output",{phase:"copy-extra-paths",sourcePath:e,targetPath:t}),false):await li(e,t)?(n.debug("Skipped unchanged post-crawl copy target",{phase:"copy-extra-paths",sourcePath:e,targetPath:t}),false):(await M.mkdir(y.dirname(t),{recursive:true}),await M.copyFile(e,t),true)}async function di(e,t,r){let n=Object.entries(e.postCrawlCopyMap||{}).map(([u,a])=>({sourcePath:u.trim(),prefix:String(a||"").trim()}));if(n.length===0)return [];let s=0,o=[],i=new Set([...t.donePages].map(u=>y.resolve(me(e,u))));r.mark("copy-extra-paths");for(let u of n){let a=u.sourcePath,l=u.prefix;if(!a||!l){r.warn("Skipped post-crawl copy mapping with empty key/value",{sourcePath:a,prefixPath:l});continue}let d=Co(a);if(!d.resolvedPath){r.warn("Skipped post-crawl copy source because alias root is not configured",{sourcePath:a,alias:d.alias||"",requiredEnv:d.requiredEnv||"",prefixPath:l});continue}let c=d.resolvedPath,m=wt(l);if(!m){r.warn("Skipped post-crawl copy mapping with invalid export prefix",{sourcePath:a,prefixPath:l});continue}let h;try{h=await M.stat(c);}catch{r.warn("Skipped post-crawl copy source because it does not exist",{sourcePath:a,sourceAbs:c,prefixPath:l});continue}let f=y.resolve(e.outputDir,m);if(h.isDirectory()){let w=await Fn(c,f,i,r);o.push(...w),s+=w.length,w.length>0&&r.progress(`Copied static directory to export: ${c} -> /${m}`,{phase:"copy-extra-paths",sourcePath:c,targetPath:`/${m}`,copiedItems:s,changedFiles:w.length});continue}let b=y.basename(c),p=l.endsWith("/")?y.join(f,b):f;await Wn(c,p,i,r)&&(o.push(p),s++,r.progress(`Copied static file to export: ${c} -> /${wt(l.endsWith("/")?`${l}${b}`:l)}`,{phase:"copy-extra-paths",sourcePath:c,targetPath:`/${wt(l.endsWith("/")?`${l}${b}`:l)}`,copiedItems:s}));}return r.endMark("copy-extra-paths",{mappedSources:n.length,copiedItems:s}),o}function qe(e,t,r,n,s){let o=new Set,i=fe(r).replace(/\\\//g,"/"),u=s==="page-html"?ui(i):i,a=ci(t,s);if(a){for(let l of ai(u)){let d=V(e,l,t,n,`${s}:css-url`);d&&q(e,d)&&o.add(d.toString());}for(let l of u.matchAll(/@import\s+(?:url\()?\s*['"]?([^'"\s;]+)['"]?\s*\)?/gi)){let d=V(e,l[1],t,n,`${s}:css-import`);d&&q(e,d)&&o.add(d.toString());}}if(a||s==="page-html")for(let l of u.matchAll(/<\?xml-stylesheet[^>]+href=["']([^"']+)["'][^>]*\?>/gi)){let d=V(e,l[1],t,n,`${s}:xml-stylesheet`);d&&q(e,d)&&o.add(d.toString());}if(s==="page-html")for(let l of Lr(i)){let d=l.startsWith("//")?`${new URL(e.sourceOrigin).protocol}${l}`:l;if(er(d)){n.ignore(`${s}:serialized-url`,d,"looks like JavaScript/code fragment",t);continue}let c=V(e,d,t,n,`${s}:serialized-url`);c&&q(e,c)?o.add(c.toString()):c&&n.ignore("asset",c.toString(),"serialized URL did not pass safe asset path filter",t);}if(s!=="page-html"&&ni(t))for(let l of Dr(i)){if(er(l)||!/\.(?:js|mjs)(?:[?#]|$)/i.test(l))continue;let d=V(e,l,t,n,`${s}:relative-asset`);d&&q(e,d)&&o.add(d.toString());}return [...o]}function qn(e,t,r,n){let s=new Set,o=fe(r);for(let i of o.matchAll(/href=["']([^"'#\s][^"']*?)["']/gi)){let u=i[1],a=V(e,u,t,n,"page-link");a&&(On(e,a)||Re(a)&&!Oe(a)&&!q(e,a)&&s.add(a.toString()));}return [...s]}async function gn(e,t,r,n,s,o,i=false,u=[]){let a=new Set(u),l=0,d=new Map,c=(m,h)=>{let f=[h],b=new Set;for(;f.length>0;){let p=f.pop();if(p===m)return true;b.has(p)||(b.add(p),f.push(...d.get(p)??[]));}return false};for(;r.sitemapQueue.length>0;){let m=r.sitemapQueue.shift();r.queuedSitemaps.delete(m);let h=se(m,n,"sitemap","sitemap-queue");if(!h)continue;let f=h.toString();if(r.doneSitemaps.has(f))continue;r.doneSitemaps.add(f),n.sitemap(`Fetching sitemap ${f}`,{url:f});let b=true;try{let p=await t.get(f,{timeout:6e4});if(b=!1,!p.ok()){if(n.skip("sitemap",f,p.status()),i&&!a.has(f))throw new Error(`Required child content-sync sitemap returned HTTP ${p.status()}: ${f}`);continue}let g=await p.body(),w=p.url()||f,k=se(w,n,"sitemap-response",f);if(!k)continue;let C=k.toString();r.successfulSitemaps.add(f),r.successfulSitemaps.add(C),a.has(f)&&(r.resolvedSitemapRoots.add(C),l+=1);let I=await nr(e,r.assetMap,C,g,r,n);G(s,e,I.outputPath),ne(s,I.outputPath);let A=g.toString("utf8");/<sitemapindex(?:\s|>)/i.test(A)?r.sitemapIndexUrls.add(C):r.sitemapLeafUrls.add(C);let R=qe(e,C,A,n,"sitemap");for(let E of R)W(e,r,E,n,C);let v=[];for(let E of oi(A)){let x=V(e,E.loc,C,n,"sitemap-loc",!0);if(!x){if(i)throw new Error(`Content-sync sitemap contains an inadmissible location: ${E.loc}`);continue}if(Ne(x)){if(c(C,x.toString()))throw new Error(`Sitemap index cycle detected: ${C} -> ${x.toString()}`);if(d.has(C)||d.set(C,new Set),d.get(C).add(x.toString()),v.push(x.toString()),i&&r.doneSitemaps.has(x.toString())&&!r.successfulSitemaps.has(x.toString()))throw new Error(`Required child content-sync sitemap was not resolved: ${x.toString()}`);bt(e,r,x.toString(),n,C);}else if(i){if(Re(x)&&!q(e,x)){let z=o.requiredUrls.has(x.toString()),L=o.manifest.pages[x.toString()],P=!!L&&!!await Te(L.outputPath);if(!z&&!P)throw new Error(`Content-sync sitemap coverage is incomplete for ${x.toString()}.`)}n.ignore("sitemap-loc",x.toString(),"content-sync sitemap-only traversal does not enqueue urlset locations",C);}else q(e,x)?W(e,r,x.toString(),n,C):Re(x)?(E.lastmod&&(r.sitemapLastmodByPage[x.toString()]=E.lastmod),Me(e,r,x.toString(),n,C)):n.reject("sitemap-loc",x.toString(),"not page/sitemap/asset-like",C);}o.trackManifest&&(o.manifest.assets[C]={url:C,outputPath:I.outputPath,isText:!0,contentType:p.headers()["content-type"]??"application/xml",cacheControl:Zt(p.headers()),changeToken:null,tokenSource:null,discoveredAssets:[...new Set([...R,...v])],lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,unreferencedRuns:0,rewriteComplete:!1},await Pe(e,o));}catch(p){n.error(`Failed sitemap ${f}`,{url:f,error:String(p)});let g=i&&a.has(f)&&b;if(i&&!g)throw p}}if(i&&a.size>0&&l===0)throw new Error(`None of the configured content-sync sitemap roots could be resolved: ${[...a].join(", ")}`)}async function pi(e,t,r,n,s,o,i){let u=V(e,n,e.sourceOrigin,s,"asset-fetch");if(!u||!q(e,u))return;let a=u.toString();if(r.doneAssets.has(a))return;let l=o.enabled||o.strictTargeted?o.previousManifest.assets[a]:void 0,d=o.trackManifest?await ft(e,t,o,a,s):null,c=d?.token??null,m=Wt(l?.changeToken,d),h=o.strictTargeted&&(!d?.supported||!d.token)&&qt(e.sourceOrigin,a),f=o.strictTargeted?o.manifest.assets[a]:void 0;if(f?.lastSeenRunId===o.runId&&await Te(f.outputPath)){r.doneAssets.add(a);for(let p of f.discoveredAssets||[])W(e,r,p,s,a);G(i,e,f.outputPath),Fe(i,e,f.outputPath,f.cacheControl),f.isText&&ne(i,f.outputPath),s.info(`Resumed completed content-sync asset ${a}`,{url:a,source:"content-sync-checkpoint"}),xe(r,s);return}if(l&&(m||h)&&await Te(l.outputPath)){o.manifest.assets[a]={...l,changeToken:c,tokenSource:d?.tokenSource??l.tokenSource,discoveredAssets:[...l.discoveredAssets||[]],lastSeenRunId:o.runId,unreferencedRuns:0},delete o.manifest.pages[a],r.doneAssets.add(a);for(let p of l.discoveredAssets||[])W(e,r,p,s,a);Fe(i,e,l.outputPath,l.cacheControl),s.info(`Reused unchanged trusted asset ${a}.`,{url:a,tokenSource:d?.tokenSource??"unknown",phase:"download-assets",source:m?"asset-change-token-match":"content-sync-release-fingerprint"}),xe(r,s);return}let b=(p,g={})=>{if(!l||o.strictTargeted)return false;o.manifest.assets[a]={...l,discoveredAssets:[...l.discoveredAssets||[]],lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,unreferencedRuns:0},delete o.manifest.pages[a],r.doneAssets.add(a);for(let w of l.discoveredAssets||[])W(e,r,w,s,a);return s.warn(`Keeping previous incremental asset ${a} after fetch issue.`,{url:a,reason:p,preservedFromPreviousManifest:true,...g,phase:"download-assets"}),xe(r,s),true};s.asset(`Fetching asset ${a}`,{url:a});try{let p=We(e,r.assetMap,a),g=p?await Te(p):null;if(p&&g&&!o.strictTargeted)try{let L=await B(`fetch asset headers ${a}`,6e4,()=>t.head(a,{timeout:6e4})),P=L.headers();if(L.ok()&&ti(g,P)){let j=await jn(p);if(j!==null){let oe=L.url()||a,X=se(oe,s,"asset-response",a);if(!X)return;let ie=X.toString(),T=await nr(e,r.assetMap,ie,j,r,s,P);T.wroteFile&&(G(i,e,T.outputPath),ce(T.outputPath)&&ne(i,T.outputPath));let F=Zt(P)||l?.cacheControl||null;Fe(i,e,T.outputPath,F),r.doneAssets.add(a),s.info(`Reused existing asset ${a} based on response headers.`,{url:a,filePath:p,lastModified:P["last-modified"]||"",contentLength:P["content-length"]||"",phase:"download-assets"}),xe(r,s);let D=rr(u,P),Z=l?.discoveredAssets?[...l.discoveredAssets]:[];if(D||l?.isText){let K=j.toString("utf8"),_e=qe(e,ie,K,s,"asset:cached");(_e.length>0||!l)&&(Z=_e);for(let et of Z)W(e,r,et,s,ie);}if(o.trackManifest){let K=D||!!l?.isText;o.manifest.assets[a]={url:a,outputPath:T.outputPath,isText:K,contentType:Gt(P)||l?.contentType||null,cacheControl:F,changeToken:d?.supported?d.token:null,tokenSource:d?.supported?d.tokenSource??null:null,discoveredAssets:Z,lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,unreferencedRuns:0,rewriteComplete:!K},delete o.manifest.pages[a],(o.enabled||o.strictTargeted)&&K&&await Pe(e,o);}return}}}catch{}let w=await B(`fetch asset ${a}`,6e4,()=>t.get(a,{timeout:6e4}));if(!w.ok()){if(b(`http-${w.status()}`,{status:w.status()}))return;if(o.strictTargeted)throw new Error(`Required content-sync asset returned HTTP ${w.status()}: ${a}`);s.skip("asset",a,w.status());return}let k=await B(`read asset response ${a}`,6e4,()=>w.body()),C=w.url()||a,I=se(C,s,"asset-response",a);if(!I)return;let A=I.toString(),R=w.headers(),v=await nr(e,r.assetMap,A,k,r,s,R);v.wroteFile&&(G(i,e,v.outputPath),ce(v.outputPath)&&ne(i,v.outputPath));let E=Zt(R);Fe(i,e,v.outputPath,E),r.doneAssets.add(a),xe(r,s);let x=rr(u,R),z=[];if(x){let L=k.toString("utf8");z=qe(e,A,L,s,`asset:${y.extname(u.pathname).toLowerCase()||R["content-type"]||"unknown"}`);for(let P of z)W(e,r,P,s,A);}o.trackManifest&&(o.manifest.assets[a]={url:a,outputPath:v.outputPath,isText:x,contentType:Gt(R),cacheControl:E,changeToken:d?.supported?d.token:null,tokenSource:d?.supported?d.tokenSource??null:null,discoveredAssets:z,lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,unreferencedRuns:0,rewriteComplete:!x},delete o.manifest.pages[a],(o.enabled||o.strictTargeted)&&x&&await Pe(e,o));}catch(p){if(b("fetch-error",{error:String(p)}))return;if(s.error(`Failed asset ${a}`,{url:a,error:String(p)}),o.strictTargeted)throw p}finally{r.doneAssets.has(a)||(r.doneAssets.add(a),xe(r,s));}}async function mi(e,t,r,n,s,o){let i=Math.max(1,Number(e.assetDownloadConcurrency||e.concurrency||1)),u=Array.from({length:i},async()=>{for(;r.assetQueue.length>0;){let a=r.assetQueue.shift();a&&(r.queuedAssets.delete(a),await pi(e,t,r,a,n,s,o));}});await Promise.all(u);}function St(e,t){let r=Y(e.outputDir,t);if(!r)throw new Error(`Remote export output is outside outputDir: ${t}`);return r}function gi(e,t){return rr(e,{"content-type":t})}function hn(e){return /(?:^|\/)index\.html?$|\.html?$/i.test(e)}async function hi(e,t,r,n,s,o,i,u,a){let l=Math.max(1,Math.min(100,a)),d=20;for(;r.assetQueue.length>0;){let c=r.assetQueue.splice(0,l*d);for(let b of c)r.queuedAssets.delete(b);await ir(e,t,s,c,n);let m=[];for(let b of c){let p=s.manifest.assets[b],g=p?Y(e.outputDir,p.outputPath):null,w=g?i.objects[g]:void 0,k=s.changeTokenCache.get(b)??null;if(!(s.enabled&&p&&w?.kind==="asset"&&w.sourceUrl===b&&(Wt(p.changeToken,k)||(!k?.supported||!k.token)&&qt(e.sourceOrigin,b)))||!p||!g||!w){m.push(b);continue}s.manifest.assets[b]={...p,changeToken:k?.token??null,tokenSource:k?.tokenSource??p.tokenSource,lastSeenRunId:s.runId,unreferencedRuns:0};for(let I of p.discoveredAssets||[])W(e,r,I,n,b);r.doneAssets.add(b),Fe(o,e,p.outputPath,p.cacheControl),n.info(`Reused unchanged S3-native asset ${b}.`,{url:b,relativePath:g,tokenSource:k?.tokenSource??"release-fingerprint",phase:"download-assets",execution:"lambda"}),xe(r,n);}if(m.length===0)continue;let h=[];for(let b=0;b<m.length;b+=d)h.push(m.slice(b,b+d));let f=await Promise.all(h.map(b=>u.fetch({urls:b,ignoreHttpsErrors:e.ignoreHttpsErrors,timeoutMs:6e4})));for(let b of f)for(let p of b.assets){let g=p.requestedUrl;try{if(p.outcome!=="fetched"||!p.object||!p.finalUrl){let E=p.error||`Remote asset fetch ended with ${p.outcome}.`;if(n.error(`Failed remote asset ${g}`,{url:g,status:p.httpStatus,outcome:p.outcome,error:E,execution:"lambda"}),s.strictTargeted)throw new Error(E);continue}let w=se(p.finalUrl,n,"remote-asset-response",g);if(!w)continue;let k=Xe(e,w.toString()),C=k.originalFilePath,I=k.originalPublicUrlWithSearch;if(k.preferQueryHashed&&k.hashedFilePath&&k.hashedPublicUrl&&Ln(r,k.originalFilePath,p.object.sha256)){let E=En(e,r.assetMap,w.toString());C=E?.outputPath??k.hashedFilePath,I=E?.publicUrl??k.hashedPublicUrl;}tr(e,r.assetMap,w.toString(),I,k.originalPublicUrl),w.toString()!==g&&tr(e,r.assetMap,g,I,k.originalPublicUrl),Dn(r,k.originalFilePath,p.object.sha256);let A=St(e,C),R=p.contentType?.trim()||"application/octet-stream",v=gi(w,R);De(i,{relativePath:A,sourceUrl:g,kind:"asset",contentType:R,cacheControl:p.cacheControl,isText:v,object:p.object}),G(o,e,C),v&&ne(o,C),Fe(o,e,C,p.cacheControl);for(let E of p.discoveredAssets)W(e,r,E,n,w.toString());r.stats.assetsSaved++,s.trackManifest&&(s.manifest.assets[g]={url:g,outputPath:C,isText:v,contentType:R,cacheControl:p.cacheControl,changeToken:null,tokenSource:null,discoveredAssets:[...p.discoveredAssets],lastCrawledAt:new Date().toISOString(),lastSeenRunId:s.runId,unreferencedRuns:0,rewriteComplete:!v},delete s.manifest.pages[g]),n.debug(`Remote asset fetch completed ${g}`,{url:g,finalUrl:w.toString(),relativePath:A,bytes:p.object.bytes,taskId:b.taskId,attempts:b.attempts,execution:"lambda"});}finally{r.doneAssets.add(g),xe(r,n);}}}}async function fi(e,t,r,n){for(let s of [...t.changedFiles].sort()){if(r.objects[s])continue;let o=y.join(e.outputDir,s),i=await M.readFile(o).catch(d=>{throw new Error(`Coordinator-owned output is missing before S3 staging: ${s}`,{cause:d})}),u=ce(o),a=String(Gr.lookup(s)||"")||(u?"text/plain; charset=utf-8":"application/octet-stream"),l=await n.writeWorkspaceObject({key:`${r.workspace.prefix}jobs/${r.jobId}/coordinator/${ue(s,40)}-${y.basename(s)}`,body:i,contentType:a,cacheControl:hn(s)?e.s3.htmlCacheControl:e.s3.assetCacheControl});De(r,{relativePath:s,sourceUrl:null,kind:"generated",contentType:a,cacheControl:hn(s)?e.s3.htmlCacheControl:e.s3.assetCacheControl,isText:u,object:l});}}function wi(e){let t=Math.ceil(e/1e3);return `${t} second${t===1?"":"s"}`}function Se(e){return Math.max(6e4,e.navigationTimeoutMs*2,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+15e3)}function Ke(e){return Math.max(15e3,Math.min(6e4,Se(e)))}function Nn(e){return Math.max(15e3,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+1e4)}function ur(e){return e.stats.pagesCompleted}function sr(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 Jt(e,t,r){let n=sr(e);try{if(n.kill){await n.kill(),t.warn(`Force-killed crawl worker browser after ${r}`,{browserPid:n.pid,reason:r});return}if(n.pid!==null){process.kill(n.pid,"SIGKILL"),t.warn(`Sent SIGKILL to crawl worker browser after ${r}`,{browserPid:n.pid,reason:r});return}t.warn(`Could not resolve crawl worker browser PID after ${r}`,{reason:r});}catch(s){t.error(`Failed to force-kill crawl worker browser after ${r}`,{browserPid:n.pid,reason:r,error:String(s)});}}async function B(e,t,r){let n;try{return await Promise.race([r(),new Promise((s,o)=>{n=globalThis.setTimeout(()=>{o(new Ge(e,t));},t);})])}finally{n!==void 0&&globalThis.clearTimeout(n);}}var Ge=class extends Error{constructor(r,n){super(`${r} timed out after ${wi(n)}.`);this.operation=r;this.timeoutMs=n;this.name="OperationTimeoutError";}operation;timeoutMs};async function yi(e,t){let r=Nn(e);await t.evaluate(async n=>{await new Promise(s=>{let o=0,i=700,u=Date.now(),a=()=>{window.clearInterval(l),window.scrollTo(0,0),s();},l=window.setInterval(()=>{if(Date.now()-u>=n.maxDurationMs){a();return}window.scrollBy(0,i),o+=i;let d=document.body?.scrollHeight||0,c=document.documentElement?.scrollHeight||0,m=Math.max(d,c);o>=m+window.innerHeight&&a();},120);});},{maxDurationMs:r});}async function bi(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 yi(e,t),await t.waitForTimeout(e.readiness.fallbackWaitMs);}async function Si(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 _n(e,t){return e.noJavaScriptRenderPathPrefixes.some(r=>ar(t,r))}async function Pi(e,t,r,n,s=true){let o=new Set;if(s){let u=await t.evaluate(()=>{let a=new Set,l=["href","src","poster","data-src","data-lazy-src","data-original","data-bg","data-background","data-href","data-resource-url"],d=new Set,c=["srcset","data-srcset","data-lazy-srcset"],m=h=>{h.querySelectorAll("*").forEach(f=>{for(let p of l){let g=f.getAttribute(p);g&&a.add(g);}for(let p of c){let g=f.getAttribute(p);g&&g.split(",").forEach(w=>{let k=w.trim().split(/\s+/)[0];k&&a.add(k);});}let b=f.getAttribute("style");b&&d.add(b),f.shadowRoot&&m(f.shadowRoot);});};return m(document),{attrs:[...a],styles:[...d]}});for(let a of u.attrs)for(let l of ii(a)){let d=V(e,l,r,n,"dom-attr");d&&q(e,d)&&o.add(d.toString());}for(let a of u.styles)for(let l of qe(e,r,a,n,"dom-style"))o.add(l);}let i=await t.content();for(let u of qe(e,r,i,n,"page-html"))o.add(u);return [...o]}async function fn(e){return await e.evaluate(()=>{document.querySelectorAll("#wpsuite-consent-root").forEach(t=>t.remove()),document.documentElement.classList.remove("wpsuite-consent-scroll-locked"),document.body.classList.remove("wpsuite-consent-scroll-locked");}),e.content()}async function or(e,t,r,n,s){let o=me(e,t);await he(o,r,"utf8");let i=await M.stat(o);s?.debug(`Saved page output ${t}`,{phase:"save-pages",url:t,outputPath:o,bytes:i.size});let u=Pt(n,o),a=Math.min(n.stats.pagesQueued,ur(n)+1);s&&u&&(n.stats.pagesSaved%10===0||n.stats.pagesSaved===1)&&s.progress(`Page progress: processed ${a}, rendered ${n.stats.pagesRendered}, saved ${n.stats.pagesSaved}, discovered ${n.stats.pagesQueued}.`,{donePages:a,claimedPages:n.donePages.size,pagesRendered:n.stats.pagesRendered,pagesSaved:n.stats.pagesSaved,pagesQueued:n.stats.pagesQueued,pageQueue:n.pageQueue.length,phase:"save-pages"});}function Pt(e,t){let r=y.resolve(t);return e.savedPageOutputs.has(r)?false:(e.savedPageOutputs.add(r),e.stats.pagesSaved=e.savedPageOutputs.size,true)}async function Rt(e,t,r,n,s){let o=Y(e.outputDir,n);if(!o)return;if(s){let u=s.objects[o];u?.kind==="page"&&u.sourceUrl===r&&u.object?.bucket===s.workspace.bucket&&typeof u.object.key=="string"&&u.object.key.startsWith(s.workspace.prefix)&&Pt(t,n);return}(await Te(n).catch(()=>null))?.isFile()&&Pt(t,n);}function Hn(e){let t=ur(e);return t%5===0||t===1||t===e.stats.pagesQueued}function Bn(e,t){let r=ur(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 Ri(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 n=new URL(String(r),window.location.href),s=new URL(window.location.href);return n.hash="",s.hash="",n.href===s.href}catch{return false}};try{let r=window.location.assign.bind(window.location),n=window.location.replace.bind(window.location),s=window.location.reload.bind(window.location);Object.defineProperty(window.location,"assign",{configurable:!0,value:o=>{if(t(o)){console.warn("[smartcloud-static-publisher] blocked same-page location.assign",o??"");return}return r(o)}}),Object.defineProperty(window.location,"replace",{configurable:!0,value:o=>{if(t(o)){console.warn("[smartcloud-static-publisher] blocked same-page location.replace",o??"");return}return n(o)}}),Object.defineProperty(window.location,"reload",{configurable:!0,value:()=>{console.warn("[smartcloud-static-publisher] blocked location.reload");}});}catch{}});}async function vi(e,t,r){let n=await e.newContext({viewport:t.viewport,userAgent:"WPSuiteStaticPublisher/0.8 Playwright SitemapOnly",ignoreHTTPSErrors:t.ignoreHttpsErrors,...r?{javaScriptEnabled:false}:{}});return r||await Ri(n),n}async function ki(e,t,r,n,s,o,i,u,a,l){for(;t.pageQueue.length>0&&!(e.maxPages>0&&t.donePages.size>=e.maxPages);){let d=t.pageQueue.shift();if(!d)break;t.queuedPages.delete(d);try{let c=se(d,r,"page","page-queue");if(!c)continue;let m=c.toString();if(d=m,t.queuedPages.delete(d),t.donePages.has(d))continue;t.donePages.add(d),o.enabled&&o.seenPages.add(d);let h=vt(e,d),f=_n(e,c.pathname);if(!Re(c)||q(e,c)||Oe(c)){if(q(e,c)){r.info(`Remote worker redirected non-page URL to asset queue: ${d}`,{url:d,source:"remote-worker-guard"}),W(e,t,d,r,"remote-worker-guard");continue}r.reject("page",d,"guard rejected non-page URL before remote rendering","remote-worker");continue}let b=o.strictTargeted?o.manifest.pages[d]:void 0;if(b?.lastSeenRunId===o.runId&&await Te(b.outputPath)){o.seenPages.add(d);for(let v of b.discoveredAssets||[])W(e,t,v,r,d);G(i,e,b.outputPath),ne(i,b.outputPath),await Rt(e,t,d,b.outputPath,l),r.info(`Resumed completed content-sync page ${d}`,{url:d,source:"content-sync-checkpoint"});continue}let p=await An(e,s,t,o,d,r);if(o.enabled&&n!=="single-url"&&n!=="content-sync"){let v=o.manifest.pages[d];if(p.action==="reuse"&&v){for(let E of v.discoveredAssets)W(e,t,E,r,d);for(let E of v.discoveredPages)Me(e,t,E,r,d);v.lastSeenRunId=o.runId,v.sitemapLastmod=Ee(t.sitemapLastmodByPage[d])??v.sitemapLastmod,p.changeToken?.supported&&(v.changeToken=p.changeToken.token,v.tokenSource=p.changeToken.tokenSource??v.tokenSource),await Rt(e,t,d,v.outputPath,l),r.info(`Incremental reuse skipped unchanged page ${d}`,{url:d,mode:"incremental",reason:p.changeToken?.supported===!0?"change-token-match":"sitemap-lastmod-match"});continue}}r.page(`Rendering remotely ${d}`,{url:d,execution:"lambda"});let g=await a.render({sourceOrigin:e.sourceOrigin,url:d,options:{ignoreHttpsErrors:e.ignoreHttpsErrors,javaScriptEnabled:!f,viewport:e.viewport,navigationTimeoutMs:e.navigationTimeoutMs,autoScrollTimeoutMs:Nn(e),readiness:e.readiness},downloadHtml:!l}),w=g.page,k=w.finalUrl?se(w.finalUrl,r,"remote-final-response",d)?.toString():void 0;if(n==="content-sync"&&k&&k!==m){if(o.deleteOnMissingUrls.has(d)){await Ze(e,o,i,d,o.deleteOnMissingUrls),r.info(`Removed stale content-sync archive route redirected to ${k}`,{url:d,finalResponseUrl:k,source:"content-sync-tombstone"});continue}throw new Error(`Required content-sync route redirected outside its planned URL: ${d} -> ${k}`)}let C=w.httpStatus;if(h){if(C!==404){r.error(`Generated 404 request path returned unexpected status for ${d}`,{url:d,expectedStatus:404,status:C,requestPath:e.generated404RequestPath,execution:"lambda"});continue}}else if(C!==null&&C>=400){if(n==="content-sync"&&(C===404||C===410)&&o.deleteOnMissingUrls.has(d)){await Ze(e,o,i,d,o.deleteOnMissingUrls),r.info(`Removed stale content-sync archive page ${d}`,{url:d,status:C,source:"content-sync-tombstone"});continue}if(n==="content-sync")throw new Error(`Required content-sync route returned HTTP ${C}: ${d}`);r.skip("page",d,C,t.pageDiscoverySources.get(d));continue}t.stats.pagesRendered++;let I=new Set;if(!l){if(g.html===null)throw new Error("Remote render did not return HTML for local output mode.");for(let v of qe(e,m,g.html,r,"remote-page-html"))I.add(v);}for(let v of [...w.discoveredAssets,...w.networkUrls]){let E=V(e,v,m,r,"remote-render");E&&q(e,E)&&I.add(E.toString());}for(let v of I)W(e,t,v,r,d);let A=n!=="single-url"&&n!=="content-sync"&&!h?[...new Set([...!l&&g.html!==null?qn(e,d,g.html,r):[],...w.discoveredPages])]:[];for(let v of A)Me(e,t,v,r,d);for(let v of w.cookies){let E=v.sameSite==="Strict"||v.sameSite==="Lax"||v.sameSite==="None"?v.sameSite:"Unspecified",x=!Number.isFinite(v.expires)||v.expires<=0;u.add({name:v.name,domain:v.domain,path:v.path||"/",expires:x?null:v.expires,session:x,secure:v.secure,httpOnly:v.httpOnly,sameSite:E,partitioned:v.partitioned===!0});}let R=me(e,d);if(l){if(!w.html)throw new Error("Remote render completed without a workspace HTML object.");De(l,{relativePath:St(e,R),sourceUrl:d,kind:"page",contentType:w.contentType?.trim()||"text/html; charset=utf-8",cacheControl:e.s3.htmlCacheControl,isText:!0,object:w.html}),Pt(t,R);}else {if(g.html===null)throw new Error("Remote render did not return HTML for local output mode.");await or(e,d,g.html,t,r);}G(i,e,R),ne(i,R),o.trackManifest&&(o.manifest.pages[d]={url:d,outputPath:R,contentType:w.contentType?.trim()||null,changeToken:p.changeToken?.supported?p.changeToken.token:null,tokenSource:p.changeToken?.supported?p.changeToken.tokenSource??null:null,sitemapLastmod:Ee(t.sitemapLastmodByPage[d])??null,discoveredPages:A,discoveredAssets:[...I],lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,rewriteComplete:!1},(o.enabled||o.strictTargeted)&&await Pe(e,o)),r.debug(`Remote render completed ${d}`,{url:d,taskId:g.taskId,attempts:g.attempts,execution:"lambda"});}catch(c){if(r.error(`Failed remote page ${d}`,{url:d,error:String(c),execution:"lambda",...c instanceof ee?{status:c.status,attempts:c.attempts}:{}}),c instanceof ee){t.pageHttpFailures.set(d,c);continue}if(o.strictTargeted)throw c}finally{t.stats.pagesCompleted++,Hn(t)&&Bn(t,r);}}}async function Ci(e,t,r,n,s,o,i,u){let a=await chromium.launch({headless:true}),l=sr(a);l.pid!==null&&r.debug(`Launched crawl worker browser PID ${l.pid}`,{browserPid:l.pid});try{for(;t.pageQueue.length>0;){a||(a=await chromium.launch({headless:!0}),l=sr(a),l.pid!==null&&r.debug(`Relaunched crawl worker browser PID ${l.pid}`,{browserPid:l.pid}));let d=a;if(e.maxPages>0&&t.donePages.size>=e.maxPages)break;let c=t.pageQueue.shift();if(!c)break;t.queuedPages.delete(c);let m=null,h=null,f=!1,b=null,p=[],g=new Set;try{let w=se(c,r,"page","page-queue");if(!w)continue;let k=w.toString();if(c=k,t.queuedPages.delete(c),t.donePages.has(c))continue;t.donePages.add(c),o.enabled&&o.seenPages.add(c);let C=vt(e,c),I=_n(e,w.pathname);if(!Re(w)||q(e,w)||Oe(w)){if(q(e,w)){r.info(`Worker redirected non-page URL to asset queue: ${c}`,{url:c,source:"worker-guard"}),W(e,t,c,r,"worker-guard");continue}r.reject("page",c,"guard rejected non-page URL before rendering","worker");continue}let A=o.strictTargeted?o.manifest.pages[c]:void 0;if(A?.lastSeenRunId===o.runId&&await Te(A.outputPath)){o.seenPages.add(c);for(let T of A.discoveredAssets||[])W(e,t,T,r,c);G(i,e,A.outputPath),ne(i,A.outputPath),await Rt(e,t,c,A.outputPath),r.info(`Resumed completed content-sync page ${c}`,{url:c,source:"content-sync-checkpoint"});continue}let R=await An(e,s,t,o,c,r);if(o.enabled&&n!=="single-url"&&n!=="content-sync"){let T=o.manifest.pages[c];if(R.action==="reuse"&&T){for(let F of T.discoveredAssets)W(e,t,F,r,c);for(let F of T.discoveredPages)Me(e,t,F,r,c);T.lastSeenRunId=o.runId,T.sitemapLastmod=Ee(t.sitemapLastmodByPage[c])??T.sitemapLastmod,R.changeToken?.supported&&(T.changeToken=R.changeToken.token,T.tokenSource=R.changeToken.tokenSource??T.tokenSource),await Rt(e,t,c,T.outputPath),r.info(`Incremental reuse skipped unchanged page ${c}`,{url:c,mode:"incremental",reason:R.changeToken?.supported===!0?"change-token-match":"sitemap-lastmod-match"});continue}}m=await B(`create page context ${c}`,Se(e),()=>vi(d,e,I)),h=await B(`create page ${c}`,Se(e),()=>m.newPage()),p=await m.cookies();let v=!1,E=new Set;await h.route("**/*",async T=>{let F=T.request();try{let D=V(e,F.url(),e.sourceOrigin,r,"network-request");D&&q(e,D)&&(E.add(D.toString()),W(e,t,D.toString(),r,c));}catch{}if(F.isNavigationRequest()&&F.frame()===h.mainFrame())try{let D=new URL(F.url()),Z=new URL(k);if(D.hash="",Z.hash="",D.href===Z.href){if(v){r.warn(`Blocked same-page navigation/reload for ${c}`,{url:c,requestUrl:F.url()});try{await T.abort("aborted");}catch(K){r.debug(`Ignored canceled route while blocking reload for ${c}`,{url:c,error:String(K)});}return}v=!0;}}catch{}try{await T.continue();}catch(D){r.debug(`Ignored canceled network route for ${c}`,{url:c,requestUrl:F.url(),error:String(D)});}}),h.on("response",T=>{try{let D=V(e,T.url(),e.sourceOrigin,r,"network-response");D&&q(e,D)&&(E.add(D.toString()),W(e,t,D.toString(),r,c));}catch{}let F=T.headerValues("set-cookie").then(D=>{for(let Z of D)u.add(_r(Z,T.url()));}).catch(()=>{}).then(()=>{});g.add(F),F.finally(()=>g.delete(F));}),r.page(`Rendering ${c}`,{url:c});let x=null,z=null;try{if(x=await h.goto(c,{waitUntil:"domcontentloaded",timeout:e.navigationTimeoutMs}),x&&x.ok())try{z=await B(`read response body ${c}`,Se(e),()=>x.text());}catch{z=null;}}catch(T){let F=t.pageHttpFailures.get(c);if(F){let D=(t.pageHttpAttempts.get(c)??0)+1;throw t.pageHttpAttempts.set(c,D),new ee(c,F.status,D,`Retry navigation failed: ${String(T)}`)}r.warn(`Navigation issue for ${c}; saving current DOM if available`,{url:c,error:String(T)});}let L=x?.status();if(lt(L)){let T=(t.pageHttpAttempts.get(c)??0)+1;throw t.pageHttpAttempts.set(c,T),new ee(c,L,T)}if(x)t.pageHttpFailures.delete(c);else if(t.pageHttpFailures.has(c)){let T=t.pageHttpFailures.get(c),F=(t.pageHttpAttempts.get(c)??0)+1;throw t.pageHttpAttempts.set(c,F),new ee(c,T.status,F,"Retry navigation returned no HTTP response.")}if(n==="content-sync"&&x){let T=se(x.url(),r,"content-sync-final-response",c)?.toString();if(T&&T!==k){if(o.deleteOnMissingUrls.has(c)){await Ze(e,o,i,c,o.deleteOnMissingUrls),r.info(`Removed stale content-sync archive route redirected to ${T}`,{url:c,finalResponseUrl:T,source:"content-sync-tombstone"});continue}throw new Error(`Required content-sync route redirected outside its planned URL: ${c} -> ${T}`)}}if(C){let T=x?.status()??null;if(T!==404){r.error(`Generated 404 request path returned unexpected status for ${c}`,{url:c,expectedStatus:404,status:T,requestPath:e.generated404RequestPath});continue}r.info(`Capturing rendered 404 page for ${c}`,{url:c,status:T,outputPath:me(e,c)});}else if(x&&!x.ok()){if(n==="content-sync"&&(x.status()===404||x.status()===410)&&o.deleteOnMissingUrls.has(c)){await Ze(e,o,i,c,o.deleteOnMissingUrls),r.info(`Removed stale content-sync archive page ${c}`,{url:c,status:x.status(),source:"content-sync-tombstone"}),await h.close();continue}if(n==="content-sync")throw new Error(`Required content-sync route returned HTTP ${x.status()}: ${c}`);r.skip("page",c,x.status(),t.pageDiscoverySources.get(c)),await h.close();continue}I?(r.info(`Rendering without JS execution for ${c}`,{url:c,mode:"no-js"}),await B(`wait for rendered page ${c}`,Se(e),()=>Si(e,h))):await B(`wait for rendered page ${c}`,Se(e),()=>bi(e,h)),t.stats.pagesRendered++;let P=await B(`extract rendered assets ${c}`,Se(e),()=>Pi(e,h,k,r,!I));for(let T of P)W(e,t,T,r,c);let j=[...new Set([...P,...E])],oe=z??await B(`capture rendered html ${c}`,Se(e),()=>fn(h)),X=n!=="single-url"&&n!=="content-sync"&&!C?qn(e,c,oe,r):[];if(n!=="single-url"&&n!=="content-sync"&&!C)for(let T of X)Me(e,t,T,r,c);await or(e,c,oe,t,r);let ie=me(e,c);if(G(i,e,ie),ne(i,ie),o.trackManifest){let T=x?.headers();o.manifest.pages[c]={url:c,outputPath:ie,contentType:Gt(T),changeToken:R.changeToken?.supported?R.changeToken.token:null,tokenSource:R.changeToken?.supported?R.changeToken.tokenSource??null:null,sitemapLastmod:Ee(t.sitemapLastmodByPage[c])??null,discoveredPages:X,discoveredAssets:j,lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,rewriteComplete:!1},(o.enabled||o.strictTargeted)&&await Pe(e,o);}}catch(w){if(w instanceof ee){t.pageHttpFailures.set(c,w),w.attempts<Bt?(b=dt(w.attempts),r.warn(`Retrying page after HTTP ${w.status}: ${c}`,{url:c,status:w.status,attempt:w.attempts,maxAttempts:Bt,delayMs:b,reason:w.message,execution:"local"})):(t.pageHttpFailures.set(c,w),r.error(`Failed page after HTTP retries ${c}`,{url:c,status:w.status,attempts:w.attempts,error:String(w),execution:"local"}));continue}if(f=w instanceof Ge,o.strictTargeted)throw r.error(`Failed required content-sync page ${c}`,{url:c,error:String(w)}),w;if(f)r.warn(`Skipped partial DOM for timed-out page ${c}`,{url:c,error:String(w),recovery:"recycle-worker-browser"});else try{let k=h?await B(`capture partial html ${c}`,Se(e),()=>fn(h)):"";if(k&&k.trim()){await or(e,c,k,t,r);let C=me(e,c);if(G(i,e,C),ne(i,C),o.trackManifest){let I=o.manifest.pages[c]??o.previousManifest.pages[c];o.manifest.pages[c]={url:c,outputPath:C,contentType:I?.contentType??null,changeToken:null,tokenSource:null,sitemapLastmod:Ee(t.sitemapLastmodByPage[c])??I?.sitemapLastmod??null,discoveredPages:I?.discoveredPages?[...I.discoveredPages]:[],discoveredAssets:I?.discoveredAssets?[...I.discoveredAssets]:[],lastCrawledAt:new Date().toISOString(),lastSeenRunId:o.runId,rewriteComplete:!1},(o.enabled||o.strictTargeted)&&await Pe(e,o);}r.warn(`Saved partial DOM for ${c}`,{url:c,error:String(w)});}}catch(k){k instanceof Ge&&(f=!0),r.error(`Could not save partial DOM for ${c}`,{url:c,error:String(k)});}r.error(`Failed page ${c}`,{url:c,error:String(w)});}finally{if(!f&&h&&await B(`drain network routes ${c}`,Ke(e),()=>h.unrouteAll({behavior:"wait"})).catch(w=>{f=!0,r.warn(`Could not drain network routes for ${c}`,{url:c,browserPid:l.pid,error:String(w),recovery:"recycle-worker-browser"});}),f&&(a=null,await Jt(d,r,`page operation timeout for ${c}`),await d.close().catch(()=>{})),g.size>0&&await Promise.allSettled([...g]),!f&&m)try{let w=await m.cookies();u.addAll(Hr(p,w));}catch{}b===null&&(t.stats.pagesCompleted++,Hn(t)&&Bn(t,r)),!f&&h&&await B(`close page ${c}`,Ke(e),()=>h.close()).catch(w=>{f=!0,r.warn(`Timed out while closing page ${c}`,{url:c,browserPid:l.pid,error:String(w),recovery:"recycle-worker-browser"});}),!f&&m&&await B(`close page context ${c}`,Ke(e),()=>m.close()).catch(w=>{f=!0,r.warn(`Timed out while closing page context for ${c}`,{url:c,browserPid:l.pid,error:String(w),recovery:"recycle-worker-browser"});}),f&&a===d&&(a=null,await Jt(d,r,`page cleanup timeout for ${c}`),await d.close().catch(()=>{})),b!==null&&(await setTimeout$1(b),t.donePages.delete(c),t.queuedPages.add(c),t.pageQueue.push(c));}}}finally{if(a){let d=a;await B("close worker browser",Ke(e),()=>d.close()).catch(c=>(r.warn("Timed out while closing crawl worker browser",{browserPid:l.pid,error:String(c)}),Jt(d,r,"browser.close timeout")));}}}async function xi(e){try{let t=await M.readFile(e),n=(e.endsWith(".gz")?gunzipSync(t):t).toString("utf8").trim();if(!n)return [];try{let s=JSON.parse(n);if(Array.isArray(s))return s;if(s&&typeof s=="object")return [s]}catch{return n.split(/\r?\n/).map(s=>s.trim()).filter(Boolean).map(s=>{try{let o=JSON.parse(s);return o&&typeof o=="object"?o:null}catch{return null}}).filter(s=>s!==null)}return []}catch{return []}}function wn(e){let t=String(e||"").toLowerCase();return t.includes("timeout")||t.includes("timed out")||t.includes("navigation timeout")}function Ti(e){let t=String(e?.job?.command||"").trim(),r=String(e?.job?.crawlMode||"full").trim();return t!=="publish"&&t!=="crawl"?false:r!=="incremental"}function Ai(e){let t=[e?.archivedAt,e?.job?.endedAt,e?.job?.startedAt];for(let r of t){let n=Date.parse(String(r||""));if(Number.isFinite(n))return n}return 0}async function Vn(e){try{let t=await M.readFile(e,"utf8"),r=JSON.parse(t);return r&&typeof r=="object"&&!Array.isArray(r)?r:null}catch{return null}}function yn(e){let t=String(e.originalFileName||"").toLowerCase();return t.endsWith("errors.jsonl")?0:t.endsWith("errors.json")?1:2}function Ii(e,t){let r=Array.isArray(t?.artifacts)?t.artifacts.filter(n=>String(n?.role||"").trim()==="errors"&&String(n?.storedFileName||"").trim()!=="").sort((n,s)=>yn(n)-yn(s)).map(n=>y.join(e,String(n.storedFileName))):[];return [...new Set([...r,y.join(e,"errors.jsonl"),y.join(e,"errors.json"),y.join(e,"errors.jsonl.gz"),y.join(e,"errors.json.gz")])]}async function bn(e){let t=await Vn(y.join(e,"job.json"));for(let r of Ii(e,t)){let n=await xi(r);if(n.length>0)return n}return []}async function Ei(e){let t=y.join(e.logDir,"archive"),r;try{r=await M.readdir(t);}catch{return ""}let n="",s=0;for(let o of r){let i=y.join(t,o);if(!(await M.stat(i).catch(()=>null))?.isDirectory())continue;let a=await Vn(y.join(i,"job.json"));if(!Ti(a))continue;let l=Ai(a);l>=s&&(s=l,n=i);}return n}async function Oi(e){let t=await Ei(e),r=t!==""?await bn(t):await bn(e.logDir),n=new Set;for(let s of r)if(wn(s.error)||wn(s.message)){let o=s.url;typeof o=="string"&&o&&n.add(o);}return [...n]}async function Mi(e){let t=[];for(let r of e)if(r.startsWith("@")){let n=r.slice(1),s=await M.readFile(n,"utf8");t.push(...s.split(/\r?\n/).map(o=>o.trim()).filter(o=>o&&!o.startsWith("#")));}else t.push(r);return t}async function $i(e){if(!e)throw new Error("Content-sync crawl requires an immutable impact plan.");let t=JSON.parse(await M.readFile(e,"utf8"));return fr(t),t}function ji(e,t){let r;try{r=new URL(e);}catch{return false}return t.archiveFamilies.some(n=>{let s=new URL(n.url);if(r.origin!==s.origin)return false;if(r.toString()===s.toString())return true;if(r.searchParams.has("paged")&&r.pathname===s.pathname)return /^\d+$/.test(r.searchParams.get("paged")||"");let o=s.pathname.replace(/\/+$/,""),i=r.pathname.slice(o.length).replace(/^\/+/,""),u=String(n.paginationBase||"page").replace(/^\/+|\/+$/g,"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return r.pathname.startsWith(`${o}/`)&&new RegExp(`^${u}/\\d+/?$`).test(i)})}function Qe(e,t,r){let n=r==="page"?me(e,t):Xe(e,t).originalFilePath;return Y(e.outputDir,n)}async function Ze(e,t,r,n,s){let o=t.manifest.pages[n];if(!o)return;let i=Y(e.outputDir,o.outputPath);if(!i)throw new Error(`Manifest-owned page path escaped output root: ${n}`);let u=y.resolve(o.outputPath);Object.entries(t.manifest.pages).some(([l,d])=>l!==n&&!s.has(l)&&y.resolve(d.outputPath)===u)||(await M.rm(o.outputPath,{force:true}),r.deletedFiles.add(i),r.revalidateFiles.delete(i)),delete t.manifest.pages[n];}async function Ui(e,t,r,n,s){let o=t.manifest.assets[n];if(!o)return;let i=Y(e.outputDir,o.outputPath);if(!i)throw new Error(`Manifest-owned resource path escaped output root: ${n}`);let u=y.resolve(o.outputPath);Object.entries(t.manifest.assets).some(([l,d])=>l!==n&&!s.has(l)&&y.resolve(d.outputPath)===u)||(await M.rm(o.outputPath,{force:true}),r.deletedFiles.add(i)),delete t.manifest.assets[n];}function Li(e,t){let r=new Set,n=[...t];for(;n.length>0;){let s=n.shift();if(r.has(s))continue;r.add(s);let o=e.assets[s];for(let i of o?.discoveredAssets??[])try{Ne(new URL(i))&&n.push(i);}catch{}}return r}async function Di(e,t,r,n,s){let o=Li(r.previousManifest,s);for(let i of o){if(t.successfulSitemaps.has(i))continue;let u=r.previousManifest.assets[i];if(!u)continue;let a=Y(e.outputDir,u.outputPath);if(!a)throw new Error(`Manifest-owned sitemap path escaped output root: ${i}`);await M.rm(u.outputPath,{force:true}),n.deletedFiles.add(a),delete r.manifest.assets[i];}await Pe(e,r);}async function Fi(e){try{let t=await M.readFile(y.join(e.outputDir,"asset-map.json"),"utf8");return JSON.parse(t)}catch{return {}}}async function Wi(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 M.mkdir(e,{recursive:true}),await Promise.all(t.map(async r=>{try{await M.unlink(y.join(e,r));}catch(n){if(n.code!=="ENOENT")throw n}}));}function Sn(e,t,r,n,s){let o=V(e,r,e.sourceOrigin,n,"manual-url");o&&(Ne(o)?bt(e,t,o.toString(),n,s):q(e,o)?W(e,t,o.toString(),n,s):Re(o)?Me(e,t,o.toString(),n,s):n.reject("manual-url",o.toString(),"not page/sitemap/asset-like",s));}async function zn(e=process.argv.slice(2)){let t=[],r=await rt(void 0,{onRemotePublisherConfigDiagnostic:S=>{t.push(S);}}),n=wr(r.sitemapPaths),s=t.at(-1)??null,o=Po(e),i=o.mode==="content-sync"?await $i(o.contentSyncPlanPath):null;if(o.resumeRewrite&&o.mode!=="full")throw new Error("--resume-rewrite is only supported for full crawl/publish jobs.");let u=[];o.mode==="retry-timeouts"&&(u=await Oi(r)),o.mode==="single-url"&&(u=await Mi(o.urls)),i&&(u=[...i.directRenderUrls,...i.archiveFamilyUrls,...i.resourceRenderUrls]);let a=o.crawlMode==="incremental"&&o.mode==="full",l=a&&typeof r.subscriptionType=="string"&&r.subscriptionType.trim()!=="";if(i&&r.subscriptionType!=="PROFESSIONAL"&&r.subscriptionType!=="AGENCY")throw new Error("Content-sync requires an active Professional or Agency subscription.");let d=(o.mode==="full"||o.mode==="single-url"||o.mode==="content-sync")&&!o.resumeRewrite,c=o.mode!=="full"||o.resumeRewrite||l,m=c?await Fi(r):{},h=l||o.mode==="single-url"||o.mode==="content-sync"?await Io(r):Cn(),f=new Set(u),b=new Set;if(i){for(let S of i.archiveFamilies)if(S.foundPosts===0)for(let $ of S.pageUrls)b.add($);for(let S of Object.keys(h.pages))ji(S,i)&&!f.has(S)&&(u.push(S),b.add(S));}let p={enabled:l,trackManifest:d,manifest:Xt(h),previousManifest:Xt(h),runId:i?.jobId??`${Date.now()}`,seenPages:new Set,changeTokenCache:new Map,pageChangeTokenPrimePromise:null,manifestSaveChain:Promise.resolve(),manifestPendingChanges:0,lastManifestSavedAt:Date.now(),strictTargeted:!!i,requiredUrls:f,deleteOnMissingUrls:b};await Wi(r.logDir);let g=new Ue(r.logDir,r.logLevel),w=o.remoteRender??r.remoteWorkers?.render?.enabled===true,k=rn({explicitPath:o.remoteWorkerConfigPath,runtimeDir:Ye()}),C=null,I=null,A=null,R=null,v=Math.max(1,r.concurrency),E=1,x=r.remoteWorkers?.rewrite?.enabled===true,z=r.remoteWorkers?.deploy?.enabled===true,L=w&&x&&z&&!o.resumeRewrite;if(!L&&o.mode==="full"&&!o.resumeRewrite&&await M.rm(gt(r),{force:true}),w&&!o.resumeRewrite||x){if(!k)throw new Error("Remote Lambda workers are enabled, but the runtime directory is unknown. Run through queue-runner with --runtime-dir, set STATIC_PUBLISHER_RUNTIME_DIR, or use --remote-worker-config for a diagnostic run.");let S=await Kr(k),$=false;if(A=new ct(S,{},{onProgress:O=>{g.progress(`Lambda ${O.operation} batch: ${O.completedItems+O.failedItems}/${O.totalItems}`,{remoteWorkerOperation:O.operation,remoteWorkerTaskId:O.taskId,remoteWorkerStatus:O.status,remoteWorkerCompletedItems:O.completedItems,remoteWorkerFailedItems:O.failedItems,remoteWorkerTotalItems:O.totalItems,remoteWorkerUpdatedAt:O.updatedAt});},onProgressError:O=>{$||($=true,g.warn("Lambda progress status could not be read; task execution continues.",{error:O.message}));}}),L){if(!S.functions.asset)throw new Error("Full Lambda delegation requires an asset worker. Redeploy the Lambda worker stack and reinstall remote-workers.json.");let O=c?await cn(r):null;R=on(`crawl-${ue(p.runId,40)}`,S,O),I=new mt({client:A,jobId:R.jobId,maxAttempts:2}),g.info("S3-native Lambda data plane is enabled.",{execution:"lambda",assetWorker:S.functions.asset,workspaceBucket:S.workspace.bucket,workspacePrefix:S.workspace.prefix});}}if(w&&!o.resumeRewrite){if(!A)throw new Error("Remote render worker client was not initialized.");v=Math.max(1,Math.min(100,L?r.concurrency:r.remoteWorkers?.render?.concurrency??r.concurrency)),E=Math.max(1,Math.min(20,r.remoteWorkers?.render?.batchSize??5)),C=new pt({client:A,jobId:`crawl-${ue(p.runId,40)}`,maxAttempts:r.remoteWorkers?.render?.maxAttempts??2,batchSize:E,maxConcurrentBatches:v,onRetry:S=>{g.warn(`Retrying remote render for ${S.url}`,{url:S.url,attempt:S.attempt,maxAttempts:S.maxAttempts,reason:S.reason,status:S.status,delayMs:S.delayMs,execution:"lambda"});}}),g.info("Lambda page rendering is enabled.",{remoteWorkerConfigPath:y.resolve(k),concurrency:v,maxAttempts:r.remoteWorkers?.render?.maxAttempts??2,batchSize:E,execution:"lambda"});}if(s){let S={status:s.status,virtualAssetBaseUrl:s.virtualAssetBaseUrl,subscriptionType:s.subscriptionType??null,error:s.error,requests:s.requests,source:"remote-publisher-config"};s.status==="loaded"&&s.subscriptionType?g.info("Loaded remote WP Suite publisher configuration.",S):g.warn("Remote WP Suite publisher configuration is unavailable or has no active subscription type.",S);}if(a&&!l){let S="Incremental crawl requires an active remote publisher subscription; refusing to fall back to a destructive full crawl.";throw g.error(S,{requestedMode:o.crawlMode,subscriptionType:r.subscriptionType??null,source:"incremental-subscription-guard"}),await g.flush(),new Error(S)}let P={pageQueue:[],queuedPages:new Set,donePages:new Set,savedPageOutputs:new Set,pageHttpAttempts:new Map,pageHttpFailures:new Map,pageDiscoverySources:new Map,assetQueue:[],queuedAssets:new Set,doneAssets:new Set,sitemapQueue:[],queuedSitemaps:new Set,doneSitemaps:new Set,successfulSitemaps:new Set,resolvedSitemapRoots:new Set,sitemapIndexUrls:new Set,sitemapLeafUrls:new Set,sitemapLastmodByPage:{},assetMap:{...m},assetVariantDigestsByOriginalPath:new Map,stats:{pagesQueued:0,pagesRendered:0,pagesCompleted:0,assetsQueued:0,sitemapsQueued:0,assetsSaved:0,pagesSaved:0}},j=Ao(),oe=new at,X=Ro();if(X&&!o.resumeRewrite&&await ut(X,oe.artifact()),await gr(r),await Ct(r,{startedAt:new Date().toISOString(),outputDir:y.resolve(r.outputDir)}),c||await M.rm(r.outputDir,{recursive:true,force:true}),await M.mkdir(r.outputDir,{recursive:true}),c||await Ct(r,{startedAt:new Date().toISOString(),outputDir:y.resolve(r.outputDir)}),i){let S=new Set([...i.deleteUrls,...p.deleteOnMissingUrls]);for(let O of i.deleteUrls)await Ze(r,p,j,O,S);let $=new Set(i.resourceDeleteUrls);for(let O of i.resourceDeleteUrls)await Ui(r,p,j,O,$);}if(o.resumeRewrite)g.info("Resuming final rewrite from existing output.",{phase:"rewrite-text",mode:o.mode,crawlMode:o.crawlMode});else {let S=await request.newContext({ignoreHTTPSErrors:r.ignoreHttpsErrors});try{if(g.mark("discovery"),o.mode==="full"?(n.forEach(O=>bt(r,P,O,g)),await gn(r,S,P,g,j,p),r.seedPaths.forEach(O=>Sn(r,P,O,g,"seed-path")),r.generated404RequestPath&&Me(r,P,r.generated404RequestPath,g,"generated-404-request-path")):(u.forEach(O=>Sn(r,P,O,g,"cli")),i?.sitemapUrls.forEach(O=>bt(r,P,O,g,"content-sync-impact")),await gn(r,S,P,g,j,p,o.mode==="content-sync",i?.sitemapUrls??[]),i&&await Di(r,P,p,j,i.sitemapUrls)),g.endMark("discovery",{pages:P.pageQueue.length,assets:P.assetQueue.length,sitemaps:P.sitemapQueue.length}),g.summary(`Queued ${P.pageQueue.length} pages, ${P.assetQueue.length} assets, ${P.sitemapQueue.length} sitemaps.`,{mode:o.mode,crawlMode:o.crawlMode,queuedPages:P.pageQueue.length,queuedAssets:P.assetQueue.length,queuedSitemaps:P.sitemapQueue.length}),o.mode==="retry-timeouts"&&P.pageQueue.length===0&&P.assetQueue.length===0&&P.sitemapQueue.length===0){g.summary("No timed-out URLs were queued. Skipping retry crawl.",{mode:o.mode,crawlMode:o.crawlMode,queuedPages:0,queuedAssets:0,queuedSitemaps:0}),await g.flush(),X&&await ut(X,oe.artifact());return}g.mark("render-pages");let $=Array.from({length:C?v*E:v},()=>C?ki(r,P,g,o.mode,S,p,j,oe,C,R??void 0):Ci(r,P,g,o.mode,S,p,j,oe));if(await Promise.all($),P.pageHttpFailures.size>0&&await g.flush(),Jr(P.pageHttpFailures),X&&await ut(X,oe.artifact()),g.endMark("render-pages",{pages:P.stats.pagesCompleted}),g.mark("download-assets"),g.progress("Asset download phase started.",{phase:"download-assets",doneAssets:P.doneAssets.size,assetsQueued:P.stats.assetsQueued,assetQueue:P.assetQueue.length}),R&&I?await hi(r,S,P,g,p,j,R,I,r.concurrency):(await ir(r,S,p,[...P.assetQueue],g),await mi(r,S,P,g,p,j)),g.endMark("download-assets",{assets:P.doneAssets.size}),p.enabled&&r.maxPages===0&&(await Lo(r,P,p,g,j),o.mode==="full"&&await Do(r,p,g,j)),o.mode==="full"){let O=await di(r,P,g);for(let N of O)if(G(j,r,N),R&&A){let J=St(r,N),Ae=await M.readFile(N),Ie=ce(N),$e=String(Gr.lookup(J)||"")||(Ie?"text/plain; charset=utf-8":"application/octet-stream"),tt=await A.writeWorkspaceObject({key:`${R.workspace.prefix}jobs/${R.jobId}/copied/${ue(J,40)}-${y.basename(J)}`,body:Ae,contentType:$e});De(R,{relativePath:J,sourceUrl:null,kind:"generated",contentType:tt.contentType,cacheControl:null,isText:Ie,object:tt}),Ie&&ne(j,N);}}}finally{await B("dispose crawl request context",Ke(r),()=>S.dispose()).catch($=>{g.warn("Timed out while disposing crawl request context",{error:String($)});});}}if(p.trackManifest&&await Pe(r,p,true),R)for(let S of j.deletedFiles)an(R,S);let ie=JSON.stringify(P.assetMap,null,2);if(await M.writeFile(y.join(r.outputDir,"asset-map.json"),ie,"utf8"),R&&A){let S=await A.writeWorkspaceObject({key:`${R.workspace.prefix}jobs/${R.jobId}/generated/asset-map.json`,body:ie,contentType:"application/json; charset=utf-8"});De(R,{relativePath:"asset-map.json",sourceUrl:null,kind:"generated",contentType:"application/json; charset=utf-8",cacheControl:r.s3.assetCacheControl,isText:true,object:S});}JSON.stringify(m,null,2)!==JSON.stringify(P.assetMap,null,2)&&G(j,r,y.join(r.outputDir,"asset-map.json")),R&&A&&await fi(r,j,R,A);let T=o.mode==="single-url"||o.mode==="content-sync"?Vo(r,P):p.enabled&&!o.resumeRewrite?Fo(r,p,j,m,P.assetMap):void 0;g.mark("rewrite-text");let F=o.mode==="single-url"||o.mode==="content-sync"?`Rewriting text files touched by URL crawl: 0/${T?.length??0}`:"Rewriting text files...";g.progress(F,{phase:"rewrite-text",index:0,totalFiles:T?.length,changedTextFiles:0}),await Kt(F);let D=Date.now(),Z={files:T,previousAssetMap:m,onStart:({totalFiles:S,workerCount:$})=>{g.info(`Rewrite phase scanning ${S} text files.`,{phase:"rewrite-text",totalFiles:S,workerCount:$});},onProgress:async({index:S,totalFiles:$,changedTextFiles:O,file:N,changed:J})=>{J&&G(j,r,y.join(r.outputDir,N)),g.checkpoint(`Rewriting text file ${S}/${$}`,{phase:"rewrite-text",index:S,totalFiles:$,changedTextFiles:O,file:N}),g.debug(`${J?"Rewrote":"Checked unchanged"} text file ${S}/${$}: ${N}`,{phase:"rewrite-text",index:S,totalFiles:$,changedTextFiles:O,file:N,changed:J});let Ae=Date.now();if(!(S===1||S===$||S%50===0||Ae-D>=5e3))return;D=Ae;let $e=`Rewriting text files: ${S}/${$}`;g.progress($e,{phase:"rewrite-text",index:S,totalFiles:$,changedTextFiles:O,file:N}),await Kt($e);}},K;if(R&&A){let S=T?.map(O=>St(r,y.isAbsolute(O)?O:y.join(r.outputDir,O))),$=Object.values(R.objects).filter(O=>O.isText&&(!S||S.includes(O.relativePath))).length;await Z.onStart?.({totalFiles:$,workerCount:Math.min(r.concurrency,$)}),K=await tn(r,R,P.assetMap,{client:A,jobId:R.jobId,concurrency:r.concurrency,batchSize:25,maxAttempts:2,...S?{relativePaths:S}:{},onProgress:Z.onProgress}),await un(r,R);}else x&&A?K=await en(r,P.assetMap,{client:A,jobId:`crawl-${ue(p.runId,40)}`,concurrency:r.remoteWorkers?.rewrite?.concurrency??r.rewriteConcurrency,batchSize:r.remoteWorkers?.rewrite?.batchSize??25,maxAttempts:r.remoteWorkers?.rewrite?.maxAttempts??2,onStageProgress:async({index:S,totalFiles:$,file:O})=>{let N=Date.now();if(S!==1&&S!==$&&S%25!==0&&N-D<5e3)return;D=N;let J=`Staging text files for Lambda rewrite: ${S}/${$}`;g.progress(J,{phase:"rewrite-stage",index:S,totalFiles:$,file:O,execution:"lambda"}),await Kt(J);},options:Z}):K=await Er(r,P.assetMap,Z);p.trackManifest&&(Wo(p,T),await Pe(r,p,true)),g.endMark("rewrite-text",{changedTextFiles:K});let _e=i?[...j.deletedFiles].sort():p.enabled&&!o.resumeRewrite?await No(r,P,p,j,g,R):[],et=[...new Set((T||[]).map(S=>Y(r.outputDir,y.isAbsolute(S)?S:y.join(r.outputDir,S))).filter(S=>S!==null))].sort();if(i){let S=[...j.changedFiles].sort(),$=new Set(S),O=new Set(i.directRenderUrls.map(U=>Qe(r,U,"page")).filter(U=>!!U&&$.has(U))),N=new Set(i.archiveFamilyUrls.map(U=>Qe(r,U,"page")).filter(U=>!!U&&$.has(U))),J=new Set(i.resourceRenderUrls.map(U=>Qe(r,U,"asset")).filter(U=>!!U&&$.has(U))),Ae=new Set([...P.sitemapLeafUrls].map(U=>Qe(r,U,"asset")).filter(U=>!!U&&$.has(U))),Ie=new Set([...P.sitemapIndexUrls].map(U=>Qe(r,U,"asset")).filter(U=>!!U&&$.has(U))),$e=new Set([...O,...N,...J,...Ae,...Ie]),tt=S.filter(U=>!$e.has(U)),Qn=[...new Set([...i.directRenderUrls,...i.archiveFamilyUrls,...P.resolvedSitemapRoots,...P.sitemapLeafUrls,...P.sitemapIndexUrls,...i.deleteUrls,...i.resourceRenderUrls,...i.resourceDeleteUrls].map(U=>{let cr=new URL(U);return `${cr.pathname}${cr.search}`}))].sort();await kt(r,{schemaVersion:2,generatedAt:new Date().toISOString(),outputDir:y.resolve(r.outputDir),runMode:"content-sync",crawlMode:"incremental",fullSyncRequired:false,changedFiles:S,deletedFiles:_e,rewriteTargets:et,revalidateFiles:[...j.revalidateFiles].sort(),consumerId:i.consumerId,fromSequence:i.fromSequence,toSequence:i.toSequence,impactHash:i.impactHash,resolvedSitemapUrls:[...P.resolvedSitemapRoots],uploadGroups:{assets:tt,content:[...O].sort(),listings:[...N].sort(),resources:[...J].sort(),sitemapLeaves:[...Ae].sort(),sitemapIndexes:[...Ie].reverse()},invalidationPaths:Qn});}else await kt(r,{schemaVersion:1,generatedAt:new Date().toISOString(),outputDir:y.resolve(r.outputDir),runMode:o.mode,crawlMode:o.crawlMode,fullSyncRequired:!(p.enabled&&!o.resumeRewrite),changedFiles:p.enabled&&!o.resumeRewrite?[...j.changedFiles].sort():[],deletedFiles:p.enabled&&!o.resumeRewrite?_e:[],rewriteTargets:p.enabled&&!o.resumeRewrite?et:[],revalidateFiles:[...j.revalidateFiles].sort()});await hr(r),g.summary(o.resumeRewrite?`Done. Resumed final rewrite over existing output and changed ${K} text files.`:`Done. Rendered ${P.stats.pagesRendered} pages, processed ${P.doneSitemaps.size} sitemaps and ${P.doneAssets.size} assets.`,{mode:o.mode,crawlMode:o.crawlMode,resumeRewrite:o.resumeRewrite,...P.stats,pagesRendered:P.stats.pagesRendered,donePages:P.stats.pagesCompleted,claimedPages:P.donePages.size,doneSitemaps:P.doneSitemaps.size,doneAssets:P.doneAssets.size,changedTextFiles:K}),await g.flush();}zn().catch(async e=>{let t=we(e instanceof Error?e.message:String(e));console.error(t);try{let n=(await rt().catch(()=>null))?.logDir??"logs",s=new Ue(n,"debug");s.error(`Unhandled error: ${t}`,e instanceof Error&&e.stack?{stack:we(e.stack)}:void 0),await s.flush();}catch{}process.exit(1);});
|