🚨 Active Supply Chain Attack:node-ipc Package Compromised.Learn More →
Socket
Book a DemoSign in
Socket

@docmd/plugin-search

Package Overview
Dependencies
Maintainers
1
Versions
40
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@docmd/plugin-search - npm Package Compare versions

Comparing version
0.7.5
to
0.7.6
+5
-5
dist/docmd-search.js

@@ -1,8 +0,8 @@

(function(){let T=null,m=!1,r=-1,c=new Set,u=[],v={};function k(){let a=document.getElementById("docmd-search-modal"),d=document.getElementById("docmd-search-input"),i=document.getElementById("docmd-search-results");if(!a||!d||!i)return;let w={initial:a.dataset.searchInitial||"Type to start searching...",noResults:a.dataset.searchNoResults||"No results found.",error:a.dataset.searchError||"Failed to load search index."},H=window.DOCMD_SITE_ROOT||window.DOCMD_ROOT||"./",y=new URL(H,window.location.href).href;y.endsWith("/")||(y+="/");let E=(window.DOCMD_SITE_ROOT||window.DOCMD_ROOT||"/").replace(/\/$/,"")+"/",x=window.location.pathname,M=(x.startsWith(E)?x.slice(E.length):x.replace(/^\//,"")).split("/")[0],I=document.querySelectorAll("link[hreflang]"),O=new Set;I.forEach(e=>{let t=e.getAttribute("hreflang");t&&t!=="x-default"&&O.add(t)});let R=O.has(M)?M+"/":"",A=new URL(E,window.location.href).href+R+"search-index.json",b=`<div class="search-initial">${w.initial}</div>`;function S(){a.style.display="flex",window.lastFocusedElement=document.activeElement,setTimeout(()=>d.focus(),50),d.value.trim()||(i.innerHTML=b,r=-1),m||C()}function p(){a.style.display="none",window.lastFocusedElement&&window.lastFocusedElement.focus(),r=-1}document.addEventListener("click",e=>{let t=e.target;t?.closest(".docmd-search-trigger")&&(e.preventDefault(),S()),(t===a||t?.closest(".docmd-search-close"))&&p()}),document.addEventListener("keydown",e=>{if((e.metaKey||e.ctrlKey)&&e.key==="k"&&(e.preventDefault(),a.style.display==="flex"?p():S()),a.style.display==="flex"){let t=i.querySelectorAll(".search-result-item");e.key==="Escape"?(e.preventDefault(),p()):e.key==="ArrowDown"?(e.preventDefault(),t.length&&(r=(r+1)%t.length,L(t))):e.key==="ArrowUp"?(e.preventDefault(),t.length&&(r=(r-1+t.length)%t.length,L(t))):e.key==="Enter"&&(e.preventDefault(),r>=0&&t[r]?t[r].click():t.length>0&&t[0].click())}});function L(e){e.forEach((t,s)=>{t.classList.toggle("selected",s===r),s===r&&t.scrollIntoView({block:"nearest"})})}async function C(){try{let e=await fetch(A);if(e.headers.get("content-type")?.includes("text/html"))throw new Error("Invalid content type");if(!e.ok)throw new Error(String(e.status));let t=await e.text(),n=JSON.parse(t).storedFields||{};u=[...new Set(Object.values(n).map(f=>f.version).filter(Boolean))],u.sort();let o=[210,150,30,330,270,60,180,0];u.forEach((f,l)=>{let h=o[l%o.length];v[f]={bg:`hsl(${h}, 55%, 92%)`,fg:`hsl(${h}, 60%, 35%)`}}),T=MiniSearch.loadJSON(t,{fields:["title","headings","text"],storeFields:["title","id","text","version"],searchOptions:{fuzzy:.2,prefix:!0,boost:{title:2,headings:1.5}}}),console.log("[docmd-search] Index loaded. Versions found:",u.length),$(),m=!0,d.value.trim()&&d.dispatchEvent(new Event("input"))}catch{i.innerHTML=`<div class="search-error">${w.error}</div>`}}function $(){if(console.log("[docmd-search] Rendering global filters. Versions:",u),u.length===0)return;let e=document.getElementById("docmd-global-search-filters");e||(e=document.createElement("div"),e.id="docmd-global-search-filters",e.style.cssText="padding: 12px 20px 8px 20px; border-bottom: 1px solid var(--docmd-border); display: flex; flex-wrap: wrap; gap: 8px;",i.parentNode?.insertBefore(e,i)),e.innerHTML=u.map(t=>{let s=v[t],n=c.has(t),o=n?'<svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>':'<svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48"></path></svg>';return`<span class="search-filter-tag ${n?"active":""}" data-version="${t}" style="background:${s.bg};color:${s.fg};cursor:pointer;display:inline-flex;align-items:center;gap:4px;padding:4px 8px;border-radius:12px;font-size:11px;border: 1px solid ${n?s.fg:"transparent"}; opacity: ${c.size>0&&!n?"0.6":"1"}; transition: all 0.2s;">
(function(){let k=null,v=!1,r=-1,c=new Set,u=[],w={};function M(){let a=document.getElementById("docmd-search-modal"),d=document.getElementById("docmd-search-input"),i=document.getElementById("docmd-search-results");if(!a||!d||!i)return;let y={initial:a.dataset.searchInitial||"Type to start searching...",noResults:a.dataset.searchNoResults||"No results found.",error:a.dataset.searchError||"Failed to load search index."},H=window.DOCMD_SITE_ROOT||window.DOCMD_ROOT||"./",E=new URL(H,window.location.href).href;E.endsWith("/")||(E+="/");let x=(window.DOCMD_SITE_ROOT||window.DOCMD_ROOT||"/").replace(/\/$/,"")+"/",L=window.location.pathname,O=(L.startsWith(x)?L.slice(x.length):L.replace(/^\//,"")).split("/")[0],I=document.querySelectorAll("link[hreflang]"),$=new Set;I.forEach(e=>{let t=e.getAttribute("hreflang");t&&t!=="x-default"&&$.add(t)});let R=$.has(O)?O+"/":"",A=new URL(x,window.location.href).href+R+"search-index.json",b=`<div class="search-initial">${y.initial}</div>`;function S(){a.style.display="flex",window.lastFocusedElement=document.activeElement,setTimeout(()=>d.focus(),50),d.value.trim()||(i.innerHTML=b,r=-1),v||C()}function p(){a.style.display="none",window.lastFocusedElement&&window.lastFocusedElement.focus(),r=-1}document.addEventListener("click",e=>{let t=e.target;t?.closest(".docmd-search-trigger")&&(e.preventDefault(),S()),(t===a||t?.closest(".docmd-search-close"))&&p()}),document.addEventListener("keydown",e=>{if((e.metaKey||e.ctrlKey)&&e.key==="k"&&(e.preventDefault(),a.style.display==="flex"?p():S()),a.style.display==="flex"){let t=i.querySelectorAll(".search-result-item");e.key==="Escape"?(e.preventDefault(),p()):e.key==="ArrowDown"?(e.preventDefault(),t.length&&(r=(r+1)%t.length,T(t))):e.key==="ArrowUp"?(e.preventDefault(),t.length&&(r=(r-1+t.length)%t.length,T(t))):e.key==="Enter"&&(e.preventDefault(),r>=0&&t[r]?t[r].click():t.length>0&&t[0].click())}});function T(e){e.forEach((t,s)=>{t.classList.toggle("selected",s===r),s===r&&t.scrollIntoView({block:"nearest"})})}async function C(){try{let e=await fetch(A);if(e.headers.get("content-type")?.includes("text/html"))throw new Error("Invalid content type");if(!e.ok)throw new Error(String(e.status));let t=await e.text(),n=JSON.parse(t).storedFields||{};u=[...new Set(Object.values(n).map(f=>f.version).filter(Boolean))],u.sort();let o=[210,150,30,330,270,60,180,0];u.forEach((f,l)=>{let g=o[l%o.length];w[f]={bg:`hsl(${g}, 55%, 92%)`,fg:`hsl(${g}, 60%, 35%)`}}),k=MiniSearch.loadJSON(t,{fields:["title","headings","text"],storeFields:["title","id","text","version"],searchOptions:{fuzzy:.2,prefix:!0,boost:{title:2,headings:1.5}}}),console.log("[docmd-search] Index loaded. Versions found:",u.length),D(),v=!0,d.value.trim()&&d.dispatchEvent(new Event("input"))}catch{i.innerHTML=`<div class="search-error">${y.error}</div>`}}function D(){if(console.log("[docmd-search] Rendering global filters. Versions:",u),u.length===0)return;let e=document.getElementById("docmd-global-search-filters");e||(e=document.createElement("div"),e.id="docmd-global-search-filters",e.style.cssText="padding: 12px 20px 8px 20px; border-bottom: 1px solid var(--docmd-border); display: flex; flex-wrap: wrap; gap: 8px;",i.parentNode?.insertBefore(e,i)),e.innerHTML=u.map(t=>{let s=w[t],n=c.has(t),o=n?'<svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>':'<svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48"></path></svg>';return`<span class="search-filter-tag ${n?"active":""}" data-version="${t}" style="background:${s.bg};color:${s.fg};cursor:pointer;display:inline-flex;align-items:center;gap:4px;padding:4px 8px;border-radius:12px;font-size:11px;border: 1px solid ${n?s.fg:"transparent"}; opacity: ${c.size>0&&!n?"0.6":"1"}; transition: all 0.2s;">
${o} ${t}
</span>`}).join(""),e.querySelectorAll(".search-filter-tag").forEach(t=>{t.addEventListener("click",s=>{s.preventDefault(),s.stopPropagation();let n=t.dataset.version;c.has(n)?c.delete(n):c.add(n),$(),d.value.trim()&&d.dispatchEvent(new Event("input"))})})}function B(e,t){if(!e)return"";let s=t.split(/\s+/).filter(g=>g.length>2),n=-1;for(let g of s){let D=e.toLowerCase().indexOf(g.toLowerCase());if(D>=0){n=D;break}}let o=Math.max(0,n-60),f=Math.min(e.length,n+60),l=e.substring(o,f);o>0&&(l="..."+l),f<e.length&&(l+="...");let h=s.map(g=>g.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|");return h&&(l=l.replace(new RegExp(`(${h})`,"gi"),"<mark>$1</mark>")),l}d.addEventListener("input",e=>{let t=e.target.value.trim();if(r=-1,!t){i.innerHTML=b;return}if(!m)return;let s=T.search(t);if(c.size>0&&(s=s.filter(n=>c.has(n.version))),s.length===0){i.innerHTML=`<div class="search-no-results">${c.size>0?"No results match the selected filters.":w.noResults}</div>`;return}i.innerHTML=s.slice(0,10).map((n,o)=>{let f=B(n.text,t),l=`${y}${n.id}`,h=n.version?v[n.version]:null,g=n.version?`<span class="search-result-version" style="background:${h.bg};color:${h.fg}">${n.version}</span>`:"";return`
<a href="${l}" class="search-result-item" data-index="${o}">
<div class="search-result-title">${n.title}${g}</div>
</span>`}).join(""),e.querySelectorAll(".search-filter-tag").forEach(t=>{t.addEventListener("click",s=>{s.preventDefault(),s.stopPropagation();let n=t.dataset.version;c.has(n)?c.delete(n):c.add(n),D(),d.value.trim()&&d.dispatchEvent(new Event("input"))})})}function B(e,t){if(!e)return"";let s=t.split(/\s+/).filter(h=>h.length>2),n=-1;for(let h of s){let m=e.toLowerCase().indexOf(h.toLowerCase());if(m>=0){n=m;break}}let o=Math.max(0,n-60),f=Math.min(e.length,n+60),l=e.substring(o,f);o>0&&(l="..."+l),f<e.length&&(l+="...");let g=s.map(h=>h.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|");return g&&(l=l.replace(new RegExp(`(${g})`,"gi"),"<mark>$1</mark>")),l}d.addEventListener("input",e=>{let t=e.target.value.trim();if(r=-1,!t){i.innerHTML=b;return}if(!v)return;let s=k.search(t);if(c.size>0&&(s=s.filter(n=>c.has(n.version))),s.length===0){i.innerHTML=`<div class="search-no-results">${c.size>0?"No results match the selected filters.":y.noResults}</div>`;return}i.innerHTML=s.slice(0,10).map((n,o)=>{let f=B(n.text,t),l=n.id.startsWith("/")?n.id.slice(1):n.id,g=`${E}${l}`.replace(/([^:])\/\/+/g,"$1/"),h=n.version?w[n.version]:null,m=n.version?`<span class="search-result-version" style="background:${h.bg};color:${h.fg}">${n.version}</span>`:"";return`
<a href="${g}" class="search-result-item" data-index="${o}">
<div class="search-result-title">${n.title}${m}</div>
<div class="search-result-preview">${f}</div>
</a>`}).join(""),i.querySelectorAll(".search-result-item").forEach((n,o)=>{n.addEventListener("mouseenter",()=>{r=o,L(i.querySelectorAll(".search-result-item"))})})}),i.addEventListener("click",e=>{e.target.closest(".search-result-item")&&p()}),window.closeDocmdSearch=p}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",k):k()})();
</a>`}).join(""),i.querySelectorAll(".search-result-item").forEach((n,o)=>{n.addEventListener("mouseenter",()=>{r=o,T(i.querySelectorAll(".search-result-item"))})})}),i.addEventListener("click",e=>{e.target.closest(".search-result-item")&&p()}),window.closeDocmdSearch=p}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",M):M()})();
/**

@@ -9,0 +9,0 @@ * --------------------------------------------------------------------

@@ -19,2 +19,3 @@ /**

import { fileURLToPath } from 'url';
import { outputPathToSlug } from '@docmd/api';
const __filename = fileURLToPath(import.meta.url);

@@ -24,3 +25,3 @@ const __dirname = path.dirname(__filename);

name: 'search',
version: '0.7.5',
version: '0.7.6',
capabilities: ['post-build', 'head', 'body', 'assets', 'translations']

@@ -105,7 +106,10 @@ };

for (const page of locPages) {
let pageId = page.outputPath.replace(/\\/g, '/');
if (pageId.endsWith('/index.html'))
pageId = pageId.slice(0, -10);
if (pageId.endsWith('.html'))
pageId = pageId.slice(0, -5);
// Use centralised URL utility for consistent slug generation.
// This is the single source of truth — no manual outputPath parsing.
let pageId = outputPathToSlug(page.outputPath);
// For search index, we want the slug without leading slash (except for root)
// This ensures clean concatenation in the client: ROOT_PATH + pageId
if (pageId.startsWith('/') && pageId !== '/') {
pageId = pageId.slice(1);
}
// Detect version from the output path

@@ -112,0 +116,0 @@ let version = null;

{
"name": "@docmd/plugin-search",
"version": "0.7.5",
"version": "0.7.6",
"description": "Offline full-text search for docmd.",

@@ -48,4 +48,4 @@ "type": "module",

"devDependencies": {
"@docmd/api": "^0.7.5"
"@docmd/api": "^0.7.6"
}
}