PageSourceSearch

https://www.airgradient.com/_nuxt/B1EtgUNK.js

js airgradient.com collected 2026-09-24 09:05:20 UTC 19,548 bytes, 1 lines download raw bytes

1import{_ as Ue}from"./D9MvgeHQ.js";import{K as Le,al as Te,e as h,r as S,g as Ne,c as o,d as a,t as l,b as z,h as b,i as K,v as E,E as _,a3 as $,F as T,m as O,b5 as W,Y as ie,b4 as Pe,B as Fe,z as ze,o as r,aL as Ee,b2 as Oe,af as We}from"./hpNDvw06.js";const je={class:"container-fluid blog-cms-admin"},Ve={class:"row mb-3"},qe={class:"col-12 d-flex justify-content-between align-items-center flex-wrap gap-2"},Ge={class:"mb-0"},He={class:"d-flex gap-2"},Ye={key:0,class:"alert alert-secondary"},Xe={key:1,class:"alert alert-danger"},Je={key:2,class:"alert alert-warning"},Qe={key:3},Ze={class:"card mb-3"},et={class:"card-body d-flex flex-wrap align-items-center gap-2"},tt={class:"btn-group btn-group-sm",role:"group","aria-label":"Migration mode"},st=["disabled"],at=["disabled"],nt=["disabled"],lt=["disabled"],rt=["disabled"],ot={class:"ms-auto text-muted small"},ut={key:0,class:"card-body pt-0"},it={class:"alert alert-info mb-0"},ct={class:"card mb-3"},dt={class:"card-body"},gt={class:"d-flex flex-wrap align-items-center gap-2"},ft={class:"ms-auto d-flex gap-2"},bt=["disabled"],vt=["disabled"],mt={class:"small"},ht={key:0,class:"small mb-0 mt-2"},pt={key:0,class:"alert alert-secondary mb-3"},yt={class:"fw-semibold mb-1"},_t={class:"small"},kt={class:"small"},St={class:"card mb-3"},wt={class:"card-body p-0"},xt={class:"table-responsive"},It={class:"table table-sm mb-0 align-middle"},$t={style:{width:"44px"},class:"ps-3"},Rt=["checked",".indeterminate"],Ct={key:0},Bt={key:0},At=["colspan"],Mt={key:1},Dt=["colspan"],Kt={class:"ps-3"},Ut=["onUpdate:modelValue"],Lt=["href"],Tt={key:1,class:"text-break"},Nt=["href"],Pt={key:1,class:"text-break"},Ft={class:"d-flex flex-wrap gap-1"},zt={key:2,class:"d-block text-warning mt-1"},Et={key:3,class:"d-block text-muted mt-1"},Ot={class:"text-muted d-block mt-1"},Wt={key:0,class:"text-muted"},jt={key:1,class:"text-muted d-block mt-1"},Vt={class:"text-nowrap"},qt={key:0,class:"text-danger ms-1"},Gt={key:1,class:"text-danger d-block mt-1"},Ht={key:0},Yt={class:"d-flex flex-wrap gap-1"},Xt={class:"text-muted d-block mt-1"},N=10,Jt=Le({__name:"migrations",setup(Qt){const{authData:j}=Te(),J=ze(),ce=h(()=>{var t;const e=(t=J.public)==null?void 0:t.apiUrl;return String(e||"").replace(/\/+$/,"")}),de=h(()=>`${ce.value}/auth/status`),k=S("loading"),V=S("Unable to validate access."),v=S("blog"),R=S(!1),C=S(!1),P=S([]),w=S({}),U=S({}),y=S({active:!1,mode:"dry-run",currentBatch:0,totalBatches:0,processed:0,totalItems:0}),{showError:q,showWarning:Q,showSuccess:G}=Pe(),ge=h(()=>v.value==="blog"?"Blog Migration":"Knowledge Base Migration"),B=h(()=>!1),fe=h(()=>v.value==="blog"?"/api/admin/blog-migration/list":"/api/admin/kb-migration/list"),be=h(()=>v.value==="blog"?"/api/admin/blog-migration/run":"/api/admin/kb-migration/run"),ve=h(()=>v.value==="blog"?"No blog source articles found under `content/blog/*/index.md`.":"No support (`content/support/kb-*/index.md`) or documentation (`content/documentation/*/index.md` with categories `DIY`, `FIRMWARES`, `OLD_INSTRUCTIONS`) source articles found."),me=()=>{var t;const e=new URL(String(((t=J.public)==null?void 0:t.dashboardSigninUrl)||""));e.searchParams.set("redirect","admin_blog"),k.value="unauthorized",V.value="Session expired — redirecting to sign in...",window.location.href=e.toString()},H=async(e,t={})=>{var n;try{return await $fetch(e,{credentials:"include",headers:Fe(),...t})}catch(s){const u=Number((s==null?void 0:s.statusCode)??((n=s==null?void 0:s.response)==null?void 0:n.status)??0);if(u===403){k.value="unauthorized",await ie("/admin/access-required");return}if(u===401){me();return}throw s}},he=async()=>{var e;try{const t=await H(de.value);if(!t)return;k.value=W("/admin/cms/migrations",t)?"authorized":"unauthorized",k.value==="unauthorized"&&await ie("/admin/access-required")}catch(t){k.value="error",V.value=String(((e=t==null?void 0:t.data)==null?void 0:e.message)||(t==null?void 0:t.message)||V.value)}},g=S({running:!1,dryRun:!0,summary:null,results:[]}),pe=e=>e==="failed"?"bg-danger":e==="skipped"?"bg-secondary":e==="fixed"?"bg-success":"bg-info",Z=async e=>{var t;if(!g.value.running){g.value.running=!0;try{const n=await H("/api/admin/blog-image-repair/run",{method:"POST",body:{dryRun:e}});if(!n)return;g.value.dryRun=n.dryRun,g.value.summary=n.summary,g.value.results=Array.isArray(n.results)?n.results:[];const s=n.summary;s!=null&&s.failed?Q(`Repair finished with ${s.failed} failure(s).`):G(e?`Dry run: ${(s==null?void 0:s.fixed)||0} post(s) can be fixed.`:`Fixed ${(s==null?void 0:s.fixed)||0} post(s).`)}catch(n){q(String(((t=n==null?void 0:n.data)==null?void 0:t.message)||(n==null?void 0:n.message)||"Image repair failed."))}finally{g.value.running=!1}}},A=h(()=>F.value.filter(e=>w.value[e.sourceKey]===!0).map(e=>
1e.sourceKey).filter(Boolean)),x=h(()=>A.value.length),ye=h(()=>x.value?Math.ceil(x.value/N):0),ee=h(()=>F.value.filter(e=>we())),te=h(()=>ee.value.length>0&&x.value===ee.value.length),_e=h(()=>x.value>0&&!te.value),M=h(()=>{const e=Object.values(U.value);return e.length?{total:e.length,creates:e.filter(t=>t.action==="create").length,updates:e.filter(t=>t.action==="update").length,failed:e.filter(t=>t.status==="failed").length,warnings:e.reduce((t,n)=>t+(Array.isArray(n.warnings)?n.warnings.length:0),0)}:null}),se=e=>e==="migrated_published"?0:e==="migrated_draft"?1:2,F=h(()=>{if(!B.value)return P.value;const e=new Map;for(const t of P.value){const s=String((t==null?void 0:t.slug)||(t==null?void 0:t.sourceSlug)||"").trim()||String((t==null?void 0:t.sourceKey)||""),u=e.get(s)||[];u.push(t),e.set(s,u)}return Array.from(e.entries()).map(([t,n])=>{const s=n.slice().sort((p,L)=>String(p.locale||"en").localeCompare(String(L.locale||"en"),"en",{sensitivity:"base"})),u=s.find(p=>String(p.locale||"en").trim()==="en"),i=u||s[0],I=s.map(p=>String(p.locale||"en").trim()||"en"),f=s.filter(p=>p.migrated).length,c=f===s.length,d=s.some(p=>p.migrationStatus==="migrated_published"),m=s.some(p=>p.migrationStatus==="migrated_draft");return{...i,sourceKey:t,sourceUrl:(i==null?void 0:i.sourceUrl)||"",locales:I,localeCount:s.length,migratedLocaleCount:f,migrated:c,migrationStatus:d?"migrated_published":m?"migrated_draft":"not_migrated",migratedPostId:String((u==null?void 0:u.migratedPostId)||(i==null?void 0:i.migratedPostId)||""),migratedSlug:String((u==null?void 0:u.migratedSlug)||(i==null?void 0:i.migratedSlug)||"")}})}),ke=h(()=>F.value.slice().sort((e,t)=>{const n=se(e.migrationStatus)-se(t.migrationStatus);if(n!==0)return n;const s=String(e.locale||"en").localeCompare(String(t.locale||"en"),"en",{sensitivity:"base"});return s!==0?s:String(e.title||"").localeCompare(String(t.title||""),"en",{sensitivity:"base"})})),Y=async()=>{var e;R.value=!0;try{const t=await H(fe.value),n=Array.isArray(t==null?void 0:t.items)?t.items:[];P.value=n,U.value={};const s={...w.value},u=B.value?Array.from(new Set(n.map(i=>String((i==null?void 0:i.slug)||(i==null?void 0:i.sourceSlug)||"").trim()).filter(Boolean))):n.map(i=>i.sourceKey);for(const i of u)s[i]=w.value[i]??!1;w.value=s}catch(t){q(String(((e=t==null?void 0:t.data)==null?void 0:e.message)||(t==null?void 0:t.message)||"Failed to load source articles."))}finally{R.value=!1}},Se=e=>{var s;const t=!!((s=e.target)!=null&&s.checked),n={...w.value};for(const u of F.value)n[u.sourceKey]=t;w.value=n},we=e=>!0,xe=e=>B.value&&Array.isArray(e.locales)&&e.locales.length?e.locales:[String((e==null?void 0:e.locale)||"en").trim()||"en"],Ie=e=>{const t=String(e||"").trim();return t?t.startsWith("knowledge-base-")?`kb-${t.slice(15)}`:t:""},ae=(e,t)=>{const n=Ie(e);return n?v.value==="blog"?`/blog/${n}`:`/documentation/kb/${n}`:""},X=e=>{String((e==null?void 0:e.locale)||"en").trim();const t=String((e==null?void 0:e.migratedSlug)||"").trim();return ae(t||(e==null?void 0:e.slug)||(e==null?void 0:e.sourceSlug)||"")},ne=e=>e==="migrated_published"?"bg-success":e==="migrated_draft"?"bg-warning text-dark":"bg-secondary",le=e=>e==="migrated_published"?"Published":e==="migrated_draft"?"Draft":"No",re=e=>{const t=String((e==null?void 0:e.migratedPostId)||"").trim();if(t)return`/admin/cms?postId=${encodeURIComponent(t)}`;const n=String((e==null?void 0:e.migratedSlug)||"").trim(),s=(B.value,String((e==null?void 0:e.locale)||"en").trim()||"en");return n?`/admin/cms?postSlug=${encodeURIComponent(n)}&postLocale=${encodeURIComponent(s)}`:""},oe=async e=>{e!==v.value&&(v.value=e,w.value={},P.value=[],U.value={},k.value==="authorized"&&await Y())},$e=e=>{const t=String((e==null?void 0:e.sourceKey)||"").trim();return t&&U.value[t]||null},D=e=>{var f;if(!B.value)return $e(e);const t=String((e==null?void 0:e.slug)||"").trim();if(!t)return null;const n=Object.values(U.value).filter(c=>String((c==null?void 0:c.slug)||"").trim()===t);if(!n.length)return null;const s=n.filter(c=>c.status==="failed"),u=n.filter(c=>c.action==="create").length,i=n.filter(c=>c.action==="update").length,I=n.flatMap(c=>Array.isArray(c.warnings)?c.warnings:[]);return{sourceKey:e.sourceKey,sourceUrl:e.sourceUrl,locale:"multi",slug:t,title:e.title,action:s.length?((f=n[0])==null?void 0:f.action)||"update":u>0&&i===0?"create":"update",status:s.length?"failed":"dry-run",uploadedImages:n.reduce((c,d)=>c+Number(d.uploadedImages||0),0),warnings:I,message:`${n.length} locale${n.length===1?"":"s"}: ${u} create, ${i} update`+(s.length?`, ${s.length} failed`:"")}},Re=e=>e==="failed"?"bg-danger":e==="dry-run"?"bg-info text-dark":"bg-success",Ce=e=>e==="failed"?"Dry Run Failed":e==="dry-run"?"Dry Run Ready":"Dry Run",Be=e=>e?`${e.action==="create"?"Would create":"Would update"}${e.uploadedImages?`, ${e.uploadedImages} image${e.uploadedImages===1?"":"s"}`:""}`:"",Ae=e=>!e||!Array.isArray(e.warnings)?[]:e.warnings.slice(0,2),Me=e=>{if(v.value!=="blog")return[];const t=[];return e.needsRewrite&&t.push({label:"Rewrite",className:"bg-warning text-dark"}),e.needsRendererSupport&&t.push({label:"Renderer",className:"bg-info text-dark"}
1),e.hasUnknownShortcodes&&t.push({label:"Unknown",className:"bg-danger"}),t.length||t.push({label:"Ready",className:"bg-success"}),t},De=e=>{const t=Array.isArray(e.shortcodeTypes)?e.shortcodeTypes:[];return t.length?t.slice(0,3).map(n=>`${n.name} (${n.count})`).join(", "):"No shortcodes"},Ke=(e,t)=>{const n=[];for(let s=0;s<e.length;s+=t)n.push(e.slice(s,s+t));return n},ue=async e=>{var i,I;if(C.value)return;if(!A.value.length){Q("Please select at least one article.");return}const t=v.value==="blog"?"blog posts":"knowledge base articles",n=e?"Dry-run":"Migrate";if(!window.confirm(`${n} ${A.value.length} selected ${t} to CMS?`))return;C.value=!0;const u=Ke(A.value,N);y.value={active:!0,mode:e?"dry-run":"migrate",currentBatch:0,totalBatches:u.length,processed:0,totalItems:A.value.length};try{const f=[];for(let d=0;d<u.length;d+=1){const m=u[d];y.value={...y.value,currentBatch:d+1,processed:d*N};const p=B.value?{slugs:m,dryRun:e}:{sourceKeys:m,dryRun:e},L=await H(be.value,{method:"POST",body:p});f.push(...Array.isArray(L==null?void 0:L.results)?L.results:[]),y.value={...y.value,processed:Math.min((d+1)*N,A.value.length)}}e?U.value=Object.fromEntries(f.map(d=>[String((d==null?void 0:d.sourceKey)||"").trim(),d]).filter(([d])=>!!d)):U.value={};const c=f.filter(d=>(d==null?void 0:d.status)==="failed");c.length?q(`${c.length} ${c.length===1?"item failed":"items failed"}. ${String(((i=c[0])==null?void 0:i.message)||"Migration failed.")}`):e?G(`Dry run completed for ${A.value.length} selected items in ${u.length} batch${u.length===1?"":"es"}.`):(await Y(),G(`Migration completed for ${A.value.length} selected items in ${u.length} batch${u.length===1?"":"es"}.`))}catch(f){q(String(((I=f==null?void 0:f.data)==null?void 0:I.message)||(f==null?void 0:f.message)||"Migration failed."))}finally{y.value={active:!1,mode:e?"dry-run":"migrate",currentBatch:0,totalBatches:0,processed:0,totalItems:0},C.value=!1}};return Ne(async()=>{await he(),k.value==="authorized"&&await Y()}),(e,t)=>{const n=Ue;return r(),o("div",je,[a("div",Ve,[a("div",qe,[a("h1",Ge,l(ge.value),1),a("div",He,[K(W)("/admin/cms/locales",K(j))?(r(),z(n,{key:0,class:"btn btn-sm btn-primary",to:"/admin/cms/locales"},{default:E(()=>[...t[6]||(t[6]=[$("Locales",-1)])]),_:1})):b("",!0),K(W)("/admin/cms/vocabulary",K(j))?(r(),z(n,{key:1,class:"btn btn-sm btn-primary",to:"/admin/cms/vocabulary"},{default:E(()=>[...t[7]||(t[7]=[$("KB Tags",-1)])]),_:1})):b("",!0),K(W)("/admin/cms/redirects",K(j))?(r(),z(n,{key:2,class:"btn btn-sm btn-primary",to:"/admin/cms/redirects"},{default:E(()=>[...t[8]||(t[8]=[$("Redirects",-1)])]),_:1})):b("",!0),K(W)("/admin/cms",K(j))?(r(),z(n,{key:3,class:"btn btn-sm btn-primary",to:"/admin/cms"},{default:E(()=>[...t[9]||(t[9]=[$("Back to Editor",-1)])]),_:1})):b("",!0)])])]),k.value==="loading"?(r(),o("div",Ye,"Checking access...")):k.value==="error"?(r(),o("div",Xe,l(V.value),1)):k.value!=="authorized"?(r(),o("div",Je," You are not authorized to run migrations. ")):(r(),o("div",Qe,[a("div",Ze,[a("div",et,[a("div",tt,[a("button",{type:"button",class:_(["btn btn-outline-secondary",{active:v.value==="blog"}]),disabled:R.value||C.value,onClick:t[0]||(t[0]=s=>oe("blog"))}," Blog ",10,st),a("button",{type:"button",class:_(["btn btn-outline-secondary",{active:v.value==="kb"}]),disabled:R.value||C.value,onClick:t[1]||(t[1]=s=>oe("kb"))}," Knowledge Base ",10,at)]),a("button",{class:"btn btn-sm btn-outline-secondary",type:"button",disabled:R.value||C.value,onClick:Y}," Refresh ",8,nt),a("button",{class:"btn btn-sm btn-warning",type:"button",disabled:C.value||R.value||x.value===0,onClick:t[2]||(t[2]=s=>ue(!1))}," Migrate Selected ",8,lt),a("button",{class:"btn btn-sm btn-outline-secondary",type:"button",disabled:C.value||R.value||x.value===0,onClick:t[3]||(t[3]=s=>ue(!0))}," Dry Run Selected ",8,rt),a("div",ot,l(x.value)+" selected / "+l(F.value.length)+" total ",1)]),x.value>N?(r(),o("div",ut,[a("div",it,l(x.value)+" selected. Runs will be processed automatically in "+l(ye.value)+" batches of up to "+l(N)+". ",1)])):b("",!0)]),a("div",ct,[a("div",dt,[a("div",gt,[t[10]||(t[10]=a("div",null,[a("div",{class:"fw-semibold"},"Repair temp inline image URLs"),a("div",{class:"text-muted small"}
1,[$(" Rewrites published posts whose body still points at "),a("code",null,"/blog-images/tmp/…"),$(" (404) to their permanent "),a("code",null,"/blog-images/blog/<id>/…"),$(" path. Verifies each permanent copy exists before writing. ")])],-1)),a("div",ft,[a("button",{class:"btn btn-sm btn-outline-secondary",type:"button",disabled:g.value.running,onClick:t[4]||(t[4]=s=>Z(!0))}," Dry Run ",8,bt),a("button",{class:"btn btn-sm btn-warning",type:"button",disabled:g.value.running,onClick:t[5]||(t[5]=s=>Z(!1))}," Apply Fix ",8,vt)])]),g.value.summary?(r(),o("div",{key:0,class:_(["alert mt-3 mb-0",g.value.summary.failed?"alert-warning":"alert-info"])},[a("div",mt,l(g.value.dryRun?"Dry run":"Applied")+": "+l(g.value.summary.scanned)+" scanned, "+l(g.value.summary.affected)+" affected, "+l(g.value.summary.fixed)+" "+l(g.value.dryRun?"to fix":"fixed")+", "+l(g.value.summary.skipped)+" skipped, "+l(g.value.summary.failed)+" failed. ",1),g.value.results.length?(r(),o("ul",ht,[(r(!0),o(T,null,O(g.value.results,s=>(r(),o("li",{key:s.postId},[a("span",{class:_(["badge",pe(s.status)])},l(s.status),3),$(" "+l(s.slug)+" — "+l(s.fixedCount)+" image(s)"+l(s.message?` — ${s.message}`:""),1)]))),128))])):b("",!0)],2)):b("",!0)])]),y.value.active?(r(),o("div",pt,[a("div",yt,l(y.value.mode==="dry-run"?"Dry Run In Progress":"Migration In Progress"),1),a("div",_t," Processing batch "+l(y.value.currentBatch)+" of "+l(y.value.totalBatches)+" ("+l(y.value.processed)+" of "+l(y.value.totalItems)+" items). ",1)])):b("",!0),M.value?(r(),o("div",{key:1,class:_(["alert mb-3",M.value.failed?"alert-warning":"alert-info"])},[t[11]||(t[11]=a("div",{class:"fw-semibold mb-1"},"Last Dry Run",-1)),a("div",kt,l(M.value.total)+" checked, "+l(M.value.creates)+" create, "+l(M.value.updates)+" update, "+l(M.value.failed)+" failed, "+l(M.value.warnings)+" warning"+l(M.value.warnings===1?"":"s")+". ",1)],2)):b("",!0),a("div",St,[a("div",wt,[a("div",xt,[a("table",It,[a("thead",null,[a("tr",null,[a("th",$t,[a("input",{type:"checkbox",class:"form-check-input",checked:te.value,".indeterminate":_e.value,onChange:Se},null,40,Rt)]),t[12]||(t[12]=a("th",null,"Source",-1)),t[13]||(t[13]=a("th",null,"Target",-1)),a("th",null,l(B.value?"Locales":"Locale"),1),t[14]||(t[14]=a("th",null,"Migrated",-1)),t[15]||(t[15]=a("th",null,"Title",-1)),t[16]||(t[16]=a("th",null,"Description",-1)),t[17]||(t[17]=a("th",{class:"text-nowrap"},"Images",-1)),v.value==="blog"?(r(),o("th",Ct,"Shortcodes")):b("",!0)])]),a("tbody",null,[R.value?(r(),o("tr",Bt,[a("td",{colspan:v.value==="blog"?9:8,class:"text-muted p-3"}," Loading source articles... ",8,At)])):P.value.length?b("",!0):(r(),o("tr",Mt,[a("td",{colspan:v.value==="blog"?9:8,class:"text-muted p-3"},l(ve.value),9,Dt)])),(r(!0),o(T,null,O(ke.value,s=>{var u,i,I,f,c,d;return r(),o("tr",{key:s.sourceKey||s.sourceFile,class:_({"table-success-subtle":s.migrated})},[a("td",Kt,[Ee(a("input",{"onUpdate:modelValue":m=>w.value[s.sourceKey]=m,type:"checkbox",class:"form-check-input"},null,8,Ut),[[Oe,w.value[s.sourceKey]]])]),a("td",null,[s.sourceUrl?(r(),o("a",{key:0,class:"text-break",href:s.sourceUrl,target:"_blank",rel:"noopener noreferrer"},l(s.sourceUrl),9,Lt)):(r(),o("span",Tt,"—"))]),a("td",null,[X(s)?(r(),o("a",{key:0,class:"text-break",href:X(s),target:"_blank",rel:"noopener noreferrer"},l(X(s)),9,Nt)):(r(),o("span",Pt,"—"))]),a("td",null,[a("div",Ft,[(r(!0),o(T,null,O(xe(s),m=>(r(),o("span",{key:`${s.sourceKey}-${m}`,class:"badge bg-light text-dark text-uppercase"},l(m),1))),128))])]),a("td",null,[s.migrationStatus!=="not_migrated"&&re(s)?(r(),z(n,{key:0,class:_(["badge text-decoration-none",ne(s.migrationStatus)]),to:re(s)},{default:E(()=>[$(l(le(s.migrationStatus)),1)]),_:2},1032,["class","to"])):(r(),o("span",{key:1,class:_(["badge",ne(s.migrationStatus)])},l(le(s.migrationStatus)),3)),s.targetMismatch&&s.migratedSlug?(r(),o("small",zt," Existing slug: "+l(s.migratedSlug),1)):b("",!0),B.value&&s.localeCount&&s.migratedLocaleCount!==void 0?(r(),o("small",Et,l(s.migratedLocaleCount)+"/"+l(s.localeCount)+" locales migrated ",1)):b("",!0)]),a("td",null,[a("div",null,l(s.title),1),D(s)?(r(),o(T,{key:0},[a("span",{class:_(["badge mt-1",Re((u=D(s))==null?void 0:u.status)])},l(Ce((i=D(s))==null?void 0:i.status)),3),a("small",Ot,l(Be(D(s))),1),(I=D(s))!=null&&I.message?(r(),o("small",{key:0,class:_(["d-block mt-1",((f=D(s))==null?void 0:f.status)==="failed"?"text-danger":"text-muted"])},l((c=D(s))==null?void 0:c.message),3)):b("",!0),(r(!0),o(T,null,O(Ae(D(s)),m=>(r(),o("small",{key:m,class:"text-warning d-block mt-1"},l(m),1))),128))],64)):b("",!0)]),a("td",null,[a("div",null,l(s.effectiveDescription||"—"),1),!s.description&&s.generatedDescription?(r(),o("small",Wt," Generated summary ")):v.value==="blog"&&((d=s.categories)!=null&&d.length)?(r(),o("small",jt,l(s.categories.join(", ")),1)):b("",!0)]),a("td",null,[a("span",Vt,l(s.imageCount),1),s.missingImageCount?(r(),o("small",qt," ("+l(s.missingImageCount)+" missing) ",1)):b("",!0),v.value==="blog"&&s.heroImageMissing?(r(),o("small",Gt," Hero missing ")):b("",!0)]),v.value==="blog"?(r(),o("td",Ht,[a("div",Yt,[(r(!0),o(T,null,O(Me(s),m=>(r(),o("span",{key:m.label,class:_(["badge",m.className])},l(m.label),3))),128))]),a("small",Xt,l(De(s)),1)])):b("",!0)],2)}),128))])])])])])]))])}}}),ts=We(Jt,[["__scopeId","data-v-84a24638"]]);export{ts as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.