@smart-cloud/publisher-exporter 1.1.61 → 1.1.63

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/deploy.js CHANGED
@@ -1,6 +1,7 @@
1
- import D from'fs/promises';import Rt from'http';import Dt from'https';import b from'path';import {S3Client,HeadObjectCommand,GetObjectCommand,DeleteObjectsCommand,ListObjectsV2Command}from'@aws-sdk/client-s3';import {Upload}from'@aws-sdk/lib-storage';import Zt,{createHash}from'crypto';import tr from'fast-glob';import $r from'mime-types';import {availableParallelism}from'os';import {Worker}from'worker_threads';var Le=["/sitemap_index.xml","/wp-sitemap.xml","/sitemap.xml"];function Fe(t){let e=t.trim();return e==="."?".":e.replace(/\/$/,"")}function xt(t){let e=String(t??"").trim();if(!e)return "";let r=e;if(/^https?:\/\//i.test(r))try{r=new URL(r).pathname;}catch{return ""}if(r=r.split(/[?#]/,1)[0]?.replace(/\\/g,"/").trim()??"",!r)return "";let i=r.endsWith("/"),n=r.replace(/^\/+/,"").split("/").map(o=>o.replace(/[^A-Za-z0-9._-]/g,"")).filter(o=>o.length>0&&o!=="."&&o!=="..");if(n.length===0)return "";let s=`/${n.join("/")}`;return i&&b.extname(s)===""&&(s+="/"),s==="/"?"":s}function ye(t){return !t||typeof t!="object"?{}:Object.fromEntries(Object.entries(t).map(([e,r])=>[e.trim(),String(r??"")]).filter(([e])=>e.length>0))}function Tt(t){if(!t||typeof t!="object")return {};let e={};for(let[r,i]of Object.entries(t)){let n=r.trim();if(!n||!i||typeof i!="object")continue;let s=i,o={};if(typeof s.targetOrigin=="string"){let a=Fe(s.targetOrigin);a&&(o.targetOrigin=a);}let l=ye(s.extraReplacements);if(Object.keys(l).length>0&&(o.extraReplacements=l),s.s3&&typeof s.s3=="object"){let a={},c=s.s3;typeof c.bucket=="string"&&(a.bucket=c.bucket.trim()),typeof c.prefix=="string"&&(a.prefix=c.prefix.trim()),typeof c.region=="string"&&(a.region=c.region.trim()),typeof c.htmlCacheControl=="string"&&(a.htmlCacheControl=c.htmlCacheControl.trim()),typeof c.assetCacheControl=="string"&&(a.assetCacheControl=c.assetCacheControl.trim()),Object.keys(a).length>0&&(o.s3=a);}if(s.cloudFront&&typeof s.cloudFront=="object"){let a={},c=s.cloudFront;typeof c.distributionId=="string"&&(a.distributionId=c.distributionId.trim()),Array.isArray(c.invalidationPaths)&&(a.invalidationPaths=c.invalidationPaths.map(u=>String(u??"").trim()).filter(u=>u.length>0)),Object.keys(a).length>0&&(o.cloudFront=a);}e[n]=o;}return e}function be(t){return t==="PROFESSIONAL"||t==="AGENCY"?t:void 0}function Ct(t,e){if(!t||typeof t!="object")return null;let r=t,i=r.command;if(i!=="publish"&&i!=="crawl"&&i!=="deploy"&&i!=="invalidate"&&i!=="retry-timeouts"&&i!=="url"&&i!=="content-sync")return null;let n=Number.parseInt(String(r.intervalMinutes??"0"),10);if(!Number.isFinite(n)||n<1)return null;let s=String(r.id??`${i}-${e+1}`).trim();if(!s)return null;let o=String(r.deploymentProfile??"").trim(),l=String(r.url??"").trim(),a=Array.isArray(r.postTypes)?[...new Set(r.postTypes.map(u=>String(u??"").trim().toLowerCase().replace(/[^a-z0-9_-]/g,"")).filter(Boolean))]:[],c=Array.isArray(r.listingPaths)?[...new Set(r.listingPaths.map(u=>String(u??"").trim()).filter(Boolean))]:[];return i==="content-sync"&&a.length===0?null:{id:s,enabled:r.enabled!==false,command:i,intervalMinutes:n,...i==="publish"||i==="crawl"?{crawlMode:r.crawlMode==="incremental"?"incremental":"full"}:{},...(i==="publish"||i==="deploy"||i==="invalidate"||i==="content-sync")&&o?{deploymentProfile:o}:{},...l?{url:l}:{},...a.length>0?{postTypes:a}:{},...c.length>0?{listingPaths:c}:{},...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 je(t){let e=t&&typeof t=="object"?t:{},r=Array.isArray(e.rules)?e.rules.map((i,n)=>Ct(i,n)).filter(i=>!!i):[];return {enabled:e.enabled===true,timezone:typeof e.timezone=="string"&&e.timezone.trim()!==""?e.timezone.trim():"UTC",rules:r}}function $t(t){if(!t||typeof t!="object")return;let e=t,r={};for(let n of ["accountId","siteId"]){let s=e[n];typeof s=="string"&&s.trim()!==""&&(r[n]=s.trim());}let i=Number(e.lastUpdate??0);return Number.isFinite(i)&&i>0&&(r.lastUpdate=Math.floor(i)),e.subscriber===true&&(r.subscriber=true),Object.keys(r).length>0?r:void 0}function Pe(t){let e=t&&typeof t=="object"?t:{},r=String(e.accountId??"").trim(),i=String(e.siteId??"").trim(),n=e.subscriber===true,s=$t(e.siteSettings),o={...s??{},...r?{accountId:s?.accountId??r}:{},...i?{siteId:s?.siteId??i}:{},...s?.subscriber===true||n?{subscriber:true}:{}},l={},a=String(e.apiBase??"").trim();a&&(l.apiBase=a);let c=String(e.runtimeToken??e.nonce??"").trim();c&&(l.runtimeToken=c);let u=String(e.virtualAssetBaseUrl??e.uploadUrl??"").trim();u&&(l.virtualAssetBaseUrl=u),Object.keys(o).length>0&&(l.siteSettings=o);let m=be(e.subscriptionType);return m&&(l.subscriptionType=m),l}function Et(t){try{let e=new URL(t);globalThis.location=e;}catch{}}function _e(t){return typeof t=="string"?t:t instanceof URL?t.toString():t.url}function At(t,e){let r=new Headers(t instanceof Request?t.headers:void 0);if(e?.headers)for(let[i,n]of new Headers(e.headers).entries())r.set(i,n);return r}async function Ue(t,e,r=5){let i=new URL(_e(t)),n=String(e?.method??(t instanceof Request?t.method:"GET")).toUpperCase(),s=i.protocol==="http:"?Rt:Dt,o=At(t,e);return await new Promise((l,a)=>{let c=s.request(i,{method:n,headers:Object.fromEntries(o.entries()),...i.protocol==="https:"?{rejectUnauthorized:false}:{}},u=>{let m=[];u.on("data",p=>{m.push(Buffer.isBuffer(p)?p:Buffer.from(p));}),u.on("error",a),u.on("end",()=>{let p=u.statusCode??0,d=u.headers.location;if(r>0&&d&&[301,302,303,307,308].includes(p)){l(Ue(new URL(d,i),{method:p===303?"GET":n},r-1));return}let g=new Headers;for(let[w,C]of Object.entries(u.headers))Array.isArray(C)?g.set(w,C.join(", ")):typeof C=="string"&&g.set(w,C);l(new Response(Buffer.concat(m),{status:p,statusText:u.statusMessage??"",headers:g}));});});c.on("error",a),c.end();})}function kt(t){let e=Pe(t.wpsuite),r={...e.siteSettings??{},...e.siteSettings?.subscriber===true||e.subscriptionType==="PROFESSIONAL"||e.subscriptionType==="AGENCY"?{subscriber:true}:{}},i=String(r.accountId??"").trim(),n=String(r.siteId??"").trim(),s=String(e.virtualAssetBaseUrl??e.uploadUrl??"").trim();if(t.wpsuite={...e.apiBase?{apiBase:e.apiBase}:{},...e.runtimeToken?{runtimeToken:e.runtimeToken}:{},...s?{virtualAssetBaseUrl:s}:{},...Object.keys(r).length>0?{siteSettings:r}:{},...e.subscriptionType?{subscriptionType:e.subscriptionType}:{}},!i||!n||!s)return false;Et(t.sourceOrigin);let o=globalThis,a={...o.WpSuite??{},siteSettings:r,uploadUrl:s};return e.apiBase&&(a.apiBase=e.apiBase),o.WpSuite=a,true}async function Mt(t){let e=String(t.wpsuite?.virtualAssetBaseUrl??t.wpsuite?.uploadUrl??"").trim();if(!kt(t)){let n=t.wpsuite?.siteSettings,s=[String(n?.accountId??"").trim()?"":"accountId",String(n?.siteId??"").trim()?"":"siteId",e?"":"virtualAssetBaseUrl"].filter(Boolean);return {remote:null,diagnostic:{status:"invalid-runtime",virtualAssetBaseUrl:e,subscriptionType:null,error:`Missing WP Suite runtime field(s): ${s.join(", ")}.`,requests:[]}}}let r=globalThis.fetch,i=[];try{typeof r=="function"&&/^https?:\/\//i.test(e)&&(globalThis.fetch=(async(a,c)=>{let u=_e(a);if(u.startsWith(e)){let m=(()=>{try{return new URL(u).pathname}catch{return u}})();try{let p=t.ignoreHttpsErrors&&u.startsWith("https://")?await Ue(a,c):await r(a,c);return i.push({path:m,status:p.status,ok:p.ok,error:null}),p}catch(p){throw i.push({path:m,status:null,ok:!1,error:p instanceof Error?p.message:String(p)}),p}}return r(a,c)}));let{getConfig:n}=await import('@smart-cloud/wpsuite-core'),s=await n("publisher"),o=s&&typeof s=="object"?s:null,l=be(o?.subscriptionType);return {remote:o,diagnostic:{status:o?"loaded":"unavailable",virtualAssetBaseUrl:e,subscriptionType:l??null,error:o?null:"WP Suite publisher config loader returned no configuration.",requests:i}}}catch(n){return {remote:null,diagnostic:{status:"unavailable",virtualAssetBaseUrl:e,subscriptionType:null,error:n instanceof Error?n.message:String(n),requests:i}}}finally{typeof r=="function"&&(globalThis.fetch=r);}}function It(t,e){let r=Tt(e?.deploymentProfiles),i=String(e?.defaultDeploymentProfile??"").trim(),n=r[i]?i:"",s=be(e?.subscriptionType),o=Pe(t.wpsuite);return {...t,scheduler:je(e?.scheduler),deploymentProfiles:r,defaultDeploymentProfile:n,...s?{subscriptionType:s}:{},wpsuite:{...o,...o.siteSettings||s?{siteSettings:{...o.siteSettings??{},...o.siteSettings?.subscriber===true||s==="PROFESSIONAL"||s==="AGENCY"?{subscriber:true}:{}}}:{},...s?{subscriptionType:s}:{}}}}function we(t,e){let i=String(t||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!i)return e;let n=i.split("/").map(s=>s.trim()).filter(s=>s.length>0&&s!=="."&&s!=="..");return n.length>0?n.join("/"):e}function Lt(){let t=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return t.trim()?b.resolve(t):""}function Oe(t,e,r){let i=String(e||"").trim();return i&&b.isAbsolute(i)?b.resolve(i):b.resolve(t,we(i,r))}async function ie(t,e={}){let r=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",i=await D.readFile(r,"utf8"),n=JSON.parse(i);n.sourceOrigin=n.sourceOrigin.replace(/\/$/,""),n.targetOrigin=Fe(n.targetOrigin),n.ignoreHttpsErrors??=false,n.outputDir=String(n.outputDir||"export").trim()||"export",n.urlRewriteMode||=n.targetOrigin==="."?"relative":"absolute",n.noJavaScriptRenderPathPrefixes||=[],n.seedPaths||=[],n.generated404RequestPath=xt(n.generated404RequestPath),n.sitemapPaths||=[...Le],n.allowedAssetHosts||=[],n.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],n.blockedPathPrefixes||=[],n.blockedSearchFragments||=[],n.concurrency||=1,n.maxPages||=0,n.extraReplacements=ye(n.extraReplacements),n.postCrawlCopyMap=ye(n.postCrawlCopyMap),n.logDir=String(n.logDir||"logs").trim()||"logs",n.verbose??=false,n.logLevel||=n.verbose?"debug":"info",n.s3SyncMode||="sdk-upload-delete",n.readiness||={waitForSelector:null,waitForFunction:null,timeoutMs:1500,fallbackWaitMs:1500},n.readiness.timeoutMs??=1500,n.readiness.fallbackWaitMs??=1500,n.viewport||={width:1440,height:1200},n.navigationTimeoutMs||=3e4,n.assetDownloadConcurrency=Number(n.assetDownloadConcurrency)>0?Number(n.assetDownloadConcurrency):n.concurrency,n.rewriteConcurrency=Number(n.rewriteConcurrency)>0?Number(n.rewriteConcurrency):n.assetDownloadConcurrency,n.wpsuite=Pe(n.wpsuite),n.scheduler=je(void 0),n.deploymentProfiles={},n.defaultDeploymentProfile="",n.deploymentTargetOverride=String(n.deploymentTargetOverride??"").trim();let s=await Mt(n);e.onRemotePublisherConfigDiagnostic?.(s.diagnostic);let o=It(n,s.remote),l=Lt(),a=l?b.resolve(l,".."):"";return a?(o.outputDir=Oe(a,o.outputDir,"export"),o.logDir=Oe(a,o.logDir,"logs")):(b.isAbsolute(o.outputDir)||(o.outputDir=we(o.outputDir,"export")),b.isAbsolute(o.logDir)||(o.logDir=we(o.logDir,"logs"))),o}function Ot(t){let e=t/6e4;if(Number.isInteger(e)&&e>=1)return `${e} minute${e===1?"":"s"}`;let r=Math.ceil(t/1e3);return `${r} second${r===1?"":"s"}`}async function I(t,e,r){let i=new AbortController,n=globalThis.setTimeout(()=>{i.abort(new Error(`${t} timed out after ${Ot(e)}.`));},e);try{return await r({abortController:i,httpOptions:{abortSignal:i.signal,requestTimeout:e}})}finally{globalThis.clearTimeout(n);}}var Ft=".deploy-plan.json",jt="deploy-plan.json",_t=".crawl-incomplete.json",Ut="crawl-incomplete.json";function Ne(){let t=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return t.trim()?b.resolve(t):""}function Nt(t){let e=String(t||"").replace(/\\/g,"/").replace(/^\/+/,"").trim(),r=b.posix.normalize(e);return !e||!r||r==="."||/^[a-zA-Z]:/.test(r)||r.startsWith("../")||r===".."?null:r}function zt(t){let e=String(t||"").trim();if(!e.startsWith("/")||e.startsWith("//")||e.includes("*")||e.includes("#"))return null;try{let r=new URL(e,"https://content-sync.invalid");return r.origin!=="https://content-sync.invalid"?null:`${b.posix.normalize(r.pathname)}${r.search}`}catch{return null}}function k(t){return [...new Set(t.map(Nt).filter(e=>e!==null))]}function Wt(t,e){let r={generatedAt:String(e.generatedAt||new Date().toISOString()),outputDir:b.resolve(t.outputDir),runMode:e.runMode,crawlMode:e.crawlMode,fullSyncRequired:!!e.fullSyncRequired,changedFiles:k(e.changedFiles||[]),deletedFiles:k(e.deletedFiles||[]),rewriteTargets:k(e.rewriteTargets||[]),revalidateFiles:k(e.revalidateFiles||[])};return e.schemaVersion===2?{...r,schemaVersion:2,runMode:"content-sync",crawlMode:"incremental",fullSyncRequired:false,consumerId:String(e.consumerId||"").trim(),fromSequence:Math.max(0,Number(e.fromSequence)||0),toSequence:Math.max(0,Number(e.toSequence)||0),impactHash:String(e.impactHash||"").trim(),resolvedSitemapUrls:[...new Set((e.resolvedSitemapUrls||[]).map(i=>String(i||"").trim()).filter(i=>{try{let n=new URL(i);return n.protocol==="http:"||n.protocol==="https:"}catch{return false}}))],uploadGroups:{assets:k(e.uploadGroups?.assets||[]),content:k(e.uploadGroups?.content||[]),listings:k(e.uploadGroups?.listings||[]),resources:k(e.uploadGroups?.resources||[]),sitemapLeaves:k(e.uploadGroups?.sitemapLeaves||[]),sitemapIndexes:k(e.uploadGroups?.sitemapIndexes||[])},invalidationPaths:[...new Set((e.invalidationPaths||[]).map(zt).filter(i=>i!==null))].sort()}:{schemaVersion:1,...r,runMode:e.runMode}}function Bt(t){if(!t||typeof t!="object")return false;let e=t;if(e.schemaVersion===2){let r=e;return r.runMode==="content-sync"&&r.crawlMode==="incremental"&&r.fullSyncRequired===false&&typeof r.generatedAt=="string"&&typeof r.outputDir=="string"&&typeof r.consumerId=="string"&&r.consumerId.trim()!==""&&Number.isSafeInteger(r.fromSequence)&&Number.isSafeInteger(r.toSequence)&&Number(r.toSequence)>=Number(r.fromSequence)&&typeof r.impactHash=="string"&&/^[a-f0-9]{64}$/.test(r.impactHash)&&Array.isArray(r.resolvedSitemapUrls)&&Array.isArray(r.changedFiles)&&Array.isArray(r.deletedFiles)&&Array.isArray(r.rewriteTargets)&&(r.revalidateFiles===void 0||Array.isArray(r.revalidateFiles))&&!!r.uploadGroups&&Array.isArray(r.uploadGroups.assets)&&Array.isArray(r.uploadGroups.content)&&Array.isArray(r.uploadGroups.listings)&&Array.isArray(r.uploadGroups.resources)&&Array.isArray(r.uploadGroups.sitemapLeaves)&&Array.isArray(r.uploadGroups.sitemapIndexes)&&Array.isArray(r.invalidationPaths)}return e.schemaVersion===1&&typeof e.generatedAt=="string"&&typeof e.outputDir=="string"&&(e.runMode==="full"||e.runMode==="retry-timeouts"||e.runMode==="single-url")&&(e.crawlMode==="full"||e.crawlMode==="incremental")&&typeof e.fullSyncRequired=="boolean"&&Array.isArray(e.changedFiles)&&Array.isArray(e.deletedFiles)&&Array.isArray(e.rewriteTargets)&&(e.revalidateFiles===void 0||Array.isArray(e.revalidateFiles))}function ze(t){let e=b.join(b.resolve(t.outputDir),Ft),r=Ne();return r?[b.join(r,jt),e]:[e]}function qt(t){let e=b.join(b.resolve(t.outputDir),_t),r=Ne();return r?[b.join(r,Ut),e]:[e]}async function We(t){let e=b.resolve(t.outputDir);for(let r of ze(t))try{let i=await D.readFile(r,"utf8"),n=JSON.parse(i);if(!Bt(n)||b.resolve(n.outputDir)!==e)continue;return Wt(t,n)}catch{}return null}async function Be(t){for(let e of ze(t))try{await D.unlink(e);}catch(r){if(r.code!=="ENOENT")throw r}}async function qe(t){let e=b.resolve(t.outputDir);for(let r of qt(t)){let i;try{i=await D.readFile(r,"utf8");}catch(s){if(s.code==="ENOENT")continue;throw s}let n;try{n=JSON.parse(i);}catch{throw new Error(`Invalid incomplete crawl marker: ${r}`)}if(n.schemaVersion!==1||typeof n.startedAt!="string"||typeof n.outputDir!="string"||b.resolve(n.outputDir)!==e)throw new Error(`Invalid incomplete crawl marker: ${r}`);return {schemaVersion:1,startedAt:n.startedAt,outputDir:e}}return null}function Gt(t){return typeof t.subscriptionType=="string"&&t.subscriptionType.trim()!==""}function Ge(t){let e="";for(let i=0;i<t.length;i++){let n=t[i];if(n==="--profile"){let s=(t[i+1]||"").trim();if(!s)throw new Error("Missing value for --profile.");e=s,i+=1;}else if(n.startsWith("--profile=")){let s=n.slice(10).trim();if(!s)throw new Error("Missing value for --profile.");e=s;}}let r=String(process.env.PUBLISHER_DEPLOY_PROFILE||process.env.PUBLISHER_DEPLOYMENT_PROFILE||"").trim();return e||r||null}function Ht(t,e){return {...t,...e??{}}}function Kt(t,e){return {...t,...e??{},invalidationPaths:[...(e?.invalidationPaths??t.invalidationPaths)||[]]}}function He(t,e){let r=String(e??t.deploymentTargetOverride??"").trim();if(!Gt(t)){if(r)throw new Error(`Deployment target "${r}" requires an active WPSuite subscription and remote publisher config.`);return {name:null,profile:null,config:t}}let i=String(r||t.defaultDeploymentProfile||"").trim();if(!i)return {name:null,profile:null,config:t};let n=t.deploymentProfiles?.[i];if(!n)throw new Error(`Unknown deployment profile "${i}". Check the linked WPSuite publisher configuration.`);return {name:i,profile:n,config:{...t,targetOrigin:n.targetOrigin??t.targetOrigin,s3:Ht(t.s3,n.s3),cloudFront:Kt(t.cloudFront,n.cloudFront)}}}var Ke={error:0,warn:1,info:2,debug:3},Jt=/^(?:authorization|proxyAuthorization|runtimeToken|siteKey|nonce|accessToken|refreshToken|accessKeyId|secretAccessKey|sessionToken|xStaticPublisherToken|xApiKey)$/i;function te(t){return t.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 oe(t){return typeof t=="string"?te(t):Array.isArray(t)?t.map(e=>oe(e)):t instanceof Error?{name:t.name,message:te(t.message),...t.stack?{stack:te(t.stack)}:{}}:t&&typeof t=="object"?Object.fromEntries(Object.entries(t).map(([e,r])=>[e,Jt.test(e)?"[REDACTED]":oe(r)])):t}function Ye(t){return t?oe(t):void 0}var Je=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",se=Je?b.join(Je,"current-progress.json"):"",Ve=Promise.resolve();function Qe(t){return t.includes("crawl")?"crawl":t.includes("deploy")?"deploy":t.includes("invalidate")?"invalidate":t}function Vt(t,e){let r={...t},i=new Set(["pagesQueued","pagesRendered","assetsQueued","sitemapsQueued","pagesDiscovered","assetsDiscovered","sitemapsDiscovered","pagesSaved","assetsSaved","donePages","doneAssets","doneSitemaps","changedTextFiles","uploaded","failed","index","totalFiles","pageQueue","assetQueue","sitemapQueue"]);for(let[n,s]of Object.entries(e)){let o=r[n];if(typeof o=="number"&&typeof s=="number"&&i.has(n)){r[n]=Math.max(o,s);continue}r[n]=s;}return r}function Qt(t,e,r){se&&(Ve=Ve.then(async()=>{let i=new Date,n=i.toISOString();await D.mkdir(b.dirname(se),{recursive:true});let s=await D.readFile(se,"utf8").then(S=>JSON.parse(S)).catch(()=>null),o=s&&typeof s.details=="object"&&s.details?s.details:{},l=Qe(t),a=s?.currentStep||Qe(s?.source||""),c=s?.startedAt||n,u={...s?.stepDurationsSec??{}},m=s?.stepStartedAt||n;if(a&&a!==l&&s?.stepStartedAt){let S=Math.max(0,Math.round((i.getTime()-new Date(s.stepStartedAt).getTime())/1e3));u[a]=(u[a]??0)+S,m=n;}let p=Math.max(0,Math.round((i.getTime()-new Date(m).getTime())/1e3)),d=Math.max(0,Math.round((i.getTime()-new Date(c).getTime())/1e3)),g=te(e),w=Ye(r)??{},C={checkedAt:n,source:t,message:g,details:Vt(o,w),startedAt:c,currentStep:l,stepStartedAt:m,stepElapsedSec:p,totalElapsedSec:d,stepDurationsSec:u};await D.writeFile(se,JSON.stringify(C,null,2),"utf8");}).catch(()=>{}));}async function Yt(t,e){await D.mkdir(b.dirname(t),{recursive:true}),await D.appendFile(t,`${JSON.stringify(oe(e))}
2
- `,"utf8");}var K=class{constructor(e,r,i="info"){this.logDir=e;this.logFile=r;this.level=i;this.ensureLogFileReady();}logDir;logFile;level;startedAt=Date.now();marks=new Map;initPromise=null;writeQueue=Promise.resolve();writeError=null;get logPath(){return b.join(this.logDir,this.logFile)}artifactPath(e){return this.logFile.endsWith(".log.jsonl")?b.join(this.logDir,this.logFile.replace(/\.log\.jsonl$/u,`${e}.jsonl`)):b.join(this.logDir,`${this.logFile}${e}.jsonl`)}get errorsPath(){return this.artifactPath(".errors")}get rejectedPath(){return this.artifactPath(".rejected")}ensureLogFileReady(){return this.initPromise||(this.initPromise=(async()=>{await D.mkdir(this.logDir,{recursive:true}),await D.writeFile(this.logPath,"","utf8");})()),this.initPromise}enqueueTask(e){this.writeQueue=this.writeQueue.then(e).catch(r=>{this.writeError=r instanceof Error?r:new Error(String(r));});}enqueueLine(e){this.enqueueTask(async()=>{await this.ensureLogFileReady(),await D.appendFile(this.logPath,`${e}
3
- `,"utf8");});}enqueueJsonLine(e,r){this.enqueueTask(()=>Yt(e,r));}accepts(e){return Ke[e]<=Ke[this.level]}push(e,r,i){if(!this.accepts(e))return;let n=te(r),s=Ye(i),o=JSON.stringify({time:new Date().toISOString(),level:e,message:n,...s||{}});this.enqueueLine(o),e==="error"?console.error(`[ERROR] ${n}`,s?JSON.stringify(s):""):e==="warn"?console.warn(`[WARN] ${n}`,s?JSON.stringify(s):""):console.log(`[${e.toUpperCase().padEnd(5)}] ${n}`);}info(e,r){this.push("info",e,r);}progress(e,r){Qt(this.logFile,e,r);}debug(e,r){this.push("debug",e,r);}warn(e,r){this.push("warn",e,r);}reject(e,r,i,n,s){let o={kind:e,url:r,reason:i,...n?{source:n}:{},...s||{}};this.enqueueJsonLine(this.rejectedPath,o),this.accepts("debug")&&this.push("debug",`Rejected ${e} ${r}: ${i}`,o);}error(e,r){this.enqueueJsonLine(this.errorsPath,{message:e,...r||{}}),this.push("error",e,r);}mark(e){this.marks.set(e,Date.now());}endMark(e,r){let i=this.marks.get(e);if(!i)return;let n=Date.now()-i,s=Number((n/1e3).toFixed(2));this.push("info",`Timing ${e}: ${s}s`,{name:e,ms:n,seconds:s,...r||{}});}async flush(){let e=Date.now()-this.startedAt,r=Number((e/1e3).toFixed(2));if(this.push("info",`Total time: ${r}s`,{name:"total",ms:e,seconds:r}),await this.writeQueue,this.writeError)throw this.writeError}};async function Xt(t){await D.mkdir(b.dirname(t),{recursive:true});}async function et(t,e,r){await Xt(t);let i=b.join(b.dirname(t),`.${b.basename(t)}.${process.pid}.${Date.now()}.${Zt.randomBytes(6).toString("hex")}.tmp`);try{typeof e=="string"?await D.writeFile(i,e,r??"utf8"):await D.writeFile(i,e),await D.rename(i,t);}catch(n){throw await D.unlink(i).catch(()=>{}),n}}function tt(t){return [".html",".htm",".css",".js",".mjs",".json",".xml",".xsl",".txt",".svg",".map",".enc",".jws"].includes(b.extname(t).toLowerCase())}function rt(t){return t.replace(/&quot;/g,'"').replace(/&#34;/g,'"').replace(/&apos;/g,"'").replace(/&#39;/g,"'").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">")}function J(t){return t.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function ae(t){return t.replace(/\//g,"\\/")}function Ze(t){return t.replace(/\//g,"\\\\/")}function er(t){try{let e=new URL(t);if(e.protocol!=="http:"&&e.protocol!=="https:")return null;let r=e.pathname==="/"&&!e.search&&!e.hash?"":`${e.pathname}${e.search}${e.hash}`;return `//${e.host}${r}`}catch{return null}}function Xe(t,e,r){if(!e)return;t[e]=r;let i=ae(e),n=ae(r);t[i]=n;let s=Ze(e),o=Ze(r);t[s]=o;let l=J(e),a=J(r);t[l]=a;let c=J(i),u=J(n);t[c]=u;let m=J(s),p=J(o);t[m]=p;}function le(t,e,r){Xe(t,e,r);let i=er(e);i&&i!==e&&Xe(t,i,r);}function nt(t,e){try{return new URL(t,e==="."?"https://relative.invalid":e).pathname}catch{return t.startsWith("/")?t:`/${t.replace(/^\.\//,"")}`}}function it(t,e,r){if(!e)return r;let i=b.dirname(b.resolve(e)),n=b.resolve(t,r.replace(/^\/+/,"")),s=b.relative(i,n).replace(/\\/g,"/");return s?(s.startsWith(".")||(s=`./${s}`),s):"."}var sr=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],or=new Set([".html",".htm"]),st="WPSuite.io Static Publisher",ar=st.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function lr(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function ur(t){return t.startsWith("//")||t.startsWith("\\/\\/")||t.startsWith("\\\\/\\\\/")}function cr(t,e,r){return ur(e)?t.replace(new RegExp(`(?<!:)${lr(e)}`,"g"),r):t.split(e).join(r)}function gr(t,e,r){if(t.wpsuite?.siteSettings?.subscriber===true||t.wpsuite?.subscriptionType==="PROFESSIONAL"||t.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let n=b.extname(r).toLowerCase();return or.has(n)?/<head\b|<html\b|<!doctype html/i.test(e):false}function pr(t){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${ar}\\2)[^>]*\\/?>`,"i").test(t))return t;let e=`<meta name="generator" content="${st}" />`;if(t.match(/(\r?\n)([ \t]*)<\/head>/i))return t.replace(/(\r?\n)([ \t]*)<\/head>/i,`$1$2${e}$1$2</head>`);let i=t.includes(`\r
1
+ import D,{readFile}from'fs/promises';import qt from'http';import Ht from'https';import k from'path';import {S3Client,GetObjectCommand,PutObjectCommand,HeadObjectCommand,DeleteObjectsCommand,ListObjectsV2Command}from'@aws-sdk/client-s3';import {Upload}from'@aws-sdk/lib-storage';import Pr,{createHash}from'crypto';import xr from'fast-glob';import Ot from'mime-types';import {availableParallelism}from'os';import {Worker}from'worker_threads';import {LambdaClient,InvokeCommand}from'@aws-sdk/client-lambda';import {fromTemporaryCredentials}from'@aws-sdk/credential-providers';var Ye=["/sitemap_index.xml","/wp-sitemap.xml","/sitemap.xml"];function Xe(t){let e=t.trim();return e==="."?".":e.replace(/\/$/,"")}function Jt(t){let e=String(t??"").trim();if(!e)return "";let r=e;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("/"),o=r.replace(/^\/+/,"").split("/").map(s=>s.replace(/[^A-Za-z0-9._-]/g,"")).filter(s=>s.length>0&&s!=="."&&s!=="..");if(o.length===0)return "";let i=`/${o.join("/")}`;return n&&k.extname(i)===""&&(i+="/"),i==="/"?"":i}function Oe(t){return !t||typeof t!="object"?{}:Object.fromEntries(Object.entries(t).map(([e,r])=>[e.trim(),String(r??"")]).filter(([e])=>e.length>0))}function Gt(t){if(!t||typeof t!="object")return {};let e={};for(let[r,n]of Object.entries(t)){let o=r.trim();if(!o||!n||typeof n!="object")continue;let i=n,s={};if(typeof i.targetOrigin=="string"){let l=Xe(i.targetOrigin);l&&(s.targetOrigin=l);}let a=Oe(i.extraReplacements);if(Object.keys(a).length>0&&(s.extraReplacements=a),i.s3&&typeof i.s3=="object"){let l={},c=i.s3;typeof c.bucket=="string"&&(l.bucket=c.bucket.trim()),typeof c.prefix=="string"&&(l.prefix=c.prefix.trim()),typeof c.region=="string"&&(l.region=c.region.trim()),typeof c.htmlCacheControl=="string"&&(l.htmlCacheControl=c.htmlCacheControl.trim()),typeof c.assetCacheControl=="string"&&(l.assetCacheControl=c.assetCacheControl.trim()),Object.keys(l).length>0&&(s.s3=l);}if(i.cloudFront&&typeof i.cloudFront=="object"){let l={},c=i.cloudFront;typeof c.distributionId=="string"&&(l.distributionId=c.distributionId.trim()),Array.isArray(c.invalidationPaths)&&(l.invalidationPaths=c.invalidationPaths.map(u=>String(u??"").trim()).filter(u=>u.length>0)),Object.keys(l).length>0&&(s.cloudFront=l);}e[o]=s;}return e}function je(t){return t==="PROFESSIONAL"||t==="AGENCY"?t:void 0}function Qt(t,e){if(!t||typeof t!="object")return null;let r=t,n=r.command;if(n!=="publish"&&n!=="crawl"&&n!=="deploy"&&n!=="invalidate"&&n!=="retry-timeouts"&&n!=="url"&&n!=="content-sync")return null;let o=Number.parseInt(String(r.intervalMinutes??"0"),10);if(!Number.isFinite(o)||o<1)return null;let i=String(r.id??`${n}-${e+1}`).trim();if(!i)return null;let s=String(r.deploymentProfile??"").trim(),a=String(r.url??"").trim(),l=Array.isArray(r.postTypes)?[...new Set(r.postTypes.map(u=>String(u??"").trim().toLowerCase().replace(/[^a-z0-9_-]/g,"")).filter(Boolean))]:[],c=Array.isArray(r.listingPaths)?[...new Set(r.listingPaths.map(u=>String(u??"").trim()).filter(Boolean))]:[];return n==="content-sync"&&l.length===0?null:{id:i,enabled:r.enabled!==false,command:n,intervalMinutes:o,...n==="publish"||n==="crawl"?{crawlMode:r.crawlMode==="incremental"?"incremental":"full"}:{},...(n==="publish"||n==="deploy"||n==="invalidate"||n==="content-sync")&&s?{deploymentProfile:s}:{},...a?{url:a}:{},...l.length>0?{postTypes:l}:{},...c.length>0?{listingPaths:c}:{},...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 et(t){let e=t&&typeof t=="object"?t:{},r=Array.isArray(e.rules)?e.rules.map((n,o)=>Qt(n,o)).filter(n=>!!n):[];return {enabled:e.enabled===true,timezone:typeof e.timezone=="string"&&e.timezone.trim()!==""?e.timezone.trim():"UTC",rules:r}}function Yt(t){let e=t&&typeof t=="object"?t:{},r=e.render&&typeof e.render=="object"?e.render:{},n=Number(r.concurrency??0),o=Number(r.maxAttempts??0),i=e.rewrite&&typeof e.rewrite=="object"?e.rewrite:{},s=e.deploy&&typeof e.deploy=="object"?e.deploy:{},a=(l,c)=>({enabled:typeof l.enabled=="boolean"?l.enabled:r.enabled===true,concurrency:Math.min(100,Math.max(1,Number(l.concurrency||c.concurrency))),batchSize:Math.min(500,Math.max(1,Number(l.batchSize||c.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}:{},...Number.isInteger(o)&&o>0?{maxAttempts:Math.min(5,o)}:{}},rewrite:a(i,{concurrency:8,batchSize:25}),deploy:a(s,{concurrency:8,batchSize:50})}}function Zt(t){if(!t||typeof t!="object")return;let e=t,r={};for(let o of ["accountId","siteId"]){let i=e[o];typeof i=="string"&&i.trim()!==""&&(r[o]=i.trim());}let n=Number(e.lastUpdate??0);return Number.isFinite(n)&&n>0&&(r.lastUpdate=Math.floor(n)),e.subscriber===true&&(r.subscriber=true),Object.keys(r).length>0?r:void 0}function Le(t){let e=t&&typeof t=="object"?t:{},r=String(e.accountId??"").trim(),n=String(e.siteId??"").trim(),o=e.subscriber===true,i=Zt(e.siteSettings),s={...i??{},...r?{accountId:i?.accountId??r}:{},...n?{siteId:i?.siteId??n}:{},...i?.subscriber===true||o?{subscriber:true}:{}},a={},l=String(e.apiBase??"").trim();l&&(a.apiBase=l);let c=String(e.runtimeToken??e.nonce??"").trim();c&&(a.runtimeToken=c);let u=String(e.virtualAssetBaseUrl??e.uploadUrl??"").trim();u&&(a.virtualAssetBaseUrl=u),Object.keys(s).length>0&&(a.siteSettings=s);let g=je(e.subscriptionType);return g&&(a.subscriptionType=g),a}function Xt(t){try{let e=new URL(t);globalThis.location=e;}catch{}}function tt(t){return typeof t=="string"?t:t instanceof URL?t.toString():t.url}function er(t,e){let r=new Headers(t instanceof Request?t.headers:void 0);if(e?.headers)for(let[n,o]of new Headers(e.headers).entries())r.set(n,o);return r}async function rt(t,e,r=5){let n=new URL(tt(t)),o=String(e?.method??(t instanceof Request?t.method:"GET")).toUpperCase(),i=n.protocol==="http:"?qt:Ht,s=er(t,e);return await new Promise((a,l)=>{let c=i.request(n,{method:o,headers:Object.fromEntries(s.entries()),...n.protocol==="https:"?{rejectUnauthorized:false}:{}},u=>{let g=[];u.on("data",d=>{g.push(Buffer.isBuffer(d)?d:Buffer.from(d));}),u.on("error",l),u.on("end",()=>{let d=u.statusCode??0,w=u.headers.location;if(r>0&&w&&[301,302,303,307,308].includes(d)){a(rt(new URL(w,n),{method:d===303?"GET":o},r-1));return}let b=new Headers;for(let[v,S]of Object.entries(u.headers))Array.isArray(S)?b.set(v,S.join(", ")):typeof S=="string"&&b.set(v,S);a(new Response(Buffer.concat(g),{status:d,statusText:u.statusMessage??"",headers:b}));});});c.on("error",l),c.end();})}function tr(t){let e=Le(t.wpsuite),r={...e.siteSettings??{},...e.siteSettings?.subscriber===true||e.subscriptionType==="PROFESSIONAL"||e.subscriptionType==="AGENCY"?{subscriber:true}:{}},n=String(r.accountId??"").trim(),o=String(r.siteId??"").trim(),i=String(e.virtualAssetBaseUrl??e.uploadUrl??"").trim();if(t.wpsuite={...e.apiBase?{apiBase:e.apiBase}:{},...e.runtimeToken?{runtimeToken:e.runtimeToken}:{},...i?{virtualAssetBaseUrl:i}:{},...Object.keys(r).length>0?{siteSettings:r}:{},...e.subscriptionType?{subscriptionType:e.subscriptionType}:{}},!n||!o||!i)return false;Xt(t.sourceOrigin);let s=globalThis,l={...s.WpSuite??{},siteSettings:r,uploadUrl:i};return e.apiBase&&(l.apiBase=e.apiBase),s.WpSuite=l,true}async function rr(t){let e=String(t.wpsuite?.virtualAssetBaseUrl??t.wpsuite?.uploadUrl??"").trim();if(!tr(t)){let o=t.wpsuite?.siteSettings,i=[String(o?.accountId??"").trim()?"":"accountId",String(o?.siteId??"").trim()?"":"siteId",e?"":"virtualAssetBaseUrl"].filter(Boolean);return {remote:null,diagnostic:{status:"invalid-runtime",virtualAssetBaseUrl:e,subscriptionType:null,error:`Missing WP Suite runtime field(s): ${i.join(", ")}.`,requests:[]}}}let r=globalThis.fetch,n=[];try{typeof r=="function"&&/^https?:\/\//i.test(e)&&(globalThis.fetch=(async(l,c)=>{let u=tt(l);if(u.startsWith(e)){let g=(()=>{try{return new URL(u).pathname}catch{return u}})();try{let d=t.ignoreHttpsErrors&&u.startsWith("https://")?await rt(l,c):await r(l,c);return n.push({path:g,status:d.status,ok:d.ok,error:null}),d}catch(d){throw n.push({path:g,status:null,ok:!1,error:d instanceof Error?d.message:String(d)}),d}}return r(l,c)}));let{getConfig:o}=await import('@smart-cloud/wpsuite-core'),i=await o("publisher"),s=i&&typeof i=="object"?i:null,a=je(s?.subscriptionType);return {remote:s,diagnostic:{status:s?"loaded":"unavailable",virtualAssetBaseUrl:e,subscriptionType:a??null,error:s?null:"WP Suite publisher config loader returned no configuration.",requests:n}}}catch(o){return {remote:null,diagnostic:{status:"unavailable",virtualAssetBaseUrl:e,subscriptionType:null,error:o instanceof Error?o.message:String(o),requests:n}}}finally{typeof r=="function"&&(globalThis.fetch=r);}}function nr(t,e){let r=Gt(e?.deploymentProfiles),n=String(e?.defaultDeploymentProfile??"").trim(),o=r[n]?n:"",i=je(e?.subscriptionType),s=Le(t.wpsuite);return {...t,scheduler:et(e?.scheduler),deploymentProfiles:r,defaultDeploymentProfile:o,...i?{subscriptionType:i}:{},wpsuite:{...s,...s.siteSettings||i?{siteSettings:{...s.siteSettings??{},...s.siteSettings?.subscriber===true||i==="PROFESSIONAL"||i==="AGENCY"?{subscriber:true}:{}}}:{},...i?{subscriptionType:i}:{}}}}function Me(t,e){let n=String(t||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!n)return e;let o=n.split("/").map(i=>i.trim()).filter(i=>i.length>0&&i!=="."&&i!=="..");return o.length>0?o.join("/"):e}function or(){let t=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return t.trim()?k.resolve(t):""}function Ze(t,e,r){let n=String(e||"").trim();return n&&k.isAbsolute(n)?k.resolve(n):k.resolve(t,Me(n,r))}async function we(t,e={}){let r=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",n=await D.readFile(r,"utf8"),o=JSON.parse(n);o.sourceOrigin=o.sourceOrigin.replace(/\/$/,""),o.targetOrigin=Xe(o.targetOrigin),o.ignoreHttpsErrors??=false,o.outputDir=String(o.outputDir||"export").trim()||"export",o.urlRewriteMode||=o.targetOrigin==="."?"relative":"absolute",o.noJavaScriptRenderPathPrefixes||=[],o.seedPaths||=[],o.generated404RequestPath=Jt(o.generated404RequestPath),o.sitemapPaths||=[...Ye],o.allowedAssetHosts||=[],o.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],o.blockedPathPrefixes||=[],o.blockedSearchFragments||=[],o.concurrency||=1,o.maxPages||=0,o.extraReplacements=Oe(o.extraReplacements),o.postCrawlCopyMap=Oe(o.postCrawlCopyMap),o.logDir=String(o.logDir||"logs").trim()||"logs",o.verbose??=false,o.logLevel||=o.verbose?"debug":"info",o.s3SyncMode||="sdk-upload-delete",o.readiness||={waitForSelector:null,waitForFunction:null,timeoutMs:1500,fallbackWaitMs:1500},o.readiness.timeoutMs??=1500,o.readiness.fallbackWaitMs??=1500,o.viewport||={width:1440,height:1200},o.navigationTimeoutMs||=3e4,o.assetDownloadConcurrency=Number(o.assetDownloadConcurrency)>0?Number(o.assetDownloadConcurrency):o.concurrency,o.rewriteConcurrency=Number(o.rewriteConcurrency)>0?Number(o.rewriteConcurrency):o.assetDownloadConcurrency,o.wpsuite=Le(o.wpsuite),o.scheduler=et(void 0),o.remoteWorkers=Yt(o.remoteWorkers),o.deploymentProfiles={},o.defaultDeploymentProfile="",o.deploymentTargetOverride=String(o.deploymentTargetOverride??"").trim();let i=await rr(o);e.onRemotePublisherConfigDiagnostic?.(i.diagnostic);let s=nr(o,i.remote),a=or(),l=a?k.resolve(a,".."):"";return l?(s.outputDir=Ze(l,s.outputDir,"export"),s.logDir=Ze(l,s.logDir,"logs")):(k.isAbsolute(s.outputDir)||(s.outputDir=Me(s.outputDir,"export")),k.isAbsolute(s.logDir)||(s.logDir=Me(s.logDir,"logs"))),s}function ir(t){let e=t/6e4;if(Number.isInteger(e)&&e>=1)return `${e} minute${e===1?"":"s"}`;let r=Math.ceil(t/1e3);return `${r} second${r===1?"":"s"}`}async function B(t,e,r){let n=new AbortController,o=globalThis.setTimeout(()=>{n.abort(new Error(`${t} timed out after ${ir(e)}.`));},e);try{return await r({abortController:n,httpOptions:{abortSignal:n.signal,requestTimeout:e}})}finally{globalThis.clearTimeout(o);}}var sr=".deploy-plan.json",ar="deploy-plan.json",lr=".crawl-incomplete.json",cr="crawl-incomplete.json";function nt(){let t=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return t.trim()?k.resolve(t):""}function ur(t){let e=String(t||"").replace(/\\/g,"/").replace(/^\/+/,"").trim(),r=k.posix.normalize(e);return !e||!r||r==="."||/^[a-zA-Z]:/.test(r)||r.startsWith("../")||r===".."?null:r}function pr(t){let e=String(t||"").trim();if(!e.startsWith("/")||e.startsWith("//")||e.includes("*")||e.includes("#"))return null;try{let r=new URL(e,"https://content-sync.invalid");return r.origin!=="https://content-sync.invalid"?null:`${k.posix.normalize(r.pathname)}${r.search}`}catch{return null}}function V(t){return [...new Set(t.map(ur).filter(e=>e!==null))]}function dr(t,e){let r={generatedAt:String(e.generatedAt||new Date().toISOString()),outputDir:k.resolve(t.outputDir),runMode:e.runMode,crawlMode:e.crawlMode,fullSyncRequired:!!e.fullSyncRequired,changedFiles:V(e.changedFiles||[]),deletedFiles:V(e.deletedFiles||[]),rewriteTargets:V(e.rewriteTargets||[]),revalidateFiles:V(e.revalidateFiles||[])};return e.schemaVersion===2?{...r,schemaVersion:2,runMode:"content-sync",crawlMode:"incremental",fullSyncRequired:false,consumerId:String(e.consumerId||"").trim(),fromSequence:Math.max(0,Number(e.fromSequence)||0),toSequence:Math.max(0,Number(e.toSequence)||0),impactHash:String(e.impactHash||"").trim(),resolvedSitemapUrls:[...new Set((e.resolvedSitemapUrls||[]).map(n=>String(n||"").trim()).filter(n=>{try{let o=new URL(n);return o.protocol==="http:"||o.protocol==="https:"}catch{return false}}))],uploadGroups:{assets:V(e.uploadGroups?.assets||[]),content:V(e.uploadGroups?.content||[]),listings:V(e.uploadGroups?.listings||[]),resources:V(e.uploadGroups?.resources||[]),sitemapLeaves:V(e.uploadGroups?.sitemapLeaves||[]),sitemapIndexes:V(e.uploadGroups?.sitemapIndexes||[])},invalidationPaths:[...new Set((e.invalidationPaths||[]).map(pr).filter(n=>n!==null))].sort()}:{schemaVersion:1,...r,runMode:e.runMode}}function gr(t){if(!t||typeof t!="object")return false;let e=t;if(e.schemaVersion===2){let r=e;return r.runMode==="content-sync"&&r.crawlMode==="incremental"&&r.fullSyncRequired===false&&typeof r.generatedAt=="string"&&typeof r.outputDir=="string"&&typeof r.consumerId=="string"&&r.consumerId.trim()!==""&&Number.isSafeInteger(r.fromSequence)&&Number.isSafeInteger(r.toSequence)&&Number(r.toSequence)>=Number(r.fromSequence)&&typeof r.impactHash=="string"&&/^[a-f0-9]{64}$/.test(r.impactHash)&&Array.isArray(r.resolvedSitemapUrls)&&Array.isArray(r.changedFiles)&&Array.isArray(r.deletedFiles)&&Array.isArray(r.rewriteTargets)&&(r.revalidateFiles===void 0||Array.isArray(r.revalidateFiles))&&!!r.uploadGroups&&Array.isArray(r.uploadGroups.assets)&&Array.isArray(r.uploadGroups.content)&&Array.isArray(r.uploadGroups.listings)&&Array.isArray(r.uploadGroups.resources)&&Array.isArray(r.uploadGroups.sitemapLeaves)&&Array.isArray(r.uploadGroups.sitemapIndexes)&&Array.isArray(r.invalidationPaths)}return e.schemaVersion===1&&typeof e.generatedAt=="string"&&typeof e.outputDir=="string"&&(e.runMode==="full"||e.runMode==="retry-timeouts"||e.runMode==="single-url")&&(e.crawlMode==="full"||e.crawlMode==="incremental")&&typeof e.fullSyncRequired=="boolean"&&Array.isArray(e.changedFiles)&&Array.isArray(e.deletedFiles)&&Array.isArray(e.rewriteTargets)&&(e.revalidateFiles===void 0||Array.isArray(e.revalidateFiles))}function ot(t){let e=k.join(k.resolve(t.outputDir),sr),r=nt();return r?[k.join(r,ar),e]:[e]}function mr(t){let e=k.join(k.resolve(t.outputDir),lr),r=nt();return r?[k.join(r,cr),e]:[e]}async function it(t){let e=k.resolve(t.outputDir);for(let r of ot(t))try{let n=await D.readFile(r,"utf8"),o=JSON.parse(n);if(!gr(o)||k.resolve(o.outputDir)!==e)continue;return dr(t,o)}catch{}return null}async function _e(t){for(let e of ot(t))try{await D.unlink(e);}catch(r){if(r.code!=="ENOENT")throw r}}async function st(t){let e=k.resolve(t.outputDir);for(let r of mr(t)){let n;try{n=await D.readFile(r,"utf8");}catch(i){if(i.code==="ENOENT")continue;throw i}let o;try{o=JSON.parse(n);}catch{throw new Error(`Invalid incomplete crawl marker: ${r}`)}if(o.schemaVersion!==1||typeof o.startedAt!="string"||typeof o.outputDir!="string"||k.resolve(o.outputDir)!==e)throw new Error(`Invalid incomplete crawl marker: ${r}`);return {schemaVersion:1,startedAt:o.startedAt,outputDir:e}}return null}function fr(t){return typeof t.subscriptionType=="string"&&t.subscriptionType.trim()!==""}function at(t){let e="";for(let n=0;n<t.length;n++){let o=t[n];if(o==="--profile"){let i=(t[n+1]||"").trim();if(!i)throw new Error("Missing value for --profile.");e=i,n+=1;}else if(o.startsWith("--profile=")){let i=o.slice(10).trim();if(!i)throw new Error("Missing value for --profile.");e=i;}}let r=String(process.env.PUBLISHER_DEPLOY_PROFILE||process.env.PUBLISHER_DEPLOYMENT_PROFILE||"").trim();return e||r||null}function hr(t,e){return {...t,...e??{}}}function yr(t,e){return {...t,...e??{},invalidationPaths:[...(e?.invalidationPaths??t.invalidationPaths)||[]]}}function lt(t,e){let r=String(e??t.deploymentTargetOverride??"").trim();if(!fr(t)){if(r)throw new Error(`Deployment target "${r}" requires an active WPSuite subscription and remote publisher config.`);return {name:null,profile:null,config:t}}let n=String(r||t.defaultDeploymentProfile||"").trim();if(!n)return {name:null,profile:null,config:t};let o=t.deploymentProfiles?.[n];if(!o)throw new Error(`Unknown deployment profile "${n}". Check the linked WPSuite publisher configuration.`);return {name:n,profile:o,config:{...t,targetOrigin:o.targetOrigin??t.targetOrigin,s3:hr(t.s3,o.s3),cloudFront:yr(t.cloudFront,o.cloudFront)}}}var ct={error:0,warn:1,info:2,debug:3},wr=/^(?:authorization|proxyAuthorization|runtimeToken|siteKey|nonce|accessToken|refreshToken|accessKeyId|secretAccessKey|sessionToken|xStaticPublisherToken|xApiKey)$/i;function de(t){return t.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 Re(t){return typeof t=="string"?de(t):Array.isArray(t)?t.map(e=>Re(e)):t instanceof Error?{name:t.name,message:de(t.message),...t.stack?{stack:de(t.stack)}:{}}:t&&typeof t=="object"?Object.fromEntries(Object.entries(t).map(([e,r])=>[e,wr.test(e)?"[REDACTED]":Re(r)])):t}function gt(t){return t?Re(t):void 0}var ut=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",be=ut?k.join(ut,"current-progress.json"):"",pt=Promise.resolve();function dt(t){return t.includes("crawl")?"crawl":t.includes("deploy")?"deploy":t.includes("invalidate")?"invalidate":t}function br(t,e){let r={...t},n=typeof t.phase=="string"?t.phase.trim():"",o=typeof e.phase=="string"?e.phase.trim():"";if(o!==""&&(o==="deploy"||o.startsWith("deploy-"))&&n!==o)for(let a of ["index","totalFiles","staged","uploaded","skipped","failed","deleted","workerCount","completedBatches","totalBatches"])delete r[a];let s=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[a,l]of Object.entries(e)){let c=r[a];if(typeof c=="number"&&typeof l=="number"&&s.has(a)){r[a]=Math.max(c,l);continue}r[a]=l;}return r}function Rr(t,e,r){be&&(pt=pt.then(async()=>{let n=new Date,o=n.toISOString();await D.mkdir(k.dirname(be),{recursive:true});let i=await D.readFile(be,"utf8").then(E=>JSON.parse(E)).catch(()=>null),s=i&&typeof i.details=="object"&&i.details?i.details:{},a=dt(t),l=i?.currentStep||dt(i?.source||""),c=i?.startedAt||o,u={...i?.stepDurationsSec??{}},g=i?.stepStartedAt||o;if(l&&l!==a&&i?.stepStartedAt){let E=Math.max(0,Math.round((n.getTime()-new Date(i.stepStartedAt).getTime())/1e3));u[l]=(u[l]??0)+E,g=o;}let d=Math.max(0,Math.round((n.getTime()-new Date(g).getTime())/1e3)),w=Math.max(0,Math.round((n.getTime()-new Date(c).getTime())/1e3)),b=de(e),v=gt(r)??{},S={checkedAt:o,source:t,message:b,details:br(s,v),startedAt:c,currentStep:a,stepStartedAt:g,stepElapsedSec:d,totalElapsedSec:w,stepDurationsSec:u};await D.writeFile(be,JSON.stringify(S,null,2),"utf8");}).catch(()=>{}));}async function Sr(t,e){await D.mkdir(k.dirname(t),{recursive:true}),await D.appendFile(t,`${JSON.stringify(Re(e))}
2
+ `,"utf8");}var ie=class{constructor(e,r,n="info"){this.logDir=e;this.logFile=r;this.level=n;this.ensureLogFileReady();}logDir;logFile;level;startedAt=Date.now();marks=new Map;initPromise=null;writeQueue=Promise.resolve();writeError=null;get logPath(){return k.join(this.logDir,this.logFile)}artifactPath(e){return this.logFile.endsWith(".log.jsonl")?k.join(this.logDir,this.logFile.replace(/\.log\.jsonl$/u,`${e}.jsonl`)):k.join(this.logDir,`${this.logFile}${e}.jsonl`)}get errorsPath(){return this.artifactPath(".errors")}get rejectedPath(){return this.artifactPath(".rejected")}ensureLogFileReady(){return this.initPromise||(this.initPromise=(async()=>{await D.mkdir(this.logDir,{recursive:true}),await D.writeFile(this.logPath,"","utf8");})()),this.initPromise}enqueueTask(e){this.writeQueue=this.writeQueue.then(e).catch(r=>{this.writeError=r instanceof Error?r:new Error(String(r));});}enqueueLine(e){this.enqueueTask(async()=>{await this.ensureLogFileReady(),await D.appendFile(this.logPath,`${e}
3
+ `,"utf8");});}enqueueJsonLine(e,r){this.enqueueTask(()=>Sr(e,r));}accepts(e){return ct[e]<=ct[this.level]}push(e,r,n){if(!this.accepts(e))return;let o=de(r),i=gt(n),s=JSON.stringify({time:new Date().toISOString(),level:e,message:o,...i||{}});this.enqueueLine(s),e==="error"?console.error(`[ERROR] ${o}`,i?JSON.stringify(i):""):e==="warn"?console.warn(`[WARN] ${o}`,i?JSON.stringify(i):""):console.log(`[${e.toUpperCase().padEnd(5)}] ${o}`);}info(e,r){this.push("info",e,r);}progress(e,r){Rr(this.logFile,e,r);}debug(e,r){this.push("debug",e,r);}warn(e,r){this.push("warn",e,r);}reject(e,r,n,o,i){let s={kind:e,url:r,reason:n,...o?{source:o}:{},...i||{}};this.enqueueJsonLine(this.rejectedPath,s),this.accepts("debug")&&this.push("debug",`Rejected ${e} ${r}: ${n}`,s);}error(e,r){this.enqueueJsonLine(this.errorsPath,{message:e,...r||{}}),this.push("error",e,r);}mark(e){this.marks.set(e,Date.now());}endMark(e,r){let n=this.marks.get(e);if(!n)return;let o=Date.now()-n,i=Number((o/1e3).toFixed(2));this.push("info",`Timing ${e}: ${i}s`,{name:e,ms:o,seconds:i,...r||{}});}async flush(){let e=Date.now()-this.startedAt,r=Number((e/1e3).toFixed(2));if(this.push("info",`Total time: ${r}s`,{name:"total",ms:e,seconds:r}),await this.writeQueue,this.writeError)throw this.writeError}};async function kr(t){await D.mkdir(k.dirname(t),{recursive:true});}async function Pe(t,e,r){await kr(t);let n=k.join(k.dirname(t),`.${k.basename(t)}.${process.pid}.${Date.now()}.${Pr.randomBytes(6).toString("hex")}.tmp`);try{typeof e=="string"?await D.writeFile(n,e,r??"utf8"):await D.writeFile(n,e),await D.rename(n,t);}catch(o){throw await D.unlink(n).catch(()=>{}),o}}function ht(t){return [".html",".htm",".css",".js",".mjs",".json",".xml",".xsl",".txt",".svg",".map",".enc",".jws"].includes(k.extname(t).toLowerCase())}function yt(t){return t.replace(/&quot;/g,'"').replace(/&#34;/g,'"').replace(/&apos;/g,"'").replace(/&#39;/g,"'").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">")}function se(t){return t.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function Se(t){return t.replace(/\//g,"\\/")}function mt(t){return t.replace(/\//g,"\\\\/")}function vr(t){try{let e=new URL(t);if(e.protocol!=="http:"&&e.protocol!=="https:")return null;let r=e.pathname==="/"&&!e.search&&!e.hash?"":`${e.pathname}${e.search}${e.hash}`;return `//${e.host}${r}`}catch{return null}}function ft(t,e,r){if(!e)return;t[e]=r;let n=Se(e),o=Se(r);t[n]=o;let i=mt(e),s=mt(r);t[i]=s;let a=se(e),l=se(r);t[a]=l;let c=se(n),u=se(o);t[c]=u;let g=se(i),d=se(s);t[g]=d;}function ke(t,e,r){ft(t,e,r);let n=vr(e);n&&n!==e&&ft(t,n,r);}function wt(t,e){try{return new URL(t,e==="."?"https://relative.invalid":e).pathname}catch{return t.startsWith("/")?t:`/${t.replace(/^\.\//,"")}`}}function bt(t,e,r){if(!e)return r;let n=k.dirname(k.resolve(e)),o=k.resolve(t,r.replace(/^\/+/,"")),i=k.relative(n,o).replace(/\\/g,"/");return i?(i.startsWith(".")||(i=`./${i}`),i):"."}async function Ke(t,e){return (e?[...new Set(e)].map(n=>k.resolve(n)).filter(n=>n.startsWith(k.resolve(t.outputDir))).map(n=>k.relative(t.outputDir,n).replace(/\\/g,"/")).filter(n=>n.length>0):await xr(["**/*"],{cwd:t.outputDir,onlyFiles:true,dot:true})).filter(n=>n!=="asset-map.json"&&ht(n))}var Tr=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],Ir=new Set([".html",".htm"]),Rt="WPSuite.io Static Publisher",Dr=Rt.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function Ar(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Or(t){return t.startsWith("//")||t.startsWith("\\/\\/")||t.startsWith("\\\\/\\\\/")}function Mr(t,e,r){return Or(e)?t.replace(new RegExp(`(?<!:)${Ar(e)}`,"g"),r):t.split(e).join(r)}function jr(t,e,r){if(t.wpsuite?.siteSettings?.subscriber===true||t.wpsuite?.subscriptionType==="PROFESSIONAL"||t.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let o=k.extname(r).toLowerCase();return Ir.has(o)?/<head\b|<html\b|<!doctype html/i.test(e):false}function Lr(t){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${Dr}\\2)[^>]*\\/?>`,"i").test(t))return t;let e=`<meta name="generator" content="${Rt}" />`;if(t.match(/(\r?\n)([ \t]*)<\/head>/i))return t.replace(/(\r?\n)([ \t]*)<\/head>/i,`$1$2${e}$1$2</head>`);let n=t.includes(`\r
4
4
  `)?`\r
5
5
  `:`
6
- `;return t.replace(/<head\b[^>]*>/i,n=>`${n}${i} ${e}`)}function dr(t){let e=rt(t).trim();return e.startsWith("{")||e.startsWith("[")||e.includes("\\/")||/"@context"|"@type"/.test(e)}function fr(t,e){let r=[...new Set(e)].filter(s=>s.includes("/")&&!/\\+\//.test(s)).map(s=>[s,ae(s)]).filter(([s,o])=>s!==o).sort((s,o)=>o[0].length-s[0].length);if(!r.length)return t;let i=s=>{let o=s;for(let[l,a]of r)o=o.split(l).join(a);return o},n=t.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(s,o,l,a)=>`${o}${i(l)}${a}`);return n=n.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(s,o,l,a,c)=>dr(a)?`${o}${i(a)}${c}`:s),n}function mr(t,e){if(!e)return null;let r=b.dirname(b.resolve(e)),i=b.resolve(t.outputDir),n=b.relative(r,i).replace(/\\/g,"/");return n?(n.startsWith(".")||(n=`./${n}`),n.endsWith("/")?n:`${n}/`):"./"}function hr(t,e,r){let i=mr(e,r);if(!i)return t;let n=t;for(let s of sr){let o=s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),l=new RegExp(`(?:\\.{1,}/)+${o}`,"g"),a=new RegExp(`(?<!\\.)/${o}`,"g");n=n.replace(l,`${i}${s}`).replace(a,`${i}${s}`);let c=s.replace(/\//g,"\\/"),u=i.replace(/\//g,"\\/"),m=c.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),p=new RegExp(`(?:\\.{1,}\\\\/)+${m}`,"g"),d=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${m}`,"g"),g=new RegExp(`(?<![\\.\\\\])\\/${m}`,"g");n=n.replace(p,`${u}${c}`).replace(d,`${u}${c}`).replace(g,`${u}${c}`);}return n}function Re(t,e,r){if(t.urlRewriteMode==="absolute")return e;let i=(()=>{try{return new URL(e,t.targetOrigin==="."?"https://relative.invalid":t.targetOrigin)}catch{return null}})(),n=i?i.pathname:nt(e,t.targetOrigin),s=i?`${i.search}${i.hash}`:"";return t.urlRewriteMode==="root-relative"?`${n}${s}`:`${it(t.outputDir,r,n)}${s}`}function ve(t,e,r,i,n){le(t,r,Re(e,i,n));}function yr(t,e,r,i,n){if(!r||r===i)return;le(t,r,i);let s=Re(e,r,n),o=Re(e,i,n);le(t,s,o);}function wr(t,e,r,i,n={}){let s=t,o={};ve(o,e,e.sourceOrigin,e.targetOrigin,i);for(let[a,c]of Object.entries(e.extraReplacements))ve(o,e,a,c,i);for(let[a,c]of Object.entries(r))ve(o,e,a,c,i);for(let[a,c]of Object.entries(n)){let u=r[a];!u||u===c||yr(o,e,c,u,i);}let l=Object.entries(o).sort((a,c)=>c[0].length-a[0].length);for(let[a,c]of l)s=cr(s,a,c);return e.urlRewriteMode!=="absolute"&&(s=hr(s,e,i)),s=fr(s,l.map(([,a])=>a)),gr(e,s,i)&&(s=pr(s)),s}async function br(t,e,r,i){let n=b.join(t.outputDir,i),s=b.extname(n).toLowerCase(),o;try{o=await D.readFile(n,"utf8");}catch(c){if(c.code!=="ENOENT")throw c;return {changed:false}}let a=wr(o,t,e,s===".js"||s===".mjs"?void 0:n,r);return a!==o?(await et(n,a,"utf8"),{changed:true}):{changed:false}}async function Pr(t,e){return await new Promise((r,i)=>{let n=a=>{if(l(),a?.error){i(new Error(a.error));return}r({changed:!!a?.changed});},s=a=>{l(),i(a);},o=a=>{l(),a!==0&&i(new Error(`Rewrite worker exited with code ${a}.`));},l=()=>{t.off("message",n),t.off("error",s),t.off("exit",o);};t.on("message",n),t.on("error",s),t.on("exit",o),t.postMessage({file:e});})}async function ot(t,e,r={}){let n=(r.files?[...new Set(r.files)].map(p=>b.resolve(p)).filter(p=>p.startsWith(b.resolve(t.outputDir))).map(p=>b.relative(t.outputDir,p).replace(/\\/g,"/")).filter(p=>p.length>0):await tr(["**/*"],{cwd:t.outputDir,onlyFiles:true,dot:true})).filter(p=>p!=="asset-map.json"&&tt(p)),s=0;if(n.length===0)return 0;let o=Math.max(1,Number(t.rewriteConcurrency||t.assetDownloadConcurrency||1)),l=Math.max(1,Math.min(o,n.length,availableParallelism()));await r.onStart?.({totalFiles:n.length,workerCount:l});let a=0,c=0,u=null;if(l===1){for(let p of n){let d=await br(t,e,r.previousAssetMap??{},p);d.changed&&(s+=1),c+=1,await r.onProgress?.({index:c,totalFiles:n.length,changedTextFiles:s,file:p,changed:d.changed});}return s}let m=Array.from({length:l},async()=>{let p=new Worker(new URL("./rewrite-worker.js",import.meta.url),{workerData:{config:t,assetMap:e,previousAssetMap:r.previousAssetMap??{}}});try{for(;!u;){let d=a;if(d>=n.length)return;a+=1;let g=n[d],w=await Pr(p,g);w.changed&&(s+=1),c+=1,await r.onProgress?.({index:c,totalFiles:n.length,changedTextFiles:s,file:g,changed:w.changed});}}catch(d){throw u=d instanceof Error?d:new Error(String(d)),u}finally{await p.terminate().catch(()=>{});}});return await Promise.all(m),s}var gt="wpsuite-sha256",pt="wpsuite-normalized-sha256",Er="public, max-age=0, must-revalidate",Ar=/(?:^|[-_:.])(id|uid|nonce|token|hash|instance)(?:$|[-_:.])/i,$e=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,kr=["SIGINT","SIGTERM"],pe=new Set,ue=new Map,at=null;function Mr(t){pe.add(t);let e=false;return ()=>{e||(e=true,pe.delete(t));}}async function Ir(){let t=[...pe];t.length!==0&&await Promise.allSettled(t.map(async e=>{pe.delete(e),await D.rm(e,{recursive:true,force:true});}));}function Lr(){if(!(ue.size>0))for(let t of kr){let e=()=>{at||(at=Ir().finally(()=>{for(let[r,i]of ue)process.off(r,i);ue.clear(),process.exit(1);}));};ue.set(t,e),process.on(t,e);}}Lr();function Or(t,e){let r=String(process.env.STATIC_PUBLISHER_CRAWL_MANIFEST_PATH||"").trim();if(r)return b.resolve(r);let i=e.trim();return i?b.join(b.resolve(i),"crawl-manifest.json"):b.join(b.resolve(t),".crawl-manifest.json")}function ge(t){return b.normalize(t).split(b.sep).join("/")}function lt(t,e){let r=b.relative(b.resolve(t),b.resolve(e));return !r||r.startsWith("..")||b.isAbsolute(r)?null:ge(r)}async function Fr(t,e,r){let i=Or(t.outputDir,e),n;try{n=await D.readFile(i,"utf8");}catch(u){return u.code==="ENOENT"?(r.warn("Deploy rewrite guard disabled because the crawl manifest is missing.",{manifestPath:i,source:"deploy-guard"}),null):(r.warn("Deploy rewrite guard disabled because the crawl manifest could not be read.",{manifestPath:i,error:u instanceof Error?u.message:String(u),source:"deploy-guard"}),null)}let s;try{s=JSON.parse(n);}catch(u){return r.warn("Deploy rewrite guard disabled because the crawl manifest is invalid JSON.",{manifestPath:i,error:u instanceof Error?u.message:String(u),source:"deploy-guard"}),null}let o=new Map,l=new Map,a=0,c=0;for(let[u,m]of Object.entries(s.pages||{})){let p=String(m?.outputPath||"").trim(),d=p?lt(t.outputDir,p):null;if(d){let g=typeof m?.contentType=="string"&&m.contentType?m.contentType:null;g&&l.set(d,g);}!p||m?.rewriteComplete===true||d&&(a++,o.has(d)||o.set(d,{kind:"page",sourceUrl:u,outputPath:b.resolve(p),relativePath:d}));}for(let[u,m]of Object.entries(s.assets||{})){let p=String(m?.outputPath||"").trim(),d=m?.isText===true,g=p?lt(t.outputDir,p):null;if(g){let w=typeof m?.contentType=="string"&&m.contentType?m.contentType:null;w&&l.set(g,w);}!p||!d||m?.rewriteComplete===true||g&&(c++,o.has(g)||o.set(g,{kind:"asset",sourceUrl:u,outputPath:b.resolve(p),relativePath:g}));}return {manifestPath:i,byRelativePath:o,contentTypeByRelativePath:l,pendingPages:a,pendingTextAssets:c}}function jr(t){return t&&($e.test(t)?"__uuid__":/^[0-9a-f]{6,}$/i.test(t)?"__hex__":/^[0-9]{8,}$/.test(t)?"__num__":/^(?=.*[a-z])(?=.*\d)[a-z0-9]{8,}$/i.test(t)?"__alnum__":t)}function xe(t){return t.split(/([_:.\-/=?&#]+)/g).map((e,r)=>r%2===1?e:jr(e)).join("")}function _r(t){return t.split(/([_:.\-/=?&#]+)/g).map((e,r)=>r%2===1?e:$e.test(e)?"__uuid__":/^[0-9a-f]{6,}$/i.test(e)?"__hex__":/^[0-9]{6,}$/.test(e)?"__num__":/^[a-z0-9_-]{6,}$/i.test(e)?"__id__":e).join("")}function de(t,e){return Array.isArray(t)?t.map(r=>de(r,e)):t&&typeof t=="object"?Object.fromEntries(Object.entries(t).map(([r,i])=>[r,de(i,r)])):typeof t!="string"?t:e&&Ar.test(e)?_r(t):$e.test(t)?"__uuid__":/^[0-9a-f]{6,}$/i.test(t)||/^[0-9]{8,}$/.test(t)?xe(t):t}function Ur(t){return t.replace(/((?:https?:\/\/[^"'\s>]+|\/)(?:wp-content|wp-includes)\/[^"'\s>?]+)\?ver=[A-Za-z0-9._-]+(?=$|[#"'])/gi,"$1")}function Nr(t,e){let r=e.trim();if((r.startsWith("{")||r.startsWith("[")||r.startsWith('"'))&&t.startsWith("data-"))try{let n=JSON.parse(r);return JSON.stringify(de(n))}catch{}if(t.startsWith("data-")&&/^[A-Za-z0-9+/=]+$/.test(r))try{let n=Buffer.from(r,"base64").toString("utf8"),s=JSON.parse(n),o=JSON.stringify(de(s));return Buffer.from(o,"utf8").toString("base64")}catch{}return e}function zr(t,e){let r=t.toLowerCase();return r==="class"?e.split(/(\s+)/).map((i,n)=>n%2===1?i:xe(i)).join(""):r==="id"||r==="for"||r==="aria-controls"||r==="aria-labelledby"||r==="aria-describedby"||r==="aria-owns"||r==="aria-activedescendant"||r==="name"?xe(e):r==="href"||r==="src"?Ur(e):Nr(r,e)}function Wr(t){return t.replace(/<([a-z][^\s/>]*)([^<>]*?)>/gi,(e,r,i)=>{if(r.startsWith("/"))return e;let n=i.replace(/\s([:@a-zA-Z_][-:.a-zA-Z0-9_]*?)=(['"])([\s\S]*?)\2/g,(s,o,l,a)=>{let c=zr(o,a);return ` ${o}=${l}${c}${l}`});return `<${r}${n}>`})}function De(t){let e=b.extname(t).toLowerCase();return [".html",".htm",".xml",".xsl",".txt"].includes(e)||["robots.txt","sitemap.xml"].includes(b.basename(t))}function ce(t,e){return [t.replace(/^\/+|\/+$/g,""),e.replace(/^\/+/,"")].filter(Boolean).join("/")}async function Br(t,e,r,i){let n=new Map,s,o=0;do{o++;let l=await I(`S3 list objects page ${o} for s3://${e}/${r||""}`,3e5,({httpOptions:a})=>t.send(new ListObjectsV2Command({Bucket:e,Prefix:r||void 0,ContinuationToken:s}),a));for(let a of l.Contents||[]){if(!a.Key)continue;let c=(a.ETag||"").replace(/^"|"$/g,"").toLowerCase(),u=Number(a.Size??0);n.set(a.Key,{etag:c,size:u,cacheControl:void 0});}s=l.NextContinuationToken,i.debug(`Listed S3 keys page ${o}: ${n.size} keys so far`);}while(s);return n}async function qr(t,e,r,i){if(i.has(r))return i.get(r)??null;try{let n=await I(`S3 head object ${r}`,3e5,({httpOptions:o})=>t.send(new HeadObjectCommand({Bucket:e,Key:r}),o)),s={etag:(n.ETag||"").replace(/^"|"$/g,"").toLowerCase(),size:Number(n.ContentLength??0),cacheControl:n.CacheControl?.trim()||null};return i.set(r,s),s}catch{return i.set(r,null),null}}async function Gr(t,e,r,i){if(i.cacheControl!==void 0)return i.cacheControl;try{let n=await I(`S3 head cache metadata ${r}`,3e5,({httpOptions:s})=>t.send(new HeadObjectCommand({Bucket:e,Key:r}),s));i.cacheControl=n.CacheControl?.trim()||null;}catch{i.cacheControl=null;}return i.cacheControl}function ut(t){return String(t||"").split(",").map(e=>e.trim().toLowerCase()).filter(Boolean).sort().join(",")}async function Hr(t,e,r,i){let n=[...new Set(Array.from(r).filter(Boolean))];if(n.length===0)return i.info("No explicitly tombstoned S3 objects to delete."),[];i.info(`Deleting ${n.length} explicitly tombstoned S3 object(s)\u2026`);for(let s=0;s<n.length;s+=1e3){let o=n.slice(s,s+1e3);if(o.length===0)continue;let l=await I(`S3 delete objects batch ${Math.floor(s/1e3)+1}`,3e5,({httpOptions:a})=>t.send(new DeleteObjectsCommand({Bucket:e,Delete:{Objects:o.map(c=>({Key:c}))}}),a));if(l.Errors&&l.Errors.length>0){let a=l.Errors.map(c=>`${c.Key||"(unknown)"}: ${c.Code||"DeleteFailed"}`);throw new Error(`S3 reported ${a.length} object deletion error(s): ${a.join(", ")}`)}i.info(`Deleted batch of ${o.length} object(s).`);for(let a of o)i.debug(` deleted: ${a}`);}return n}function Kr(t){return createHash("md5").update(t).digest("hex")}function ct(t){return createHash("sha256").update(t).digest("hex")}function Te(t){return createHash("sha256").update(Wr(t.toString("utf8"))).digest("hex")}async function Jr(t,e,r,i){if(i.has(r))return i.get(r)??null;try{let o=((await I(`S3 head object metadata ${r}`,3e5,({httpOptions:l})=>t.send(new HeadObjectCommand({Bucket:e,Key:r}),l))).Metadata?.[gt]||"").trim().toLowerCase()||null;return i.set(r,o),o}catch{return i.set(r,null),null}}async function Vr(t,e,r,i,n){if(i.has(r))return i.get(r)??null;try{let o=((await I(`S3 head object normalized metadata ${r}`,3e5,({httpOptions:l})=>t.send(new HeadObjectCommand({Bucket:e,Key:r}),l))).Metadata?.[pt]||"").trim().toLowerCase();if(o)return i.set(r,o),o}catch{return i.set(r,null),null}if(n.has(r)){let s=n.get(r)??null;return i.set(r,s),s}try{let o=await(await I(`S3 get object ${r}`,3e5,({httpOptions:a})=>t.send(new GetObjectCommand({Bucket:e,Key:r}),a))).Body?.transformToByteArray(),l=o?Te(Buffer.from(o)):null;return n.set(r,l),i.set(r,l),l}catch{return n.set(r,null),i.set(r,null),null}}function Qr(t){return t.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")||"profile"}function Yr(t,e){let r=t,i=Object.entries(e).sort((n,s)=>s[0].length-n[0].length);for(let[n,s]of i)n&&(r=r.split(n).join(s));return r}async function Zr(t,e,r,i){let n=b.join(t,"asset-map.json"),s;try{s=await D.readFile(n,"utf8");}catch(a){if(a.code==="ENOENT")return;throw a}let o=JSON.parse(s);if(!o||typeof o!="object")return;let l=Object.fromEntries(Object.entries(o).map(([a,c])=>{let u=String(c??"");return e.urlRewriteMode==="absolute"&&e.targetOrigin&&r.targetOrigin&&e.targetOrigin!==r.targetOrigin&&(u=u.split(e.targetOrigin).join(r.targetOrigin)),u=Yr(u,i),[a,u]}));await D.writeFile(n,JSON.stringify(l,null,2),"utf8");}async function Xr(t,e,r,i,n,s){let o=t.targetOrigin!==e.targetOrigin,l=Object.keys(i).length>0;if(!r||!o&&!l)return {outputDir:t.outputDir,cleanup:async()=>{}};if(o&&t.urlRewriteMode!=="absolute")throw new Error(`Deployment profile "${r}" changes targetOrigin, but the base crawl output must use urlRewriteMode "absolute" for multi-target redeploys.`);let a=b.join(b.dirname(t.outputDir),`.deploy-profile-${Qr(r)}-${Date.now()}`),c=Mr(a);n.info(`Preparing deployment profile "${r}" from existing crawl output to ${a}...`);try{if(await D.rm(a,{recursive:!0,force:!0}),s){await D.mkdir(a,{recursive:!0});for(let d of s){let g=b.join(t.outputDir,d),w=b.join(a,d);await D.mkdir(b.dirname(w),{recursive:!0}),await D.copyFile(g,w);}}else await D.cp(t.outputDir,a,{recursive:!0});let u={...t,sourceOrigin:t.targetOrigin,targetOrigin:e.targetOrigin,extraReplacements:i,outputDir:a},m=1;n.info(`Rewriting text files for deployment profile "${r}"...`);let p=await ot(u,{},{files:s,onStart:({totalFiles:d,workerCount:g})=>{m=g,n.info(`Rewriting ${d} text file(s) for deployment profile "${r}" with ${g} worker(s).`);},onProgress:({index:d,totalFiles:g,changedTextFiles:w,file:C,changed:S})=>{let v=`Rewriting [${d}/${g}] ${C} (${S?"rewrote":"checked"}; ${w} changed so far)`;g<=200||d<=5||d%10===0||d===g?(n.progress(v,{file:C,index:d,totalFiles:g,changed:S,changedTextFiles:w,workerCount:m}),n.info(v)):n.debug(v);}});return await Zr(a,t,e,i),n.info(`Prepared deployment profile "${r}" in ${a} (${p} rewritten text file(s)).`),{outputDir:a,cleanup:async()=>{c(),await D.rm(a,{recursive:!0,force:!0});}}}catch(u){throw n.error(`Failed to prepare deployment profile "${r}" temporary output.`,{tempDir:a,outputDir:t.outputDir,error:u instanceof Error?u.message:String(u),...u instanceof Error&&u.stack?{stack:u.stack}:{}}),await D.rm(a,{recursive:true,force:true}).catch(()=>{}),c(),await n.flush().catch(()=>{}),u}}async function dt(t=process.argv.slice(2)){let e=await ie(),r=Ge(t),i=He(e,r),n=b.resolve(i.config.logDir||"logs"),s=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",o=s?b.join(b.resolve(s),"deploy-diff.json"):"",l=new K(n,"deploy.log.jsonl",i.config.logLevel??"info"),a=i.profile?.extraReplacements??{},c=async()=>{};try{let u=await We(e);if(t.includes("--content-sync")&&u?.schemaVersion!==2)throw new Error("Content-sync deployment requires a valid schema-2 targeted deploy plan.");let p=await qe(e);if(p)throw new Error(`Deployment blocked: the crawl started at ${p.startedAt} did not complete its final rewrite. Run a successful crawl or resume the rewrite before deploying.`);let d=await Xr(e,i.config,i.name,a,l,u?.schemaVersion===2?u.changedFiles:void 0);c=d.cleanup;let g={...i.config,outputDir:d.outputDir},w=g.s3SyncMode??"sdk-upload-delete";if(u?.schemaVersion===2&&u.deletedFiles.length>0&&w!=="sdk-upload-delete")throw new Error("Content-sync tombstones require the sdk-upload-delete S3 sync mode.");let C=u?.schemaVersion!==2&&d.outputDir!==e.outputDir&&(e.targetOrigin!==i.config.targetOrigin||Object.keys(a).length>0),S=!!u&&!u.fullSyncRequired&&!C;if(u?.schemaVersion===2&&!S)throw new Error("Content-sync deployment cannot widen into a full-output deployment.");i.name&&l.info(`Using deployment profile: ${i.name}`),l.info(`Starting deploy \u2014 s3://${g.s3.bucket}/${g.s3.prefix||""} (region: ${g.s3.region})`),l.info(`S3 sync mode: ${w}`),u&&u.fullSyncRequired?l.info("Deploy plan requests a full sync; scanning the whole output tree."):u&&C?l.info("Ignoring incremental deploy plan because deployment-profile rewrites require a full sync."):S&&l.info(`Using incremental deploy plan: ${u.changedFiles.length} changed file(s), ${u.deletedFiles.length} deleted file(s).`),l.mark("deploy");let O=new S3Client({region:g.s3.region}),v=d.outputDir===e.outputDir?await Fr(e,s,l):null,Ee=u?.schemaVersion===2?[...u.uploadGroups.assets,...u.uploadGroups.content,...u.uploadGroups.listings,...u.uploadGroups.resources,...u.uploadGroups.sitemapLeaves,...u.uploadGroups.sitemapIndexes]:u?.changedFiles??[];if(u?.schemaVersion===2){let h=[...new Set(Ee)],T=[...new Set(u.changedFiles)];if(h.length!==T.length||T.some(f=>!h.includes(f)))throw new Error("Content-sync deploy-plan upload groups do not cover the exact changed-file set.")}let V=S?(await Promise.all(Ee.map(async h=>{try{return (await D.stat(b.join(g.outputDir,h))).isFile()?h:null}catch{if(u?.schemaVersion===2)throw new Error(`Content-sync planned upload is missing: ${h}`);return null}}))).filter(h=>h!==null):await tr(["**/*"],{cwd:g.outputDir,onlyFiles:!0,dot:!0}),F=[],W=[],y=V.filter(h=>{let T=v?.byRelativePath.get(ge(h));if(!T)return !0;let f=ce(g.s3.prefix,h);return F.push(h),W.push(f),l.reject(T.kind,T.sourceUrl||h,"rewrite not completed; deploy upload blocked","deploy-guard",{file:h,key:f,outputPath:T.outputPath,manifestPath:v?.manifestPath}),!1}),ft=new Set((u?.revalidateFiles||[]).map(ge)),Ae=new Set((S?y:V).map(h=>ce(g.s3.prefix,h)));v&&(v.pendingPages>0||v.pendingTextAssets>0)&&l.info(`Deploy rewrite guard loaded ${v.pendingPages} pending page(s) and ${v.pendingTextAssets} pending text asset(s) from crawl manifest.`,{manifestPath:v.manifestPath,pendingPages:v.pendingPages,pendingTextAssets:v.pendingTextAssets,source:"deploy-guard"}),F.length>0&&l.warn(`Deploy rewrite guard blocked ${F.length} file(s) from upload because final crawl rewrite is incomplete.`,{rejected:F.length,manifestPath:v?.manifestPath,source:"deploy-guard"}),S?l.info(`Using ${y.length} eligible planned changed file(s) from deploy plan for upload${F.length>0?` (${F.length} blocked by deploy rewrite guard)`:""}.`):l.info(`Found ${V.length} file(s) in output directory "${g.outputDir}"${F.length>0?`; ${y.length} remain eligible for upload after deploy rewrite guard filtering`:""}.`),l.progress("Deploy preflight: comparing local output with remote S3 state.",{phase:"deploy",mode:w,totalFiles:y.length,scannedFiles:V.length,rejected:F.length,deploymentProfile:i.name||"",s3Bucket:g.s3.bucket,s3Prefix:g.s3.prefix||"",targetedPlan:S,deployGuardEnabled:d.outputDir===e.outputDir});let $=0,R=0,U=0,me=[],Q=[],Y=[],he=[],N=[],B=new Map,mt=new Map,ht=new Map,yt=new Map,wt=new Map;S||(l.info("Listing existing S3 objects to detect unchanged files..."),B=await Br(O,g.s3.bucket,g.s3.prefix,l),l.info(`Found ${B.size} existing key(s) in S3.`));let bt=async h=>B.has(h)?B.get(h)??null:S?qr(O,g.s3.bucket,h,mt):null;for(let h of y){let T=b.join(g.outputDir,h),f=ce(g.s3.prefix,h),E=v?.contentTypeByRelativePath.get(h),Z=E&&E!=="application/octet-stream"?E:$r.lookup(h)||E||"application/octet-stream",ke=ft.has(ge(h)),Me=ke?Er:De(h)?g.s3.htmlCacheControl:g.s3.assetCacheControl,P=$+R+U+1;y.length<=200||P<=5||P%10===0||P===y.length?(l.progress(`Uploading [${P}/${y.length}] ${f} (${Z})`,{file:h,key:f,index:P,totalFiles:y.length,contentType:Z,mode:w}),l.info(`Uploading [${P}/${y.length}] ${f} (${Z})`)):l.debug(`Uploading [${P}/${y.length}] ${f} (${Z})`);try{let A=await D.readFile(T),q=await bt(f),X=null,G=null;if(q){let ee=!ke||ut(await Gr(O,g.s3.bucket,f,q))===ut(Me),Pt=A.byteLength;if(q.size===Pt){let ne=q.etag.includes("-");if(q.etag!==""&&!ne){let St=Kr(A);if(q.etag===St&&ee){R++,y.length<=200||R<=5||R%25===0?(l.progress(`Skipped unchanged [${P}/${y.length}] ${f}`,{file:h,key:f,index:P,totalFiles:y.length,uploaded:$,skipped:R,failed:U,mode:w,reason:"etag-md5-match"}),l.info(`Skipped unchanged [${P}/${y.length}] ${f}`)):l.debug(`Skipped unchanged [${P}/${y.length}] ${f}`),Q.push(f);continue}}X=ct(A);let Ie=await Jr(O,g.s3.bucket,f,ht);if(Ie&&Ie===X&&ee){R++,y.length<=200||R<=5||R%25===0?(l.progress(`Skipped unchanged [${P}/${y.length}] ${f}`,{file:h,key:f,index:P,totalFiles:y.length,uploaded:$,skipped:R,failed:U,mode:w,reason:"metadata-sha256-match"}),l.info(`Skipped unchanged [${P}/${y.length}] ${f}`)):l.debug(`Skipped unchanged [${P}/${y.length}] ${f}`),Q.push(f);continue}}if(De(h)){G=Te(A);let ne=await Vr(O,g.s3.bucket,f,yt,wt);if(ne&&ne===G&&ee){R++,y.length<=200||R<=5||R%25===0?(l.progress(`Skipped semantically unchanged [${P}/${y.length}] ${f}`,{file:h,key:f,index:P,totalFiles:y.length,uploaded:$,skipped:R,failed:U,mode:w,reason:"normalized-html-match"}),l.info(`Skipped semantically unchanged [${P}/${y.length}] ${f}`)):l.debug(`Skipped semantically unchanged [${P}/${y.length}] ${f}`),Q.push(f);continue}}}X=X??ct(A),G=G??(De(h)?Te(A):null),await I(`S3 upload ${f}`,9e5,({abortController:ee})=>new Upload({client:O,abortController:ee,params:{Bucket:g.s3.bucket,Key:f,Body:A,ContentType:Z,CacheControl:Me,Metadata:{[gt]:X,...G?{[pt]:G}:{}}}}).done()),$++,me.push(f),($%25===0||$===y.length)&&(l.progress(`Uploaded ${$}/${y.length} file(s)\u2026`,{uploaded:$,skipped:R,failed:U,totalFiles:y.length,mode:w}),l.info(`Uploaded ${$}/${y.length} file(s)\u2026`));}catch(A){U++,Y.push(f),l.error(`Failed to upload ${f}: ${A.message}`,{key:f,error:String(A)});}}if(l.info(`Upload complete: ${$} uploaded, ${R} skipped unchanged, ${W.length} rejected by guard, ${U} failed.`),Y.length>0||W.length>0)throw new Error(`Deployment stopped before deletion because ${Y.length} upload(s) failed and ${W.length} upload(s) were rejected.`);if(w==="sdk-upload-delete"){let h=new Set((u?.deletedFiles??[]).map(f=>ce(g.s3.prefix,f))),T=[...h].filter(f=>!Ae.has(f));if(!S&&(N=[...B.keys()].filter(E=>!Ae.has(E)).filter(E=>!h.has(E)),N.length>0)){l.warn(`Protected ${N.length} remote-only S3 object(s) from deletion because the crawl did not provide explicit tombstones.`,{protected:N.length,source:"deploy-delete-guard"});for(let E of N)l.debug(` protected remote-only object: ${E}`);}he=await Hr(O,g.s3.bucket,S?T:T.filter(f=>B.has(f)),l);}else l.info("Sync mode is sdk-upload-only \u2014 skipping stale object deletion.");o&&(await D.mkdir(b.dirname(o),{recursive:!0}),await D.writeFile(o,JSON.stringify({generatedAt:new Date().toISOString(),mode:w,summary:{totalFiles:V.length,eligibleFiles:y.length,uploaded:me.length,skipped:Q.length,rejected:W.length,failed:Y.length,deleted:he.length,protected:N.length,...i.name?{profile:i.name}:{}},uploadedKeys:me,skippedKeys:Q,rejectedKeys:W,failedKeys:Y,deletedKeys:he,protectedRemoteOnlyKeys:N},null,2),"utf8")),u?.schemaVersion!==2&&await Be(e),l.endMark("deploy"),await l.flush();}finally{await c().catch(()=>{});}}dt().catch(async t=>{console.error(t);try{let r=(await ie().catch(()=>null))?.logDir??"logs",i=new K(r,"deploy.log.jsonl","debug");i.error(`Unhandled error: ${t instanceof Error?t.message:String(t)}`,t instanceof Error?{stack:t.stack}:void 0),await i.flush();}catch{}process.exit(1);});
6
+ `;return t.replace(/<head\b[^>]*>/i,o=>`${o}${n} ${e}`)}function Fr(t){let e=yt(t).trim();return e.startsWith("{")||e.startsWith("[")||e.includes("\\/")||/"@context"|"@type"/.test(e)}function _r(t,e){let r=[...new Set(e)].filter(i=>i.includes("/")&&!/\\+\//.test(i)).map(i=>[i,Se(i)]).filter(([i,s])=>i!==s).sort((i,s)=>s[0].length-i[0].length);if(!r.length)return t;let n=i=>{let s=i;for(let[a,l]of r)s=s.split(a).join(l);return s},o=t.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(i,s,a,l)=>`${s}${n(a)}${l}`);return o=o.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(i,s,a,l,c)=>Fr(l)?`${s}${n(l)}${c}`:i),o}function Wr(t,e){if(!e)return null;let r=k.dirname(k.resolve(e)),n=k.resolve(t.outputDir),o=k.relative(r,n).replace(/\\/g,"/");return o?(o.startsWith(".")||(o=`./${o}`),o.endsWith("/")?o:`${o}/`):"./"}function Nr(t,e,r){let n=Wr(e,r);if(!n)return t;let o=t;for(let i of Tr){let s=i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),a=new RegExp(`(?:\\.{1,}/)+${s}`,"g"),l=new RegExp(`(?<!\\.)/${s}`,"g");o=o.replace(a,`${n}${i}`).replace(l,`${n}${i}`);let c=i.replace(/\//g,"\\/"),u=n.replace(/\//g,"\\/"),g=c.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),d=new RegExp(`(?:\\.{1,}\\\\/)+${g}`,"g"),w=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${g}`,"g"),b=new RegExp(`(?<![\\.\\\\])\\/${g}`,"g");o=o.replace(d,`${u}${c}`).replace(w,`${u}${c}`).replace(b,`${u}${c}`);}return o}function Ne(t,e,r){if(t.urlRewriteMode==="absolute")return e;let n=(()=>{try{return new URL(e,t.targetOrigin==="."?"https://relative.invalid":t.targetOrigin)}catch{return null}})(),o=n?n.pathname:wt(e,t.targetOrigin),i=n?`${n.search}${n.hash}`:"";return t.urlRewriteMode==="root-relative"?`${o}${i}`:`${bt(t.outputDir,r,o)}${i}`}function We(t,e,r,n,o){ke(t,r,Ne(e,n,o));}function Kr(t,e,r,n,o){if(!r||r===n)return;ke(t,r,n);let i=Ne(e,r,o),s=Ne(e,n,o);ke(t,i,s);}function Ur(t,e,r,n,o={}){let i=t,s={};We(s,e,e.sourceOrigin,e.targetOrigin,n);for(let[l,c]of Object.entries(e.extraReplacements))We(s,e,l,c,n);for(let[l,c]of Object.entries(r))We(s,e,l,c,n);for(let[l,c]of Object.entries(o)){let u=r[l];!u||u===c||Kr(s,e,c,u,n);}let a=Object.entries(s).sort((l,c)=>c[0].length-l[0].length);for(let[l,c]of a)i=Mr(i,l,c);return e.urlRewriteMode!=="absolute"&&(i=Nr(i,e,n)),i=_r(i,a.map(([,l])=>l)),jr(e,i,n)&&(i=Lr(i)),i}async function Vr(t,e,r,n){let o=k.join(t.outputDir,n),i=k.extname(o).toLowerCase(),s;try{s=await D.readFile(o,"utf8");}catch(c){if(c.code!=="ENOENT")throw c;return {changed:false}}let l=Ur(s,t,e,i===".js"||i===".mjs"?void 0:o,r);return l!==s?(await Pe(o,l,"utf8"),{changed:true}):{changed:false}}async function zr(t,e){return await new Promise((r,n)=>{let o=l=>{if(a(),l?.error){n(new Error(l.error));return}r({changed:!!l?.changed});},i=l=>{a(),n(l);},s=l=>{a(),l!==0&&n(new Error(`Rewrite worker exited with code ${l}.`));},a=()=>{t.off("message",o),t.off("error",i),t.off("exit",s);};t.on("message",o),t.on("error",i),t.on("exit",s),t.postMessage({file:e});})}async function St(t,e,r={}){let n=await Ke(t,r.files),o=0;if(n.length===0)return 0;let i=Math.max(1,Number(t.rewriteConcurrency||t.assetDownloadConcurrency||1)),s=Math.max(1,Math.min(i,n.length,availableParallelism()));await r.onStart?.({totalFiles:n.length,workerCount:s});let a=0,l=0,c=null;if(s===1){for(let g of n){let d=await Vr(t,e,r.previousAssetMap??{},g);d.changed&&(o+=1),l+=1,await r.onProgress?.({index:l,totalFiles:n.length,changedTextFiles:o,file:g,changed:d.changed});}return o}let u=Array.from({length:s},async()=>{let g=new Worker(new URL("./rewrite-worker.js",import.meta.url),{workerData:{config:t,assetMap:e,previousAssetMap:r.previousAssetMap??{}}});try{for(;!c;){let d=a;if(d>=n.length)return;a+=1;let w=n[d],b=await zr(g,w);b.changed&&(o+=1),l+=1,await r.onProgress?.({index:l,totalFiles:n.length,changedTextFiles:o,file:w,changed:b.changed});}}catch(d){throw c=d instanceof Error?d:new Error(String(d)),c}finally{await g.terminate().catch(()=>{});}});return await Promise.all(u),o}var _=1,Pt=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;function ae(t,e){let r=String(t??"").trim();if(!Pt.test(r))throw new Error(`${e} must match ${Pt.source} and be at most 128 characters.`);return r}function kt(t){let e=String(t??"").trim().replace(/^\/+|\/+$/g,"");if(!e)return "";let r=e.split("/").filter(Boolean);if(r.some(n=>n==="."||n===".."))throw new Error("S3 prefix contains an unsafe dot path segment.");return `${r.join("/")}/`}function ve(t,...e){let r=kt(t),n=e.map((o,i)=>{let s=String(o??"").replace(/^\/+|\/+$/g,"");if(!s||s.split("/").some(a=>a==="."||a===".."))throw new Error(`Unsafe S3 key segment at index ${i}.`);return s});return `${r}${n.join("/")}`}function le(t){return createHash("sha256").update(t).digest("hex")}function xe(t,e){let r=String(t??"").replace(/^\/+/,""),n=kt(e);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(o=>o===".."))throw new Error("S3 object key contains an unsafe parent segment.");return r}function Jr(t,e){let r=[];for(let n=0;n<t.length;n+=e)r.push(t.slice(n,n+e));return r}function Gr(t){return {sourceOrigin:t.sourceOrigin,targetOrigin:t.targetOrigin,urlRewriteMode:t.urlRewriteMode,outputDir:"/workspace",extraReplacements:t.extraReplacements,wpsuite:{...t.wpsuite?.subscriptionType?{subscriptionType:t.wpsuite.subscriptionType}:{},...t.wpsuite?.siteSettings?{siteSettings:{subscriber:t.wpsuite.siteSettings.subscriber===true}}:{}}}}function Qr(t,e){if(!t||typeof t!="object")throw new Error("Remote rewrite result must be a JSON object.");let r=t;if(r.schemaVersion!==_||r.response?.operation!=="rewrite"||r.response.jobId!==e.jobId||r.response.taskId!==e.taskId||!r.detail||!Array.isArray(r.detail.objects))throw new Error("Remote rewrite result has an invalid envelope.");return r}async function vt(t,e,r){let n=r.options??{},o=await Ke(t,n.files);if(o.length===0)return 0;let i=ae(r.jobId,"jobId"),s=ve(r.client.config.workspace.prefix,"jobs",i,"rewrite-inputs"),a=`${s}/config.json`.replace(/\/+/g,"/"),l=`${s}/asset-map.json`.replace(/\/+/g,"/"),c=`${s}/previous-asset-map.json`.replace(/\/+/g,"/");await Promise.all([r.client.writeWorkspaceObject({key:a,body:JSON.stringify(Gr(t)),contentType:"application/json; charset=utf-8"}),r.client.writeWorkspaceObject({key:l,body:JSON.stringify(e),contentType:"application/json; charset=utf-8"}),r.client.writeWorkspaceObject({key:c,body:JSON.stringify(n.previousAssetMap??{}),contentType:"application/json; charset=utf-8"})]);let u=Math.max(1,Math.min(500,r.batchSize)),g=Math.ceil(o.length/u),d=Math.max(1,Math.min(Math.max(1,r.concurrency),g));await n.onStart?.({totalFiles:o.length,workerCount:d});let w=[],b=0,v=0;await Promise.all(Array.from({length:Math.min(16,o.length)},async()=>{for(;;){let P=b;if(P>=o.length)return;b+=1;let $=o[P],x=k.join(t.outputDir,$),A=`${s}/files/${le($)}.txt`.replace(/\/+/g,"/");await r.client.writeWorkspaceObject({key:A,body:await D.readFile(x),contentType:"text/plain; charset=utf-8"}),w[P]={relativePath:$,key:A,fullPath:x},v+=1,await r.onStageProgress?.({index:v,totalFiles:o.length,file:$});}}));let S=Jr(w,u),E=0,p=0,y=0,C=Array.from({length:d},async()=>{for(;;){let P=E;if(P>=S.length)return;E+=1;let $=S[P],x=null,A=null;for(let R=1;R<=Math.max(1,Math.min(5,r.maxAttempts));R+=1){let M=ae(`rewrite-${P+1}-a${R}-${le($.map(f=>f.relativePath).join(`
7
+ `)).slice(0,16)}`,"taskId"),F={schemaVersion:_,operation:"rewrite",jobId:i,taskId:M,configKey:a,assetMapKey:l,previousAssetMapKey:c,items:$.map(f=>({inputKey:f.key,outputKey:f.key,relativePath:f.relativePath}))};try{let f=await r.client.invoke(F);A=Qr(await r.client.readResult(f),f);break}catch(f){x=f;}}if(!A)throw new Error(`Remote rewrite batch ${P+1}/${S.length} failed: ${x instanceof Error?x.message:String(x)}`,{cause:x});for(let R of $){let M=A.detail.objects.find(F=>F.outputKey===R.key);if(!M)throw new Error(`Remote rewrite result omitted ${R.relativePath}.`);await Pe(R.fullPath,Buffer.from(await r.client.readObject(M.output))),M.changed&&(y+=1),p+=1,await n.onProgress?.({index:p,totalFiles:o.length,changedTextFiles:y,file:R.relativePath,changed:M.changed});}}});return await Promise.all(C),y}function W(t,e,{optional:r=false}={}){if(!(r&&(t==null||t===""))){if(typeof t!="string"||!t.trim())throw new Error(`${e} must be a non-empty string.`);return t.trim()}}function nn(t){if(!t||typeof t!="object")throw new Error("Remote worker config must be a JSON object.");let e=t;if(e.schemaVersion!==1)throw new Error(`Unsupported remote worker config version: ${String(e.schemaVersion)}.`);if(e.protocolVersion!==_)throw new Error(`Remote worker protocol mismatch: expected ${_}, received ${String(e.protocolVersion)}.`);let r=e.workspace,n=e.functions;if(!r||!n)throw new Error("Remote worker config requires workspace and functions objects.");return {schemaVersion:1,region:W(e.region,"region"),...W(e.roleArn,"roleArn",{optional:true})?{roleArn:W(e.roleArn,"roleArn")}:{},...W(e.roleSessionName,"roleSessionName",{optional:true})?{roleSessionName:W(e.roleSessionName,"roleSessionName")}:{},workspace:{bucket:W(r.bucket,"workspace.bucket"),prefix:String(r.prefix??"")},functions:{render:W(n.render,"functions.render"),rewrite:W(n.rewrite,"functions.rewrite"),"deploy-copy":W(n["deploy-copy"],"functions.deploy-copy")},targets:Array.isArray(e.targets)?e.targets.map((o,i)=>{if(!o||typeof o!="object")throw new Error(`targets[${i}] must be an object.`);let s=o;return {id:W(s.id,`targets[${i}].id`),bucketName:W(s.bucketName,`targets[${i}].bucketName`),prefix:String(s.prefix??""),region:W(s.region,`targets[${i}].region`)}}):[],protocolVersion:_}}async function $t(t){let e=k.resolve(t);try{return nn(JSON.parse(await readFile(e,"utf8")))}catch(r){throw new Error(`Unable to load remote worker config ${e}: ${r instanceof Error?r.message:String(r)}`,{cause:r})}}var Ee=class{config;lambda;s3;constructor(e,r={}){this.config=e;let n=e.roleArn?fromTemporaryCredentials({params:{RoleArn:e.roleArn,RoleSessionName:e.roleSessionName??"publisher-exporter-remote-worker"},clientConfig:{region:e.region}}):void 0;this.lambda=new LambdaClient({region:e.region,...n?{credentials:n}:{},...r}),this.s3=new S3Client({region:e.region,...n?{credentials:n}:{}});}async invoke(e){let r=e.operation==="health"?this.config.functions.render:this.config.functions[e.operation],n=await this.lambda.send(new InvokeCommand({FunctionName:r,InvocationType:"RequestResponse",Payload:Buffer.from(JSON.stringify(e),"utf8")})),o=n.Payload?JSON.parse(new TextDecoder().decode(n.Payload)):null;if(n.FunctionError)throw new Error(`Remote ${e.operation} worker failed (${n.FunctionError}): ${JSON.stringify(o)}`);if(!o||typeof o!="object")throw new Error(`Remote ${e.operation} worker returned no JSON response.`);let i=o;if(i.schemaVersion!==_||i.operation!==e.operation||i.jobId!==e.jobId||i.taskId!==e.taskId)throw new Error(`Remote ${e.operation} worker returned a mismatched response.`);return i}async readResult(e){if(!e.resultKey)throw new Error(`Remote ${e.operation} response does not contain a resultKey.`);let r=xe(e.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(e){if(e.bucket!==this.config.workspace.bucket)throw new Error(`Remote worker object bucket mismatch: ${e.bucket}.`);let r=xe(e.key,this.config.workspace.prefix),n=await this.s3.send(new GetObjectCommand({Bucket:this.config.workspace.bucket,Key:r,...e.versionId?{VersionId:e.versionId}:{}}));if(!n.Body)throw new Error(`Remote worker object has no body: ${r}`);let o=await n.Body.transformToByteArray();if(o.byteLength!==e.bytes)throw new Error(`Remote worker object length mismatch for ${r}: expected ${e.bytes}, received ${o.byteLength}.`);if(le(o)!==e.sha256)throw new Error(`Remote worker object checksum mismatch for ${r}.`);return o}async readObjectText(e){return new TextDecoder("utf8",{fatal:true}).decode(await this.readObject(e))}async health(e){let r=this.config.functions[e],n=`${e}-${Date.now()}`,o=await this.lambda.send(new InvokeCommand({FunctionName:r,InvocationType:"RequestResponse",Payload:Buffer.from(JSON.stringify({schemaVersion:_,operation:"health",jobId:"health",taskId:n}),"utf8")})),i=o.Payload?JSON.parse(new TextDecoder().decode(o.Payload)):null;if(o.FunctionError||!i||typeof i!="object")throw new Error(`Remote ${e} health check failed: ${JSON.stringify(i)}`);return i}async writeWorkspaceObject(e){let r=xe(e.key,this.config.workspace.prefix),n=typeof e.body=="string"?Buffer.from(e.body,"utf8"):e.body,o=le(n),i=await this.s3.send(new PutObjectCommand({Bucket:this.config.workspace.bucket,Key:r,Body:n,ContentType:e.contentType,...e.cacheControl?{CacheControl:e.cacheControl}:{},Metadata:{sha256:o,...e.metadata??{}}}));return {bucket:this.config.workspace.bucket,key:r,sha256:o,bytes:n.byteLength,contentType:e.contentType,...i.ETag?{etag:i.ETag}:{},...i.VersionId?{versionId:i.VersionId}:{}}}};var on="remote-workers.json";function Ct(t={}){let e=String(t.explicitPath??"").trim();if(e)return k.resolve(e);let r=String(t.runtimeDir??process.env.STATIC_PUBLISHER_RUNTIME_DIR??process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR??"").trim();return r?k.join(k.resolve(r),on):""}var Mt="wpsuite-sha256",jt="wpsuite-normalized-sha256",Lt="public, max-age=0, must-revalidate",gn=/(?:^|[-_:.])(id|uid|nonce|token|hash|instance)(?:$|[-_:.])/i,Be=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,mn=["SIGINT","SIGTERM"],Te=new Set,$e=new Map,Tt=null;function fn(t){Te.add(t);let e=false;return ()=>{e||(e=true,Te.delete(t));}}async function hn(){let t=[...Te];t.length!==0&&await Promise.allSettled(t.map(async e=>{Te.delete(e),await D.rm(e,{recursive:true,force:true});}));}function yn(){if(!($e.size>0))for(let t of mn){let e=()=>{Tt||(Tt=hn().finally(()=>{for(let[r,n]of $e)process.off(r,n);$e.clear(),process.exit(1);}));};$e.set(t,e),process.on(t,e);}}yn();function wn(t,e){let r=String(process.env.STATIC_PUBLISHER_CRAWL_MANIFEST_PATH||"").trim();if(r)return k.resolve(r);let n=e.trim();return n?k.join(k.resolve(n),"crawl-manifest.json"):k.join(k.resolve(t),".crawl-manifest.json")}function me(t){return k.normalize(t).split(k.sep).join("/")}function It(t,e){let r=k.relative(k.resolve(t),k.resolve(e));return !r||r.startsWith("..")||k.isAbsolute(r)?null:me(r)}async function bn(t,e,r){let n=wn(t.outputDir,e),o;try{o=await D.readFile(n,"utf8");}catch(u){return u.code==="ENOENT"?(r.warn("Deploy rewrite guard disabled because the crawl manifest is missing.",{manifestPath:n,source:"deploy-guard"}),null):(r.warn("Deploy rewrite guard disabled because the crawl manifest could not be read.",{manifestPath:n,error:u instanceof Error?u.message:String(u),source:"deploy-guard"}),null)}let i;try{i=JSON.parse(o);}catch(u){return r.warn("Deploy rewrite guard disabled because the crawl manifest is invalid JSON.",{manifestPath:n,error:u instanceof Error?u.message:String(u),source:"deploy-guard"}),null}let s=new Map,a=new Map,l=0,c=0;for(let[u,g]of Object.entries(i.pages||{})){let d=String(g?.outputPath||"").trim(),w=d?It(t.outputDir,d):null;if(w){let b=typeof g?.contentType=="string"&&g.contentType?g.contentType:null;b&&a.set(w,b);}!d||g?.rewriteComplete===true||w&&(l++,s.has(w)||s.set(w,{kind:"page",sourceUrl:u,outputPath:k.resolve(d),relativePath:w}));}for(let[u,g]of Object.entries(i.assets||{})){let d=String(g?.outputPath||"").trim(),w=g?.isText===true,b=d?It(t.outputDir,d):null;if(b){let v=typeof g?.contentType=="string"&&g.contentType?g.contentType:null;v&&a.set(b,v);}!d||!w||g?.rewriteComplete===true||b&&(c++,s.has(b)||s.set(b,{kind:"asset",sourceUrl:u,outputPath:k.resolve(d),relativePath:b}));}return {manifestPath:n,byRelativePath:s,contentTypeByRelativePath:a,pendingPages:l,pendingTextAssets:c}}function Rn(t){return t&&(Be.test(t)?"__uuid__":/^[0-9a-f]{6,}$/i.test(t)?"__hex__":/^[0-9]{8,}$/.test(t)?"__num__":/^(?=.*[a-z])(?=.*\d)[a-z0-9]{8,}$/i.test(t)?"__alnum__":t)}function Ve(t){return t.split(/([_:.\-/=?&#]+)/g).map((e,r)=>r%2===1?e:Rn(e)).join("")}function Sn(t){return t.split(/([_:.\-/=?&#]+)/g).map((e,r)=>r%2===1?e:Be.test(e)?"__uuid__":/^[0-9a-f]{6,}$/i.test(e)?"__hex__":/^[0-9]{6,}$/.test(e)?"__num__":/^[a-z0-9_-]{6,}$/i.test(e)?"__id__":e).join("")}function Ie(t,e){return Array.isArray(t)?t.map(r=>Ie(r,e)):t&&typeof t=="object"?Object.fromEntries(Object.entries(t).map(([r,n])=>[r,Ie(n,r)])):typeof t!="string"?t:e&&gn.test(e)?Sn(t):Be.test(t)?"__uuid__":/^[0-9a-f]{6,}$/i.test(t)||/^[0-9]{8,}$/.test(t)?Ve(t):t}function Pn(t){return t.replace(/((?:https?:\/\/[^"'\s>]+|\/)(?:wp-content|wp-includes)\/[^"'\s>?]+)\?ver=[A-Za-z0-9._-]+(?=$|[#"'])/gi,"$1")}function kn(t,e){let r=e.trim();if((r.startsWith("{")||r.startsWith("[")||r.startsWith('"'))&&t.startsWith("data-"))try{let o=JSON.parse(r);return JSON.stringify(Ie(o))}catch{}if(t.startsWith("data-")&&/^[A-Za-z0-9+/=]+$/.test(r))try{let o=Buffer.from(r,"base64").toString("utf8"),i=JSON.parse(o),s=JSON.stringify(Ie(i));return Buffer.from(s,"utf8").toString("base64")}catch{}return e}function vn(t,e){let r=t.toLowerCase();return r==="class"?e.split(/(\s+)/).map((n,o)=>o%2===1?n:Ve(n)).join(""):r==="id"||r==="for"||r==="aria-controls"||r==="aria-labelledby"||r==="aria-describedby"||r==="aria-owns"||r==="aria-activedescendant"||r==="name"?Ve(e):r==="href"||r==="src"?Pn(e):kn(r,e)}function xn(t){return t.replace(/<([a-z][^\s/>]*)([^<>]*?)>/gi,(e,r,n)=>{if(r.startsWith("/"))return e;let o=n.replace(/\s([:@a-zA-Z_][-:.a-zA-Z0-9_]*?)=(['"])([\s\S]*?)\2/g,(i,s,a,l)=>{let c=vn(s,l);return ` ${s}=${a}${c}${a}`});return `<${r}${o}>`})}function fe(t){let e=k.extname(t).toLowerCase();return [".html",".htm",".xml",".xsl",".txt"].includes(e)||["robots.txt","sitemap.xml"].includes(k.basename(t))}function Ce(t,e){return [t.replace(/^\/+|\/+$/g,""),e.replace(/^\/+/,"")].filter(Boolean).join("/")}async function En(t,e,r,n){let o=new Map,i,s=0;do{s++;let a=await B(`S3 list objects page ${s} for s3://${e}/${r||""}`,3e5,({httpOptions:l})=>t.send(new ListObjectsV2Command({Bucket:e,Prefix:r||void 0,ContinuationToken:i}),l));for(let l of a.Contents||[]){if(!l.Key)continue;let c=(l.ETag||"").replace(/^"|"$/g,"").toLowerCase(),u=Number(l.Size??0);o.set(l.Key,{etag:c,size:u,cacheControl:void 0});}i=a.NextContinuationToken,n.debug(`Listed S3 keys page ${s}: ${o.size} keys so far`);}while(i);return o}async function $n(t,e,r,n){if(n.has(r))return n.get(r)??null;try{let o=await B(`S3 head object ${r}`,3e5,({httpOptions:s})=>t.send(new HeadObjectCommand({Bucket:e,Key:r}),s)),i={etag:(o.ETag||"").replace(/^"|"$/g,"").toLowerCase(),size:Number(o.ContentLength??0),cacheControl:o.CacheControl?.trim()||null};return n.set(r,i),i}catch{return n.set(r,null),null}}async function Cn(t,e,r,n){if(n.cacheControl!==void 0)return n.cacheControl;try{let o=await B(`S3 head cache metadata ${r}`,3e5,({httpOptions:i})=>t.send(new HeadObjectCommand({Bucket:e,Key:r}),i));n.cacheControl=o.CacheControl?.trim()||null;}catch{n.cacheControl=null;}return n.cacheControl}function Dt(t){return String(t||"").split(",").map(e=>e.trim().toLowerCase()).filter(Boolean).sort().join(",")}async function Tn(t,e,r,n){let o=[...new Set(Array.from(r).filter(Boolean))];if(o.length===0)return n.info("No explicitly tombstoned S3 objects to delete."),[];n.info(`Deleting ${o.length} explicitly tombstoned S3 object(s)\u2026`);for(let i=0;i<o.length;i+=1e3){let s=o.slice(i,i+1e3);if(s.length===0)continue;let a=await B(`S3 delete objects batch ${Math.floor(i/1e3)+1}`,3e5,({httpOptions:l})=>t.send(new DeleteObjectsCommand({Bucket:e,Delete:{Objects:s.map(c=>({Key:c}))}}),l));if(a.Errors&&a.Errors.length>0){let l=a.Errors.map(c=>`${c.Key||"(unknown)"}: ${c.Code||"DeleteFailed"}`);throw new Error(`S3 reported ${l.length} object deletion error(s): ${l.join(", ")}`)}n.info(`Deleted batch of ${s.length} object(s).`);for(let l of s)n.debug(` deleted: ${l}`);}return o}function In(t){return createHash("md5").update(t).digest("hex")}function he(t){return createHash("sha256").update(t).digest("hex")}function De(t){return createHash("sha256").update(xn(t.toString("utf8"))).digest("hex")}async function Dn(t,e,r,n){if(n.has(r))return n.get(r)??null;try{let s=((await B(`S3 head object metadata ${r}`,3e5,({httpOptions:a})=>t.send(new HeadObjectCommand({Bucket:e,Key:r}),a))).Metadata?.[Mt]||"").trim().toLowerCase()||null;return n.set(r,s),s}catch{return n.set(r,null),null}}async function An(t,e,r,n,o){if(n.has(r))return n.get(r)??null;try{let s=((await B(`S3 head object normalized metadata ${r}`,3e5,({httpOptions:a})=>t.send(new HeadObjectCommand({Bucket:e,Key:r}),a))).Metadata?.[jt]||"").trim().toLowerCase();if(s)return n.set(r,s),s}catch{return n.set(r,null),null}if(o.has(r)){let i=o.get(r)??null;return n.set(r,i),i}try{let s=await(await B(`S3 get object ${r}`,3e5,({httpOptions:l})=>t.send(new GetObjectCommand({Bucket:e,Key:r}),l))).Body?.transformToByteArray(),a=s?De(Buffer.from(s)):null;return o.set(r,a),n.set(r,a),a}catch{return o.set(r,null),n.set(r,null),null}}function On(t){return t.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")||"profile"}function Mn(t,e){let r=t,n=Object.entries(e).sort((o,i)=>i[0].length-o[0].length);for(let[o,i]of n)o&&(r=r.split(o).join(i));return r}async function jn(t,e,r,n){let o=k.join(t,"asset-map.json"),i;try{i=await D.readFile(o,"utf8");}catch(l){if(l.code==="ENOENT")return;throw l}let s=JSON.parse(i);if(!s||typeof s!="object")return;let a=Object.fromEntries(Object.entries(s).map(([l,c])=>{let u=String(c??"");return e.urlRewriteMode==="absolute"&&e.targetOrigin&&r.targetOrigin&&e.targetOrigin!==r.targetOrigin&&(u=u.split(e.targetOrigin).join(r.targetOrigin)),u=Mn(u,n),[l,u]}));await D.writeFile(o,JSON.stringify(a,null,2),"utf8");}async function Ln(t,e,r,n,o,i,s){let a=t.targetOrigin!==e.targetOrigin,l=Object.keys(n).length>0;if(!r||!a&&!l)return {outputDir:t.outputDir,cleanup:async()=>{}};if(a&&t.urlRewriteMode!=="absolute")throw new Error(`Deployment profile "${r}" changes targetOrigin, but the base crawl output must use urlRewriteMode "absolute" for multi-target redeploys.`);let c=k.join(k.dirname(t.outputDir),`.deploy-profile-${On(r)}-${Date.now()}`),u=fn(c);o.info(`Preparing deployment profile "${r}" from existing crawl output to ${c}...`);try{if(await D.rm(c,{recursive:!0,force:!0}),i){await D.mkdir(c,{recursive:!0});for(let v of i){let S=k.join(t.outputDir,v),E=k.join(c,v);await D.mkdir(k.dirname(E),{recursive:!0}),await D.copyFile(S,E);}}else await D.cp(t.outputDir,c,{recursive:!0});let g={...t,sourceOrigin:t.targetOrigin,targetOrigin:e.targetOrigin,extraReplacements:n,outputDir:c},d=1;o.info(`Rewriting text files for deployment profile "${r}"...`);let w={files:i,onStart:({totalFiles:v,workerCount:S})=>{d=S,o.info(`Rewriting ${v} text file(s) for deployment profile "${r}" with ${S} worker(s).`);},onProgress:({index:v,totalFiles:S,changedTextFiles:E,file:p,changed:y})=>{let P=`Rewriting [${v}/${S}] ${p} (${y?"rewrote":"checked"}; ${E} changed so far)`;S<=200||v<=5||v%10===0||v===S?(o.progress(P,{file:p,index:v,totalFiles:S,changed:y,changedTextFiles:E,workerCount:d}),o.info(P)):o.debug(P);}},b=s?await vt(g,{},{...s,options:w}):await St(g,{},w);return await jn(c,t,e,n),o.info(`Prepared deployment profile "${r}" in ${c} (${b} rewritten text file(s)).`),{outputDir:c,cleanup:async()=>{u(),await D.rm(c,{recursive:!0,force:!0});}}}catch(g){throw o.error(`Failed to prepare deployment profile "${r}" temporary output.`,{tempDir:c,outputDir:t.outputDir,error:g instanceof Error?g.message:String(g),...g instanceof Error&&g.stack?{stack:g.stack}:{}}),await D.rm(c,{recursive:true,force:true}).catch(()=>{}),u(),await o.flush().catch(()=>{}),g}}function Fn(t,e){let r=o=>o.replace(/^\/+|\/+$/g,""),n=t.targets.find(o=>o.bucketName===e.s3.bucket&&r(o.prefix)===r(e.s3.prefix)&&o.region===e.s3.region);if(!n)throw new Error(`No CDK Lambda deployment target matches s3://${e.s3.bucket}/${e.s3.prefix||""} in ${e.s3.region}. Redeploy the CDK with this target and reinstall remote-workers.json.`);return n}function _n(t,e){if(!t||typeof t!="object")throw new Error("Remote deploy result must be a JSON object.");let r=t;if(r.schemaVersion!==_||r.response?.operation!=="deploy-copy"||r.response.jobId!==e.jobId||r.response.taskId!==e.taskId||!r.detail||!Array.isArray(r.detail.objects)||!Array.isArray(r.detail.deletedKeys)||!Array.isArray(r.detail.deleteErrors))throw new Error("Remote deploy result has an invalid envelope.");return r}async function At(t){let e=null;for(let r=1;r<=Math.max(1,Math.min(5,t.maxAttempts));r+=1){let n=ae(`deploy-${t.batchIndex}-a${r}-${Date.now()}`,"taskId");try{let o=await t.client.invoke({schemaVersion:_,operation:"deploy-copy",jobId:t.jobId,taskId:n,targetId:t.targetId,items:t.items,...t.deleteRelativeKeys?{deleteRelativeKeys:t.deleteRelativeKeys}:{}}),i=_n(await t.client.readResult(o),o);if(i.response.status==="partial")throw new Error(`Worker reported ${i.response.failedItems} failed item(s).`);return i}catch(o){e=o;}}throw new Error(`Remote deploy task failed after ${t.maxAttempts} attempt(s): ${e instanceof Error?e.message:String(e)}`,{cause:e})}async function Wn(t){let e=Fn(t.remoteConfig,t.config),r=ae(`deploy-${Date.now()}-${he(Buffer.from(`${e.id}:${t.config.outputDir}`)).slice(0,12)}`,"jobId"),n=ve(t.remoteConfig.workspace.prefix,"jobs",r,"deploy-inputs");t.log.progress(`Staging export for Lambda deploy: 0/${t.files.length}`,{phase:"deploy-stage",index:0,totalFiles:t.files.length,uploaded:0,skipped:0,failed:0,mode:"lambda-s3-copy"});let o=0,i=[],s=Math.max(1,Math.min(16,t.concurrency*2)),a=0;await Promise.all(Array.from({length:Math.min(s,t.files.length)},async()=>{for(;;){let p=a;if(p>=t.files.length)return;a+=1;let y=t.files[p],C=await D.readFile(k.join(t.config.outputDir,y)),P=t.contentTypeByRelativePath?.get(y)||Ot.lookup(y)||"application/octet-stream",$=t.revalidateFiles.has(me(y))?Lt:fe(y)?t.config.s3.htmlCacheControl:t.config.s3.assetCacheControl,x=he(C),A=fe(y)?De(C):void 0,R=`${n}/files/${he(Buffer.from(y))}-${k.basename(y)}`.replace(/\/+/g,"/");await t.client.writeWorkspaceObject({key:R,body:C,contentType:String(P),cacheControl:$,metadata:{"wpsuite-sha256":x,...A?{"wpsuite-normalized-sha256":A}:{}}}),i[p]={sourceKey:R,targetRelativeKey:y,sha256:x,...A?{normalizedSha256:A}:{},bytes:C.byteLength,contentType:String(P),cacheControl:$},o+=1,(o===t.files.length||o<=5||o%25===0)&&t.log.progress(`Staging export for Lambda deploy: ${o}/${t.files.length}`,{phase:"deploy-stage",index:o,totalFiles:t.files.length,staged:o,mode:"lambda-s3-copy"});}}));let l=[],c=Math.max(1,Math.min(500,t.batchSize));for(let p=0;p<i.length;p+=c)l.push(i.slice(p,p+c));let u=[],g=[],d=[],w=0,b=0,v=0,S=Math.max(1,Math.min(Math.max(1,t.concurrency),l.length));if(t.log.progress(`Lambda deploy: 0/${t.files.length}`,{phase:"deploy-copy",index:0,totalFiles:t.files.length,uploaded:0,skipped:0,failed:0,mode:"lambda-s3-copy",workerCount:S,completedBatches:0,totalBatches:l.length}),await Promise.all(Array.from({length:S},async()=>{for(;;){let p=v;if(p>=l.length)return;v+=1;let y=Date.now(),C=await At({client:t.client,jobId:r,targetId:e.id,batchIndex:p+1,items:l[p],maxAttempts:t.maxAttempts}),P=0,$=0,x=0;for(let R of C.detail.objects)w+=1,R.status==="copied"?(u.push(R.targetKey),P+=1):R.status==="skipped"?(g.push(R.targetKey),$+=1):(d.push(R.targetKey),x+=1),t.log.debug(`Lambda deploy ${R.status}: ${R.targetKey}`,{phase:"deploy-copy",batch:p+1,sourceKey:R.sourceKey,targetKey:R.targetKey,status:R.status,...R.error?{error:R.error}:{}});b+=1;let A=Date.now()-y;t.log.info(`Lambda deploy batch ${p+1}/${l.length} completed: ${P} copied, ${$} skipped unchanged, ${x} failed.`,{phase:"deploy-copy",batch:p+1,totalBatches:l.length,items:C.detail.objects.length,copied:P,skipped:$,failed:x,elapsedMs:A,elapsedSeconds:Math.round(A/10)/100,workerExporterVersion:C.response.exporterVersion,...C.requestId?{lambdaRequestId:C.requestId}:{},...C.completedAt?{workerCompletedAt:C.completedAt}:{}}),t.log.progress(`Lambda deploy: ${w}/${t.files.length}`,{phase:"deploy-copy",index:w,totalFiles:t.files.length,uploaded:u.length,skipped:g.length,failed:d.length,mode:"lambda-s3-copy",workerCount:S,completedBatches:b,totalBatches:l.length});}})),d.length>0)throw new Error(`Remote deployment failed for ${d.length} object(s).`);let E=[];for(let p=0;p<t.deletedFiles.length;p+=1e3){let y=t.deletedFiles.slice(p,p+1e3);if(y.length===0)continue;let C=await At({client:t.client,jobId:r,targetId:e.id,batchIndex:l.length+Math.floor(p/1e3)+1,items:[],deleteRelativeKeys:y,maxAttempts:t.maxAttempts});E.push(...C.detail.deletedKeys),t.log.progress(`Lambda deploy deletions: ${E.length}/${t.deletedFiles.length}`,{phase:"deploy-delete",index:E.length,totalFiles:t.deletedFiles.length,deleted:E.length,mode:"lambda-s3-copy"});}return {uploadedKeys:u,skippedKeys:g,failedKeys:d,deletedKeys:E}}async function Ft(t=process.argv.slice(2)){let e=await we(),r=at(t),n=lt(e,r),o=k.resolve(n.config.logDir||"logs"),i=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",s=i?k.join(k.resolve(i),"deploy-diff.json"):"",a=new ie(o,"deploy.log.jsonl",n.config.logLevel??"info"),l=n.profile?.extraReplacements??{},c=async()=>{};try{let u=await it(e);if(t.includes("--content-sync")&&u?.schemaVersion!==2)throw new Error("Content-sync deployment requires a valid schema-2 targeted deploy plan.");let d=await st(e);if(d)throw new Error(`Deployment blocked: the crawl started at ${d.startedAt} did not complete its final rewrite. Run a successful crawl or resume the rewrite before deploying.`);let w=e.remoteWorkers?.rewrite?.enabled===!0,b=e.remoteWorkers?.deploy?.enabled===!0,v=null,S=null;if(w||b){let m=Ct({runtimeDir:i});if(!m)throw new Error("Remote Lambda workers are enabled, but the runtime directory is unknown.");v=await $t(m),S=new Ee(v);}let E=await Ln(e,n.config,n.name,l,a,u?.schemaVersion===2?u.changedFiles:void 0,w&&S?{client:S,jobId:`profile-${Date.now()}`,concurrency:e.remoteWorkers?.rewrite?.concurrency??e.rewriteConcurrency,batchSize:e.remoteWorkers?.rewrite?.batchSize??25,maxAttempts:e.remoteWorkers?.rewrite?.maxAttempts??2,onStageProgress:({index:m,totalFiles:O,file:h})=>{(m===1||m===O||m%25===0)&&a.progress(`Staging deployment-profile rewrite: ${m}/${O}`,{phase:"rewrite-stage",index:m,totalFiles:O,file:h,execution:"lambda"});}}:void 0);c=E.cleanup;let p={...n.config,outputDir:E.outputDir},y=p.s3SyncMode??"sdk-upload-delete";if(u?.schemaVersion===2&&u.deletedFiles.length>0&&y!=="sdk-upload-delete")throw new Error("Content-sync tombstones require the sdk-upload-delete S3 sync mode.");let C=u?.schemaVersion!==2&&E.outputDir!==e.outputDir&&(e.targetOrigin!==n.config.targetOrigin||Object.keys(l).length>0),P=!!u&&!u.fullSyncRequired&&!C;if(u?.schemaVersion===2&&!P)throw new Error("Content-sync deployment cannot widen into a full-output deployment.");n.name&&a.info(`Using deployment profile: ${n.name}`),a.info(`Starting deploy \u2014 s3://${p.s3.bucket}/${p.s3.prefix||""} (region: ${p.s3.region})`),a.info(`S3 sync mode: ${y}`),u&&u.fullSyncRequired?a.info("Deploy plan requests a full sync; scanning the whole output tree."):u&&C?a.info("Ignoring incremental deploy plan because deployment-profile rewrites require a full sync."):P&&a.info(`Using incremental deploy plan: ${u.changedFiles.length} changed file(s), ${u.deletedFiles.length} deleted file(s).`),a.mark("deploy");let $=new S3Client({region:p.s3.region}),x=E.outputDir===e.outputDir?await bn(e,i,a):null,A=u?.schemaVersion===2?[...u.uploadGroups.assets,...u.uploadGroups.content,...u.uploadGroups.listings,...u.uploadGroups.resources,...u.uploadGroups.sitemapLeaves,...u.uploadGroups.sitemapIndexes]:u?.changedFiles??[];if(u?.schemaVersion===2){let m=[...new Set(A)],O=[...new Set(u.changedFiles)];if(m.length!==O.length||O.some(h=>!m.includes(h)))throw new Error("Content-sync deploy-plan upload groups do not cover the exact changed-file set.")}let R=P?(await Promise.all(A.map(async m=>{try{return (await D.stat(k.join(p.outputDir,m))).isFile()?m:null}catch{if(u?.schemaVersion===2)throw new Error(`Content-sync planned upload is missing: ${m}`);return null}}))).filter(m=>m!==null):await xr(["**/*"],{cwd:p.outputDir,onlyFiles:!0,dot:!0}),M=[],F=[],f=R.filter(m=>{let O=x?.byRelativePath.get(me(m));if(!O)return !0;let h=Ce(p.s3.prefix,m);return M.push(m),F.push(h),a.reject(O.kind,O.sourceUrl||m,"rewrite not completed; deploy upload blocked","deploy-guard",{file:m,key:h,outputPath:O.outputPath,manifestPath:x?.manifestPath}),!1}),qe=new Set((u?.revalidateFiles||[]).map(me)),He=new Set((P?f:R).map(m=>Ce(p.s3.prefix,m)));x&&(x.pendingPages>0||x.pendingTextAssets>0)&&a.info(`Deploy rewrite guard loaded ${x.pendingPages} pending page(s) and ${x.pendingTextAssets} pending text asset(s) from crawl manifest.`,{manifestPath:x.manifestPath,pendingPages:x.pendingPages,pendingTextAssets:x.pendingTextAssets,source:"deploy-guard"}),M.length>0&&a.warn(`Deploy rewrite guard blocked ${M.length} file(s) from upload because final crawl rewrite is incomplete.`,{rejected:M.length,manifestPath:x?.manifestPath,source:"deploy-guard"}),P?a.info(`Using ${f.length} eligible planned changed file(s) from deploy plan for upload${M.length>0?` (${M.length} blocked by deploy rewrite guard)`:""}.`):a.info(`Found ${R.length} file(s) in output directory "${p.outputDir}"${M.length>0?`; ${f.length} remain eligible for upload after deploy rewrite guard filtering`:""}.`),a.progress("Deploy preflight: comparing local output with remote S3 state.",{phase:"deploy",mode:y,totalFiles:f.length,scannedFiles:R.length,rejected:M.length,deploymentProfile:n.name||"",s3Bucket:p.s3.bucket,s3Prefix:p.s3.prefix||"",targetedPlan:P,deployGuardEnabled:E.outputDir===e.outputDir});let j=0,I=0,N=0,ee=[],H=[],J=[],Y=[],Z=[],te=new Map,_t=new Map,Wt=new Map,Nt=new Map,Kt=new Map;if(b){if(!S||!v)throw new Error("Remote deploy worker client was not initialized.");if(y!=="sdk-upload-delete"&&y!=="sdk-upload-only")throw new Error(`Unsupported remote deploy mode: ${y}`);let m=await Wn({client:S,remoteConfig:v,config:p,files:f,deletedFiles:y==="sdk-upload-delete"?u?.deletedFiles??[]:[],revalidateFiles:qe,contentTypeByRelativePath:x?.contentTypeByRelativePath,concurrency:p.remoteWorkers?.deploy?.concurrency??p.assetDownloadConcurrency,batchSize:p.remoteWorkers?.deploy?.batchSize??50,maxAttempts:p.remoteWorkers?.deploy?.maxAttempts??2,log:a});ee.push(...m.uploadedKeys),H.push(...m.skippedKeys),J.push(...m.failedKeys),Y=m.deletedKeys,j=ee.length,I=H.length,N=J.length,a.info(`Lambda deploy complete: ${j} copied, ${I} skipped unchanged, ${Y.length} deleted, ${N} failed.`),s&&(await D.mkdir(k.dirname(s),{recursive:!0}),await D.writeFile(s,JSON.stringify({generatedAt:new Date().toISOString(),mode:"lambda-s3-copy",summary:{totalFiles:R.length,eligibleFiles:f.length,uploaded:j,skipped:I,rejected:F.length,failed:N,deleted:Y.length,protected:0,...n.name?{profile:n.name}:{}},uploadedKeys:ee,skippedKeys:H,rejectedKeys:F,failedKeys:J,deletedKeys:Y,protectedRemoteOnlyKeys:[]},null,2),"utf8")),u?.schemaVersion!==2&&await _e(e),a.endMark("deploy"),await a.flush();return}P||(a.info("Listing existing S3 objects to detect unchanged files..."),te=await En($,p.s3.bucket,p.s3.prefix,a),a.info(`Found ${te.size} existing key(s) in S3.`));let Ut=async m=>te.has(m)?te.get(m)??null:P?$n($,p.s3.bucket,m,_t):null;for(let m of f){let O=k.join(p.outputDir,m),h=Ce(p.s3.prefix,m),K=x?.contentTypeByRelativePath.get(m),ce=K&&K!=="application/octet-stream"?K:Ot.lookup(m)||K||"application/octet-stream",Je=qe.has(me(m)),Ge=Je?Lt:fe(m)?p.s3.htmlCacheControl:p.s3.assetCacheControl,T=j+I+N+1;f.length<=200||T<=5||T%10===0||T===f.length?(a.progress(`Uploading [${T}/${f.length}] ${h} (${ce})`,{file:m,key:h,index:T,totalFiles:f.length,contentType:ce,mode:y}),a.info(`Uploading [${T}/${f.length}] ${h} (${ce})`)):a.debug(`Uploading [${T}/${f.length}] ${h} (${ce})`);try{let U=await D.readFile(O),re=await Ut(h),ue=null,ne=null;if(re){let pe=!Je||Dt(await Cn($,p.s3.bucket,h,re))===Dt(Ge),Vt=U.byteLength;if(re.size===Vt){let ye=re.etag.includes("-");if(re.etag!==""&&!ye){let zt=In(U);if(re.etag===zt&&pe){I++,f.length<=200||I<=5||I%25===0?(a.progress(`Skipped unchanged [${T}/${f.length}] ${h}`,{file:m,key:h,index:T,totalFiles:f.length,uploaded:j,skipped:I,failed:N,mode:y,reason:"etag-md5-match"}),a.info(`Skipped unchanged [${T}/${f.length}] ${h}`)):a.debug(`Skipped unchanged [${T}/${f.length}] ${h}`),H.push(h);continue}}ue=he(U);let Qe=await Dn($,p.s3.bucket,h,Wt);if(Qe&&Qe===ue&&pe){I++,f.length<=200||I<=5||I%25===0?(a.progress(`Skipped unchanged [${T}/${f.length}] ${h}`,{file:m,key:h,index:T,totalFiles:f.length,uploaded:j,skipped:I,failed:N,mode:y,reason:"metadata-sha256-match"}),a.info(`Skipped unchanged [${T}/${f.length}] ${h}`)):a.debug(`Skipped unchanged [${T}/${f.length}] ${h}`),H.push(h);continue}}if(fe(m)){ne=De(U);let ye=await An($,p.s3.bucket,h,Nt,Kt);if(ye&&ye===ne&&pe){I++,f.length<=200||I<=5||I%25===0?(a.progress(`Skipped semantically unchanged [${T}/${f.length}] ${h}`,{file:m,key:h,index:T,totalFiles:f.length,uploaded:j,skipped:I,failed:N,mode:y,reason:"normalized-html-match"}),a.info(`Skipped semantically unchanged [${T}/${f.length}] ${h}`)):a.debug(`Skipped semantically unchanged [${T}/${f.length}] ${h}`),H.push(h);continue}}}ue=ue??he(U),ne=ne??(fe(m)?De(U):null),await B(`S3 upload ${h}`,9e5,({abortController:pe})=>new Upload({client:$,abortController:pe,params:{Bucket:p.s3.bucket,Key:h,Body:U,ContentType:ce,CacheControl:Ge,Metadata:{[Mt]:ue,...ne?{[jt]:ne}:{}}}}).done()),j++,ee.push(h),(j%25===0||j===f.length)&&(a.progress(`Uploaded ${j}/${f.length} file(s)\u2026`,{uploaded:j,skipped:I,failed:N,totalFiles:f.length,mode:y}),a.info(`Uploaded ${j}/${f.length} file(s)\u2026`));}catch(U){N++,J.push(h),a.error(`Failed to upload ${h}: ${U.message}`,{key:h,error:String(U)});}}if(a.info(`Upload complete: ${j} uploaded, ${I} skipped unchanged, ${F.length} rejected by guard, ${N} failed.`),J.length>0||F.length>0)throw new Error(`Deployment stopped before deletion because ${J.length} upload(s) failed and ${F.length} upload(s) were rejected.`);if(y==="sdk-upload-delete"){let m=new Set((u?.deletedFiles??[]).map(h=>Ce(p.s3.prefix,h))),O=[...m].filter(h=>!He.has(h));if(!P&&(Z=[...te.keys()].filter(K=>!He.has(K)).filter(K=>!m.has(K)),Z.length>0)){a.warn(`Protected ${Z.length} remote-only S3 object(s) from deletion because the crawl did not provide explicit tombstones.`,{protected:Z.length,source:"deploy-delete-guard"});for(let K of Z)a.debug(` protected remote-only object: ${K}`);}Y=await Tn($,p.s3.bucket,P?O:O.filter(h=>te.has(h)),a);}else a.info("Sync mode is sdk-upload-only \u2014 skipping stale object deletion.");s&&(await D.mkdir(k.dirname(s),{recursive:!0}),await D.writeFile(s,JSON.stringify({generatedAt:new Date().toISOString(),mode:y,summary:{totalFiles:R.length,eligibleFiles:f.length,uploaded:ee.length,skipped:H.length,rejected:F.length,failed:J.length,deleted:Y.length,protected:Z.length,...n.name?{profile:n.name}:{}},uploadedKeys:ee,skippedKeys:H,rejectedKeys:F,failedKeys:J,deletedKeys:Y,protectedRemoteOnlyKeys:Z},null,2),"utf8")),u?.schemaVersion!==2&&await _e(e),a.endMark("deploy"),await a.flush();}finally{await c().catch(()=>{});}}Ft().catch(async t=>{console.error(t);try{let r=(await we().catch(()=>null))?.logDir??"logs",n=new ie(r,"deploy.log.jsonl","debug");n.error(`Unhandled error: ${t instanceof Error?t.message:String(t)}`,t instanceof Error?{stack:t.stack}:void 0),await n.flush();}catch{}process.exit(1);});
@@ -1,3 +1,3 @@
1
- import S from'fs/promises';import te from'http';import re from'https';import P from'path';import {CloudFrontClient,waitUntilInvalidationCompleted,CreateInvalidationCommand}from'@aws-sdk/client-cloudfront';import {createHash}from'crypto';var U=["/sitemap_index.xml","/wp-sitemap.xml","/sitemap.xml"];function $(r){let e=r.trim();return e==="."?".":e.replace(/\/$/,"")}function ie(r){let e=String(r??"").trim();if(!e)return "";let t=e;if(/^https?:\/\//i.test(t))try{t=new URL(t).pathname;}catch{return ""}if(t=t.split(/[?#]/,1)[0]?.replace(/\\/g,"/").trim()??"",!t)return "";let n=t.endsWith("/"),i=t.replace(/^\/+/,"").split("/").map(o=>o.replace(/[^A-Za-z0-9._-]/g,"")).filter(o=>o.length>0&&o!=="."&&o!=="..");if(i.length===0)return "";let s=`/${i.join("/")}`;return n&&P.extname(s)===""&&(s+="/"),s==="/"?"":s}function E(r){return !r||typeof r!="object"?{}:Object.fromEntries(Object.entries(r).map(([e,t])=>[e.trim(),String(t??"")]).filter(([e])=>e.length>0))}function ne(r){if(!r||typeof r!="object")return {};let e={};for(let[t,n]of Object.entries(r)){let i=t.trim();if(!i||!n||typeof n!="object")continue;let s=n,o={};if(typeof s.targetOrigin=="string"){let a=$(s.targetOrigin);a&&(o.targetOrigin=a);}let l=E(s.extraReplacements);if(Object.keys(l).length>0&&(o.extraReplacements=l),s.s3&&typeof s.s3=="object"){let a={},u=s.s3;typeof u.bucket=="string"&&(a.bucket=u.bucket.trim()),typeof u.prefix=="string"&&(a.prefix=u.prefix.trim()),typeof u.region=="string"&&(a.region=u.region.trim()),typeof u.htmlCacheControl=="string"&&(a.htmlCacheControl=u.htmlCacheControl.trim()),typeof u.assetCacheControl=="string"&&(a.assetCacheControl=u.assetCacheControl.trim()),Object.keys(a).length>0&&(o.s3=a);}if(s.cloudFront&&typeof s.cloudFront=="object"){let a={},u=s.cloudFront;typeof u.distributionId=="string"&&(a.distributionId=u.distributionId.trim()),Array.isArray(u.invalidationPaths)&&(a.invalidationPaths=u.invalidationPaths.map(c=>String(c??"").trim()).filter(c=>c.length>0)),Object.keys(a).length>0&&(o.cloudFront=a);}e[i]=o;}return e}function L(r){return r==="PROFESSIONAL"||r==="AGENCY"?r:void 0}function se(r,e){if(!r||typeof r!="object")return null;let t=r,n=t.command;if(n!=="publish"&&n!=="crawl"&&n!=="deploy"&&n!=="invalidate"&&n!=="retry-timeouts"&&n!=="url"&&n!=="content-sync")return null;let i=Number.parseInt(String(t.intervalMinutes??"0"),10);if(!Number.isFinite(i)||i<1)return null;let s=String(t.id??`${n}-${e+1}`).trim();if(!s)return null;let o=String(t.deploymentProfile??"").trim(),l=String(t.url??"").trim(),a=Array.isArray(t.postTypes)?[...new Set(t.postTypes.map(c=>String(c??"").trim().toLowerCase().replace(/[^a-z0-9_-]/g,"")).filter(Boolean))]:[],u=Array.isArray(t.listingPaths)?[...new Set(t.listingPaths.map(c=>String(c??"").trim()).filter(Boolean))]:[];return n==="content-sync"&&a.length===0?null:{id:s,enabled:t.enabled!==false,command:n,intervalMinutes:i,...n==="publish"||n==="crawl"?{crawlMode:t.crawlMode==="incremental"?"incremental":"full"}:{},...(n==="publish"||n==="deploy"||n==="invalidate"||n==="content-sync")&&o?{deploymentProfile:o}:{},...l?{url:l}:{},...a.length>0?{postTypes:a}:{},...u.length>0?{listingPaths:u}:{},...typeof t.includeSubsites=="boolean"?{includeSubsites:t.includeSubsites}:{},...typeof t.includePostTypeArchives=="boolean"?{includePostTypeArchives:t.includePostTypeArchives}:{},...typeof t.includeTaxonomyArchives=="boolean"?{includeTaxonomyArchives:t.includeTaxonomyArchives}:{},...typeof t.includeAuthorArchives=="boolean"?{includeAuthorArchives:t.includeAuthorArchives}:{},...typeof t.includeDateArchives=="boolean"?{includeDateArchives:t.includeDateArchives}:{},...typeof t.includePostsPage=="boolean"?{includePostsPage:t.includePostsPage}:{},...typeof t.includeSitemapChain=="boolean"?{includeSitemapChain:t.includeSitemapChain}:{}}}function j(r){let e=r&&typeof r=="object"?r:{},t=Array.isArray(e.rules)?e.rules.map((n,i)=>se(n,i)).filter(n=>!!n):[];return {enabled:e.enabled===true,timezone:typeof e.timezone=="string"&&e.timezone.trim()!==""?e.timezone.trim():"UTC",rules:t}}function oe(r){if(!r||typeof r!="object")return;let e=r,t={};for(let i of ["accountId","siteId"]){let s=e[i];typeof s=="string"&&s.trim()!==""&&(t[i]=s.trim());}let n=Number(e.lastUpdate??0);return Number.isFinite(n)&&n>0&&(t.lastUpdate=Math.floor(n)),e.subscriber===true&&(t.subscriber=true),Object.keys(t).length>0?t:void 0}function x(r){let e=r&&typeof r=="object"?r:{},t=String(e.accountId??"").trim(),n=String(e.siteId??"").trim(),i=e.subscriber===true,s=oe(e.siteSettings),o={...s??{},...t?{accountId:s?.accountId??t}:{},...n?{siteId:s?.siteId??n}:{},...s?.subscriber===true||i?{subscriber:true}:{}},l={},a=String(e.apiBase??"").trim();a&&(l.apiBase=a);let u=String(e.runtimeToken??e.nonce??"").trim();u&&(l.runtimeToken=u);let c=String(e.virtualAssetBaseUrl??e.uploadUrl??"").trim();c&&(l.virtualAssetBaseUrl=c),Object.keys(o).length>0&&(l.siteSettings=o);let g=L(e.subscriptionType);return g&&(l.subscriptionType=g),l}function ae(r){try{let e=new URL(r);globalThis.location=e;}catch{}}function _(r){return typeof r=="string"?r:r instanceof URL?r.toString():r.url}function le(r,e){let t=new Headers(r instanceof Request?r.headers:void 0);if(e?.headers)for(let[n,i]of new Headers(e.headers).entries())t.set(n,i);return t}async function q(r,e,t=5){let n=new URL(_(r)),i=String(e?.method??(r instanceof Request?r.method:"GET")).toUpperCase(),s=n.protocol==="http:"?te:re,o=le(r,e);return await new Promise((l,a)=>{let u=s.request(n,{method:i,headers:Object.fromEntries(o.entries()),...n.protocol==="https:"?{rejectUnauthorized:false}:{}},c=>{let g=[];c.on("data",p=>{g.push(Buffer.isBuffer(p)?p:Buffer.from(p));}),c.on("error",a),c.on("end",()=>{let p=c.statusCode??0,m=c.headers.location;if(t>0&&m&&[301,302,303,307,308].includes(p)){l(q(new URL(m,n),{method:p===303?"GET":i},t-1));return}let d=new Headers;for(let[f,h]of Object.entries(c.headers))Array.isArray(h)?d.set(f,h.join(", ")):typeof h=="string"&&d.set(f,h);l(new Response(Buffer.concat(g),{status:p,statusText:c.statusMessage??"",headers:d}));});});u.on("error",a),u.end();})}function ue(r){let e=x(r.wpsuite),t={...e.siteSettings??{},...e.siteSettings?.subscriber===true||e.subscriptionType==="PROFESSIONAL"||e.subscriptionType==="AGENCY"?{subscriber:true}:{}},n=String(t.accountId??"").trim(),i=String(t.siteId??"").trim(),s=String(e.virtualAssetBaseUrl??e.uploadUrl??"").trim();if(r.wpsuite={...e.apiBase?{apiBase:e.apiBase}:{},...e.runtimeToken?{runtimeToken:e.runtimeToken}:{},...s?{virtualAssetBaseUrl:s}:{},...Object.keys(t).length>0?{siteSettings:t}:{},...e.subscriptionType?{subscriptionType:e.subscriptionType}:{}},!n||!i||!s)return false;ae(r.sourceOrigin);let o=globalThis,a={...o.WpSuite??{},siteSettings:t,uploadUrl:s};return e.apiBase&&(a.apiBase=e.apiBase),o.WpSuite=a,true}async function ce(r){let e=String(r.wpsuite?.virtualAssetBaseUrl??r.wpsuite?.uploadUrl??"").trim();if(!ue(r)){let i=r.wpsuite?.siteSettings,s=[String(i?.accountId??"").trim()?"":"accountId",String(i?.siteId??"").trim()?"":"siteId",e?"":"virtualAssetBaseUrl"].filter(Boolean);return {remote:null,diagnostic:{status:"invalid-runtime",virtualAssetBaseUrl:e,subscriptionType:null,error:`Missing WP Suite runtime field(s): ${s.join(", ")}.`,requests:[]}}}let t=globalThis.fetch,n=[];try{typeof t=="function"&&/^https?:\/\//i.test(e)&&(globalThis.fetch=(async(a,u)=>{let c=_(a);if(c.startsWith(e)){let g=(()=>{try{return new URL(c).pathname}catch{return c}})();try{let p=r.ignoreHttpsErrors&&c.startsWith("https://")?await q(a,u):await t(a,u);return n.push({path:g,status:p.status,ok:p.ok,error:null}),p}catch(p){throw n.push({path:g,status:null,ok:!1,error:p instanceof Error?p.message:String(p)}),p}}return t(a,u)}));let{getConfig:i}=await import('@smart-cloud/wpsuite-core'),s=await i("publisher"),o=s&&typeof s=="object"?s:null,l=L(o?.subscriptionType);return {remote:o,diagnostic:{status:o?"loaded":"unavailable",virtualAssetBaseUrl:e,subscriptionType:l??null,error:o?null:"WP Suite publisher config loader returned no configuration.",requests:n}}}catch(i){return {remote:null,diagnostic:{status:"unavailable",virtualAssetBaseUrl:e,subscriptionType:null,error:i instanceof Error?i.message:String(i),requests:n}}}finally{typeof t=="function"&&(globalThis.fetch=t);}}function de(r,e){let t=ne(e?.deploymentProfiles),n=String(e?.defaultDeploymentProfile??"").trim(),i=t[n]?n:"",s=L(e?.subscriptionType),o=x(r.wpsuite);return {...r,scheduler:j(e?.scheduler),deploymentProfiles:t,defaultDeploymentProfile:i,...s?{subscriptionType:s}:{},wpsuite:{...o,...o.siteSettings||s?{siteSettings:{...o.siteSettings??{},...o.siteSettings?.subscriber===true||s==="PROFESSIONAL"||s==="AGENCY"?{subscriber:true}:{}}}:{},...s?{subscriptionType:s}:{}}}}function k(r,e){let n=String(r||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!n)return e;let i=n.split("/").map(s=>s.trim()).filter(s=>s.length>0&&s!=="."&&s!=="..");return i.length>0?i.join("/"):e}function pe(){let r=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return r.trim()?P.resolve(r):""}function N(r,e,t){let n=String(e||"").trim();return n&&P.isAbsolute(n)?P.resolve(n):P.resolve(r,k(n,t))}async function D(r,e={}){let t=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",n=await S.readFile(t,"utf8"),i=JSON.parse(n);i.sourceOrigin=i.sourceOrigin.replace(/\/$/,""),i.targetOrigin=$(i.targetOrigin),i.ignoreHttpsErrors??=false,i.outputDir=String(i.outputDir||"export").trim()||"export",i.urlRewriteMode||=i.targetOrigin==="."?"relative":"absolute",i.noJavaScriptRenderPathPrefixes||=[],i.seedPaths||=[],i.generated404RequestPath=ie(i.generated404RequestPath),i.sitemapPaths||=[...U],i.allowedAssetHosts||=[],i.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],i.blockedPathPrefixes||=[],i.blockedSearchFragments||=[],i.concurrency||=1,i.maxPages||=0,i.extraReplacements=E(i.extraReplacements),i.postCrawlCopyMap=E(i.postCrawlCopyMap),i.logDir=String(i.logDir||"logs").trim()||"logs",i.verbose??=false,i.logLevel||=i.verbose?"debug":"info",i.s3SyncMode||="sdk-upload-delete",i.readiness||={waitForSelector:null,waitForFunction:null,timeoutMs:1500,fallbackWaitMs:1500},i.readiness.timeoutMs??=1500,i.readiness.fallbackWaitMs??=1500,i.viewport||={width:1440,height:1200},i.navigationTimeoutMs||=3e4,i.assetDownloadConcurrency=Number(i.assetDownloadConcurrency)>0?Number(i.assetDownloadConcurrency):i.concurrency,i.rewriteConcurrency=Number(i.rewriteConcurrency)>0?Number(i.rewriteConcurrency):i.assetDownloadConcurrency,i.wpsuite=x(i.wpsuite),i.scheduler=j(void 0),i.deploymentProfiles={},i.defaultDeploymentProfile="",i.deploymentTargetOverride=String(i.deploymentTargetOverride??"").trim();let s=await ce(i);e.onRemotePublisherConfigDiagnostic?.(s.diagnostic);let o=de(i,s.remote),l=pe(),a=l?P.resolve(l,".."):"";return a?(o.outputDir=N(a,o.outputDir,"export"),o.logDir=N(a,o.logDir,"logs")):(P.isAbsolute(o.outputDir)||(o.outputDir=k(o.outputDir,"export")),P.isAbsolute(o.logDir)||(o.logDir=k(o.logDir,"logs"))),o}function ge(r){let e=r/6e4;if(Number.isInteger(e)&&e>=1)return `${e} minute${"s"}`;let t=Math.ceil(r/1e3);return `${t} second${t===1?"":"s"}`}async function M(r,e,t){let n=new AbortController,i=globalThis.setTimeout(()=>{n.abort(new Error(`${r} timed out after ${ge(e)}.`));},e);try{return await t({abortController:n,httpOptions:{abortSignal:n.signal,requestTimeout:e}})}finally{globalThis.clearTimeout(i);}}function he(r){let e=r;return e.endsWith("/")?e+="index.html":P.posix.basename(e).includes(".")||(e+="/index.html"),e}function fe(r,e){let t=e.trim().replace(/^\/+|\/+$/g,"");if(!t)return null;let n=`/${t}`;return r===n||r.startsWith(`${n}/`)?r:`${n}${r.startsWith("/")?r:`/${r}`}`}function W(r,e){let t=new Set;for(let n of r){let i=new URL(n,"https://content-sync.invalid");if(i.origin!=="https://content-sync.invalid")continue;let s=`${i.pathname}${i.search}`,o=he(i.pathname);t.add(s),t.add(`${o}${i.search}`);let l=fe(o,e);l&&t.add(`${l}${i.search}`);}return [...t].sort()}var Pe=".deploy-plan.json",be="deploy-plan.json";function Se(){let r=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return r.trim()?P.resolve(r):""}function we(r){let e=String(r||"").replace(/\\/g,"/").replace(/^\/+/,"").trim(),t=P.posix.normalize(e);return !e||!t||t==="."||/^[a-zA-Z]:/.test(t)||t.startsWith("../")||t===".."?null:t}function ve(r){let e=String(r||"").trim();if(!e.startsWith("/")||e.startsWith("//")||e.includes("*")||e.includes("#"))return null;try{let t=new URL(e,"https://content-sync.invalid");return t.origin!=="https://content-sync.invalid"?null:`${P.posix.normalize(t.pathname)}${t.search}`}catch{return null}}function y(r){return [...new Set(r.map(we).filter(e=>e!==null))]}function Ie(r,e){let t={generatedAt:String(e.generatedAt||new Date().toISOString()),outputDir:P.resolve(r.outputDir),runMode:e.runMode,crawlMode:e.crawlMode,fullSyncRequired:!!e.fullSyncRequired,changedFiles:y(e.changedFiles||[]),deletedFiles:y(e.deletedFiles||[]),rewriteTargets:y(e.rewriteTargets||[]),revalidateFiles:y(e.revalidateFiles||[])};return e.schemaVersion===2?{...t,schemaVersion:2,runMode:"content-sync",crawlMode:"incremental",fullSyncRequired:false,consumerId:String(e.consumerId||"").trim(),fromSequence:Math.max(0,Number(e.fromSequence)||0),toSequence:Math.max(0,Number(e.toSequence)||0),impactHash:String(e.impactHash||"").trim(),resolvedSitemapUrls:[...new Set((e.resolvedSitemapUrls||[]).map(n=>String(n||"").trim()).filter(n=>{try{let i=new URL(n);return i.protocol==="http:"||i.protocol==="https:"}catch{return false}}))],uploadGroups:{assets:y(e.uploadGroups?.assets||[]),content:y(e.uploadGroups?.content||[]),listings:y(e.uploadGroups?.listings||[]),resources:y(e.uploadGroups?.resources||[]),sitemapLeaves:y(e.uploadGroups?.sitemapLeaves||[]),sitemapIndexes:y(e.uploadGroups?.sitemapIndexes||[])},invalidationPaths:[...new Set((e.invalidationPaths||[]).map(ve).filter(n=>n!==null))].sort()}:{schemaVersion:1,...t,runMode:e.runMode}}function Ce(r){if(!r||typeof r!="object")return false;let e=r;if(e.schemaVersion===2){let t=e;return t.runMode==="content-sync"&&t.crawlMode==="incremental"&&t.fullSyncRequired===false&&typeof t.generatedAt=="string"&&typeof t.outputDir=="string"&&typeof t.consumerId=="string"&&t.consumerId.trim()!==""&&Number.isSafeInteger(t.fromSequence)&&Number.isSafeInteger(t.toSequence)&&Number(t.toSequence)>=Number(t.fromSequence)&&typeof t.impactHash=="string"&&/^[a-f0-9]{64}$/.test(t.impactHash)&&Array.isArray(t.resolvedSitemapUrls)&&Array.isArray(t.changedFiles)&&Array.isArray(t.deletedFiles)&&Array.isArray(t.rewriteTargets)&&(t.revalidateFiles===void 0||Array.isArray(t.revalidateFiles))&&!!t.uploadGroups&&Array.isArray(t.uploadGroups.assets)&&Array.isArray(t.uploadGroups.content)&&Array.isArray(t.uploadGroups.listings)&&Array.isArray(t.uploadGroups.resources)&&Array.isArray(t.uploadGroups.sitemapLeaves)&&Array.isArray(t.uploadGroups.sitemapIndexes)&&Array.isArray(t.invalidationPaths)}return e.schemaVersion===1&&typeof e.generatedAt=="string"&&typeof e.outputDir=="string"&&(e.runMode==="full"||e.runMode==="retry-timeouts"||e.runMode==="single-url")&&(e.crawlMode==="full"||e.crawlMode==="incremental")&&typeof e.fullSyncRequired=="boolean"&&Array.isArray(e.changedFiles)&&Array.isArray(e.deletedFiles)&&Array.isArray(e.rewriteTargets)&&(e.revalidateFiles===void 0||Array.isArray(e.revalidateFiles))}function De(r){let e=P.join(P.resolve(r.outputDir),Pe),t=Se();return t?[P.join(t,be),e]:[e]}async function B(r){let e=P.resolve(r.outputDir);for(let t of De(r))try{let n=await S.readFile(t,"utf8"),i=JSON.parse(n);if(!Ce(i)||P.resolve(i.outputDir)!==e)continue;return Ie(r,i)}catch{}return null}function Te(r){return typeof r.subscriptionType=="string"&&r.subscriptionType.trim()!==""}function H(r){let e="";for(let n=0;n<r.length;n++){let i=r[n];if(i==="--profile"){let s=(r[n+1]||"").trim();if(!s)throw new Error("Missing value for --profile.");e=s,n+=1;}else if(i.startsWith("--profile=")){let s=i.slice(10).trim();if(!s)throw new Error("Missing value for --profile.");e=s;}}let t=String(process.env.PUBLISHER_DEPLOY_PROFILE||process.env.PUBLISHER_DEPLOYMENT_PROFILE||"").trim();return e||t||null}function Ae(r,e){return {...r,...e??{}}}function Re(r,e){return {...r,...e??{},invalidationPaths:[...(e?.invalidationPaths??r.invalidationPaths)||[]]}}function z(r,e){let t=String(e??r.deploymentTargetOverride??"").trim();if(!Te(r)){if(t)throw new Error(`Deployment target "${t}" requires an active WPSuite subscription and remote publisher config.`);return {name:null,profile:null,config:r}}let n=String(t||r.defaultDeploymentProfile||"").trim();if(!n)return {name:null,profile:null,config:r};let i=r.deploymentProfiles?.[n];if(!i)throw new Error(`Unknown deployment profile "${n}". Check the linked WPSuite publisher configuration.`);return {name:n,profile:i,config:{...r,targetOrigin:i.targetOrigin??r.targetOrigin,s3:Ae(r.s3,i.s3),cloudFront:Re(r.cloudFront,i.cloudFront)}}}var J={error:0,warn:1,info:2,debug:3},Ee=/^(?:authorization|proxyAuthorization|runtimeToken|siteKey|nonce|accessToken|refreshToken|accessKeyId|secretAccessKey|sessionToken|xStaticPublisherToken|xApiKey)$/i;function C(r){return r.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 A(r){return typeof r=="string"?C(r):Array.isArray(r)?r.map(e=>A(e)):r instanceof Error?{name:r.name,message:C(r.message),...r.stack?{stack:C(r.stack)}:{}}:r&&typeof r=="object"?Object.fromEntries(Object.entries(r).map(([e,t])=>[e,Ee.test(e)?"[REDACTED]":A(t)])):r}function K(r){return r?A(r):void 0}var G=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",T=G?P.join(G,"current-progress.json"):"",V=Promise.resolve();function Q(r){return r.includes("crawl")?"crawl":r.includes("deploy")?"deploy":r.includes("invalidate")?"invalidate":r}function ke(r,e){let t={...r},n=new Set(["pagesQueued","pagesRendered","assetsQueued","sitemapsQueued","pagesDiscovered","assetsDiscovered","sitemapsDiscovered","pagesSaved","assetsSaved","donePages","doneAssets","doneSitemaps","changedTextFiles","uploaded","failed","index","totalFiles","pageQueue","assetQueue","sitemapQueue"]);for(let[i,s]of Object.entries(e)){let o=t[i];if(typeof o=="number"&&typeof s=="number"&&n.has(i)){t[i]=Math.max(o,s);continue}t[i]=s;}return t}function Le(r,e,t){T&&(V=V.then(async()=>{let n=new Date,i=n.toISOString();await S.mkdir(P.dirname(T),{recursive:true});let s=await S.readFile(T,"utf8").then(I=>JSON.parse(I)).catch(()=>null),o=s&&typeof s.details=="object"&&s.details?s.details:{},l=Q(r),a=s?.currentStep||Q(s?.source||""),u=s?.startedAt||i,c={...s?.stepDurationsSec??{}},g=s?.stepStartedAt||i;if(a&&a!==l&&s?.stepStartedAt){let I=Math.max(0,Math.round((n.getTime()-new Date(s.stepStartedAt).getTime())/1e3));c[a]=(c[a]??0)+I,g=i;}let p=Math.max(0,Math.round((n.getTime()-new Date(g).getTime())/1e3)),m=Math.max(0,Math.round((n.getTime()-new Date(u).getTime())/1e3)),d=C(e),f=K(t)??{},h={checkedAt:i,source:r,message:d,details:ke(o,f),startedAt:u,currentStep:l,stepStartedAt:g,stepElapsedSec:p,totalElapsedSec:m,stepDurationsSec:c};await S.writeFile(T,JSON.stringify(h,null,2),"utf8");}).catch(()=>{}));}async function xe(r,e){await S.mkdir(P.dirname(r),{recursive:true}),await S.appendFile(r,`${JSON.stringify(A(e))}
2
- `,"utf8");}var v=class{constructor(e,t,n="info"){this.logDir=e;this.logFile=t;this.level=n;this.ensureLogFileReady();}logDir;logFile;level;startedAt=Date.now();marks=new Map;initPromise=null;writeQueue=Promise.resolve();writeError=null;get logPath(){return P.join(this.logDir,this.logFile)}artifactPath(e){return this.logFile.endsWith(".log.jsonl")?P.join(this.logDir,this.logFile.replace(/\.log\.jsonl$/u,`${e}.jsonl`)):P.join(this.logDir,`${this.logFile}${e}.jsonl`)}get errorsPath(){return this.artifactPath(".errors")}get rejectedPath(){return this.artifactPath(".rejected")}ensureLogFileReady(){return this.initPromise||(this.initPromise=(async()=>{await S.mkdir(this.logDir,{recursive:true}),await S.writeFile(this.logPath,"","utf8");})()),this.initPromise}enqueueTask(e){this.writeQueue=this.writeQueue.then(e).catch(t=>{this.writeError=t instanceof Error?t:new Error(String(t));});}enqueueLine(e){this.enqueueTask(async()=>{await this.ensureLogFileReady(),await S.appendFile(this.logPath,`${e}
3
- `,"utf8");});}enqueueJsonLine(e,t){this.enqueueTask(()=>xe(e,t));}accepts(e){return J[e]<=J[this.level]}push(e,t,n){if(!this.accepts(e))return;let i=C(t),s=K(n),o=JSON.stringify({time:new Date().toISOString(),level:e,message:i,...s||{}});this.enqueueLine(o),e==="error"?console.error(`[ERROR] ${i}`,s?JSON.stringify(s):""):e==="warn"?console.warn(`[WARN] ${i}`,s?JSON.stringify(s):""):console.log(`[${e.toUpperCase().padEnd(5)}] ${i}`);}info(e,t){this.push("info",e,t);}progress(e,t){Le(this.logFile,e,t);}debug(e,t){this.push("debug",e,t);}warn(e,t){this.push("warn",e,t);}reject(e,t,n,i,s){let o={kind:e,url:t,reason:n,...i?{source:i}:{},...s||{}};this.enqueueJsonLine(this.rejectedPath,o),this.accepts("debug")&&this.push("debug",`Rejected ${e} ${t}: ${n}`,o);}error(e,t){this.enqueueJsonLine(this.errorsPath,{message:e,...t||{}}),this.push("error",e,t);}mark(e){this.marks.set(e,Date.now());}endMark(e,t){let n=this.marks.get(e);if(!n)return;let i=Date.now()-n,s=Number((i/1e3).toFixed(2));this.push("info",`Timing ${e}: ${s}s`,{name:e,ms:i,seconds:s,...t||{}});}async flush(){let e=Date.now()-this.startedAt,t=Number((e/1e3).toFixed(2));if(this.push("info",`Total time: ${t}s`,{name:"total",ms:e,seconds:t}),await this.writeQueue,this.writeError)throw this.writeError}};function Ue(){let r=String(process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"").trim();return r?P.join(P.resolve(r),"content-sync-invalidation.json"):""}async function F(r,e){if(!r)return;await S.mkdir(P.dirname(r),{recursive:true});let t=`${r}.${process.pid}.${Date.now()}.tmp`;await S.writeFile(t,JSON.stringify({...e,updatedAt:new Date().toISOString()},null,2),"utf8"),await S.rename(t,r);}async function Ne(r,e,t,n){if(!r)return null;try{let i=JSON.parse(await S.readFile(r,"utf8"));if(i.schemaVersion!==1||i.distributionId!==e||i.impactHash!==t||!Array.isArray(i.batches))throw new Error("Content-sync invalidation state does not match the deploy plan.");let s=i.batches.flatMap(o=>o.paths);return s.length!==n.length||s.some((o,l)=>o!==n[l])?null:i}catch(i){if(i.code==="ENOENT")return null;throw i}}function $e(r,e=3e3){let t=[];for(let n=0;n<r.length;n+=e)t.push(r.slice(n,n+e));return t}async function X(r=process.argv.slice(2)){let e=await D(),t=H(r),n=z(e,t),i=n.config,s=new v(i.logDir||"logs","invalidate.log.jsonl",i.logLevel??"info"),o=r.includes("--content-sync"),l=await B(e);if(o&&l?.schemaVersion!==2)throw new Error("Content-sync invalidation requires a valid schema-2 targeted deploy plan.");if(n.name&&s.info(`Using deployment profile: ${n.name}`),!i.cloudFront.distributionId){s.info("No CloudFront distributionId configured; skipping invalidation."),await s.flush();return}let a=l?.schemaVersion===2?l.invalidationPaths:i.cloudFront.invalidationPaths.length>0?i.cloudFront.invalidationPaths:["/*"],u=l?.schemaVersion===2?W(a,i.s3.prefix||""):a;if(l?.schemaVersion===2&&u.some(d=>d==="/*"))throw new Error("Content-sync cannot use a whole-distribution invalidation.");if(u.length===0){s.info("The targeted deploy plan has no CloudFront paths to invalidate."),await s.flush();return}let c=i.cloudFront.distributionId,g=new CloudFrontClient({region:"us-east-1",maxAttempts:5});if(s.mark("invalidate"),l?.schemaVersion!==2){let d=`smartcloud-static-publisher-${Date.now()}`;await M(`CloudFront invalidation for distribution ${c}`,3e5,({httpOptions:f})=>g.send(new CreateInvalidationCommand({DistributionId:c,InvalidationBatch:{CallerReference:d,Paths:{Quantity:u.length,Items:u}}}),f)),s.endMark("invalidate"),await s.flush();return}let p=Ue(),m=await Ne(p,c,l.impactHash,u);if(!m){let d=createHash("sha256").update(JSON.stringify(u)).digest("hex");m={schemaVersion:1,distributionId:c,impactHash:l.impactHash,updatedAt:new Date().toISOString(),batches:$e(u).map((f,h)=>({index:h,callerReference:`wpsuite-content-sync-${l.impactHash.slice(0,24)}-${d.slice(0,24)}-${h}`,paths:f,invalidationId:null,status:"pending"}))},await F(p,m);}for(let d of m.batches){if(!d.invalidationId){let f=await M(`CloudFront targeted invalidation batch ${d.index+1}`,3e5,({httpOptions:I})=>g.send(new CreateInvalidationCommand({DistributionId:c,InvalidationBatch:{CallerReference:d.callerReference,Paths:{Quantity:d.paths.length,Items:d.paths}}}),I)),h=String(f.Invalidation?.Id||"").trim();if(!h)throw new Error("CloudFront did not return an invalidation ID.");d.invalidationId=h,d.status="created",await F(p,m);}await waitUntilInvalidationCompleted({client:g,maxWaitTime:900,minDelay:2,maxDelay:15},{DistributionId:c,Id:d.invalidationId}),d.status="completed",await F(p,m),s.info(`CloudFront invalidation batch ${d.index+1}/${m.batches.length} completed.`,{invalidationId:d.invalidationId,pathCount:d.paths.length});}s.endMark("invalidate"),await s.flush();}X().catch(async r=>{console.error(r);try{let e=await D().catch(()=>null),t=new v(e?.logDir??"logs","invalidate.log.jsonl","debug");t.error(`Unhandled error: ${r instanceof Error?r.message:String(r)}`,r instanceof Error?{stack:r.stack}:void 0),await t.flush();}catch{}process.exit(1);});
1
+ import w from'fs/promises';import te from'http';import re from'https';import b from'path';import {CloudFrontClient,waitUntilInvalidationCompleted,CreateInvalidationCommand}from'@aws-sdk/client-cloudfront';import {createHash}from'crypto';var N=["/sitemap_index.xml","/wp-sitemap.xml","/sitemap.xml"];function j(r){let e=r.trim();return e==="."?".":e.replace(/\/$/,"")}function ne(r){let e=String(r??"").trim();if(!e)return "";let t=e;if(/^https?:\/\//i.test(t))try{t=new URL(t).pathname;}catch{return ""}if(t=t.split(/[?#]/,1)[0]?.replace(/\\/g,"/").trim()??"",!t)return "";let i=t.endsWith("/"),n=t.replace(/^\/+/,"").split("/").map(o=>o.replace(/[^A-Za-z0-9._-]/g,"")).filter(o=>o.length>0&&o!=="."&&o!=="..");if(n.length===0)return "";let s=`/${n.join("/")}`;return i&&b.extname(s)===""&&(s+="/"),s==="/"?"":s}function k(r){return !r||typeof r!="object"?{}:Object.fromEntries(Object.entries(r).map(([e,t])=>[e.trim(),String(t??"")]).filter(([e])=>e.length>0))}function ie(r){if(!r||typeof r!="object")return {};let e={};for(let[t,i]of Object.entries(r)){let n=t.trim();if(!n||!i||typeof i!="object")continue;let s=i,o={};if(typeof s.targetOrigin=="string"){let a=j(s.targetOrigin);a&&(o.targetOrigin=a);}let l=k(s.extraReplacements);if(Object.keys(l).length>0&&(o.extraReplacements=l),s.s3&&typeof s.s3=="object"){let a={},u=s.s3;typeof u.bucket=="string"&&(a.bucket=u.bucket.trim()),typeof u.prefix=="string"&&(a.prefix=u.prefix.trim()),typeof u.region=="string"&&(a.region=u.region.trim()),typeof u.htmlCacheControl=="string"&&(a.htmlCacheControl=u.htmlCacheControl.trim()),typeof u.assetCacheControl=="string"&&(a.assetCacheControl=u.assetCacheControl.trim()),Object.keys(a).length>0&&(o.s3=a);}if(s.cloudFront&&typeof s.cloudFront=="object"){let a={},u=s.cloudFront;typeof u.distributionId=="string"&&(a.distributionId=u.distributionId.trim()),Array.isArray(u.invalidationPaths)&&(a.invalidationPaths=u.invalidationPaths.map(c=>String(c??"").trim()).filter(c=>c.length>0)),Object.keys(a).length>0&&(o.cloudFront=a);}e[n]=o;}return e}function E(r){return r==="PROFESSIONAL"||r==="AGENCY"?r:void 0}function se(r,e){if(!r||typeof r!="object")return null;let t=r,i=t.command;if(i!=="publish"&&i!=="crawl"&&i!=="deploy"&&i!=="invalidate"&&i!=="retry-timeouts"&&i!=="url"&&i!=="content-sync")return null;let n=Number.parseInt(String(t.intervalMinutes??"0"),10);if(!Number.isFinite(n)||n<1)return null;let s=String(t.id??`${i}-${e+1}`).trim();if(!s)return null;let o=String(t.deploymentProfile??"").trim(),l=String(t.url??"").trim(),a=Array.isArray(t.postTypes)?[...new Set(t.postTypes.map(c=>String(c??"").trim().toLowerCase().replace(/[^a-z0-9_-]/g,"")).filter(Boolean))]:[],u=Array.isArray(t.listingPaths)?[...new Set(t.listingPaths.map(c=>String(c??"").trim()).filter(Boolean))]:[];return i==="content-sync"&&a.length===0?null:{id:s,enabled:t.enabled!==false,command:i,intervalMinutes:n,...i==="publish"||i==="crawl"?{crawlMode:t.crawlMode==="incremental"?"incremental":"full"}:{},...(i==="publish"||i==="deploy"||i==="invalidate"||i==="content-sync")&&o?{deploymentProfile:o}:{},...l?{url:l}:{},...a.length>0?{postTypes:a}:{},...u.length>0?{listingPaths:u}:{},...typeof t.includeSubsites=="boolean"?{includeSubsites:t.includeSubsites}:{},...typeof t.includePostTypeArchives=="boolean"?{includePostTypeArchives:t.includePostTypeArchives}:{},...typeof t.includeTaxonomyArchives=="boolean"?{includeTaxonomyArchives:t.includeTaxonomyArchives}:{},...typeof t.includeAuthorArchives=="boolean"?{includeAuthorArchives:t.includeAuthorArchives}:{},...typeof t.includeDateArchives=="boolean"?{includeDateArchives:t.includeDateArchives}:{},...typeof t.includePostsPage=="boolean"?{includePostsPage:t.includePostsPage}:{},...typeof t.includeSitemapChain=="boolean"?{includeSitemapChain:t.includeSitemapChain}:{}}}function $(r){let e=r&&typeof r=="object"?r:{},t=Array.isArray(e.rules)?e.rules.map((i,n)=>se(i,n)).filter(i=>!!i):[];return {enabled:e.enabled===true,timezone:typeof e.timezone=="string"&&e.timezone.trim()!==""?e.timezone.trim():"UTC",rules:t}}function oe(r){let e=r&&typeof r=="object"?r:{},t=e.render&&typeof e.render=="object"?e.render:{},i=Number(t.concurrency??0),n=Number(t.maxAttempts??0),s=e.rewrite&&typeof e.rewrite=="object"?e.rewrite:{},o=e.deploy&&typeof e.deploy=="object"?e.deploy:{},l=(a,u)=>({enabled:typeof a.enabled=="boolean"?a.enabled:t.enabled===true,concurrency:Math.min(100,Math.max(1,Number(a.concurrency||u.concurrency))),batchSize:Math.min(500,Math.max(1,Number(a.batchSize||u.batchSize))),maxAttempts:Math.min(5,Math.max(1,Number(a.maxAttempts||2)))});return {render:{enabled:t.enabled===true,...Number.isInteger(i)&&i>0?{concurrency:i}:{},...Number.isInteger(n)&&n>0?{maxAttempts:Math.min(5,n)}:{}},rewrite:l(s,{concurrency:8,batchSize:25}),deploy:l(o,{concurrency:8,batchSize:50})}}function ae(r){if(!r||typeof r!="object")return;let e=r,t={};for(let n of ["accountId","siteId"]){let s=e[n];typeof s=="string"&&s.trim()!==""&&(t[n]=s.trim());}let i=Number(e.lastUpdate??0);return Number.isFinite(i)&&i>0&&(t.lastUpdate=Math.floor(i)),e.subscriber===true&&(t.subscriber=true),Object.keys(t).length>0?t:void 0}function L(r){let e=r&&typeof r=="object"?r:{},t=String(e.accountId??"").trim(),i=String(e.siteId??"").trim(),n=e.subscriber===true,s=ae(e.siteSettings),o={...s??{},...t?{accountId:s?.accountId??t}:{},...i?{siteId:s?.siteId??i}:{},...s?.subscriber===true||n?{subscriber:true}:{}},l={},a=String(e.apiBase??"").trim();a&&(l.apiBase=a);let u=String(e.runtimeToken??e.nonce??"").trim();u&&(l.runtimeToken=u);let c=String(e.virtualAssetBaseUrl??e.uploadUrl??"").trim();c&&(l.virtualAssetBaseUrl=c),Object.keys(o).length>0&&(l.siteSettings=o);let g=E(e.subscriptionType);return g&&(l.subscriptionType=g),l}function le(r){try{let e=new URL(r);globalThis.location=e;}catch{}}function _(r){return typeof r=="string"?r:r instanceof URL?r.toString():r.url}function ue(r,e){let t=new Headers(r instanceof Request?r.headers:void 0);if(e?.headers)for(let[i,n]of new Headers(e.headers).entries())t.set(i,n);return t}async function q(r,e,t=5){let i=new URL(_(r)),n=String(e?.method??(r instanceof Request?r.method:"GET")).toUpperCase(),s=i.protocol==="http:"?te:re,o=ue(r,e);return await new Promise((l,a)=>{let u=s.request(i,{method:n,headers:Object.fromEntries(o.entries()),...i.protocol==="https:"?{rejectUnauthorized:false}:{}},c=>{let g=[];c.on("data",p=>{g.push(Buffer.isBuffer(p)?p:Buffer.from(p));}),c.on("error",a),c.on("end",()=>{let p=c.statusCode??0,m=c.headers.location;if(t>0&&m&&[301,302,303,307,308].includes(p)){l(q(new URL(m,i),{method:p===303?"GET":n},t-1));return}let d=new Headers;for(let[f,h]of Object.entries(c.headers))Array.isArray(h)?d.set(f,h.join(", ")):typeof h=="string"&&d.set(f,h);l(new Response(Buffer.concat(g),{status:p,statusText:c.statusMessage??"",headers:d}));});});u.on("error",a),u.end();})}function ce(r){let e=L(r.wpsuite),t={...e.siteSettings??{},...e.siteSettings?.subscriber===true||e.subscriptionType==="PROFESSIONAL"||e.subscriptionType==="AGENCY"?{subscriber:true}:{}},i=String(t.accountId??"").trim(),n=String(t.siteId??"").trim(),s=String(e.virtualAssetBaseUrl??e.uploadUrl??"").trim();if(r.wpsuite={...e.apiBase?{apiBase:e.apiBase}:{},...e.runtimeToken?{runtimeToken:e.runtimeToken}:{},...s?{virtualAssetBaseUrl:s}:{},...Object.keys(t).length>0?{siteSettings:t}:{},...e.subscriptionType?{subscriptionType:e.subscriptionType}:{}},!i||!n||!s)return false;le(r.sourceOrigin);let o=globalThis,a={...o.WpSuite??{},siteSettings:t,uploadUrl:s};return e.apiBase&&(a.apiBase=e.apiBase),o.WpSuite=a,true}async function de(r){let e=String(r.wpsuite?.virtualAssetBaseUrl??r.wpsuite?.uploadUrl??"").trim();if(!ce(r)){let n=r.wpsuite?.siteSettings,s=[String(n?.accountId??"").trim()?"":"accountId",String(n?.siteId??"").trim()?"":"siteId",e?"":"virtualAssetBaseUrl"].filter(Boolean);return {remote:null,diagnostic:{status:"invalid-runtime",virtualAssetBaseUrl:e,subscriptionType:null,error:`Missing WP Suite runtime field(s): ${s.join(", ")}.`,requests:[]}}}let t=globalThis.fetch,i=[];try{typeof t=="function"&&/^https?:\/\//i.test(e)&&(globalThis.fetch=(async(a,u)=>{let c=_(a);if(c.startsWith(e)){let g=(()=>{try{return new URL(c).pathname}catch{return c}})();try{let p=r.ignoreHttpsErrors&&c.startsWith("https://")?await q(a,u):await t(a,u);return i.push({path:g,status:p.status,ok:p.ok,error:null}),p}catch(p){throw i.push({path:g,status:null,ok:!1,error:p instanceof Error?p.message:String(p)}),p}}return t(a,u)}));let{getConfig:n}=await import('@smart-cloud/wpsuite-core'),s=await n("publisher"),o=s&&typeof s=="object"?s:null,l=E(o?.subscriptionType);return {remote:o,diagnostic:{status:o?"loaded":"unavailable",virtualAssetBaseUrl:e,subscriptionType:l??null,error:o?null:"WP Suite publisher config loader returned no configuration.",requests:i}}}catch(n){return {remote:null,diagnostic:{status:"unavailable",virtualAssetBaseUrl:e,subscriptionType:null,error:n instanceof Error?n.message:String(n),requests:i}}}finally{typeof t=="function"&&(globalThis.fetch=t);}}function pe(r,e){let t=ie(e?.deploymentProfiles),i=String(e?.defaultDeploymentProfile??"").trim(),n=t[i]?i:"",s=E(e?.subscriptionType),o=L(r.wpsuite);return {...r,scheduler:$(e?.scheduler),deploymentProfiles:t,defaultDeploymentProfile:n,...s?{subscriptionType:s}:{},wpsuite:{...o,...o.siteSettings||s?{siteSettings:{...o.siteSettings??{},...o.siteSettings?.subscriber===true||s==="PROFESSIONAL"||s==="AGENCY"?{subscriber:true}:{}}}:{},...s?{subscriptionType:s}:{}}}}function x(r,e){let i=String(r||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!i)return e;let n=i.split("/").map(s=>s.trim()).filter(s=>s.length>0&&s!=="."&&s!=="..");return n.length>0?n.join("/"):e}function ge(){let r=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return r.trim()?b.resolve(r):""}function U(r,e,t){let i=String(e||"").trim();return i&&b.isAbsolute(i)?b.resolve(i):b.resolve(r,x(i,t))}async function D(r,e={}){let t=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",i=await w.readFile(t,"utf8"),n=JSON.parse(i);n.sourceOrigin=n.sourceOrigin.replace(/\/$/,""),n.targetOrigin=j(n.targetOrigin),n.ignoreHttpsErrors??=false,n.outputDir=String(n.outputDir||"export").trim()||"export",n.urlRewriteMode||=n.targetOrigin==="."?"relative":"absolute",n.noJavaScriptRenderPathPrefixes||=[],n.seedPaths||=[],n.generated404RequestPath=ne(n.generated404RequestPath),n.sitemapPaths||=[...N],n.allowedAssetHosts||=[],n.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],n.blockedPathPrefixes||=[],n.blockedSearchFragments||=[],n.concurrency||=1,n.maxPages||=0,n.extraReplacements=k(n.extraReplacements),n.postCrawlCopyMap=k(n.postCrawlCopyMap),n.logDir=String(n.logDir||"logs").trim()||"logs",n.verbose??=false,n.logLevel||=n.verbose?"debug":"info",n.s3SyncMode||="sdk-upload-delete",n.readiness||={waitForSelector:null,waitForFunction:null,timeoutMs:1500,fallbackWaitMs:1500},n.readiness.timeoutMs??=1500,n.readiness.fallbackWaitMs??=1500,n.viewport||={width:1440,height:1200},n.navigationTimeoutMs||=3e4,n.assetDownloadConcurrency=Number(n.assetDownloadConcurrency)>0?Number(n.assetDownloadConcurrency):n.concurrency,n.rewriteConcurrency=Number(n.rewriteConcurrency)>0?Number(n.rewriteConcurrency):n.assetDownloadConcurrency,n.wpsuite=L(n.wpsuite),n.scheduler=$(void 0),n.remoteWorkers=oe(n.remoteWorkers),n.deploymentProfiles={},n.defaultDeploymentProfile="",n.deploymentTargetOverride=String(n.deploymentTargetOverride??"").trim();let s=await de(n);e.onRemotePublisherConfigDiagnostic?.(s.diagnostic);let o=pe(n,s.remote),l=ge(),a=l?b.resolve(l,".."):"";return a?(o.outputDir=U(a,o.outputDir,"export"),o.logDir=U(a,o.logDir,"logs")):(b.isAbsolute(o.outputDir)||(o.outputDir=x(o.outputDir,"export")),b.isAbsolute(o.logDir)||(o.logDir=x(o.logDir,"logs"))),o}function me(r){let e=r/6e4;if(Number.isInteger(e)&&e>=1)return `${e} minute${"s"}`;let t=Math.ceil(r/1e3);return `${t} second${t===1?"":"s"}`}async function M(r,e,t){let i=new AbortController,n=globalThis.setTimeout(()=>{i.abort(new Error(`${r} timed out after ${me(e)}.`));},e);try{return await t({abortController:i,httpOptions:{abortSignal:i.signal,requestTimeout:e}})}finally{globalThis.clearTimeout(n);}}function fe(r){let e=r;return e.endsWith("/")?e+="index.html":b.posix.basename(e).includes(".")||(e+="/index.html"),e}function ye(r,e){let t=e.trim().replace(/^\/+|\/+$/g,"");if(!t)return null;let i=`/${t}`;return r===i||r.startsWith(`${i}/`)?r:`${i}${r.startsWith("/")?r:`/${r}`}`}function W(r,e){let t=new Set;for(let i of r){let n=new URL(i,"https://content-sync.invalid");if(n.origin!=="https://content-sync.invalid")continue;let s=`${n.pathname}${n.search}`,o=fe(n.pathname);t.add(s),t.add(`${o}${n.search}`);let l=ye(o,e);l&&t.add(`${l}${n.search}`);}return [...t].sort()}var Pe=".deploy-plan.json",we="deploy-plan.json";function Se(){let r=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return r.trim()?b.resolve(r):""}function ve(r){let e=String(r||"").replace(/\\/g,"/").replace(/^\/+/,"").trim(),t=b.posix.normalize(e);return !e||!t||t==="."||/^[a-zA-Z]:/.test(t)||t.startsWith("../")||t===".."?null:t}function Ie(r){let e=String(r||"").trim();if(!e.startsWith("/")||e.startsWith("//")||e.includes("*")||e.includes("#"))return null;try{let t=new URL(e,"https://content-sync.invalid");return t.origin!=="https://content-sync.invalid"?null:`${b.posix.normalize(t.pathname)}${t.search}`}catch{return null}}function y(r){return [...new Set(r.map(ve).filter(e=>e!==null))]}function Ce(r,e){let t={generatedAt:String(e.generatedAt||new Date().toISOString()),outputDir:b.resolve(r.outputDir),runMode:e.runMode,crawlMode:e.crawlMode,fullSyncRequired:!!e.fullSyncRequired,changedFiles:y(e.changedFiles||[]),deletedFiles:y(e.deletedFiles||[]),rewriteTargets:y(e.rewriteTargets||[]),revalidateFiles:y(e.revalidateFiles||[])};return e.schemaVersion===2?{...t,schemaVersion:2,runMode:"content-sync",crawlMode:"incremental",fullSyncRequired:false,consumerId:String(e.consumerId||"").trim(),fromSequence:Math.max(0,Number(e.fromSequence)||0),toSequence:Math.max(0,Number(e.toSequence)||0),impactHash:String(e.impactHash||"").trim(),resolvedSitemapUrls:[...new Set((e.resolvedSitemapUrls||[]).map(i=>String(i||"").trim()).filter(i=>{try{let n=new URL(i);return n.protocol==="http:"||n.protocol==="https:"}catch{return false}}))],uploadGroups:{assets:y(e.uploadGroups?.assets||[]),content:y(e.uploadGroups?.content||[]),listings:y(e.uploadGroups?.listings||[]),resources:y(e.uploadGroups?.resources||[]),sitemapLeaves:y(e.uploadGroups?.sitemapLeaves||[]),sitemapIndexes:y(e.uploadGroups?.sitemapIndexes||[])},invalidationPaths:[...new Set((e.invalidationPaths||[]).map(Ie).filter(i=>i!==null))].sort()}:{schemaVersion:1,...t,runMode:e.runMode}}function De(r){if(!r||typeof r!="object")return false;let e=r;if(e.schemaVersion===2){let t=e;return t.runMode==="content-sync"&&t.crawlMode==="incremental"&&t.fullSyncRequired===false&&typeof t.generatedAt=="string"&&typeof t.outputDir=="string"&&typeof t.consumerId=="string"&&t.consumerId.trim()!==""&&Number.isSafeInteger(t.fromSequence)&&Number.isSafeInteger(t.toSequence)&&Number(t.toSequence)>=Number(t.fromSequence)&&typeof t.impactHash=="string"&&/^[a-f0-9]{64}$/.test(t.impactHash)&&Array.isArray(t.resolvedSitemapUrls)&&Array.isArray(t.changedFiles)&&Array.isArray(t.deletedFiles)&&Array.isArray(t.rewriteTargets)&&(t.revalidateFiles===void 0||Array.isArray(t.revalidateFiles))&&!!t.uploadGroups&&Array.isArray(t.uploadGroups.assets)&&Array.isArray(t.uploadGroups.content)&&Array.isArray(t.uploadGroups.listings)&&Array.isArray(t.uploadGroups.resources)&&Array.isArray(t.uploadGroups.sitemapLeaves)&&Array.isArray(t.uploadGroups.sitemapIndexes)&&Array.isArray(t.invalidationPaths)}return e.schemaVersion===1&&typeof e.generatedAt=="string"&&typeof e.outputDir=="string"&&(e.runMode==="full"||e.runMode==="retry-timeouts"||e.runMode==="single-url")&&(e.crawlMode==="full"||e.crawlMode==="incremental")&&typeof e.fullSyncRequired=="boolean"&&Array.isArray(e.changedFiles)&&Array.isArray(e.deletedFiles)&&Array.isArray(e.rewriteTargets)&&(e.revalidateFiles===void 0||Array.isArray(e.revalidateFiles))}function Te(r){let e=b.join(b.resolve(r.outputDir),Pe),t=Se();return t?[b.join(t,we),e]:[e]}async function B(r){let e=b.resolve(r.outputDir);for(let t of Te(r))try{let i=await w.readFile(t,"utf8"),n=JSON.parse(i);if(!De(n)||b.resolve(n.outputDir)!==e)continue;return Ce(r,n)}catch{}return null}function Re(r){return typeof r.subscriptionType=="string"&&r.subscriptionType.trim()!==""}function z(r){let e="";for(let i=0;i<r.length;i++){let n=r[i];if(n==="--profile"){let s=(r[i+1]||"").trim();if(!s)throw new Error("Missing value for --profile.");e=s,i+=1;}else if(n.startsWith("--profile=")){let s=n.slice(10).trim();if(!s)throw new Error("Missing value for --profile.");e=s;}}let t=String(process.env.PUBLISHER_DEPLOY_PROFILE||process.env.PUBLISHER_DEPLOYMENT_PROFILE||"").trim();return e||t||null}function Ae(r,e){return {...r,...e??{}}}function ke(r,e){return {...r,...e??{},invalidationPaths:[...(e?.invalidationPaths??r.invalidationPaths)||[]]}}function H(r,e){let t=String(e??r.deploymentTargetOverride??"").trim();if(!Re(r)){if(t)throw new Error(`Deployment target "${t}" requires an active WPSuite subscription and remote publisher config.`);return {name:null,profile:null,config:r}}let i=String(t||r.defaultDeploymentProfile||"").trim();if(!i)return {name:null,profile:null,config:r};let n=r.deploymentProfiles?.[i];if(!n)throw new Error(`Unknown deployment profile "${i}". Check the linked WPSuite publisher configuration.`);return {name:i,profile:n,config:{...r,targetOrigin:n.targetOrigin??r.targetOrigin,s3:Ae(r.s3,n.s3),cloudFront:ke(r.cloudFront,n.cloudFront)}}}var J={error:0,warn:1,info:2,debug:3},xe=/^(?:authorization|proxyAuthorization|runtimeToken|siteKey|nonce|accessToken|refreshToken|accessKeyId|secretAccessKey|sessionToken|xStaticPublisherToken|xApiKey)$/i;function C(r){return r.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 R(r){return typeof r=="string"?C(r):Array.isArray(r)?r.map(e=>R(e)):r instanceof Error?{name:r.name,message:C(r.message),...r.stack?{stack:C(r.stack)}:{}}:r&&typeof r=="object"?Object.fromEntries(Object.entries(r).map(([e,t])=>[e,xe.test(e)?"[REDACTED]":R(t)])):r}function K(r){return r?R(r):void 0}var G=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",T=G?b.join(G,"current-progress.json"):"",V=Promise.resolve();function Q(r){return r.includes("crawl")?"crawl":r.includes("deploy")?"deploy":r.includes("invalidate")?"invalidate":r}function Ee(r,e){let t={...r},i=typeof r.phase=="string"?r.phase.trim():"",n=typeof e.phase=="string"?e.phase.trim():"";if(n!==""&&(n==="deploy"||n.startsWith("deploy-"))&&i!==n)for(let l of ["index","totalFiles","staged","uploaded","skipped","failed","deleted","workerCount","completedBatches","totalBatches"])delete t[l];let o=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[l,a]of Object.entries(e)){let u=t[l];if(typeof u=="number"&&typeof a=="number"&&o.has(l)){t[l]=Math.max(u,a);continue}t[l]=a;}return t}function Le(r,e,t){T&&(V=V.then(async()=>{let i=new Date,n=i.toISOString();await w.mkdir(b.dirname(T),{recursive:true});let s=await w.readFile(T,"utf8").then(I=>JSON.parse(I)).catch(()=>null),o=s&&typeof s.details=="object"&&s.details?s.details:{},l=Q(r),a=s?.currentStep||Q(s?.source||""),u=s?.startedAt||n,c={...s?.stepDurationsSec??{}},g=s?.stepStartedAt||n;if(a&&a!==l&&s?.stepStartedAt){let I=Math.max(0,Math.round((i.getTime()-new Date(s.stepStartedAt).getTime())/1e3));c[a]=(c[a]??0)+I,g=n;}let p=Math.max(0,Math.round((i.getTime()-new Date(g).getTime())/1e3)),m=Math.max(0,Math.round((i.getTime()-new Date(u).getTime())/1e3)),d=C(e),f=K(t)??{},h={checkedAt:n,source:r,message:d,details:Ee(o,f),startedAt:u,currentStep:l,stepStartedAt:g,stepElapsedSec:p,totalElapsedSec:m,stepDurationsSec:c};await w.writeFile(T,JSON.stringify(h,null,2),"utf8");}).catch(()=>{}));}async function Me(r,e){await w.mkdir(b.dirname(r),{recursive:true}),await w.appendFile(r,`${JSON.stringify(R(e))}
2
+ `,"utf8");}var v=class{constructor(e,t,i="info"){this.logDir=e;this.logFile=t;this.level=i;this.ensureLogFileReady();}logDir;logFile;level;startedAt=Date.now();marks=new Map;initPromise=null;writeQueue=Promise.resolve();writeError=null;get logPath(){return b.join(this.logDir,this.logFile)}artifactPath(e){return this.logFile.endsWith(".log.jsonl")?b.join(this.logDir,this.logFile.replace(/\.log\.jsonl$/u,`${e}.jsonl`)):b.join(this.logDir,`${this.logFile}${e}.jsonl`)}get errorsPath(){return this.artifactPath(".errors")}get rejectedPath(){return this.artifactPath(".rejected")}ensureLogFileReady(){return this.initPromise||(this.initPromise=(async()=>{await w.mkdir(this.logDir,{recursive:true}),await w.writeFile(this.logPath,"","utf8");})()),this.initPromise}enqueueTask(e){this.writeQueue=this.writeQueue.then(e).catch(t=>{this.writeError=t instanceof Error?t:new Error(String(t));});}enqueueLine(e){this.enqueueTask(async()=>{await this.ensureLogFileReady(),await w.appendFile(this.logPath,`${e}
3
+ `,"utf8");});}enqueueJsonLine(e,t){this.enqueueTask(()=>Me(e,t));}accepts(e){return J[e]<=J[this.level]}push(e,t,i){if(!this.accepts(e))return;let n=C(t),s=K(i),o=JSON.stringify({time:new Date().toISOString(),level:e,message:n,...s||{}});this.enqueueLine(o),e==="error"?console.error(`[ERROR] ${n}`,s?JSON.stringify(s):""):e==="warn"?console.warn(`[WARN] ${n}`,s?JSON.stringify(s):""):console.log(`[${e.toUpperCase().padEnd(5)}] ${n}`);}info(e,t){this.push("info",e,t);}progress(e,t){Le(this.logFile,e,t);}debug(e,t){this.push("debug",e,t);}warn(e,t){this.push("warn",e,t);}reject(e,t,i,n,s){let o={kind:e,url:t,reason:i,...n?{source:n}:{},...s||{}};this.enqueueJsonLine(this.rejectedPath,o),this.accepts("debug")&&this.push("debug",`Rejected ${e} ${t}: ${i}`,o);}error(e,t){this.enqueueJsonLine(this.errorsPath,{message:e,...t||{}}),this.push("error",e,t);}mark(e){this.marks.set(e,Date.now());}endMark(e,t){let i=this.marks.get(e);if(!i)return;let n=Date.now()-i,s=Number((n/1e3).toFixed(2));this.push("info",`Timing ${e}: ${s}s`,{name:e,ms:n,seconds:s,...t||{}});}async flush(){let e=Date.now()-this.startedAt,t=Number((e/1e3).toFixed(2));if(this.push("info",`Total time: ${t}s`,{name:"total",ms:e,seconds:t}),await this.writeQueue,this.writeError)throw this.writeError}};function Ue(){let r=String(process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"").trim();return r?b.join(b.resolve(r),"content-sync-invalidation.json"):""}async function F(r,e){if(!r)return;await w.mkdir(b.dirname(r),{recursive:true});let t=`${r}.${process.pid}.${Date.now()}.tmp`;await w.writeFile(t,JSON.stringify({...e,updatedAt:new Date().toISOString()},null,2),"utf8"),await w.rename(t,r);}async function je(r,e,t,i){if(!r)return null;try{let n=JSON.parse(await w.readFile(r,"utf8"));if(n.schemaVersion!==1||n.distributionId!==e||n.impactHash!==t||!Array.isArray(n.batches))throw new Error("Content-sync invalidation state does not match the deploy plan.");let s=n.batches.flatMap(o=>o.paths);return s.length!==i.length||s.some((o,l)=>o!==i[l])?null:n}catch(n){if(n.code==="ENOENT")return null;throw n}}function $e(r,e=3e3){let t=[];for(let i=0;i<r.length;i+=e)t.push(r.slice(i,i+e));return t}async function X(r=process.argv.slice(2)){let e=await D(),t=z(r),i=H(e,t),n=i.config,s=new v(n.logDir||"logs","invalidate.log.jsonl",n.logLevel??"info"),o=r.includes("--content-sync"),l=await B(e);if(o&&l?.schemaVersion!==2)throw new Error("Content-sync invalidation requires a valid schema-2 targeted deploy plan.");if(i.name&&s.info(`Using deployment profile: ${i.name}`),!n.cloudFront.distributionId){s.info("No CloudFront distributionId configured; skipping invalidation."),await s.flush();return}let a=l?.schemaVersion===2?l.invalidationPaths:n.cloudFront.invalidationPaths.length>0?n.cloudFront.invalidationPaths:["/*"],u=l?.schemaVersion===2?W(a,n.s3.prefix||""):a;if(l?.schemaVersion===2&&u.some(d=>d==="/*"))throw new Error("Content-sync cannot use a whole-distribution invalidation.");if(u.length===0){s.info("The targeted deploy plan has no CloudFront paths to invalidate."),await s.flush();return}let c=n.cloudFront.distributionId,g=new CloudFrontClient({region:"us-east-1",maxAttempts:5});if(s.mark("invalidate"),l?.schemaVersion!==2){let d=`smartcloud-static-publisher-${Date.now()}`;await M(`CloudFront invalidation for distribution ${c}`,3e5,({httpOptions:f})=>g.send(new CreateInvalidationCommand({DistributionId:c,InvalidationBatch:{CallerReference:d,Paths:{Quantity:u.length,Items:u}}}),f)),s.endMark("invalidate"),await s.flush();return}let p=Ue(),m=await je(p,c,l.impactHash,u);if(!m){let d=createHash("sha256").update(JSON.stringify(u)).digest("hex");m={schemaVersion:1,distributionId:c,impactHash:l.impactHash,updatedAt:new Date().toISOString(),batches:$e(u).map((f,h)=>({index:h,callerReference:`wpsuite-content-sync-${l.impactHash.slice(0,24)}-${d.slice(0,24)}-${h}`,paths:f,invalidationId:null,status:"pending"}))},await F(p,m);}for(let d of m.batches){if(!d.invalidationId){let f=await M(`CloudFront targeted invalidation batch ${d.index+1}`,3e5,({httpOptions:I})=>g.send(new CreateInvalidationCommand({DistributionId:c,InvalidationBatch:{CallerReference:d.callerReference,Paths:{Quantity:d.paths.length,Items:d.paths}}}),I)),h=String(f.Invalidation?.Id||"").trim();if(!h)throw new Error("CloudFront did not return an invalidation ID.");d.invalidationId=h,d.status="created",await F(p,m);}await waitUntilInvalidationCompleted({client:g,maxWaitTime:900,minDelay:2,maxDelay:15},{DistributionId:c,Id:d.invalidationId}),d.status="completed",await F(p,m),s.info(`CloudFront invalidation batch ${d.index+1}/${m.batches.length} completed.`,{invalidationId:d.invalidationId,pathCount:d.paths.length});}s.endMark("invalidate"),await s.flush();}X().catch(async r=>{console.error(r);try{let e=await D().catch(()=>null),t=new v(e?.logDir??"logs","invalidate.log.jsonl","debug");t.error(`Unhandled error: ${r instanceof Error?r.message:String(r)}`,r instanceof Error?{stack:r.stack}:void 0),await t.flush();}catch{}process.exit(1);});