@smart-cloud/publisher-exporter 1.1.26 → 1.1.27

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.
Files changed (2) hide show
  1. package/dist/deploy.js +3 -3
  2. package/package.json +1 -1
package/dist/deploy.js CHANGED
@@ -1,6 +1,6 @@
1
- import {S3Client,HeadObjectCommand,GetObjectCommand,DeleteObjectsCommand,ListObjectsV2Command}from'@aws-sdk/client-s3';import {Upload}from'@aws-sdk/lib-storage';import {createHash}from'crypto';import Lt from'fast-glob';import $ from'fs/promises';import b from'path';import ir from'mime-types';import ot from'http';import at from'https';import {availableParallelism}from'os';import {Worker}from'worker_threads';function Pe(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function lt(e){let t=String(e??"").trim();if(!t)return "";let r=t;if(/^https?:\/\//i.test(r))try{r=new URL(r).pathname;}catch{return ""}if(r=r.split(/[?#]/,1)[0]?.replace(/\\/g,"/").trim()??"",!r)return "";let n=r.endsWith("/"),i=r.replace(/^\/+/,"").split("/").map(o=>o.replace(/[^A-Za-z0-9._-]/g,"")).filter(o=>o.length>0&&o!=="."&&o!=="..");if(i.length===0)return "";let s=`/${i.join("/")}`;return n&&b.extname(s)===""&&(s+="/"),s==="/"?"":s}function se(e){return !e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).map(([t,r])=>[t.trim(),String(r??"")]).filter(([t])=>t.length>0))}function ut(e){if(!e||typeof e!="object")return {};let t={};for(let[r,n]of Object.entries(e)){let i=r.trim();if(!i||!n||typeof n!="object")continue;let s=n,o={};if(typeof s.targetOrigin=="string"){let a=Pe(s.targetOrigin);a&&(o.targetOrigin=a);}let u=se(s.extraReplacements);if(Object.keys(u).length>0&&(o.extraReplacements=u),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(l=>String(l??"").trim()).filter(l=>l.length>0)),Object.keys(a).length>0&&(o.cloudFront=a);}t[i]=o;}return t}function Se(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function ct(e,t){if(!e||typeof e!="object")return null;let r=e,n=r.command;if(n!=="publish"&&n!=="crawl"&&n!=="deploy"&&n!=="invalidate"&&n!=="retry-timeouts"&&n!=="url")return null;let i=Number.parseInt(String(r.intervalMinutes??"0"),10);if(!Number.isFinite(i)||i<1)return null;let s=String(r.id??`${n}-${t+1}`).trim();if(!s)return null;let o=String(r.deploymentProfile??"").trim(),u=String(r.url??"").trim();return {id:s,enabled:r.enabled!==false,command:n,intervalMinutes:i,...n==="publish"||n==="crawl"?{crawlMode:r.crawlMode==="incremental"?"incremental":"full"}:{},...(n==="publish"||n==="deploy"||n==="invalidate")&&o?{deploymentProfile:o}:{},...u?{url:u}:{}}}function ve(e){let t=e&&typeof e=="object"?e:{},r=Array.isArray(t.rules)?t.rules.map((n,i)=>ct(n,i)).filter(n=>!!n):[];return {enabled:t.enabled===true,timezone:typeof t.timezone=="string"&&t.timezone.trim()!==""?t.timezone.trim():"UTC",rules:r}}function gt(e){if(!e||typeof e!="object")return;let t=e,r={};for(let i of ["accountId","siteId"]){let s=t[i];typeof s=="string"&&s.trim()!==""&&(r[i]=s.trim());}let n=Number(t.lastUpdate??0);return Number.isFinite(n)&&n>0&&(r.lastUpdate=Math.floor(n)),t.subscriber===true&&(r.subscriber=true),Object.keys(r).length>0?r:void 0}function ae(e){let t=e&&typeof e=="object"?e:{},r=String(t.accountId??"").trim(),n=String(t.siteId??"").trim(),i=t.subscriber===true,s=gt(t.siteSettings),o={...s??{},...r?{accountId:s?.accountId??r}:{},...n?{siteId:s?.siteId??n}:{},...s?.subscriber===true||i?{subscriber:true}:{}},u={},a=String(t.apiBase??"").trim();a&&(u.apiBase=a);let c=String(t.runtimeToken??t.nonce??"").trim();c&&(u.runtimeToken=c);let l=String(t.uploadUrl??"").trim();l&&(u.uploadUrl=l),Object.keys(o).length>0&&(u.siteSettings=o);let p=Se(t.subscriptionType);return p&&(u.subscriptionType=p),u}function pt(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function Re(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function dt(e,t){let r=new Headers(e instanceof Request?e.headers:void 0);if(t?.headers)for(let[n,i]of new Headers(t.headers).entries())r.set(n,i);return r}async function $e(e,t,r=5){let n=new URL(Re(e)),i=String(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase(),s=n.protocol==="http:"?ot:at,o=dt(e,t);return await new Promise((u,a)=>{let c=s.request(n,{method:i,headers:Object.fromEntries(o.entries()),...n.protocol==="https:"?{rejectUnauthorized:false}:{}},l=>{let p=[];l.on("data",g=>{p.push(Buffer.isBuffer(g)?g:Buffer.from(g));}),l.on("error",a),l.on("end",()=>{let g=l.statusCode??0,d=l.headers.location;if(r>0&&d&&[301,302,303,307,308].includes(g)){u($e(new URL(d,n),{method:g===303?"GET":i},r-1));return}let w=new Headers;for(let[y,P]of Object.entries(l.headers))Array.isArray(P)?w.set(y,P.join(", ")):typeof P=="string"&&w.set(y,P);u(new Response(Buffer.concat(p),{status:g,statusText:l.statusMessage??"",headers:w}));});});c.on("error",a),c.end();})}function ft(e){let t=ae(e.wpsuite),r={...t.siteSettings??{},...t.siteSettings?.subscriber===true||t.subscriptionType==="PROFESSIONAL"||t.subscriptionType==="AGENCY"?{subscriber:true}:{}},n=String(r.accountId??"").trim(),i=String(r.siteId??"").trim(),s=String(t.uploadUrl??"").trim();if(e.wpsuite={...t.apiBase?{apiBase:t.apiBase}:{},...t.runtimeToken?{runtimeToken:t.runtimeToken}:{},...s?{uploadUrl:s}:{},...Object.keys(r).length>0?{siteSettings:r}:{},...t.subscriptionType?{subscriptionType:t.subscriptionType}:{}},!n||!i||!s)return false;pt(e.sourceOrigin);let o=globalThis,a={...o.WpSuite??{},siteSettings:r,uploadUrl:s};return t.apiBase&&(a.apiBase=t.apiBase),o.WpSuite=a,true}async function ht(e){if(!ft(e))return null;let t=String(e.wpsuite?.uploadUrl??"").trim(),r=globalThis.fetch;try{e.ignoreHttpsErrors&&typeof r=="function"&&t.startsWith("https://")&&(globalThis.fetch=(async(s,o)=>Re(s).startsWith(t)?$e(s,o):r(s,o)));let{getConfig:n}=await import('@smart-cloud/wpsuite-core'),i=await n("publisher");return i&&typeof i=="object"?i:null}catch{return null}finally{typeof r=="function"&&(globalThis.fetch=r);}}function mt(e,t){let r=ut(t?.deploymentProfiles),n=String(t?.defaultDeploymentProfile??"").trim(),i=r[n]?n:"",s=Se(t?.subscriptionType),o=ae(e.wpsuite);return {...e,scheduler:ve(t?.scheduler),deploymentProfiles:r,defaultDeploymentProfile:i,...s?{subscriptionType:s}:{},wpsuite:{...o,...o.siteSettings||s?{siteSettings:{...o.siteSettings??{},...o.siteSettings?.subscriber===true||s==="PROFESSIONAL"||s==="AGENCY"?{subscriber:true}:{}}}:{},...s?{subscriptionType:s}:{}}}}function oe(e,t){let n=String(e||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!n)return t;let i=n.split("/").map(s=>s.trim()).filter(s=>s.length>0&&s!=="."&&s!=="..");return i.length>0?i.join("/"):t}function wt(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?b.resolve(e):""}function be(e,t,r){let n=String(t||"").trim();return n&&b.isAbsolute(n)?b.resolve(n):b.resolve(e,oe(n,r))}async function le(e){let t=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",r=await $.readFile(t,"utf8"),n=JSON.parse(r);n.sourceOrigin=n.sourceOrigin.replace(/\/$/,""),n.targetOrigin=Pe(n.targetOrigin),n.ignoreHttpsErrors??=false,n.outputDir=String(n.outputDir||"export").trim()||"export",n.urlRewriteMode||=n.targetOrigin==="."?"relative":"absolute",n.noJavaScriptRenderPathPrefixes||=[],n.seedPaths||=[],n.generated404RequestPath=lt(n.generated404RequestPath),n.sitemapPaths||=["/sitemap_index.xml","/sitemap.xml"],n.allowedAssetHosts||=[],n.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],n.blockedPathPrefixes||=[],n.blockedSearchFragments||=[],n.concurrency||=1,n.maxPages||=0,n.extraReplacements=se(n.extraReplacements),n.postCrawlCopyMap=se(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=ae(n.wpsuite),n.scheduler=ve(void 0),n.deploymentProfiles={},n.defaultDeploymentProfile="",n.deploymentTargetOverride=String(n.deploymentTargetOverride??"").trim();let i=mt(n,await ht(n)),s=wt(),o=s?b.resolve(s,".."):"";return o?(i.outputDir=be(o,i.outputDir,"export"),i.logDir=be(o,i.logDir,"logs")):(b.isAbsolute(i.outputDir)||(i.outputDir=oe(i.outputDir,"export")),b.isAbsolute(i.logDir)||(i.logDir=oe(i.logDir,"logs"))),i}function yt(e){let t=e/6e4;if(Number.isInteger(t)&&t>=1)return `${t} minute${t===1?"":"s"}`;let r=Math.ceil(e/1e3);return `${r} second${r===1?"":"s"}`}async function E(e,t,r){let n=new AbortController,i=globalThis.setTimeout(()=>{n.abort(new Error(`${e} timed out after ${yt(t)}.`));},t);try{return await r({abortController:n,httpOptions:{abortSignal:n.signal,requestTimeout:t}})}finally{globalThis.clearTimeout(i);}}var bt=".deploy-plan.json",Pt="deploy-plan.json";function St(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?b.resolve(e):""}function vt(e){let t=String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").trim();return !t||t==="."||t.startsWith("../")||t===".."?null:t}function ue(e){return [...new Set(e.map(vt).filter(t=>t!==null))]}function Rt(e,t){return {schemaVersion:1,generatedAt:String(t.generatedAt||new Date().toISOString()),outputDir:b.resolve(e.outputDir),runMode:t.runMode,crawlMode:t.crawlMode,fullSyncRequired:!!t.fullSyncRequired,changedFiles:ue(t.changedFiles||[]),deletedFiles:ue(t.deletedFiles||[]),rewriteTargets:ue(t.rewriteTargets||[])}}function $t(e){if(!e||typeof e!="object")return false;let t=e;return t.schemaVersion===1&&typeof t.generatedAt=="string"&&typeof t.outputDir=="string"&&(t.runMode==="full"||t.runMode==="retry-timeouts"||t.runMode==="single-url")&&(t.crawlMode==="full"||t.crawlMode==="incremental")&&typeof t.fullSyncRequired=="boolean"&&Array.isArray(t.changedFiles)&&Array.isArray(t.deletedFiles)&&Array.isArray(t.rewriteTargets)}function De(e){let t=b.join(b.resolve(e.outputDir),bt),r=St();return r?[b.join(r,Pt),t]:[t]}async function Te(e){let t=b.resolve(e.outputDir);for(let r of De(e))try{let n=await $.readFile(r,"utf8"),i=JSON.parse(n);if(!$t(i)||b.resolve(i.outputDir)!==t)continue;return Rt(e,i)}catch{}return null}async function Ce(e){for(let t of De(e))try{await $.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}function xt(e){return typeof e.subscriptionType=="string"&&e.subscriptionType.trim()!==""}function Ee(e){let t="";for(let n=0;n<e.length;n++){let i=e[n];if(i==="--profile"){let s=(e[n+1]||"").trim();if(!s)throw new Error("Missing value for --profile.");t=s,n+=1;}else if(i.startsWith("--profile=")){let s=i.slice(10).trim();if(!s)throw new Error("Missing value for --profile.");t=s;}}let r=String(process.env.PUBLISHER_DEPLOY_PROFILE||process.env.PUBLISHER_DEPLOYMENT_PROFILE||"").trim();return t||r||null}function Dt(e,t){return {...e,...t??{}}}function Tt(e,t){return {...e,...t??{},invalidationPaths:[...(t?.invalidationPaths??e.invalidationPaths)||[]]}}function Me(e,t){let r=String(t??e.deploymentTargetOverride??"").trim();if(!xt(e)){if(r)throw new Error(`Deployment target "${r}" requires an active WPSuite subscription and remote publisher config.`);return {name:null,profile:null,config:e}}let n=String(r||e.defaultDeploymentProfile||"").trim();if(!n)return {name:null,profile:null,config:e};let i=e.deploymentProfiles?.[n];if(!i)throw new Error(`Unknown deployment profile "${n}". Check the linked WPSuite publisher configuration.`);return {name:n,profile:i,config:{...e,targetOrigin:i.targetOrigin??e.targetOrigin,s3:Dt(e.s3,i.s3),cloudFront:Tt(e.cloudFront,i.cloudFront)}}}var ke={error:0,warn:1,info:2,debug:3},Le=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",Q=Le?b.join(Le,"current-progress.json"):"",Ie=Promise.resolve();function Oe(e){return e.includes("crawl")?"crawl":e.includes("deploy")?"deploy":e.includes("invalidate")?"invalidate":e}function Ct(e,t){let r={...e},n=new Set(["pagesQueued","pagesRendered","assetsQueued","sitemapsQueued","pagesDiscovered","assetsDiscovered","sitemapsDiscovered","pagesSaved","assetsSaved","donePages","doneAssets","doneSitemaps","changedTextFiles","uploaded","failed","index","totalFiles","pageQueue","assetQueue","sitemapQueue"]);for(let[i,s]of Object.entries(t)){let o=r[i];if(typeof o=="number"&&typeof s=="number"&&n.has(i)){r[i]=Math.max(o,s);continue}r[i]=s;}return r}function Et(e,t,r){Q&&(Ie=Ie.then(async()=>{let n=new Date,i=n.toISOString();await $.mkdir(b.dirname(Q),{recursive:true});let s=await $.readFile(Q,"utf8").then(y=>JSON.parse(y)).catch(()=>null),o=s&&typeof s.details=="object"&&s.details?s.details:{},u=Oe(e),a=s?.currentStep||Oe(s?.source||""),c=s?.startedAt||i,l={...s?.stepDurationsSec??{}},p=s?.stepStartedAt||i;if(a&&a!==u&&s?.stepStartedAt){let y=Math.max(0,Math.round((n.getTime()-new Date(s.stepStartedAt).getTime())/1e3));l[a]=(l[a]??0)+y,p=i;}let g=Math.max(0,Math.round((n.getTime()-new Date(p).getTime())/1e3)),d=Math.max(0,Math.round((n.getTime()-new Date(c).getTime())/1e3)),w={checkedAt:i,source:e,message:t,details:Ct(o,r??{}),startedAt:c,currentStep:u,stepStartedAt:p,stepElapsedSec:g,totalElapsedSec:d,stepDurationsSec:l};await $.writeFile(Q,JSON.stringify(w,null,2),"utf8");}).catch(()=>{}));}async function Mt(e,t){await $.mkdir(b.dirname(e),{recursive:true}),await $.appendFile(e,`${JSON.stringify(t)}
1
+ import {S3Client,HeadObjectCommand,GetObjectCommand,DeleteObjectsCommand,ListObjectsV2Command}from'@aws-sdk/client-s3';import {Upload}from'@aws-sdk/lib-storage';import {createHash}from'crypto';import It from'fast-glob';import $ from'fs/promises';import b from'path';import sr from'mime-types';import at from'http';import lt from'https';import {availableParallelism}from'os';import {Worker}from'worker_threads';function Se(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function ut(e){let t=String(e??"").trim();if(!t)return "";let r=t;if(/^https?:\/\//i.test(r))try{r=new URL(r).pathname;}catch{return ""}if(r=r.split(/[?#]/,1)[0]?.replace(/\\/g,"/").trim()??"",!r)return "";let n=r.endsWith("/"),i=r.replace(/^\/+/,"").split("/").map(o=>o.replace(/[^A-Za-z0-9._-]/g,"")).filter(o=>o.length>0&&o!=="."&&o!=="..");if(i.length===0)return "";let s=`/${i.join("/")}`;return n&&b.extname(s)===""&&(s+="/"),s==="/"?"":s}function oe(e){return !e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).map(([t,r])=>[t.trim(),String(r??"")]).filter(([t])=>t.length>0))}function ct(e){if(!e||typeof e!="object")return {};let t={};for(let[r,n]of Object.entries(e)){let i=r.trim();if(!i||!n||typeof n!="object")continue;let s=n,o={};if(typeof s.targetOrigin=="string"){let a=Se(s.targetOrigin);a&&(o.targetOrigin=a);}let u=oe(s.extraReplacements);if(Object.keys(u).length>0&&(o.extraReplacements=u),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(l=>String(l??"").trim()).filter(l=>l.length>0)),Object.keys(a).length>0&&(o.cloudFront=a);}t[i]=o;}return t}function ve(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function gt(e,t){if(!e||typeof e!="object")return null;let r=e,n=r.command;if(n!=="publish"&&n!=="crawl"&&n!=="deploy"&&n!=="invalidate"&&n!=="retry-timeouts"&&n!=="url")return null;let i=Number.parseInt(String(r.intervalMinutes??"0"),10);if(!Number.isFinite(i)||i<1)return null;let s=String(r.id??`${n}-${t+1}`).trim();if(!s)return null;let o=String(r.deploymentProfile??"").trim(),u=String(r.url??"").trim();return {id:s,enabled:r.enabled!==false,command:n,intervalMinutes:i,...n==="publish"||n==="crawl"?{crawlMode:r.crawlMode==="incremental"?"incremental":"full"}:{},...(n==="publish"||n==="deploy"||n==="invalidate")&&o?{deploymentProfile:o}:{},...u?{url:u}:{}}}function Re(e){let t=e&&typeof e=="object"?e:{},r=Array.isArray(t.rules)?t.rules.map((n,i)=>gt(n,i)).filter(n=>!!n):[];return {enabled:t.enabled===true,timezone:typeof t.timezone=="string"&&t.timezone.trim()!==""?t.timezone.trim():"UTC",rules:r}}function pt(e){if(!e||typeof e!="object")return;let t=e,r={};for(let i of ["accountId","siteId"]){let s=t[i];typeof s=="string"&&s.trim()!==""&&(r[i]=s.trim());}let n=Number(t.lastUpdate??0);return Number.isFinite(n)&&n>0&&(r.lastUpdate=Math.floor(n)),t.subscriber===true&&(r.subscriber=true),Object.keys(r).length>0?r:void 0}function le(e){let t=e&&typeof e=="object"?e:{},r=String(t.accountId??"").trim(),n=String(t.siteId??"").trim(),i=t.subscriber===true,s=pt(t.siteSettings),o={...s??{},...r?{accountId:s?.accountId??r}:{},...n?{siteId:s?.siteId??n}:{},...s?.subscriber===true||i?{subscriber:true}:{}},u={},a=String(t.apiBase??"").trim();a&&(u.apiBase=a);let c=String(t.runtimeToken??t.nonce??"").trim();c&&(u.runtimeToken=c);let l=String(t.uploadUrl??"").trim();l&&(u.uploadUrl=l),Object.keys(o).length>0&&(u.siteSettings=o);let p=ve(t.subscriptionType);return p&&(u.subscriptionType=p),u}function dt(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function $e(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function ft(e,t){let r=new Headers(e instanceof Request?e.headers:void 0);if(t?.headers)for(let[n,i]of new Headers(t.headers).entries())r.set(n,i);return r}async function xe(e,t,r=5){let n=new URL($e(e)),i=String(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase(),s=n.protocol==="http:"?at:lt,o=ft(e,t);return await new Promise((u,a)=>{let c=s.request(n,{method:i,headers:Object.fromEntries(o.entries()),...n.protocol==="https:"?{rejectUnauthorized:false}:{}},l=>{let p=[];l.on("data",g=>{p.push(Buffer.isBuffer(g)?g:Buffer.from(g));}),l.on("error",a),l.on("end",()=>{let g=l.statusCode??0,d=l.headers.location;if(r>0&&d&&[301,302,303,307,308].includes(g)){u(xe(new URL(d,n),{method:g===303?"GET":i},r-1));return}let w=new Headers;for(let[y,P]of Object.entries(l.headers))Array.isArray(P)?w.set(y,P.join(", ")):typeof P=="string"&&w.set(y,P);u(new Response(Buffer.concat(p),{status:g,statusText:l.statusMessage??"",headers:w}));});});c.on("error",a),c.end();})}function ht(e){let t=le(e.wpsuite),r={...t.siteSettings??{},...t.siteSettings?.subscriber===true||t.subscriptionType==="PROFESSIONAL"||t.subscriptionType==="AGENCY"?{subscriber:true}:{}},n=String(r.accountId??"").trim(),i=String(r.siteId??"").trim(),s=String(t.uploadUrl??"").trim();if(e.wpsuite={...t.apiBase?{apiBase:t.apiBase}:{},...t.runtimeToken?{runtimeToken:t.runtimeToken}:{},...s?{uploadUrl:s}:{},...Object.keys(r).length>0?{siteSettings:r}:{},...t.subscriptionType?{subscriptionType:t.subscriptionType}:{}},!n||!i||!s)return false;dt(e.sourceOrigin);let o=globalThis,a={...o.WpSuite??{},siteSettings:r,uploadUrl:s};return t.apiBase&&(a.apiBase=t.apiBase),o.WpSuite=a,true}async function mt(e){if(!ht(e))return null;let t=String(e.wpsuite?.uploadUrl??"").trim(),r=globalThis.fetch;try{e.ignoreHttpsErrors&&typeof r=="function"&&t.startsWith("https://")&&(globalThis.fetch=(async(s,o)=>$e(s).startsWith(t)?xe(s,o):r(s,o)));let{getConfig:n}=await import('@smart-cloud/wpsuite-core'),i=await n("publisher");return i&&typeof i=="object"?i:null}catch{return null}finally{typeof r=="function"&&(globalThis.fetch=r);}}function wt(e,t){let r=ct(t?.deploymentProfiles),n=String(t?.defaultDeploymentProfile??"").trim(),i=r[n]?n:"",s=ve(t?.subscriptionType),o=le(e.wpsuite);return {...e,scheduler:Re(t?.scheduler),deploymentProfiles:r,defaultDeploymentProfile:i,...s?{subscriptionType:s}:{},wpsuite:{...o,...o.siteSettings||s?{siteSettings:{...o.siteSettings??{},...o.siteSettings?.subscriber===true||s==="PROFESSIONAL"||s==="AGENCY"?{subscriber:true}:{}}}:{},...s?{subscriptionType:s}:{}}}}function ae(e,t){let n=String(e||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!n)return t;let i=n.split("/").map(s=>s.trim()).filter(s=>s.length>0&&s!=="."&&s!=="..");return i.length>0?i.join("/"):t}function yt(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?b.resolve(e):""}function Pe(e,t,r){let n=String(t||"").trim();return n&&b.isAbsolute(n)?b.resolve(n):b.resolve(e,ae(n,r))}async function ue(e){let t=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",r=await $.readFile(t,"utf8"),n=JSON.parse(r);n.sourceOrigin=n.sourceOrigin.replace(/\/$/,""),n.targetOrigin=Se(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=ut(n.generated404RequestPath),n.sitemapPaths||=["/sitemap_index.xml","/sitemap.xml"],n.allowedAssetHosts||=[],n.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],n.blockedPathPrefixes||=[],n.blockedSearchFragments||=[],n.concurrency||=1,n.maxPages||=0,n.extraReplacements=oe(n.extraReplacements),n.postCrawlCopyMap=oe(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=le(n.wpsuite),n.scheduler=Re(void 0),n.deploymentProfiles={},n.defaultDeploymentProfile="",n.deploymentTargetOverride=String(n.deploymentTargetOverride??"").trim();let i=wt(n,await mt(n)),s=yt(),o=s?b.resolve(s,".."):"";return o?(i.outputDir=Pe(o,i.outputDir,"export"),i.logDir=Pe(o,i.logDir,"logs")):(b.isAbsolute(i.outputDir)||(i.outputDir=ae(i.outputDir,"export")),b.isAbsolute(i.logDir)||(i.logDir=ae(i.logDir,"logs"))),i}function bt(e){let t=e/6e4;if(Number.isInteger(t)&&t>=1)return `${t} minute${t===1?"":"s"}`;let r=Math.ceil(e/1e3);return `${r} second${r===1?"":"s"}`}async function E(e,t,r){let n=new AbortController,i=globalThis.setTimeout(()=>{n.abort(new Error(`${e} timed out after ${bt(t)}.`));},t);try{return await r({abortController:n,httpOptions:{abortSignal:n.signal,requestTimeout:t}})}finally{globalThis.clearTimeout(i);}}var Pt=".deploy-plan.json",St="deploy-plan.json";function vt(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?b.resolve(e):""}function Rt(e){let t=String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").trim();return !t||t==="."||t.startsWith("../")||t===".."?null:t}function ce(e){return [...new Set(e.map(Rt).filter(t=>t!==null))]}function $t(e,t){return {schemaVersion:1,generatedAt:String(t.generatedAt||new Date().toISOString()),outputDir:b.resolve(e.outputDir),runMode:t.runMode,crawlMode:t.crawlMode,fullSyncRequired:!!t.fullSyncRequired,changedFiles:ce(t.changedFiles||[]),deletedFiles:ce(t.deletedFiles||[]),rewriteTargets:ce(t.rewriteTargets||[])}}function xt(e){if(!e||typeof e!="object")return false;let t=e;return t.schemaVersion===1&&typeof t.generatedAt=="string"&&typeof t.outputDir=="string"&&(t.runMode==="full"||t.runMode==="retry-timeouts"||t.runMode==="single-url")&&(t.crawlMode==="full"||t.crawlMode==="incremental")&&typeof t.fullSyncRequired=="boolean"&&Array.isArray(t.changedFiles)&&Array.isArray(t.deletedFiles)&&Array.isArray(t.rewriteTargets)}function Te(e){let t=b.join(b.resolve(e.outputDir),Pt),r=vt();return r?[b.join(r,St),t]:[t]}async function Ce(e){let t=b.resolve(e.outputDir);for(let r of Te(e))try{let n=await $.readFile(r,"utf8"),i=JSON.parse(n);if(!xt(i)||b.resolve(i.outputDir)!==t)continue;return $t(e,i)}catch{}return null}async function Ee(e){for(let t of Te(e))try{await $.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}function Dt(e){return typeof e.subscriptionType=="string"&&e.subscriptionType.trim()!==""}function Me(e){let t="";for(let n=0;n<e.length;n++){let i=e[n];if(i==="--profile"){let s=(e[n+1]||"").trim();if(!s)throw new Error("Missing value for --profile.");t=s,n+=1;}else if(i.startsWith("--profile=")){let s=i.slice(10).trim();if(!s)throw new Error("Missing value for --profile.");t=s;}}let r=String(process.env.PUBLISHER_DEPLOY_PROFILE||process.env.PUBLISHER_DEPLOYMENT_PROFILE||"").trim();return t||r||null}function Tt(e,t){return {...e,...t??{}}}function Ct(e,t){return {...e,...t??{},invalidationPaths:[...(t?.invalidationPaths??e.invalidationPaths)||[]]}}function ke(e,t){let r=String(t??e.deploymentTargetOverride??"").trim();if(!Dt(e)){if(r)throw new Error(`Deployment target "${r}" requires an active WPSuite subscription and remote publisher config.`);return {name:null,profile:null,config:e}}let n=String(r||e.defaultDeploymentProfile||"").trim();if(!n)return {name:null,profile:null,config:e};let i=e.deploymentProfiles?.[n];if(!i)throw new Error(`Unknown deployment profile "${n}". Check the linked WPSuite publisher configuration.`);return {name:n,profile:i,config:{...e,targetOrigin:i.targetOrigin??e.targetOrigin,s3:Tt(e.s3,i.s3),cloudFront:Ct(e.cloudFront,i.cloudFront)}}}var Le={error:0,warn:1,info:2,debug:3},Ie=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",V=Ie?b.join(Ie,"current-progress.json"):"",Oe=Promise.resolve();function je(e){return e.includes("crawl")?"crawl":e.includes("deploy")?"deploy":e.includes("invalidate")?"invalidate":e}function Et(e,t){let r={...e},n=new Set(["pagesQueued","pagesRendered","assetsQueued","sitemapsQueued","pagesDiscovered","assetsDiscovered","sitemapsDiscovered","pagesSaved","assetsSaved","donePages","doneAssets","doneSitemaps","changedTextFiles","uploaded","failed","index","totalFiles","pageQueue","assetQueue","sitemapQueue"]);for(let[i,s]of Object.entries(t)){let o=r[i];if(typeof o=="number"&&typeof s=="number"&&n.has(i)){r[i]=Math.max(o,s);continue}r[i]=s;}return r}function Mt(e,t,r){V&&(Oe=Oe.then(async()=>{let n=new Date,i=n.toISOString();await $.mkdir(b.dirname(V),{recursive:true});let s=await $.readFile(V,"utf8").then(y=>JSON.parse(y)).catch(()=>null),o=s&&typeof s.details=="object"&&s.details?s.details:{},u=je(e),a=s?.currentStep||je(s?.source||""),c=s?.startedAt||i,l={...s?.stepDurationsSec??{}},p=s?.stepStartedAt||i;if(a&&a!==u&&s?.stepStartedAt){let y=Math.max(0,Math.round((n.getTime()-new Date(s.stepStartedAt).getTime())/1e3));l[a]=(l[a]??0)+y,p=i;}let g=Math.max(0,Math.round((n.getTime()-new Date(p).getTime())/1e3)),d=Math.max(0,Math.round((n.getTime()-new Date(c).getTime())/1e3)),w={checkedAt:i,source:e,message:t,details:Et(o,r??{}),startedAt:c,currentStep:u,stepStartedAt:p,stepElapsedSec:g,totalElapsedSec:d,stepDurationsSec:l};await $.writeFile(V,JSON.stringify(w,null,2),"utf8");}).catch(()=>{}));}async function kt(e,t){await $.mkdir(b.dirname(e),{recursive:true}),await $.appendFile(e,`${JSON.stringify(t)}
2
2
  `,"utf8");}var B=class{constructor(t,r,n="info"){this.logDir=t;this.logFile=r;this.level=n;this.ensureLogFileReady();}logDir;logFile;level;startedAt=Date.now();marks=new Map;initPromise=null;writeQueue=Promise.resolve();writeError=null;get logPath(){return b.join(this.logDir,this.logFile)}artifactPath(t){return this.logFile.endsWith(".log.jsonl")?b.join(this.logDir,this.logFile.replace(/\.log\.jsonl$/u,`${t}.jsonl`)):b.join(this.logDir,`${this.logFile}${t}.jsonl`)}get errorsPath(){return this.artifactPath(".errors")}get rejectedPath(){return this.artifactPath(".rejected")}ensureLogFileReady(){return this.initPromise||(this.initPromise=(async()=>{await $.mkdir(this.logDir,{recursive:true}),await $.writeFile(this.logPath,"","utf8");})()),this.initPromise}enqueueTask(t){this.writeQueue=this.writeQueue.then(t).catch(r=>{this.writeError=r instanceof Error?r:new Error(String(r));});}enqueueLine(t){this.enqueueTask(async()=>{await this.ensureLogFileReady(),await $.appendFile(this.logPath,`${t}
3
- `,"utf8");});}enqueueJsonLine(t,r){this.enqueueTask(()=>Mt(t,r));}accepts(t){return ke[t]<=ke[this.level]}push(t,r,n){if(!this.accepts(t))return;let i=JSON.stringify({time:new Date().toISOString(),level:t,message:r,...n||{}});this.enqueueLine(i),t==="error"?console.error(`[ERROR] ${r}`,n?JSON.stringify(n):""):t==="warn"?console.warn(`[WARN] ${r}`,n?JSON.stringify(n):""):console.log(`[${t.toUpperCase().padEnd(5)}] ${r}`);}info(t,r){this.push("info",t,r);}progress(t,r){Et(this.logFile,t,r);}debug(t,r){this.push("debug",t,r);}warn(t,r){this.push("warn",t,r);}reject(t,r,n,i,s){let o={kind:t,url:r,reason:n,...i?{source:i}:{},...s||{}};this.enqueueJsonLine(this.rejectedPath,o),this.accepts("debug")&&this.push("debug",`Rejected ${t} ${r}: ${n}`,o);}error(t,r){this.enqueueJsonLine(this.errorsPath,{message:t,...r||{}}),this.push("error",t,r);}mark(t){this.marks.set(t,Date.now());}endMark(t,r){let n=this.marks.get(t);if(!n)return;let i=Date.now()-n,s=Number((i/1e3).toFixed(2));this.push("info",`Timing ${t}: ${s}s`,{name:t,ms:i,seconds:s,...r||{}});}async flush(){let t=Date.now()-this.startedAt,r=Number((t/1e3).toFixed(2));if(this.push("info",`Total time: ${r}s`,{name:"total",ms:t,seconds:r}),await this.writeQueue,this.writeError)throw this.writeError}};function Ae(e){return [".html",".htm",".css",".js",".mjs",".json",".xml",".xsl",".txt",".svg",".map",".enc",".jws"].includes(b.extname(e).toLowerCase())}function _e(e){return e.replace(/&quot;/g,'"').replace(/&#34;/g,'"').replace(/&apos;/g,"'").replace(/&#39;/g,"'").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">")}function A(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function V(e){return e.replace(/\//g,"\\/")}function je(e){return e.replace(/\//g,"\\\\/")}function kt(e){try{let t=new URL(e);if(t.protocol!=="http:"&&t.protocol!=="https:")return null;let r=t.pathname==="/"&&!t.search&&!t.hash?"":`${t.pathname}${t.search}${t.hash}`;return `//${t.host}${r}`}catch{return null}}function Fe(e,t,r){if(!t)return;e[t]=r;let n=V(t),i=V(r);e[n]=i;let s=je(t),o=je(r);e[s]=o;let u=A(t),a=A(r);e[u]=a;let c=A(n),l=A(i);e[c]=l;let p=A(s),g=A(o);e[p]=g;}function Y(e,t,r){Fe(e,t,r);let n=kt(t);n&&n!==t&&Fe(e,n,r);}function Ue(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function Ne(e,t,r){if(!t)return r;let n=b.dirname(b.resolve(t)),i=b.resolve(e,r.replace(/^\/+/,"")),s=b.relative(n,i).replace(/\\/g,"/");return s?(s.startsWith(".")||(s=`./${s}`),s):"."}var jt=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],Ft=new Set([".html",".htm"]),ze="WPSuite.io Static Publisher",At=ze.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function _t(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ut(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function Nt(e,t,r){return Ut(t)?e.replace(new RegExp(`(?<!:)${_t(t)}`,"g"),r):e.split(t).join(r)}function Wt(e,t,r){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let i=b.extname(r).toLowerCase();return Ft.has(i)?/<head\b|<html\b|<!doctype html/i.test(t):false}function zt(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${At}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${ze}" />`;if(e.match(/(\r?\n)([ \t]*)<\/head>/i))return e.replace(/(\r?\n)([ \t]*)<\/head>/i,`$1$2${t}$1$2</head>`);let n=e.includes(`\r
3
+ `,"utf8");});}enqueueJsonLine(t,r){this.enqueueTask(()=>kt(t,r));}accepts(t){return Le[t]<=Le[this.level]}push(t,r,n){if(!this.accepts(t))return;let i=JSON.stringify({time:new Date().toISOString(),level:t,message:r,...n||{}});this.enqueueLine(i),t==="error"?console.error(`[ERROR] ${r}`,n?JSON.stringify(n):""):t==="warn"?console.warn(`[WARN] ${r}`,n?JSON.stringify(n):""):console.log(`[${t.toUpperCase().padEnd(5)}] ${r}`);}info(t,r){this.push("info",t,r);}progress(t,r){Mt(this.logFile,t,r);}debug(t,r){this.push("debug",t,r);}warn(t,r){this.push("warn",t,r);}reject(t,r,n,i,s){let o={kind:t,url:r,reason:n,...i?{source:i}:{},...s||{}};this.enqueueJsonLine(this.rejectedPath,o),this.accepts("debug")&&this.push("debug",`Rejected ${t} ${r}: ${n}`,o);}error(t,r){this.enqueueJsonLine(this.errorsPath,{message:t,...r||{}}),this.push("error",t,r);}mark(t){this.marks.set(t,Date.now());}endMark(t,r){let n=this.marks.get(t);if(!n)return;let i=Date.now()-n,s=Number((i/1e3).toFixed(2));this.push("info",`Timing ${t}: ${s}s`,{name:t,ms:i,seconds:s,...r||{}});}async flush(){let t=Date.now()-this.startedAt,r=Number((t/1e3).toFixed(2));if(this.push("info",`Total time: ${r}s`,{name:"total",ms:t,seconds:r}),await this.writeQueue,this.writeError)throw this.writeError}};function _e(e){return [".html",".htm",".css",".js",".mjs",".json",".xml",".xsl",".txt",".svg",".map",".enc",".jws"].includes(b.extname(e).toLowerCase())}function Ue(e){return e.replace(/&quot;/g,'"').replace(/&#34;/g,'"').replace(/&apos;/g,"'").replace(/&#39;/g,"'").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">")}function A(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function Y(e){return e.replace(/\//g,"\\/")}function Fe(e){return e.replace(/\//g,"\\\\/")}function Lt(e){try{let t=new URL(e);if(t.protocol!=="http:"&&t.protocol!=="https:")return null;let r=t.pathname==="/"&&!t.search&&!t.hash?"":`${t.pathname}${t.search}${t.hash}`;return `//${t.host}${r}`}catch{return null}}function Ae(e,t,r){if(!t)return;e[t]=r;let n=Y(t),i=Y(r);e[n]=i;let s=Fe(t),o=Fe(r);e[s]=o;let u=A(t),a=A(r);e[u]=a;let c=A(n),l=A(i);e[c]=l;let p=A(s),g=A(o);e[p]=g;}function Z(e,t,r){Ae(e,t,r);let n=Lt(t);n&&n!==t&&Ae(e,n,r);}function Ne(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function We(e,t,r){if(!t)return r;let n=b.dirname(b.resolve(t)),i=b.resolve(e,r.replace(/^\/+/,"")),s=b.relative(n,i).replace(/\\/g,"/");return s?(s.startsWith(".")||(s=`./${s}`),s):"."}var Ft=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],At=new Set([".html",".htm"]),qe="WPSuite.io Static Publisher",_t=qe.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function Ut(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Nt(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function Wt(e,t,r){return Nt(t)?e.replace(new RegExp(`(?<!:)${Ut(t)}`,"g"),r):e.split(t).join(r)}function zt(e,t,r){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let i=b.extname(r).toLowerCase();return At.has(i)?/<head\b|<html\b|<!doctype html/i.test(t):false}function qt(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${_t}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${qe}" />`;if(e.match(/(\r?\n)([ \t]*)<\/head>/i))return e.replace(/(\r?\n)([ \t]*)<\/head>/i,`$1$2${t}$1$2</head>`);let n=e.includes(`\r
4
4
  `)?`\r
5
5
  `:`
6
- `;return e.replace(/<head\b[^>]*>/i,i=>`${i}${n} ${t}`)}function qt(e){let t=_e(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function Bt(e,t){let r=[...new Set(t)].filter(s=>s.includes("/")&&!/\\+\//.test(s)).map(s=>[s,V(s)]).filter(([s,o])=>s!==o).sort((s,o)=>o[0].length-s[0].length);if(!r.length)return e;let n=s=>{let o=s;for(let[u,a]of r)o=o.split(u).join(a);return o},i=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(s,o,u,a)=>`${o}${n(u)}${a}`);return i=i.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(s,o,u,a,c)=>qt(a)?`${o}${n(a)}${c}`:s),i}function Ht(e,t){if(!t)return null;let r=b.dirname(b.resolve(t)),n=b.resolve(e.outputDir),i=b.relative(r,n).replace(/\\/g,"/");return i?(i.startsWith(".")||(i=`./${i}`),i.endsWith("/")?i:`${i}/`):"./"}function Jt(e,t,r){let n=Ht(t,r);if(!n)return e;let i=e;for(let s of jt){let o=s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),u=new RegExp(`(?:\\.{1,}/)+${o}`,"g"),a=new RegExp(`(?<!\\.)/${o}`,"g");i=i.replace(u,`${n}${s}`).replace(a,`${n}${s}`);let c=s.replace(/\//g,"\\/"),l=n.replace(/\//g,"\\/"),p=c.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),g=new RegExp(`(?:\\.{1,}\\\\/)+${p}`,"g"),d=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${p}`,"g"),w=new RegExp(`(?<![\\.\\\\])\\/${p}`,"g");i=i.replace(g,`${l}${c}`).replace(d,`${l}${c}`).replace(w,`${l}${c}`);}return i}function ge(e,t,r){if(e.urlRewriteMode==="absolute")return t;let n=(()=>{try{return new URL(t,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin)}catch{return null}})(),i=n?n.pathname:Ue(t,e.targetOrigin),s=n?`${n.search}${n.hash}`:"";return e.urlRewriteMode==="root-relative"?`${i}${s}`:`${Ne(e.outputDir,r,i)}${s}`}function ce(e,t,r,n,i){Y(e,r,ge(t,n,i));}function Kt(e,t,r,n,i){if(!r||r===n)return;Y(e,r,n);let s=ge(t,r,i),o=ge(t,n,i);Y(e,s,o);}function Gt(e,t,r,n,i={}){let s=e,o={};ce(o,t,t.sourceOrigin,t.targetOrigin,n);for(let[a,c]of Object.entries(t.extraReplacements))ce(o,t,a,c,n);for(let[a,c]of Object.entries(r))ce(o,t,a,c,n);for(let[a,c]of Object.entries(i)){let l=r[a];!l||l===c||Kt(o,t,c,l,n);}let u=Object.entries(o).sort((a,c)=>c[0].length-a[0].length);for(let[a,c]of u)s=Nt(s,a,c);return t.urlRewriteMode!=="absolute"&&(s=Jt(s,t,n)),s=Bt(s,u.map(([,a])=>a)),Wt(t,s,n)&&(s=zt(s)),s}async function Qt(e,t,r,n){let i=b.join(e.outputDir,n),s=b.extname(i).toLowerCase(),o;try{o=await $.readFile(i,"utf8");}catch(c){if(c.code!=="ENOENT")throw c;return {changed:false}}let a=Gt(o,e,t,s===".js"||s===".mjs"?void 0:i,r);return a!==o?(await $.writeFile(i,a,"utf8"),{changed:true}):{changed:false}}async function Vt(e,t){return await new Promise((r,n)=>{let i=a=>{if(u(),a?.error){n(new Error(a.error));return}r({changed:!!a?.changed});},s=a=>{u(),n(a);},o=a=>{u(),a!==0&&n(new Error(`Rewrite worker exited with code ${a}.`));},u=()=>{e.off("message",i),e.off("error",s),e.off("exit",o);};e.on("message",i),e.on("error",s),e.on("exit",o),e.postMessage({file:t});})}async function qe(e,t,r={}){let i=(r.files?[...new Set(r.files)].map(g=>b.resolve(g)).filter(g=>g.startsWith(b.resolve(e.outputDir))).map(g=>b.relative(e.outputDir,g).replace(/\\/g,"/")).filter(g=>g.length>0):await Lt(["**/*"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(g=>g!=="asset-map.json"&&Ae(g)),s=0;if(i.length===0)return 0;let o=Math.max(1,Number(e.rewriteConcurrency||e.assetDownloadConcurrency||1)),u=Math.max(1,Math.min(o,i.length,availableParallelism()));await r.onStart?.({totalFiles:i.length,workerCount:u});let a=0,c=0,l=null;if(u===1){for(let g of i){let d=await Qt(e,t,r.previousAssetMap??{},g);d.changed&&(s+=1),c+=1,await r.onProgress?.({index:c,totalFiles:i.length,changedTextFiles:s,file:g,changed:d.changed});}return s}let p=Array.from({length:u},async()=>{let g=new Worker(new URL("./rewrite-worker.js",import.meta.url),{workerData:{config:e,assetMap:t,previousAssetMap:r.previousAssetMap??{}}});try{for(;!l;){let d=a;if(d>=i.length)return;a+=1;let w=i[d],y=await Vt(g,w);y.changed&&(s+=1),c+=1,await r.onProgress?.({index:c,totalFiles:i.length,changedTextFiles:s,file:w,changed:y.changed});}}catch(d){throw l=d instanceof Error?d:new Error(String(d)),l}finally{await g.terminate().catch(()=>{});}});return await Promise.all(p),s}var Ke="wpsuite-sha256",Ge="wpsuite-normalized-sha256",sr=/(?:^|[-_:.])(id|uid|nonce|token|hash|instance)(?:$|[-_:.])/i,we=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,or=["SIGINT","SIGTERM"],ee=new Set,Z=new Map,Be=null;function ar(e){ee.add(e);let t=false;return ()=>{t||(t=true,ee.delete(e));}}async function lr(){let e=[...ee];e.length!==0&&await Promise.allSettled(e.map(async t=>{ee.delete(t),await $.rm(t,{recursive:true,force:true});}));}function ur(){if(!(Z.size>0))for(let e of or){let t=()=>{Be||(Be=lr().finally(()=>{for(let[r,n]of Z)process.off(r,n);Z.clear(),process.exit(1);}));};Z.set(e,t),process.on(e,t);}}ur();function cr(e,t){let r=t.trim();return r?b.join(b.resolve(r),"crawl-manifest.json"):b.join(b.resolve(e),".crawl-manifest.json")}function Qe(e){return b.normalize(e).split(b.sep).join("/")}function He(e,t){let r=b.relative(b.resolve(e),b.resolve(t));return !r||r.startsWith("..")||b.isAbsolute(r)?null:Qe(r)}async function gr(e,t,r){let n=cr(e.outputDir,t),i;try{i=await $.readFile(n,"utf8");}catch(l){return l.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:l instanceof Error?l.message:String(l),source:"deploy-guard"}),null)}let s;try{s=JSON.parse(i);}catch(l){return r.warn("Deploy rewrite guard disabled because the crawl manifest is invalid JSON.",{manifestPath:n,error:l instanceof Error?l.message:String(l),source:"deploy-guard"}),null}let o=new Map,u=new Map,a=0,c=0;for(let[l,p]of Object.entries(s.pages||{})){let g=String(p?.outputPath||"").trim();if(!g||p?.rewriteComplete===true)continue;let d=He(e.outputDir,g);d&&(a++,o.has(d)||o.set(d,{kind:"page",sourceUrl:l,outputPath:b.resolve(g),relativePath:d}));}for(let[l,p]of Object.entries(s.assets||{})){let g=String(p?.outputPath||"").trim(),d=p?.isText===true,w=g?He(e.outputDir,g):null;if(w){let y=typeof p?.contentType=="string"&&p.contentType?p.contentType:null;y&&u.set(w,y);}!g||!d||p?.rewriteComplete===true||w&&(c++,o.has(w)||o.set(w,{kind:"asset",sourceUrl:l,outputPath:b.resolve(g),relativePath:w}));}return {manifestPath:n,byRelativePath:o,contentTypeByRelativePath:u,pendingPages:a,pendingTextAssets:c}}function pr(e){return e&&(we.test(e)?"__uuid__":/^[0-9a-f]{6,}$/i.test(e)?"__hex__":/^[0-9]{8,}$/.test(e)?"__num__":/^(?=.*[a-z])(?=.*\d)[a-z0-9]{8,}$/i.test(e)?"__alnum__":e)}function de(e){return e.split(/([_:.\-/=?&#]+)/g).map((t,r)=>r%2===1?t:pr(t)).join("")}function dr(e){return e.split(/([_:.\-/=?&#]+)/g).map((t,r)=>r%2===1?t:we.test(t)?"__uuid__":/^[0-9a-f]{6,}$/i.test(t)?"__hex__":/^[0-9]{6,}$/.test(t)?"__num__":/^[a-z0-9_-]{6,}$/i.test(t)?"__id__":t).join("")}function te(e,t){return Array.isArray(e)?e.map(r=>te(r,t)):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([r,n])=>[r,te(n,r)])):typeof e!="string"?e:t&&sr.test(t)?dr(e):we.test(e)?"__uuid__":/^[0-9a-f]{6,}$/i.test(e)||/^[0-9]{8,}$/.test(e)?de(e):e}function fr(e){return e.replace(/((?:https?:\/\/[^"'\s>]+|\/)(?:wp-content|wp-includes)\/[^"'\s>?]+)\?ver=[A-Za-z0-9._-]+(?=$|[#"'])/gi,"$1")}function hr(e,t){let r=t.trim();if((r.startsWith("{")||r.startsWith("[")||r.startsWith('"'))&&e.startsWith("data-"))try{let i=JSON.parse(r);return JSON.stringify(te(i))}catch{}if(e.startsWith("data-")&&/^[A-Za-z0-9+/=]+$/.test(r))try{let i=Buffer.from(r,"base64").toString("utf8"),s=JSON.parse(i),o=JSON.stringify(te(s));return Buffer.from(o,"utf8").toString("base64")}catch{}return t}function mr(e,t){let r=e.toLowerCase();return r==="class"?t.split(/(\s+)/).map((n,i)=>i%2===1?n:de(n)).join(""):r==="id"||r==="for"||r==="aria-controls"||r==="aria-labelledby"||r==="aria-describedby"||r==="aria-owns"||r==="aria-activedescendant"||r==="name"?de(t):r==="href"||r==="src"?fr(t):hr(r,t)}function wr(e){return e.replace(/<([a-z][^\s/>]*)([^<>]*?)>/gi,(t,r,n)=>{if(r.startsWith("/"))return t;let i=n.replace(/\s([:@a-zA-Z_][-:.a-zA-Z0-9_]*?)=(['"])([\s\S]*?)\2/g,(s,o,u,a)=>{let c=mr(o,a);return ` ${o}=${u}${c}${u}`});return `<${r}${i}>`})}function pe(e){let t=b.extname(e).toLowerCase();return [".html",".htm",".xml",".xsl",".txt"].includes(t)||["robots.txt","sitemap.xml"].includes(b.basename(e))}function X(e,t){return [e.replace(/^\/+|\/+$/g,""),t.replace(/^\/+/,"")].filter(Boolean).join("/")}async function yr(e,t,r,n){let i=new Map,s,o=0;do{o++;let u=await E(`S3 list objects page ${o} for s3://${t}/${r||""}`,3e5,({httpOptions:a})=>e.send(new ListObjectsV2Command({Bucket:t,Prefix:r||void 0,ContinuationToken:s}),a));for(let a of u.Contents||[]){if(!a.Key)continue;let c=(a.ETag||"").replace(/^"|"$/g,"").toLowerCase(),l=Number(a.Size??0);i.set(a.Key,{etag:c,size:l});}s=u.NextContinuationToken,n.debug(`Listed S3 keys page ${o}: ${i.size} keys so far`);}while(s);return i}async function br(e,t,r,n){if(n.has(r))return n.get(r)??null;try{let i=await E(`S3 head object ${r}`,3e5,({httpOptions:o})=>e.send(new HeadObjectCommand({Bucket:t,Key:r}),o)),s={etag:(i.ETag||"").replace(/^"|"$/g,"").toLowerCase(),size:Number(i.ContentLength??0)};return n.set(r,s),s}catch{return n.set(r,null),null}}async function Ve(e,t,r,n){let i=[...new Set(Array.from(r).filter(Boolean))];if(i.length===0)return n.info("No stale S3 objects to delete."),[];n.info(`Deleting ${i.length} stale S3 object(s)\u2026`);for(let s=0;s<i.length;s+=1e3){let o=i.slice(s,s+1e3);if(o.length!==0){await E(`S3 delete objects batch ${Math.floor(s/1e3)+1}`,3e5,({httpOptions:u})=>e.send(new DeleteObjectsCommand({Bucket:t,Delete:{Objects:o.map(a=>({Key:a}))}}),u)),n.info(`Deleted batch of ${o.length} object(s).`);for(let u of o)n.debug(` deleted: ${u}`);}}return i}async function Pr(e,t,r,n,i){return Ve(e,t,Array.from(r).filter(s=>!n.has(s)),i)}function Sr(e){return createHash("md5").update(e).digest("hex")}function Je(e){return createHash("sha256").update(e).digest("hex")}function fe(e){return createHash("sha256").update(wr(e.toString("utf8"))).digest("hex")}async function vr(e,t,r,n){if(n.has(r))return n.get(r)??null;try{let o=((await E(`S3 head object metadata ${r}`,3e5,({httpOptions:u})=>e.send(new HeadObjectCommand({Bucket:t,Key:r}),u))).Metadata?.[Ke]||"").trim().toLowerCase()||null;return n.set(r,o),o}catch{return n.set(r,null),null}}async function Rr(e,t,r,n,i){if(n.has(r))return n.get(r)??null;try{let o=((await E(`S3 head object normalized metadata ${r}`,3e5,({httpOptions:u})=>e.send(new HeadObjectCommand({Bucket:t,Key:r}),u))).Metadata?.[Ge]||"").trim().toLowerCase();if(o)return n.set(r,o),o}catch{return n.set(r,null),null}if(i.has(r)){let s=i.get(r)??null;return n.set(r,s),s}try{let o=await(await E(`S3 get object ${r}`,3e5,({httpOptions:a})=>e.send(new GetObjectCommand({Bucket:t,Key:r}),a))).Body?.transformToByteArray(),u=o?fe(Buffer.from(o)):null;return i.set(r,u),n.set(r,u),u}catch{return i.set(r,null),n.set(r,null),null}}function $r(e){return e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")||"profile"}function xr(e,t){let r=e,n=Object.entries(t).sort((i,s)=>s[0].length-i[0].length);for(let[i,s]of n)i&&(r=r.split(i).join(s));return r}async function Dr(e,t,r,n){let i=b.join(e,"asset-map.json"),s;try{s=await $.readFile(i,"utf8");}catch(a){if(a.code==="ENOENT")return;throw a}let o=JSON.parse(s);if(!o||typeof o!="object")return;let u=Object.fromEntries(Object.entries(o).map(([a,c])=>{let l=String(c??"");return t.urlRewriteMode==="absolute"&&t.targetOrigin&&r.targetOrigin&&t.targetOrigin!==r.targetOrigin&&(l=l.split(t.targetOrigin).join(r.targetOrigin)),l=xr(l,n),[a,l]}));await $.writeFile(i,JSON.stringify(u,null,2),"utf8");}async function Tr(e,t,r,n,i){let s=e.targetOrigin!==t.targetOrigin,o=Object.keys(n).length>0;if(!r||!s&&!o)return {outputDir:e.outputDir,cleanup:async()=>{}};if(s&&e.urlRewriteMode!=="absolute")throw new Error(`Deployment profile "${r}" changes targetOrigin, but the base crawl output must use urlRewriteMode "absolute" for multi-target redeploys.`);let u=b.join(b.dirname(e.outputDir),`.deploy-profile-${$r(r)}-${Date.now()}`),a=ar(u);i.info(`Preparing deployment profile "${r}" from existing crawl output to ${u}...`);try{await $.rm(u,{recursive:!0,force:!0}),await $.cp(e.outputDir,u,{recursive:!0});let c={...e,sourceOrigin:e.targetOrigin,targetOrigin:t.targetOrigin,extraReplacements:n,outputDir:u},l=1;i.info(`Rewriting text files for deployment profile "${r}"...`);let p=await qe(c,{},{onStart:({totalFiles:g,workerCount:d})=>{l=d,i.info(`Rewriting ${g} text file(s) for deployment profile "${r}" with ${d} worker(s).`);},onProgress:({index:g,totalFiles:d,changedTextFiles:w,file:y,changed:P})=>{let R=`Rewriting [${g}/${d}] ${y} (${P?"rewrote":"checked"}; ${w} changed so far)`;d<=200||g<=5||g%10===0||g===d?(i.progress(R,{file:y,index:g,totalFiles:d,changed:P,changedTextFiles:w,workerCount:l}),i.info(R)):i.debug(R);}});return await Dr(u,e,t,n),i.info(`Prepared deployment profile "${r}" in ${u} (${p} rewritten text file(s)).`),{outputDir:u,cleanup:async()=>{a(),await $.rm(u,{recursive:!0,force:!0});}}}catch(c){throw i.error(`Failed to prepare deployment profile "${r}" temporary output.`,{tempDir:u,outputDir:e.outputDir,error:c instanceof Error?c.message:String(c),...c instanceof Error&&c.stack?{stack:c.stack}:{}}),await $.rm(u,{recursive:true,force:true}).catch(()=>{}),a(),await i.flush().catch(()=>{}),c}}async function Cr(){let e=await le(),t=Ee(process.argv.slice(2)),r=Me(e,t),n=b.resolve(r.config.logDir||"logs"),i=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",s=i?b.join(b.resolve(i),"deploy-diff.json"):"",o=new B(n,"deploy.log.jsonl",r.config.logLevel??"info"),u=r.profile?.extraReplacements??{},a=async()=>{};try{let c=await Tr(e,r.config,r.name,u,o);a=c.cleanup;let l={...r.config,outputDir:c.outputDir},p=l.s3SyncMode??"sdk-upload-delete",g=await Te(e),d=c.outputDir!==e.outputDir&&(e.targetOrigin!==r.config.targetOrigin||Object.keys(u).length>0),w=!!g&&!g.fullSyncRequired&&!d;r.name&&o.info(`Using deployment profile: ${r.name}`),o.info(`Starting deploy \u2014 s3://${l.s3.bucket}/${l.s3.prefix||""} (region: ${l.s3.region})`),o.info(`S3 sync mode: ${p}`),g&&g.fullSyncRequired?o.info("Deploy plan requests a full sync; scanning the whole output tree."):g&&d?o.info("Ignoring incremental deploy plan because deployment-profile rewrites require a full sync."):w&&o.info(`Using incremental deploy plan: ${g.changedFiles.length} changed file(s), ${g.deletedFiles.length} deleted file(s).`),o.mark("deploy");let y=new S3Client({region:l.s3.region}),P=c.outputDir===e.outputDir?await gr(e,i,o):null,O=w?(await Promise.all(g.changedFiles.map(async m=>{try{return (await $.stat(b.join(l.outputDir,m))).isFile()?m:null}catch{return null}}))).filter(m=>m!==null):await Lt(["**/*"],{cwd:l.outputDir,onlyFiles:!0,dot:!0}),R=[],J=[],h=O.filter(m=>{let L=P?.byRelativePath.get(Qe(m));if(!L)return !0;let f=X(l.s3.prefix,m);return R.push(m),J.push(f),o.reject(L.kind,L.sourceUrl||m,"rewrite not completed; deploy upload blocked","deploy-guard",{file:m,key:f,outputPath:L.outputPath,manifestPath:P?.manifestPath}),!1}),Ye=w?new Set:new Set(O.map(m=>X(l.s3.prefix,m)));P&&(P.pendingPages>0||P.pendingTextAssets>0)&&o.info(`Deploy rewrite guard loaded ${P.pendingPages} pending page(s) and ${P.pendingTextAssets} pending text asset(s) from crawl manifest.`,{manifestPath:P.manifestPath,pendingPages:P.pendingPages,pendingTextAssets:P.pendingTextAssets,source:"deploy-guard"}),R.length>0&&o.warn(`Deploy rewrite guard blocked ${R.length} file(s) from upload because final crawl rewrite is incomplete.`,{rejected:R.length,manifestPath:P?.manifestPath,source:"deploy-guard"}),w?o.info(`Using ${h.length} eligible planned changed file(s) from deploy plan for upload${R.length>0?` (${R.length} blocked by deploy rewrite guard)`:""}.`):o.info(`Found ${O.length} file(s) in output directory "${l.outputDir}"${R.length>0?`; ${h.length} remain eligible for upload after deploy rewrite guard filtering`:""}.`),o.progress("Deploy preflight: comparing local output with remote S3 state.",{phase:"deploy",mode:p,totalFiles:h.length,scannedFiles:O.length,rejected:R.length,deploymentProfile:r.name||"",s3Bucket:l.s3.bucket,s3Prefix:l.s3.prefix||"",targetedPlan:w,deployGuardEnabled:c.outputDir===e.outputDir});let x=0,v=0,k=0,re=[],U=[],ne=[],K=[],N=new Map,Ze=new Map,Xe=new Map,et=new Map,tt=new Map;w||(o.info("Listing existing S3 objects to detect unchanged files..."),N=await yr(y,l.s3.bucket,l.s3.prefix,o),o.info(`Found ${N.size} existing key(s) in S3.`));let rt=async m=>N.has(m)?N.get(m)??null:w?br(y,l.s3.bucket,m,Ze):null;for(let m of h){let L=b.join(l.outputDir,m),f=X(l.s3.prefix,m),W=ir.lookup(m)||P?.contentTypeByRelativePath.get(m)||"application/octet-stream",nt=pe(m)?l.s3.htmlCacheControl:l.s3.assetCacheControl,S=x+v+k+1;h.length<=200||S<=5||S%10===0||S===h.length?(o.progress(`Uploading [${S}/${h.length}] ${f} (${W})`,{file:m,key:f,index:S,totalFiles:h.length,contentType:W,mode:p}),o.info(`Uploading [${S}/${h.length}] ${f} (${W})`)):o.debug(`Uploading [${S}/${h.length}] ${f} (${W})`);try{let D=await $.readFile(L),z=await rt(f),q=null,j=null;if(z){let ie=D.byteLength;if(z.size===ie){let G=z.etag.includes("-");if(z.etag!==""&&!G){let it=Sr(D);if(z.etag===it){v++,h.length<=200||v<=5||v%25===0?(o.progress(`Skipped unchanged [${S}/${h.length}] ${f}`,{file:m,key:f,index:S,totalFiles:h.length,uploaded:x,skipped:v,failed:k,mode:p,reason:"etag-md5-match"}),o.info(`Skipped unchanged [${S}/${h.length}] ${f}`)):o.debug(`Skipped unchanged [${S}/${h.length}] ${f}`),U.push(f);continue}}q=Je(D);let ye=await vr(y,l.s3.bucket,f,Xe);if(ye&&ye===q){v++,h.length<=200||v<=5||v%25===0?(o.progress(`Skipped unchanged [${S}/${h.length}] ${f}`,{file:m,key:f,index:S,totalFiles:h.length,uploaded:x,skipped:v,failed:k,mode:p,reason:"metadata-sha256-match"}),o.info(`Skipped unchanged [${S}/${h.length}] ${f}`)):o.debug(`Skipped unchanged [${S}/${h.length}] ${f}`),U.push(f);continue}}if(pe(m)){j=fe(D);let G=await Rr(y,l.s3.bucket,f,et,tt);if(G&&G===j){v++,h.length<=200||v<=5||v%25===0?(o.progress(`Skipped semantically unchanged [${S}/${h.length}] ${f}`,{file:m,key:f,index:S,totalFiles:h.length,uploaded:x,skipped:v,failed:k,mode:p,reason:"normalized-html-match"}),o.info(`Skipped semantically unchanged [${S}/${h.length}] ${f}`)):o.debug(`Skipped semantically unchanged [${S}/${h.length}] ${f}`),U.push(f);continue}}}q=q??Je(D),j=j??(pe(m)?fe(D):null),await E(`S3 upload ${f}`,9e5,({abortController:ie})=>new Upload({client:y,abortController:ie,params:{Bucket:l.s3.bucket,Key:f,Body:D,ContentType:W,CacheControl:nt,Metadata:{[Ke]:q,...j?{[Ge]:j}:{}}}}).done()),x++,re.push(f),(x%25===0||x===h.length)&&(o.progress(`Uploaded ${x}/${h.length} file(s)\u2026`,{uploaded:x,skipped:v,failed:k,totalFiles:h.length,mode:p}),o.info(`Uploaded ${x}/${h.length} file(s)\u2026`));}catch(D){k++,ne.push(f),o.error(`Failed to upload ${f}: ${D.message}`,{key:f,error:String(D)});}}o.info(`Upload complete: ${x} uploaded, ${v} skipped unchanged, ${J.length} rejected by guard, ${k} failed.`),p==="sdk-upload-delete"?w?K=await Ve(y,l.s3.bucket,g.deletedFiles.map(m=>X(l.s3.prefix,m)),o):K=await Pr(y,l.s3.bucket,N.keys(),Ye,o):o.info("Sync mode is sdk-upload-only \u2014 skipping stale object deletion."),s&&(await $.mkdir(b.dirname(s),{recursive:!0}),await $.writeFile(s,JSON.stringify({generatedAt:new Date().toISOString(),mode:p,summary:{totalFiles:O.length,eligibleFiles:h.length,uploaded:re.length,skipped:U.length,rejected:J.length,failed:ne.length,deleted:K.length,...r.name?{profile:r.name}:{}},uploadedKeys:re,skippedKeys:U,rejectedKeys:J,failedKeys:ne,deletedKeys:K},null,2),"utf8")),await Ce(e),o.endMark("deploy"),await o.flush();}finally{await a().catch(()=>{});}}Cr().catch(async e=>{console.error(e);try{let r=(await le().catch(()=>null))?.logDir??"logs",n=new B(r,"deploy.log.jsonl","debug");n.error(`Unhandled error: ${e instanceof Error?e.message:String(e)}`,e instanceof Error?{stack:e.stack}:void 0),await n.flush();}catch{}process.exit(1);});
6
+ `;return e.replace(/<head\b[^>]*>/i,i=>`${i}${n} ${t}`)}function Bt(e){let t=Ue(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function Ht(e,t){let r=[...new Set(t)].filter(s=>s.includes("/")&&!/\\+\//.test(s)).map(s=>[s,Y(s)]).filter(([s,o])=>s!==o).sort((s,o)=>o[0].length-s[0].length);if(!r.length)return e;let n=s=>{let o=s;for(let[u,a]of r)o=o.split(u).join(a);return o},i=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(s,o,u,a)=>`${o}${n(u)}${a}`);return i=i.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(s,o,u,a,c)=>Bt(a)?`${o}${n(a)}${c}`:s),i}function Jt(e,t){if(!t)return null;let r=b.dirname(b.resolve(t)),n=b.resolve(e.outputDir),i=b.relative(r,n).replace(/\\/g,"/");return i?(i.startsWith(".")||(i=`./${i}`),i.endsWith("/")?i:`${i}/`):"./"}function Kt(e,t,r){let n=Jt(t,r);if(!n)return e;let i=e;for(let s of Ft){let o=s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),u=new RegExp(`(?:\\.{1,}/)+${o}`,"g"),a=new RegExp(`(?<!\\.)/${o}`,"g");i=i.replace(u,`${n}${s}`).replace(a,`${n}${s}`);let c=s.replace(/\//g,"\\/"),l=n.replace(/\//g,"\\/"),p=c.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),g=new RegExp(`(?:\\.{1,}\\\\/)+${p}`,"g"),d=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${p}`,"g"),w=new RegExp(`(?<![\\.\\\\])\\/${p}`,"g");i=i.replace(g,`${l}${c}`).replace(d,`${l}${c}`).replace(w,`${l}${c}`);}return i}function pe(e,t,r){if(e.urlRewriteMode==="absolute")return t;let n=(()=>{try{return new URL(t,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin)}catch{return null}})(),i=n?n.pathname:Ne(t,e.targetOrigin),s=n?`${n.search}${n.hash}`:"";return e.urlRewriteMode==="root-relative"?`${i}${s}`:`${We(e.outputDir,r,i)}${s}`}function ge(e,t,r,n,i){Z(e,r,pe(t,n,i));}function Gt(e,t,r,n,i){if(!r||r===n)return;Z(e,r,n);let s=pe(t,r,i),o=pe(t,n,i);Z(e,s,o);}function Qt(e,t,r,n,i={}){let s=e,o={};ge(o,t,t.sourceOrigin,t.targetOrigin,n);for(let[a,c]of Object.entries(t.extraReplacements))ge(o,t,a,c,n);for(let[a,c]of Object.entries(r))ge(o,t,a,c,n);for(let[a,c]of Object.entries(i)){let l=r[a];!l||l===c||Gt(o,t,c,l,n);}let u=Object.entries(o).sort((a,c)=>c[0].length-a[0].length);for(let[a,c]of u)s=Wt(s,a,c);return t.urlRewriteMode!=="absolute"&&(s=Kt(s,t,n)),s=Ht(s,u.map(([,a])=>a)),zt(t,s,n)&&(s=qt(s)),s}async function Vt(e,t,r,n){let i=b.join(e.outputDir,n),s=b.extname(i).toLowerCase(),o;try{o=await $.readFile(i,"utf8");}catch(c){if(c.code!=="ENOENT")throw c;return {changed:false}}let a=Qt(o,e,t,s===".js"||s===".mjs"?void 0:i,r);return a!==o?(await $.writeFile(i,a,"utf8"),{changed:true}):{changed:false}}async function Yt(e,t){return await new Promise((r,n)=>{let i=a=>{if(u(),a?.error){n(new Error(a.error));return}r({changed:!!a?.changed});},s=a=>{u(),n(a);},o=a=>{u(),a!==0&&n(new Error(`Rewrite worker exited with code ${a}.`));},u=()=>{e.off("message",i),e.off("error",s),e.off("exit",o);};e.on("message",i),e.on("error",s),e.on("exit",o),e.postMessage({file:t});})}async function Be(e,t,r={}){let i=(r.files?[...new Set(r.files)].map(g=>b.resolve(g)).filter(g=>g.startsWith(b.resolve(e.outputDir))).map(g=>b.relative(e.outputDir,g).replace(/\\/g,"/")).filter(g=>g.length>0):await It(["**/*"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(g=>g!=="asset-map.json"&&_e(g)),s=0;if(i.length===0)return 0;let o=Math.max(1,Number(e.rewriteConcurrency||e.assetDownloadConcurrency||1)),u=Math.max(1,Math.min(o,i.length,availableParallelism()));await r.onStart?.({totalFiles:i.length,workerCount:u});let a=0,c=0,l=null;if(u===1){for(let g of i){let d=await Vt(e,t,r.previousAssetMap??{},g);d.changed&&(s+=1),c+=1,await r.onProgress?.({index:c,totalFiles:i.length,changedTextFiles:s,file:g,changed:d.changed});}return s}let p=Array.from({length:u},async()=>{let g=new Worker(new URL("./rewrite-worker.js",import.meta.url),{workerData:{config:e,assetMap:t,previousAssetMap:r.previousAssetMap??{}}});try{for(;!l;){let d=a;if(d>=i.length)return;a+=1;let w=i[d],y=await Yt(g,w);y.changed&&(s+=1),c+=1,await r.onProgress?.({index:c,totalFiles:i.length,changedTextFiles:s,file:w,changed:y.changed});}}catch(d){throw l=d instanceof Error?d:new Error(String(d)),l}finally{await g.terminate().catch(()=>{});}});return await Promise.all(p),s}var Ge="wpsuite-sha256",Qe="wpsuite-normalized-sha256",or=/(?:^|[-_:.])(id|uid|nonce|token|hash|instance)(?:$|[-_:.])/i,ye=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,ar=["SIGINT","SIGTERM"],te=new Set,X=new Map,He=null;function lr(e){te.add(e);let t=false;return ()=>{t||(t=true,te.delete(e));}}async function ur(){let e=[...te];e.length!==0&&await Promise.allSettled(e.map(async t=>{te.delete(t),await $.rm(t,{recursive:true,force:true});}));}function cr(){if(!(X.size>0))for(let e of ar){let t=()=>{He||(He=ur().finally(()=>{for(let[r,n]of X)process.off(r,n);X.clear(),process.exit(1);}));};X.set(e,t),process.on(e,t);}}cr();function gr(e,t){let r=t.trim();return r?b.join(b.resolve(r),"crawl-manifest.json"):b.join(b.resolve(e),".crawl-manifest.json")}function Ve(e){return b.normalize(e).split(b.sep).join("/")}function Je(e,t){let r=b.relative(b.resolve(e),b.resolve(t));return !r||r.startsWith("..")||b.isAbsolute(r)?null:Ve(r)}async function pr(e,t,r){let n=gr(e.outputDir,t),i;try{i=await $.readFile(n,"utf8");}catch(l){return l.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:l instanceof Error?l.message:String(l),source:"deploy-guard"}),null)}let s;try{s=JSON.parse(i);}catch(l){return r.warn("Deploy rewrite guard disabled because the crawl manifest is invalid JSON.",{manifestPath:n,error:l instanceof Error?l.message:String(l),source:"deploy-guard"}),null}let o=new Map,u=new Map,a=0,c=0;for(let[l,p]of Object.entries(s.pages||{})){let g=String(p?.outputPath||"").trim();if(!g||p?.rewriteComplete===true)continue;let d=Je(e.outputDir,g);d&&(a++,o.has(d)||o.set(d,{kind:"page",sourceUrl:l,outputPath:b.resolve(g),relativePath:d}));}for(let[l,p]of Object.entries(s.assets||{})){let g=String(p?.outputPath||"").trim(),d=p?.isText===true,w=g?Je(e.outputDir,g):null;if(w){let y=typeof p?.contentType=="string"&&p.contentType?p.contentType:null;y&&u.set(w,y);}!g||!d||p?.rewriteComplete===true||w&&(c++,o.has(w)||o.set(w,{kind:"asset",sourceUrl:l,outputPath:b.resolve(g),relativePath:w}));}return {manifestPath:n,byRelativePath:o,contentTypeByRelativePath:u,pendingPages:a,pendingTextAssets:c}}function dr(e){return e&&(ye.test(e)?"__uuid__":/^[0-9a-f]{6,}$/i.test(e)?"__hex__":/^[0-9]{8,}$/.test(e)?"__num__":/^(?=.*[a-z])(?=.*\d)[a-z0-9]{8,}$/i.test(e)?"__alnum__":e)}function fe(e){return e.split(/([_:.\-/=?&#]+)/g).map((t,r)=>r%2===1?t:dr(t)).join("")}function fr(e){return e.split(/([_:.\-/=?&#]+)/g).map((t,r)=>r%2===1?t:ye.test(t)?"__uuid__":/^[0-9a-f]{6,}$/i.test(t)?"__hex__":/^[0-9]{6,}$/.test(t)?"__num__":/^[a-z0-9_-]{6,}$/i.test(t)?"__id__":t).join("")}function re(e,t){return Array.isArray(e)?e.map(r=>re(r,t)):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([r,n])=>[r,re(n,r)])):typeof e!="string"?e:t&&or.test(t)?fr(e):ye.test(e)?"__uuid__":/^[0-9a-f]{6,}$/i.test(e)||/^[0-9]{8,}$/.test(e)?fe(e):e}function hr(e){return e.replace(/((?:https?:\/\/[^"'\s>]+|\/)(?:wp-content|wp-includes)\/[^"'\s>?]+)\?ver=[A-Za-z0-9._-]+(?=$|[#"'])/gi,"$1")}function mr(e,t){let r=t.trim();if((r.startsWith("{")||r.startsWith("[")||r.startsWith('"'))&&e.startsWith("data-"))try{let i=JSON.parse(r);return JSON.stringify(re(i))}catch{}if(e.startsWith("data-")&&/^[A-Za-z0-9+/=]+$/.test(r))try{let i=Buffer.from(r,"base64").toString("utf8"),s=JSON.parse(i),o=JSON.stringify(re(s));return Buffer.from(o,"utf8").toString("base64")}catch{}return t}function wr(e,t){let r=e.toLowerCase();return r==="class"?t.split(/(\s+)/).map((n,i)=>i%2===1?n:fe(n)).join(""):r==="id"||r==="for"||r==="aria-controls"||r==="aria-labelledby"||r==="aria-describedby"||r==="aria-owns"||r==="aria-activedescendant"||r==="name"?fe(t):r==="href"||r==="src"?hr(t):mr(r,t)}function yr(e){return e.replace(/<([a-z][^\s/>]*)([^<>]*?)>/gi,(t,r,n)=>{if(r.startsWith("/"))return t;let i=n.replace(/\s([:@a-zA-Z_][-:.a-zA-Z0-9_]*?)=(['"])([\s\S]*?)\2/g,(s,o,u,a)=>{let c=wr(o,a);return ` ${o}=${u}${c}${u}`});return `<${r}${i}>`})}function de(e){let t=b.extname(e).toLowerCase();return [".html",".htm",".xml",".xsl",".txt"].includes(t)||["robots.txt","sitemap.xml"].includes(b.basename(e))}function ee(e,t){return [e.replace(/^\/+|\/+$/g,""),t.replace(/^\/+/,"")].filter(Boolean).join("/")}async function br(e,t,r,n){let i=new Map,s,o=0;do{o++;let u=await E(`S3 list objects page ${o} for s3://${t}/${r||""}`,3e5,({httpOptions:a})=>e.send(new ListObjectsV2Command({Bucket:t,Prefix:r||void 0,ContinuationToken:s}),a));for(let a of u.Contents||[]){if(!a.Key)continue;let c=(a.ETag||"").replace(/^"|"$/g,"").toLowerCase(),l=Number(a.Size??0);i.set(a.Key,{etag:c,size:l});}s=u.NextContinuationToken,n.debug(`Listed S3 keys page ${o}: ${i.size} keys so far`);}while(s);return i}async function Pr(e,t,r,n){if(n.has(r))return n.get(r)??null;try{let i=await E(`S3 head object ${r}`,3e5,({httpOptions:o})=>e.send(new HeadObjectCommand({Bucket:t,Key:r}),o)),s={etag:(i.ETag||"").replace(/^"|"$/g,"").toLowerCase(),size:Number(i.ContentLength??0)};return n.set(r,s),s}catch{return n.set(r,null),null}}async function Ye(e,t,r,n){let i=[...new Set(Array.from(r).filter(Boolean))];if(i.length===0)return n.info("No stale S3 objects to delete."),[];n.info(`Deleting ${i.length} stale S3 object(s)\u2026`);for(let s=0;s<i.length;s+=1e3){let o=i.slice(s,s+1e3);if(o.length!==0){await E(`S3 delete objects batch ${Math.floor(s/1e3)+1}`,3e5,({httpOptions:u})=>e.send(new DeleteObjectsCommand({Bucket:t,Delete:{Objects:o.map(a=>({Key:a}))}}),u)),n.info(`Deleted batch of ${o.length} object(s).`);for(let u of o)n.debug(` deleted: ${u}`);}}return i}async function Sr(e,t,r,n,i){return Ye(e,t,Array.from(r).filter(s=>!n.has(s)),i)}function vr(e){return createHash("md5").update(e).digest("hex")}function Ke(e){return createHash("sha256").update(e).digest("hex")}function he(e){return createHash("sha256").update(yr(e.toString("utf8"))).digest("hex")}async function Rr(e,t,r,n){if(n.has(r))return n.get(r)??null;try{let o=((await E(`S3 head object metadata ${r}`,3e5,({httpOptions:u})=>e.send(new HeadObjectCommand({Bucket:t,Key:r}),u))).Metadata?.[Ge]||"").trim().toLowerCase()||null;return n.set(r,o),o}catch{return n.set(r,null),null}}async function $r(e,t,r,n,i){if(n.has(r))return n.get(r)??null;try{let o=((await E(`S3 head object normalized metadata ${r}`,3e5,({httpOptions:u})=>e.send(new HeadObjectCommand({Bucket:t,Key:r}),u))).Metadata?.[Qe]||"").trim().toLowerCase();if(o)return n.set(r,o),o}catch{return n.set(r,null),null}if(i.has(r)){let s=i.get(r)??null;return n.set(r,s),s}try{let o=await(await E(`S3 get object ${r}`,3e5,({httpOptions:a})=>e.send(new GetObjectCommand({Bucket:t,Key:r}),a))).Body?.transformToByteArray(),u=o?he(Buffer.from(o)):null;return i.set(r,u),n.set(r,u),u}catch{return i.set(r,null),n.set(r,null),null}}function xr(e){return e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")||"profile"}function Dr(e,t){let r=e,n=Object.entries(t).sort((i,s)=>s[0].length-i[0].length);for(let[i,s]of n)i&&(r=r.split(i).join(s));return r}async function Tr(e,t,r,n){let i=b.join(e,"asset-map.json"),s;try{s=await $.readFile(i,"utf8");}catch(a){if(a.code==="ENOENT")return;throw a}let o=JSON.parse(s);if(!o||typeof o!="object")return;let u=Object.fromEntries(Object.entries(o).map(([a,c])=>{let l=String(c??"");return t.urlRewriteMode==="absolute"&&t.targetOrigin&&r.targetOrigin&&t.targetOrigin!==r.targetOrigin&&(l=l.split(t.targetOrigin).join(r.targetOrigin)),l=Dr(l,n),[a,l]}));await $.writeFile(i,JSON.stringify(u,null,2),"utf8");}async function Cr(e,t,r,n,i){let s=e.targetOrigin!==t.targetOrigin,o=Object.keys(n).length>0;if(!r||!s&&!o)return {outputDir:e.outputDir,cleanup:async()=>{}};if(s&&e.urlRewriteMode!=="absolute")throw new Error(`Deployment profile "${r}" changes targetOrigin, but the base crawl output must use urlRewriteMode "absolute" for multi-target redeploys.`);let u=b.join(b.dirname(e.outputDir),`.deploy-profile-${xr(r)}-${Date.now()}`),a=lr(u);i.info(`Preparing deployment profile "${r}" from existing crawl output to ${u}...`);try{await $.rm(u,{recursive:!0,force:!0}),await $.cp(e.outputDir,u,{recursive:!0});let c={...e,sourceOrigin:e.targetOrigin,targetOrigin:t.targetOrigin,extraReplacements:n,outputDir:u},l=1;i.info(`Rewriting text files for deployment profile "${r}"...`);let p=await Be(c,{},{onStart:({totalFiles:g,workerCount:d})=>{l=d,i.info(`Rewriting ${g} text file(s) for deployment profile "${r}" with ${d} worker(s).`);},onProgress:({index:g,totalFiles:d,changedTextFiles:w,file:y,changed:P})=>{let R=`Rewriting [${g}/${d}] ${y} (${P?"rewrote":"checked"}; ${w} changed so far)`;d<=200||g<=5||g%10===0||g===d?(i.progress(R,{file:y,index:g,totalFiles:d,changed:P,changedTextFiles:w,workerCount:l}),i.info(R)):i.debug(R);}});return await Tr(u,e,t,n),i.info(`Prepared deployment profile "${r}" in ${u} (${p} rewritten text file(s)).`),{outputDir:u,cleanup:async()=>{a(),await $.rm(u,{recursive:!0,force:!0});}}}catch(c){throw i.error(`Failed to prepare deployment profile "${r}" temporary output.`,{tempDir:u,outputDir:e.outputDir,error:c instanceof Error?c.message:String(c),...c instanceof Error&&c.stack?{stack:c.stack}:{}}),await $.rm(u,{recursive:true,force:true}).catch(()=>{}),a(),await i.flush().catch(()=>{}),c}}async function Er(){let e=await ue(),t=Me(process.argv.slice(2)),r=ke(e,t),n=b.resolve(r.config.logDir||"logs"),i=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",s=i?b.join(b.resolve(i),"deploy-diff.json"):"",o=new B(n,"deploy.log.jsonl",r.config.logLevel??"info"),u=r.profile?.extraReplacements??{},a=async()=>{};try{let c=await Cr(e,r.config,r.name,u,o);a=c.cleanup;let l={...r.config,outputDir:c.outputDir},p=l.s3SyncMode??"sdk-upload-delete",g=await Ce(e),d=c.outputDir!==e.outputDir&&(e.targetOrigin!==r.config.targetOrigin||Object.keys(u).length>0),w=!!g&&!g.fullSyncRequired&&!d;r.name&&o.info(`Using deployment profile: ${r.name}`),o.info(`Starting deploy \u2014 s3://${l.s3.bucket}/${l.s3.prefix||""} (region: ${l.s3.region})`),o.info(`S3 sync mode: ${p}`),g&&g.fullSyncRequired?o.info("Deploy plan requests a full sync; scanning the whole output tree."):g&&d?o.info("Ignoring incremental deploy plan because deployment-profile rewrites require a full sync."):w&&o.info(`Using incremental deploy plan: ${g.changedFiles.length} changed file(s), ${g.deletedFiles.length} deleted file(s).`),o.mark("deploy");let y=new S3Client({region:l.s3.region}),P=c.outputDir===e.outputDir?await pr(e,i,o):null,O=w?(await Promise.all(g.changedFiles.map(async m=>{try{return (await $.stat(b.join(l.outputDir,m))).isFile()?m:null}catch{return null}}))).filter(m=>m!==null):await It(["**/*"],{cwd:l.outputDir,onlyFiles:!0,dot:!0}),R=[],J=[],h=O.filter(m=>{let L=P?.byRelativePath.get(Ve(m));if(!L)return !0;let f=ee(l.s3.prefix,m);return R.push(m),J.push(f),o.reject(L.kind,L.sourceUrl||m,"rewrite not completed; deploy upload blocked","deploy-guard",{file:m,key:f,outputPath:L.outputPath,manifestPath:P?.manifestPath}),!1}),Ze=w?new Set:new Set(O.map(m=>ee(l.s3.prefix,m)));P&&(P.pendingPages>0||P.pendingTextAssets>0)&&o.info(`Deploy rewrite guard loaded ${P.pendingPages} pending page(s) and ${P.pendingTextAssets} pending text asset(s) from crawl manifest.`,{manifestPath:P.manifestPath,pendingPages:P.pendingPages,pendingTextAssets:P.pendingTextAssets,source:"deploy-guard"}),R.length>0&&o.warn(`Deploy rewrite guard blocked ${R.length} file(s) from upload because final crawl rewrite is incomplete.`,{rejected:R.length,manifestPath:P?.manifestPath,source:"deploy-guard"}),w?o.info(`Using ${h.length} eligible planned changed file(s) from deploy plan for upload${R.length>0?` (${R.length} blocked by deploy rewrite guard)`:""}.`):o.info(`Found ${O.length} file(s) in output directory "${l.outputDir}"${R.length>0?`; ${h.length} remain eligible for upload after deploy rewrite guard filtering`:""}.`),o.progress("Deploy preflight: comparing local output with remote S3 state.",{phase:"deploy",mode:p,totalFiles:h.length,scannedFiles:O.length,rejected:R.length,deploymentProfile:r.name||"",s3Bucket:l.s3.bucket,s3Prefix:l.s3.prefix||"",targetedPlan:w,deployGuardEnabled:c.outputDir===e.outputDir});let x=0,v=0,k=0,ne=[],U=[],ie=[],K=[],N=new Map,Xe=new Map,et=new Map,tt=new Map,rt=new Map;w||(o.info("Listing existing S3 objects to detect unchanged files..."),N=await br(y,l.s3.bucket,l.s3.prefix,o),o.info(`Found ${N.size} existing key(s) in S3.`));let nt=async m=>N.has(m)?N.get(m)??null:w?Pr(y,l.s3.bucket,m,Xe):null;for(let m of h){let L=b.join(l.outputDir,m),f=ee(l.s3.prefix,m),G=P?.contentTypeByRelativePath.get(m),W=G&&G!=="application/octet-stream"?G:sr.lookup(m)||G||"application/octet-stream",it=de(m)?l.s3.htmlCacheControl:l.s3.assetCacheControl,S=x+v+k+1;h.length<=200||S<=5||S%10===0||S===h.length?(o.progress(`Uploading [${S}/${h.length}] ${f} (${W})`,{file:m,key:f,index:S,totalFiles:h.length,contentType:W,mode:p}),o.info(`Uploading [${S}/${h.length}] ${f} (${W})`)):o.debug(`Uploading [${S}/${h.length}] ${f} (${W})`);try{let D=await $.readFile(L),z=await nt(f),q=null,j=null;if(z){let se=D.byteLength;if(z.size===se){let Q=z.etag.includes("-");if(z.etag!==""&&!Q){let st=vr(D);if(z.etag===st){v++,h.length<=200||v<=5||v%25===0?(o.progress(`Skipped unchanged [${S}/${h.length}] ${f}`,{file:m,key:f,index:S,totalFiles:h.length,uploaded:x,skipped:v,failed:k,mode:p,reason:"etag-md5-match"}),o.info(`Skipped unchanged [${S}/${h.length}] ${f}`)):o.debug(`Skipped unchanged [${S}/${h.length}] ${f}`),U.push(f);continue}}q=Ke(D);let be=await Rr(y,l.s3.bucket,f,et);if(be&&be===q){v++,h.length<=200||v<=5||v%25===0?(o.progress(`Skipped unchanged [${S}/${h.length}] ${f}`,{file:m,key:f,index:S,totalFiles:h.length,uploaded:x,skipped:v,failed:k,mode:p,reason:"metadata-sha256-match"}),o.info(`Skipped unchanged [${S}/${h.length}] ${f}`)):o.debug(`Skipped unchanged [${S}/${h.length}] ${f}`),U.push(f);continue}}if(de(m)){j=he(D);let Q=await $r(y,l.s3.bucket,f,tt,rt);if(Q&&Q===j){v++,h.length<=200||v<=5||v%25===0?(o.progress(`Skipped semantically unchanged [${S}/${h.length}] ${f}`,{file:m,key:f,index:S,totalFiles:h.length,uploaded:x,skipped:v,failed:k,mode:p,reason:"normalized-html-match"}),o.info(`Skipped semantically unchanged [${S}/${h.length}] ${f}`)):o.debug(`Skipped semantically unchanged [${S}/${h.length}] ${f}`),U.push(f);continue}}}q=q??Ke(D),j=j??(de(m)?he(D):null),await E(`S3 upload ${f}`,9e5,({abortController:se})=>new Upload({client:y,abortController:se,params:{Bucket:l.s3.bucket,Key:f,Body:D,ContentType:W,CacheControl:it,Metadata:{[Ge]:q,...j?{[Qe]:j}:{}}}}).done()),x++,ne.push(f),(x%25===0||x===h.length)&&(o.progress(`Uploaded ${x}/${h.length} file(s)\u2026`,{uploaded:x,skipped:v,failed:k,totalFiles:h.length,mode:p}),o.info(`Uploaded ${x}/${h.length} file(s)\u2026`));}catch(D){k++,ie.push(f),o.error(`Failed to upload ${f}: ${D.message}`,{key:f,error:String(D)});}}o.info(`Upload complete: ${x} uploaded, ${v} skipped unchanged, ${J.length} rejected by guard, ${k} failed.`),p==="sdk-upload-delete"?w?K=await Ye(y,l.s3.bucket,g.deletedFiles.map(m=>ee(l.s3.prefix,m)),o):K=await Sr(y,l.s3.bucket,N.keys(),Ze,o):o.info("Sync mode is sdk-upload-only \u2014 skipping stale object deletion."),s&&(await $.mkdir(b.dirname(s),{recursive:!0}),await $.writeFile(s,JSON.stringify({generatedAt:new Date().toISOString(),mode:p,summary:{totalFiles:O.length,eligibleFiles:h.length,uploaded:ne.length,skipped:U.length,rejected:J.length,failed:ie.length,deleted:K.length,...r.name?{profile:r.name}:{}},uploadedKeys:ne,skippedKeys:U,rejectedKeys:J,failedKeys:ie,deletedKeys:K},null,2),"utf8")),await Ee(e),o.endMark("deploy"),await o.flush();}finally{await a().catch(()=>{});}}Er().catch(async e=>{console.error(e);try{let r=(await ue().catch(()=>null))?.logDir??"logs",n=new B(r,"deploy.log.jsonl","debug");n.error(`Unhandled error: ${e instanceof Error?e.message:String(e)}`,e instanceof Error?{stack:e.stack}:void 0),await n.flush();}catch{}process.exit(1);});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smart-cloud/publisher-exporter",
3
- "version": "1.1.26",
3
+ "version": "1.1.27",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "description": "Headless Playwright static publisher for WordPress/Elementor sites with sitemap-only page discovery, strict asset capture, escaped URL rewrite, structured logs, and targeted retry modes.",