@stacksjs/search-engine 0.72.57 → 0.72.61

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/index.js +3 -3
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- var Py=Object.defineProperty;var Sy=(u)=>u;function _y(u,y){this[u]=Sy.bind(null,y)}var L=(u,y)=>{for(var f in y)Py(u,f,{get:y[f],enumerable:!0,configurable:!0,set:_y.bind(y,f)})};var B=(u,y)=>()=>(u&&(y=u(u=0)),y);var Ay=import.meta.require;var v={};L(v,{waitTask:()=>bu,setSettings:()=>Tu,searchSynonyms:()=>ou,searchRules:()=>vu,search:()=>Yu,saveSynonym:()=>cu,saveRule:()=>ku,saveObjects:()=>Xu,saveObject:()=>Wu,partialUpdateObject:()=>Qu,multiSearch:()=>Zu,moveIndex:()=>Cu,listIndices:()=>Ru,indexExists:()=>hu,getSettings:()=>Bu,getObjects:()=>Ku,getObject:()=>Eu,deleteObjects:()=>Vu,deleteObject:()=>gu,deleteIndex:()=>ru,deleteBy:()=>zu,default:()=>oy,copyIndex:()=>Fu,configure:()=>Mu,clearSynonyms:()=>qu,clearRules:()=>ju,clearObjects:()=>Lu,browse:()=>Iu,algolia:()=>Du});import{searchEngine as Gu}from"@stacksjs/config";import{log as hy}from"@stacksjs/logging";function Hu(){if(!R){let u=Gu.algolia?.appId||process.env.ALGOLIA_APP_ID||"",y=Gu.algolia?.apiKey||process.env.ALGOLIA_API_KEY||"";if(!u||!y)throw hy.error("Algolia credentials not configured. Set ALGOLIA_APP_ID and ALGOLIA_API_KEY."),Error("Algolia credentials not configured. Set ALGOLIA_APP_ID and ALGOLIA_API_KEY.");R={appId:u,apiKey:y}}return R}function by(){let{appId:u}=Hu();return`https://${u}.algolia.net`}function cy(){let{appId:u,apiKey:y}=Hu();return{"X-Algolia-Application-Id":u,"X-Algolia-API-Key":y,"Content-Type":"application/json"}}async function A(u,y,f){let $=await fetch(`${by()}${y}`,{method:u,headers:cy(),body:f?JSON.stringify(f):void 0});if(!$.ok){let w=await $.json().catch(()=>({message:$.statusText}));throw Error(`Algolia API error: ${w.message||$.statusText}`)}return $.json()}function Mu(u){R=u}async function Yu(u,y={}){return A("POST",`/1/indexes/${u}/query`,{query:y.query||"",page:y.page||0,hitsPerPage:y.hitsPerPage||20,filters:y.filters,facets:y.facets,attributesToRetrieve:y.attributesToRetrieve,attributesToHighlight:y.attributesToHighlight,attributesToSnippet:y.attributesToSnippet})}async function Zu(u){return A("POST","/1/indexes/*/queries",{requests:u.map((y)=>({indexName:y.indexName,params:new URLSearchParams({query:y.params?.query||"",page:String(y.params?.page||0),hitsPerPage:String(y.params?.hitsPerPage||20),...y.params?.filters&&{filters:y.params.filters}}).toString()}))})}async function Wu(u,y,f){if(f)return A("PUT",`/1/indexes/${u}/${f}`,y);return A("POST",`/1/indexes/${u}`,y)}async function Xu(u,y){return A("POST",`/1/indexes/${u}/batch`,{requests:y.map((f)=>({action:f.objectID?"updateObject":"addObject",body:f}))})}async function Qu(u,y,f,$=!0){return A("POST",`/1/indexes/${u}/${y}/partial${$?"":"?createIfNotExists=false"}`,f)}async function gu(u,y){return A("DELETE",`/1/indexes/${u}/${y}`)}async function Vu(u,y){return A("POST",`/1/indexes/${u}/batch`,{requests:y.map((f)=>({action:"deleteObject",body:{objectID:f}}))})}async function zu(u,y){return A("POST",`/1/indexes/${u}/deleteByQuery`,{filters:y})}async function Eu(u,y,f){let $=f?`?attributesToRetrieve=${f.join(",")}`:"";return A("GET",`/1/indexes/${u}/${y}${$}`)}async function Ku(u,y,f){return A("POST","/1/indexes/*/objects",{requests:y.map(($)=>({indexName:u,objectID:$,attributesToRetrieve:f}))})}async function Lu(u){return A("POST",`/1/indexes/${u}/clear`)}async function Bu(u){return A("GET",`/1/indexes/${u}/settings`)}async function Tu(u,y,f=!1){return A("PUT",`/1/indexes/${u}/settings${f?"?forwardToReplicas=true":""}`,y)}async function Ru(){return A("GET","/1/indexes")}async function Fu(u,y,f){return A("POST",`/1/indexes/${u}/operation`,{operation:"copy",destination:y,scope:f})}async function Cu(u,y){return A("POST",`/1/indexes/${u}/operation`,{operation:"move",destination:y})}async function ru(u){return A("DELETE",`/1/indexes/${u}`)}async function hu(u){try{return await A("GET",`/1/indexes/${u}/settings`),!0}catch{return!1}}async function bu(u,y,f=1e4,$=100){let w=Date.now();while(Date.now()-w<f){let P=await A("GET",`/1/indexes/${u}/task/${y}`);if(P.status==="published")return P;await new Promise((S)=>setTimeout(S,$))}throw Error(`Task ${y} timed out after ${f}ms`)}async function cu(u,y,f=!1){return A("PUT",`/1/indexes/${u}/synonyms/${y.objectID}${f?"?forwardToReplicas=true":""}`,y)}async function ou(u,y="",f,$=0,w=20){return A("POST",`/1/indexes/${u}/synonyms/search`,{query:y,type:f,page:$,hitsPerPage:w})}async function qu(u,y=!1){return A("POST",`/1/indexes/${u}/synonyms/clear${y?"?forwardToReplicas=true":""}`)}async function ku(u,y,f=!1){return A("PUT",`/1/indexes/${u}/rules/${y.objectID}${f?"?forwardToReplicas=true":""}`,y)}async function vu(u,y="",f,$,w=0,P=20){return A("POST",`/1/indexes/${u}/rules/search`,{query:y,anchoring:f,context:$,page:w,hitsPerPage:P})}async function ju(u,y=!1){return A("POST",`/1/indexes/${u}/rules/clear${y?"?forwardToReplicas=true":""}`)}async function*Iu(u,y={}){let f;do{let $=await A("POST",`/1/indexes/${u}/browse`,{...y,cursor:f});for(let w of $.hits)yield w;f=$.cursor}while(f)}var R=null,Du,oy;var j=B(()=>{Du={configure:Mu,search:Yu,multiSearch:Zu,saveObject:Wu,saveObjects:Xu,partialUpdateObject:Qu,deleteObject:gu,deleteObjects:Vu,deleteBy:zu,getObject:Eu,getObjects:Ku,clearObjects:Lu,getSettings:Bu,setSettings:Tu,listIndices:Ru,copyIndex:Fu,moveIndex:Cu,deleteIndex:ru,indexExists:hu,waitTask:bu,saveSynonym:cu,searchSynonyms:ou,clearSynonyms:qu,saveRule:ku,searchRules:vu,clearRules:ju,browse:Iu},oy=Du});var uu={};L(uu,{default:()=>dy});import{searchEngine as qy}from"@stacksjs/config";function a(){let u=qy.opensearch,y=String(u?.host||"localhost").replace(/\/+$/,""),f=/^https?:\/\//i.test(y),$=String(u?.protocol||"http").replace(/:$/,""),w=Number(u?.port||9200),P=`${$}://${y}${w?`:${w}`:""}`;if(f){let S=new URL(y);if(!S.port&&u?.port)S.port=String(u.port);P=S.toString().replace(/\/+$/,"")}return{baseUrl:P,auth:String(u?.auth||"")}}function ky(u="application/json"){let{auth:y}=a();return{"Content-Type":u,...y?{Authorization:`Basic ${btoa(y)}`}:{}}}async function M(u,y,f,$){let{baseUrl:w}=a(),P=await fetch(`${w}${y}`,{method:u,headers:ky($),body:f===void 0?void 0:typeof f==="string"?f:JSON.stringify(f)});if(!P.ok){let J=await P.text();throw new C(P.status,u,y,J||P.statusText)}let S=await P.text();return S?JSON.parse(S):{}}function Y(u){return`/${encodeURIComponent(u)}`}function Q(u,y){return{taskUid:Date.now(),indexUid:u,status:"succeeded",type:y,enqueuedAt:new Date().toISOString()}}async function e(u){return(await M("GET",`${Y(u)}/_mapping`))[u]?.mappings?._meta?.stacks||{}}async function F(u,y){let f;try{f=await e(u)}catch($){if(!($ instanceof C)||$.status!==404)throw $;await M("PUT",Y(u)),f={}}return await M("PUT",`${Y(u)}/_mapping`,{_meta:{stacks:{...f,...y}}}),Q(u,"settingsUpdate")}async function vy(u,y={}){if(typeof y==="string")y={q:y};let f=String(y.q??y.query??""),$=Math.max(1,Number(y.limit??y.perPage??20)),w=Math.max(0,Number(y.offset??(Number(y.page||1)-1)*$)),P=Array.isArray(y.filter)?y.filter:y.filter?[y.filter]:[],S=f?{multi_match:{query:f,fields:y.attributesToSearchOn||["*"]}}:{match_all:{}},J=P.length>0?{bool:{must:[S],filter:P.map((H)=>({query_string:{query:typeof H==="string"?H:JSON.stringify(H)}}))}}:S,U=await M("POST",`${Y(u)}/_search`,{query:J,from:w,size:$,...y.sort?{sort:y.sort}:{},...y.attributesToRetrieve?{_source:y.attributesToRetrieve}:{}}),_=typeof U.hits?.total==="number"?U.hits.total:Number(U.hits?.total?.value||0);return{hits:(U.hits?.hits||[]).map((H)=>({id:H._source?.id??H._id,...H._source})),estimatedTotalHits:_,processingTimeMs:Number(U.took||0),query:f,limit:$,offset:w}}async function jy(u,y={}){return await M("PUT",Y(u),y),Q(u,"indexCreation")}async function Iy(u){return await M("GET",Y(u))}async function Dy(u,y){return await M("PUT",`${Y(u)}/_settings`,y),Q(u,"indexUpdate")}async function ny(u){try{await M("DELETE",Y(u))}catch(y){if(!(y instanceof C)||y.status!==404)throw y}return Q(u,"indexDeletion")}async function nu(){let y=(await M("GET","/_cat/indices?format=json")).map((f)=>({uid:f.index,primaryKey:null,createdAt:null,updatedAt:null}));return{results:y,total:y.length,limit:y.length,offset:0}}async function pu(u,y){let f=y?.id??y?.objectID,$=f===void 0||f===null?`${Y(u)}/_doc?refresh=wait_for`:`${Y(u)}/_doc/${encodeURIComponent(String(f))}?refresh=wait_for`;return await M(f===void 0||f===null?"POST":"PUT",$,y),Q(u,"documentAdditionOrUpdate")}async function Nu(u,y){if(!Array.isArray(y))throw TypeError("[search/opensearch] addDocuments requires an array of documents");if(y.length===0)return Q(u,"documentAdditionOrUpdate");let f=y.flatMap((w)=>{let P=w?.id??w?.objectID;return[JSON.stringify({index:{_index:u,...P===void 0||P===null?{}:{_id:P}}}),JSON.stringify(w)]}),$=await M("POST","/_bulk?refresh=wait_for",`${f.join(`
2
+ var at=Object.defineProperty;var ct=(e)=>e;function ut(e,t){this[e]=ct.bind(null,t)}var E=(e,t)=>{for(var n in t)at(e,n,{get:t[n],enumerable:!0,configurable:!0,set:ut.bind(t,n)})};var R=(e,t)=>()=>(e&&(t=e(e=0)),t);var lt=import.meta.require;var U={};E(U,{algolia:()=>Be,browse:()=>He,clearObjects:()=>$e,clearRules:()=>Le,clearSynonyms:()=>Ce,configure:()=>me,copyIndex:()=>Oe,default:()=>Mt,deleteBy:()=>xe,deleteIndex:()=>_e,deleteObject:()=>Se,deleteObjects:()=>we,getObject:()=>ke,getObjects:()=>Ee,getSettings:()=>Re,indexExists:()=>ve,listIndices:()=>Ie,moveIndex:()=>qe,multiSearch:()=>he,partialUpdateObject:()=>Pe,saveObject:()=>Ae,saveObjects:()=>Te,saveRule:()=>Ne,saveSynonym:()=>Fe,search:()=>be,searchRules:()=>Ue,searchSynonyms:()=>Me,setSettings:()=>De,waitTask:()=>je});import{searchEngine as pe}from"@stacksjs/config";import{log as vt}from"@stacksjs/logging";function fe(){if(!I){let e=pe.algolia?.appId||process.env.ALGOLIA_APP_ID||"",t=pe.algolia?.apiKey||process.env.ALGOLIA_API_KEY||"";if(!e||!t)throw vt.error("Algolia credentials not configured. Set ALGOLIA_APP_ID and ALGOLIA_API_KEY."),Error("Algolia credentials not configured. Set ALGOLIA_APP_ID and ALGOLIA_API_KEY.");I={appId:e,apiKey:t}}return I}function jt(){let{appId:e}=fe();return`https://${e}.algolia.net`}function Ft(){let{appId:e,apiKey:t}=fe();return{"X-Algolia-Application-Id":e,"X-Algolia-API-Key":t,"Content-Type":"application/json"}}async function u(e,t,n){let r=await fetch(`${jt()}${t}`,{method:e,headers:Ft(),body:n?JSON.stringify(n):void 0});if(!r.ok){let s=await r.json().catch(()=>({message:r.statusText}));throw Error(`Algolia API error: ${s.message||r.statusText}`)}return r.json()}function me(e){I=e}async function be(e,t={}){return u("POST",`/1/indexes/${e}/query`,{query:t.query||"",page:t.page||0,hitsPerPage:t.hitsPerPage||20,filters:t.filters,facets:t.facets,attributesToRetrieve:t.attributesToRetrieve,attributesToHighlight:t.attributesToHighlight,attributesToSnippet:t.attributesToSnippet})}async function he(e){return u("POST","/1/indexes/*/queries",{requests:e.map((t)=>({indexName:t.indexName,params:new URLSearchParams({query:t.params?.query||"",page:String(t.params?.page||0),hitsPerPage:String(t.params?.hitsPerPage||20),...t.params?.filters&&{filters:t.params.filters}}).toString()}))})}async function Ae(e,t,n){if(n)return u("PUT",`/1/indexes/${e}/${n}`,t);return u("POST",`/1/indexes/${e}`,t)}async function Te(e,t){return u("POST",`/1/indexes/${e}/batch`,{requests:t.map((n)=>({action:n.objectID?"updateObject":"addObject",body:n}))})}async function Pe(e,t,n,r=!0){return u("POST",`/1/indexes/${e}/${t}/partial${r?"":"?createIfNotExists=false"}`,n)}async function Se(e,t){return u("DELETE",`/1/indexes/${e}/${t}`)}async function we(e,t){return u("POST",`/1/indexes/${e}/batch`,{requests:t.map((n)=>({action:"deleteObject",body:{objectID:n}}))})}async function xe(e,t){return u("POST",`/1/indexes/${e}/deleteByQuery`,{filters:t})}async function ke(e,t,n){let r=n?`?attributesToRetrieve=${n.join(",")}`:"";return u("GET",`/1/indexes/${e}/${t}${r}`)}async function Ee(e,t,n){return u("POST","/1/indexes/*/objects",{requests:t.map((r)=>({indexName:e,objectID:r,attributesToRetrieve:n}))})}async function $e(e){return u("POST",`/1/indexes/${e}/clear`)}async function Re(e){return u("GET",`/1/indexes/${e}/settings`)}async function De(e,t,n=!1){return u("PUT",`/1/indexes/${e}/settings${n?"?forwardToReplicas=true":""}`,t)}async function Ie(){return u("GET","/1/indexes")}async function Oe(e,t,n){return u("POST",`/1/indexes/${e}/operation`,{operation:"copy",destination:t,scope:n})}async function qe(e,t){return u("POST",`/1/indexes/${e}/operation`,{operation:"move",destination:t})}async function _e(e){return u("DELETE",`/1/indexes/${e}`)}async function ve(e){try{return await u("GET",`/1/indexes/${e}/settings`),!0}catch{return!1}}async function je(e,t,n=1e4,r=100){let s=Date.now();while(Date.now()-s<n){let o=await u("GET",`/1/indexes/${e}/task/${t}`);if(o.status==="published")return o;await new Promise((a)=>setTimeout(a,r))}throw Error(`Task ${t} timed out after ${n}ms`)}async function Fe(e,t,n=!1){return u("PUT",`/1/indexes/${e}/synonyms/${t.objectID}${n?"?forwardToReplicas=true":""}`,t)}async function Me(e,t="",n,r=0,s=20){return u("POST",`/1/indexes/${e}/synonyms/search`,{query:t,type:n,page:r,hitsPerPage:s})}async function Ce(e,t=!1){return u("POST",`/1/indexes/${e}/synonyms/clear${t?"?forwardToReplicas=true":""}`)}async function Ne(e,t,n=!1){return u("PUT",`/1/indexes/${e}/rules/${t.objectID}${n?"?forwardToReplicas=true":""}`,t)}async function Ue(e,t="",n,r,s=0,o=20){return u("POST",`/1/indexes/${e}/rules/search`,{query:t,anchoring:n,context:r,page:s,hitsPerPage:o})}async function Le(e,t=!1){return u("POST",`/1/indexes/${e}/rules/clear${t?"?forwardToReplicas=true":""}`)}async function*He(e,t={}){let n;do{let r=await u("POST",`/1/indexes/${e}/browse`,{...t,cursor:n});for(let s of r.hits)yield s;n=r.cursor}while(n)}var I=null,Be,Mt;var L=R(()=>{Be={configure:me,search:be,multiSearch:he,saveObject:Ae,saveObjects:Te,partialUpdateObject:Pe,deleteObject:Se,deleteObjects:we,deleteBy:xe,getObject:ke,getObjects:Ee,clearObjects:$e,getSettings:Re,setSettings:De,listIndices:Ie,copyIndex:Oe,moveIndex:qe,deleteIndex:_e,indexExists:ve,waitTask:je,saveSynonym:Fe,searchSynonyms:Me,clearSynonyms:Ce,saveRule:Ne,searchRules:Ue,clearRules:Le,browse:He},Mt=Be});var te={};E(te,{default:()=>Vt});import{searchEngine as Ct}from"@stacksjs/config";function Z(){let e=Ct.opensearch,t=String(e?.host||"localhost").replace(/\/+$/,""),n=/^https?:\/\//i.test(t),r=String(e?.protocol||"http").replace(/:$/,""),s=Number(e?.port||9200),o=`${r}://${t}${s?`:${s}`:""}`;if(n){let a=new URL(t);if(!a.port&&e?.port)a.port=String(e.port);o=a.toString().replace(/\/+$/,"")}return{baseUrl:o,auth:String(e?.auth||"")}}function Nt(e="application/json"){let{auth:t}=Z();return{"Content-Type":e,...t?{Authorization:`Basic ${btoa(t)}`}:{}}}async function f(e,t,n,r){let{baseUrl:s}=Z(),o=await fetch(`${s}${t}`,{method:e,headers:Nt(r),body:n===void 0?void 0:typeof n==="string"?n:JSON.stringify(n)});if(!o.ok){let d=await o.text();throw new q(o.status,e,t,d||o.statusText)}let a=await o.text();return a?JSON.parse(a):{}}function m(e){return`/${encodeURIComponent(e)}`}function T(e,t){return{taskUid:Date.now(),indexUid:e,status:"succeeded",type:t,enqueuedAt:new Date().toISOString()}}async function ee(e){return(await f("GET",`${m(e)}/_mapping`))[e]?.mappings?._meta?.stacks||{}}async function O(e,t){let n;try{n=await ee(e)}catch(r){if(!(r instanceof q)||r.status!==404)throw r;await f("PUT",m(e)),n={}}return await f("PUT",`${m(e)}/_mapping`,{_meta:{stacks:{...n,...t}}}),T(e,"settingsUpdate")}async function Ut(e,t={}){if(typeof t==="string")t={q:t};let n=String(t.q??t.query??""),r=Math.max(1,Number(t.limit??t.perPage??20)),s=Math.max(0,Number(t.offset??(Number(t.page||1)-1)*r)),o=Array.isArray(t.filter)?t.filter:t.filter?[t.filter]:[],a=n?{multi_match:{query:n,fields:t.attributesToSearchOn||["*"]}}:{match_all:{}},d=o.length>0?{bool:{must:[a],filter:o.map((p)=>({query_string:{query:typeof p==="string"?p:JSON.stringify(p)}}))}}:a,l=await f("POST",`${m(e)}/_search`,{query:d,from:s,size:r,...t.sort?{sort:t.sort}:{},...t.attributesToRetrieve?{_source:t.attributesToRetrieve}:{}}),c=typeof l.hits?.total==="number"?l.hits.total:Number(l.hits?.total?.value||0);return{hits:(l.hits?.hits||[]).map((p)=>({id:p._source?.id??p._id,...p._source})),estimatedTotalHits:c,processingTimeMs:Number(l.took||0),query:n,limit:r,offset:s}}async function Lt(e,t={}){return await f("PUT",m(e),t),T(e,"indexCreation")}async function Ht(e){return await f("GET",m(e))}async function Bt(e,t){return await f("PUT",`${m(e)}/_settings`,t),T(e,"indexUpdate")}async function Gt(e){try{await f("DELETE",m(e))}catch(t){if(!(t instanceof q)||t.status!==404)throw t}return T(e,"indexDeletion")}async function Ge(){let t=(await f("GET","/_cat/indices?format=json")).map((n)=>({uid:n.index,primaryKey:null,createdAt:null,updatedAt:null}));return{results:t,total:t.length,limit:t.length,offset:0}}async function Ke(e,t){let n=t?.id??t?.objectID,r=n===void 0||n===null?`${m(e)}/_doc?refresh=wait_for`:`${m(e)}/_doc/${encodeURIComponent(String(n))}?refresh=wait_for`;return await f(n===void 0||n===null?"POST":"PUT",r,t),T(e,"documentAdditionOrUpdate")}async function ze(e,t){if(!Array.isArray(t))throw TypeError("[search/opensearch] addDocuments requires an array of documents");if(t.length===0)return T(e,"documentAdditionOrUpdate");let n=t.flatMap((s)=>{let o=s?.id??s?.objectID;return[JSON.stringify({index:{_index:e,...o===void 0||o===null?{}:{_id:o}}}),JSON.stringify(s)]}),r=await f("POST","/_bulk?refresh=wait_for",`${n.join(`
3
3
  `)}
4
- `,"application/x-ndjson");if($.errors){let w=$.items?.filter((P)=>Number(P.index?.status||0)>=400)||[];throw Error(`[search/opensearch] Bulk indexing failed for ${w.length} document(s)`)}return Q(u,"documentAdditionOrUpdate")}async function py(u,y,f){let $=f?`?_source=${encodeURIComponent(Array.isArray(f)?f.join(","):String(f))}`:"",w=await M("GET",`${Y(u)}/_doc/${encodeURIComponent(String(y))}${$}`);return{id:w._source?.id??w._id,...w._source}}async function Ny(u,y){return await M("DELETE",`${Y(u)}/_doc/${encodeURIComponent(String(y))}?refresh=wait_for`),Q(u,"documentDeletion")}async function iy(u,y){let f=(Array.isArray(y)?y:[y]).filter(Boolean);return await M("POST",`${Y(u)}/_delete_by_query?refresh=true`,{query:f.length>0?{bool:{filter:f.map(($)=>({query_string:{query:$}}))}}:{match_all:{}}}),Q(u,"documentDeletion")}function W(u,y){return{get:async(f)=>(await e(f))[u]??y,update:async(f,$)=>F(f,{[u]:$}),reset:async(f)=>F(f,{[u]:y})}}async function ly(u){let y=await e(u);return{filterableAttributes:y.filterableAttributes||[],searchableAttributes:y.searchableAttributes||[],sortableAttributes:y.sortableAttributes||[],displayedAttributes:y.displayedAttributes||[],pagination:y.pagination||{},synonyms:y.synonyms||{},rankingRules:y.rankingRules||[],distinctAttribute:y.distinctAttribute??null,faceting:y.faceting||{},typoTolerance:y.typoTolerance||{},dictionary:y.dictionary||[]}}async function sy(u,y){let $=Object.fromEntries(["filterableAttributes","searchableAttributes","sortableAttributes","displayedAttributes","pagination","synonyms","rankingRules","distinctAttribute","faceting","typoTolerance","dictionary"].filter((w)=>(w in y)).map((w)=>[w,y[w]]));return await F(u,$)}async function xy(u){return await F(u,{filterableAttributes:[],searchableAttributes:[],sortableAttributes:[],displayedAttributes:[],pagination:{},synonyms:{},rankingRules:[],distinctAttribute:null,faceting:{},typoTolerance:{},dictionary:[]})}var C,I,D,n,p,N,i,l,s,x,m,d,my,dy;var yu=B(()=>{C=class C extends Error{status;constructor(u,y,f,$){super(`[search/opensearch] ${y} ${f} failed (${u}): ${$}`);this.status=u}};I=W("filterableAttributes",[]),D=W("searchableAttributes",[]),n=W("sortableAttributes",[]),p=W("displayedAttributes",[]),N=W("pagination",{}),i=W("synonyms",{}),l=W("rankingRules",[]),s=W("distinctAttribute",null),x=W("faceting",{}),m=W("typoTolerance",{}),d=W("dictionary",[]);my={client:()=>({request:M,configuration:a}),search:vy,createIndex:jy,getIndex:Iy,updateIndex:Dy,deleteIndex:ny,listAllIndexes:nu,listAllIndices:nu,addDocument:pu,addDocuments:Nu,updateDocument:pu,updateDocuments:Nu,getDocument:py,deleteDocument:Ny,deleteDocuments:iy,getFilterableAttributes:I.get,updateFilterableAttributes:I.update,resetFilterableAttributes:I.reset,getSearchableAttributes:D.get,updateSearchableAttributes:D.update,resetSearchableAttributes:D.reset,getSortableAttributes:n.get,updateSortableAttributes:n.update,resetSortableAttributes:n.reset,getDisplayedAttributes:p.get,updateDisplayedAttributes:p.update,resetDisplayedAttributes:p.reset,getSettings:ly,updateSettings:sy,resetSettings:xy,getPagination:N.get,updatePagination:N.update,resetPagination:N.reset,getSynonyms:i.get,updateSynonyms:i.update,resetSynonyms:i.reset,getRankingRules:l.get,updateRankingRules:l.update,resetRankingRules:l.reset,getDistinctAttribute:s.get,updateDistinctAttribute:s.update,resetDistinctAttribute:s.reset,getFaceting:x.get,updateFaceting:x.update,resetFaceting:x.reset,getTypoTolerance:m.get,updateTypoTolerance:m.update,resetTypoTolerance:m.reset,getDictionary:d.get,updateDictionary:d.update,resetDictionary:d.reset},dy=my});var wu={};L(wu,{default:()=>Af});import{searchEngine as r}from"@stacksjs/config";import{log as ay}from"@stacksjs/logging";function xu(){if(!h){let u=r.typesense?.host||process.env.TYPESENSE_HOST||"127.0.0.1",y=r.typesense?.port||Number(process.env.TYPESENSE_PORT||8108),f=r.typesense?.protocol||process.env.TYPESENSE_PROTOCOL||"http",$=r.typesense?.apiKey||process.env.TYPESENSE_API_KEY||"xyz";h={host:u,port:y,protocol:f,apiKey:$}}return h}function mu(){let{protocol:u,host:y,port:f}=xu();return`${u}://${y}:${f}`}function du(){return{"Content-Type":"application/json","X-TYPESENSE-API-KEY":xu().apiKey}}function g(u){return{taskUid:0,indexUid:u,status:"succeeded",type:"documentAddition",enqueuedAt:new Date}}async function X(u,y,f){let $=await fetch(`${mu()}${y}`,{method:u,headers:du(),body:f==null?void 0:JSON.stringify(f)});if(!$.ok){let w=await $.text().catch(()=>"");throw Error(`[search/typesense] ${u} ${y} failed (${$.status}): ${w}`)}if($.status===204)return;return await $.json()}function ey(u){if(!u)return;let y=[];for(let f in u){if(!Object.prototype.hasOwnProperty.call(u,f))continue;if(!au.test(f))throw Error(`[search/typesense] Refusing to build filter with unsafe field name: ${f}`);let $=u[f];if($==null||$==="")continue;let w=String($).replace(/`/g,"\\`");y.push(`${f}:=\`${w}\``)}return y.length?y.join(" && "):void 0}function uf(u){if(!u)return;let y=[];for(let f in u){if(!Object.prototype.hasOwnProperty.call(u,f))continue;if(!au.test(f))continue;let $=String(u[f]).toLowerCase()==="desc"?"desc":"asc";y.push(`${f}:${$}`)}return y.length?y.join(","):void 0}function yf(u){if(typeof u==="boolean")return"bool";if(typeof u==="number")return Number.isInteger(u)?"int64":"float";if(Array.isArray(u)){let y=u[0];if(typeof y==="boolean")return"bool[]";if(typeof y==="number")return Number.isInteger(y)?"int64[]":"float[]";return"string[]"}return"string"}async function b(u,y,f){try{await X("GET",`/collections/${u}`);return}catch{}if(!y)return;let $=new Set(["id"]),w=f?.searchableAttributes??[],P=f?.filterableAttributes??[],S=f?.sortableAttributes??[],J=f?.displayedAttributes??[];for(let _ of[...w,...P,...S,...J])if(typeof _==="string")$.add(_);else for(let Z of _.attributePatterns)$.add(Z);if(y){for(let _ of Object.keys(y))$.add(_);for(let _ of $)if(y[_]===void 0)y[_]=""}let U=[...$].map((_)=>({name:_,type:_==="id"?"string":yf(y[_]),facet:P.includes(_),sort:S.includes(_),optional:_!=="id"}));await X("POST","/collections",{name:u,fields:U})}function fu(u){let y={};for(let[f,$]of Object.entries(u)){if($==null)continue;if(f==="id"||typeof $==="bigint")y[f]=String($);else y[f]=$}if(u.id!=null&&y.id==null)y.id=String(u.id);return y}async function ff(u,y){let f=Number(y.page)||1,$=Number(y.perPage)||20,w=(f-1)*$,P=y.filter_by||ey(y.filter),S=uf(y.sort),J=y.queryBy?.join(",")||y.query_by;if(!J)throw Error(`[search/typesense] search on "${u}" needs fields to search by. Pass \`query_by\`, or declare \`searchable\` on the model's \`useSearch\` trait so it can be supplied for you.`);let U=y.query??y.q,_=U==null||U===""?"*":String(U),Z=new URLSearchParams({q:_,query_by:J,per_page:String($),page:String(f)});if(P)Z.set("filter_by",P);if(S)Z.set("sort_by",S);let H=await X("GET",`/collections/${u}/documents/search?${Z}`),V=(H.hits??[]).map((E)=>E.document);return{hits:V,query:_,processingTimeMs:H.search_time_ms??0,limit:$,offset:w,estimatedTotalHits:H.found??V.length}}async function iu(u,y){let f=fu(y);return await b(u,f),await X("POST",`/collections/${u}/documents?action=upsert`,f),g(u)}async function lu(u,y){if(!Array.isArray(y)||y.length===0)return g(u);let f=y.map(fu);await b(u,f[0]);let $=f.map((P)=>JSON.stringify(P)).join(`
5
- `),w=await fetch(`${mu()}/collections/${u}/documents/import?action=upsert`,{method:"POST",headers:{...du(),"Content-Type":"text/plain"},body:$});if(!w.ok){let P=await w.text().catch(()=>"");throw Error(`[search/typesense] bulk import failed (${w.status}): ${P}`)}return g(u)}async function $f(u,y){return await X("DELETE",`/collections/${u}/documents/${String(y)}`),g(u)}async function su(u){try{await X("DELETE",`/collections/${u}`)}catch(y){ay.debug(`[search/typesense] deleteIndex ${u}: ${y.message}`)}return g(u)}async function wf(u,y){let f=y?.sampleDocument;return await b(u,f?fu(f):void 0,y?.settings),g(u)}async function tf(u){return await X("GET",`/collections/${u}`)}async function Pf(u,y){return await b(u,void 0,y),g(u)}async function $u(u){return((await X("GET",`/collections/${u}`)).fields??[]).map((f)=>f.name).filter((f)=>f!=="id")}async function eu(u){return((await X("GET",`/collections/${u}`)).fields??[]).filter((f)=>f.facet).map((f)=>f.name)}async function uy(u){return((await X("GET",`/collections/${u}`)).fields??[]).map((f)=>f.name)}async function yy(u){return $u(u)}async function Sf(u){return{searchableAttributes:await $u(u),filterableAttributes:await eu(u),sortableAttributes:await uy(u),displayedAttributes:await yy(u)}}function O(u,y){return Promise.resolve(g("typesense"))}var h=null,au,_f,Af;var tu=B(()=>{au=/^[a-z_][\w]*(?:\.[a-z_][\w]*)*$/i;_f={client:()=>({}),resetClient:()=>{h=null},search:ff,getIndex:tf,createIndex:wf,deleteIndex:su,updateIndex:O,listAllIndexes:async()=>({results:[]}),listAllIndices:async()=>({results:[]}),addDocument:iu,addDocuments:lu,updateDocument:(u,y)=>iu(u,y),updateDocuments:(u,y)=>lu(u,y),deleteDocument:$f,deleteDocuments:async(u)=>su(u),getDocument:async()=>g("typesense"),getFilterableAttributes:eu,updateFilterableAttributes:O,resetFilterableAttributes:O,updateDisplayedAttributes:O,resetDisplayedAttributes:O,getDisplayedAttributes:yy,updateSearchableAttributes:O,resetSearchableAttributes:O,getSearchableAttributes:$u,updateSortableAttributes:O,resetSortableAttributes:O,getSortableAttributes:uy,getSettings:Sf,updateSettings:Pf,resetSettings:O,getPagination:async()=>({}),updatePagination:O,resetPagination:O,getSynonyms:async()=>({}),updateSynonyms:O,resetSynonyms:O,getRankingRules:async()=>[],updateRankingRules:O,resetRankingRules:O,getDistinctAttribute:async()=>null,updateDistinctAttribute:O,resetDistinctAttribute:O,getFaceting:async()=>({}),updateFaceting:O,resetFaceting:O,getTypoTolerance:async()=>({}),updateTypoTolerance:O,resetTypoTolerance:O,getDictionary:async()=>({}),updateDictionary:O,resetDictionary:O},Af=_f});var Su={};L(Su,{default:()=>U$});import{searchEngine as fy}from"@stacksjs/config";function t(){if(!Pu)throw Error("The `meilisearch` search driver is selected but the `meilisearch` package is not installed. It is an opt-in dependency - run `bun add meilisearch` to enable it, or switch drivers in `config/search-engine.ts`.");if(!c){let u=fy.meilisearch?.host||"http://127.0.0.1:7700",y=fy.meilisearch?.apiKey||"";if(!u)throw Error("Meilisearch host is not configured. Please specify a search engine host.");c=new Pu({host:u,apiKey:y})}return c}function Uf(){c=null}async function Of(u,y){let f=Number(y.page)||1,$=Number(y.perPage)||20,w=(f-1)*$,P=S$(y.filter),S=_$(y.sort);return await t().index(u).search(y.query,{limit:$,filter:P,sort:S,offset:w})}async function Jf(u,y){return await t().index(u).addDocuments([y])}async function Gf(u,y){if(!Array.isArray(y))throw TypeError("[search/meilisearch] addDocuments requires an array of documents");if(y.length<=1000)return await t().index(u).addDocuments(y);let $;for(let w=0;w<y.length;w+=1000){let P=y.slice(w,w+1000),S=await t().index(u).addDocuments(P);if(!$)$=S}return $}async function Hf(u){return await t().getIndex(u)}async function Mf(u,y){return await t().createIndex(u,y)}async function Yf(u,y){return await t().updateIndex(u,y)}async function Zf(u,y){return await t().index(u).updateDocuments([y])}async function Wf(u,y){return await t().index(u).updateDocuments(y)}async function Xf(u,y){return await t().index(u).deleteDocument(y)}async function Qf(u,y){return await t().index(u).deleteDocuments({filter:y})}async function gf(u,y,f){return await t().index(u).getDocument(y,f)}async function Vf(u){return await t().deleteIndex(u)}async function $y(){return await t().getIndexes()}async function zf(u){return t().index(u).getFilterableAttributes()}async function Ef(u,y){return t().index(u).updateFilterableAttributes(y)}async function Kf(u){return t().index(u).resetFilterableAttributes()}async function Lf(u,y){return t().index(u).updateSearchableAttributes(y)}async function Bf(u){return t().index(u).resetSearchableAttributes()}async function Tf(u){return t().index(u).getSearchableAttributes()}async function Rf(u,y){return t().index(u).updateSortableAttributes(y)}async function Ff(u){return t().index(u).resetSortableAttributes()}async function Cf(u){return t().index(u).getSortableAttributes()}async function rf(u,y){return t().index(u).updateDisplayedAttributes(y)}async function hf(u){return t().index(u).getDisplayedAttributes()}async function bf(u){return t().index(u).resetDisplayedAttributes()}async function cf(u){return t().index(u).getSettings()}async function of(u,y){return t().index(u).updateSettings(y)}async function qf(u){return t().index(u).resetSettings()}async function kf(u){return t().index(u).getPagination()}async function vf(u,y){return t().index(u).updatePagination(y)}async function jf(u){return t().index(u).resetPagination()}async function If(u){return t().index(u).getSynonyms()}async function Df(u,y){return t().index(u).updateSynonyms(y)}async function nf(u){return t().index(u).resetSynonyms()}async function pf(u){return t().index(u).getRankingRules()}async function Nf(u,y){return t().index(u).updateRankingRules(y)}async function lf(u){return t().index(u).resetRankingRules()}async function sf(u){return t().index(u).getDistinctAttribute()}async function xf(u,y){return t().index(u).updateDistinctAttribute(y)}async function mf(u){return t().index(u).resetDistinctAttribute()}async function df(u){return t().index(u).getFaceting()}async function af(u,y){return t().index(u).updateFaceting(y)}async function ef(u){return t().index(u).resetFaceting()}async function u$(u){return t().index(u).getTypoTolerance()}async function y$(u,y){return t().index(u).updateTypoTolerance(y)}async function f$(u){return t().index(u).resetTypoTolerance()}async function $$(u){return t().index(u).getDictionary()}async function w$(u,y){return t().index(u).updateDictionary(y)}async function t$(u){return t().index(u).resetDictionary()}function S$(u){if(!u)return[];let y=[];for(let f in u){if(!Object.prototype.hasOwnProperty.call(u,f))continue;if(!P$.test(f))throw Error(`[search/meilisearch] Refusing to build filter with unsafe field name: ${f}`);let $=u[f],w=String($).replace(/'/g,"\\'");y.push(`${f}='${w}'`)}return y}function _$(u){if(!u)return[];let y=[];for(let f in u)if(Object.prototype.hasOwnProperty.call(u,f)){let w=String(u[f]).toLowerCase()==="desc"?"desc":"asc";y.push(`${f}:${w}`)}return y}var Pu,c=null,P$,A$,U$;var _u=B(async()=>{try{({Meilisearch:Pu}=await import("meilisearch"))}catch{}P$=/^[a-z_][\w]*(?:\.[a-z_][\w]*)*$/i;A$={client:t,resetClient:Uf,search:Of,getIndex:Hf,createIndex:Mf,deleteIndex:Vf,updateIndex:Yf,listAllIndexes:$y,listAllIndices:$y,addDocument:Jf,addDocuments:Gf,updateDocument:Zf,updateDocuments:Wf,deleteDocument:Xf,deleteDocuments:Qf,getDocument:gf,getFilterableAttributes:zf,updateFilterableAttributes:Ef,resetFilterableAttributes:Kf,updateDisplayedAttributes:rf,resetDisplayedAttributes:bf,getDisplayedAttributes:hf,updateSearchableAttributes:Lf,resetSearchableAttributes:Bf,getSearchableAttributes:Tf,updateSortableAttributes:Rf,resetSortableAttributes:Ff,getSortableAttributes:Cf,getSettings:cf,updateSettings:of,resetSettings:qf,getPagination:kf,updatePagination:vf,resetPagination:jf,getSynonyms:If,updateSynonyms:Df,resetSynonyms:nf,getRankingRules:pf,updateRankingRules:Nf,resetRankingRules:lf,getDistinctAttribute:sf,updateDistinctAttribute:xf,resetDistinctAttribute:mf,getFaceting:df,updateFaceting:af,resetFaceting:ef,getTypoTolerance:u$,updateTypoTolerance:y$,resetTypoTolerance:f$,getDictionary:$$,updateDictionary:w$,resetDictionary:t$},U$=A$});import{overridesReady as O$,searchEngine as wy}from"@stacksjs/config";import{err as Uy,ok as Oy}from"@stacksjs/error-handling";import{log as z}from"@stacksjs/logging";import{getModelName as Jy,getTableName as Gy}from"@stacksjs/orm";import{path as Uu}from"@stacksjs/path";import{useSearchEngine as Hy}from"@stacksjs/search-engine";import{globSync as My}from"@stacksjs/storage";import{snakeCase as T}from"@stacksjs/strings";async function g$(u){try{let y=My([Uu.userModelsPath("*.ts"),Uu.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),{addDocument:f,updateSettings:$}=Hy();for(let w of y){let P=(await import(w)).default,S=P.traits?.useSearch,J=Gy(P,w),U=Jy(P,w);if(u&&U!==u)continue;if(S&&(typeof S==="boolean"||typeof S==="object")){if(typeof S==="object")await $(J,{searchableAttributes:(S.searchable??[]).map((G)=>T(G)),filterableAttributes:(S.filterable??[]).map((G)=>T(G)),sortableAttributes:(S.sortable??[]).map((G)=>T(G)),displayedAttributes:(S.displayable??[]).map((G)=>T(G))});let _=P;if(typeof _.all!=="function"){z.warn(`[search] ${U}: model has no .all() - run generate:model-files or use defineModel`);continue}let Z=_.makeAllSearchable;if(typeof Z==="function"){let G=await Z.call(_);z.info(`[search] ${U}: imported ${G}, skipped 0`);continue}let H=typeof S==="object"?S.denormalize:void 0,V=H?Array.from(new Set(Object.values(H).map((G)=>G.split(".")[0]).filter((G)=>Boolean(G)))):[],E;if(V.length>0&&typeof _.query==="function")try{E=await _.query().with(...V).get()}catch(G){z.warn(`[search] ${U}: eager-load of [${V.join(", ")}] failed - falling back to .all(); denormalized fields will be null. (${G.message})`),E=await _.all()}else E=await _.all();let Au=0,q=0;for(let G of E)try{let K=G.toSearchableObject?.();if(K==null){q++;continue}await f(J,K),Au++}catch(K){q++,z.warn(`[search] Skipped ${U}#${G.id??"?"}: ${K.message}`)}z.info(`[search] ${U}: imported ${Au}, skipped ${q}`)}}return z.info(u),Oy("Successfully imported models to search engine!")}catch(y){return z.error(y),Uy(y?.message||String(y))}}import{ok as Yy}from"@stacksjs/error-handling";import{log as Zy}from"@stacksjs/logging";import{getModelName as Wy,getTableName as Xy}from"@stacksjs/orm";import{path as Ou}from"@stacksjs/path";import{useSearchEngine as Qy}from"@stacksjs/search-engine";import{globSync as gy}from"@stacksjs/storage";async function R$(u){try{let y=gy([Ou.userModelsPath("*.ts"),Ou.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),{deleteIndex:f}=Qy();for(let $ of y){let w=(await import($)).default,P=w.traits?.useSearch,S=Xy(w,$),J=Wy(w,$);if(u&&J!==u)continue;if(P&&(typeof P==="boolean"||typeof P==="object"))await f(S)}return Yy("Successfully flushed all model data from search engine!")}catch(y){return Zy.error(y),y(y)}}import{ok as Vy}from"@stacksjs/error-handling";import{log as zy}from"@stacksjs/logging";import{getTableName as Ey}from"@stacksjs/orm";import{path as Ky}from"@stacksjs/path";import{useSearchEngine as Ly}from"@stacksjs/search-engine";async function o$(u){try{let y=Ky.userModelsPath(`${u}.ts`),f=(await import(y)).default,{getFilterableAttributes:$,getSortableAttributes:w,getSearchableAttributes:P,getDisplayedAttributes:S}=Ly(),J=f.traits?.useSearch,U=Ey(f,y);if(J&&typeof J==="object"){let _=await S(U),Z=await $(U),H=await w(U),V=await P(U);console.table({displayedAttributes:_,filterableAttributes:Z,sortableAttributes:H,searchableAttributes:V})}return Vy("Successfully update index settings!")}catch(y){return zy.error(y),y(y)}}import{err as By,ok as Ty}from"@stacksjs/error-handling";import{log as Ry}from"@stacksjs/logging";import{getTableName as Fy}from"@stacksjs/orm";import{path as Ju}from"@stacksjs/path";import{useSearchEngine as Cy}from"@stacksjs/search-engine";import{globSync as ry}from"@stacksjs/storage";import{snakeCase as k}from"@stacksjs/strings";async function N$(){try{let u=ry([Ju.userModelsPath("*.ts"),Ju.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),{updateSettings:y}=Cy();for(let f of u){let $=(await import(f)).default,w=$.traits?.useSearch,P=Fy($,f);if(w&&typeof w==="object"){let S=(typeof $.traits?.useSearch==="object"&&$.traits?.useSearch.filterable||[]).map((_)=>k(_)),J=(typeof $.traits?.useSearch==="object"&&$.traits?.useSearch.sortable||[]).map((_)=>k(_)),U=(typeof $.traits?.useSearch==="object"&&$.traits?.useSearch.searchable||[]).map((_)=>k(_));await y(P,{filterableAttributes:S,sortableAttributes:J,searchableAttributes:U})}}return Ty("Successfully update index settings!")}catch(u){return Ry.error(u),By(u?.message||String(u))}}function J$(u){if(u==="algolia")return Promise.resolve().then(() => (j(),v));if(u==="opensearch")return Promise.resolve().then(() => (yu(),uu));if(u==="typesense")return Promise.resolve().then(() => (tu(),wu));return _u().then(() => Su)}var o,ty=(async()=>{return await O$,o=(await J$(wy.driver)).default,o})();function uw(){return new Proxy({},{get(u,y){if(o)return Reflect.get(o,y);return(...f)=>ty.then(($)=>{let w=Reflect.get($,y);return typeof w==="function"?w.apply($,f):w})}})}function yw(){return ty}function fw(){return Promise.resolve().then(() => (j(),v)).then((u)=>u.default)}function $w(){return _u().then(() => Su).then((u)=>u.default)}function ww(){return Promise.resolve().then(() => (yu(),uu)).then((u)=>u.default)}function tw(){return Promise.resolve().then(() => (tu(),wu)).then((u)=>u.default)}export{tw as useTypesense,uw as useSearchEngine,ww as useOpensearch,$w as useMeilisearch,fw as useAlgolia,N$ as updateIndexSettings,yw as searchEngineReady,o$ as listIndexSettings,g$ as importModelDocuments,R$ as flushModelDocuments};
4
+ `,"application/x-ndjson");if(r.errors){let s=r.items?.filter((o)=>Number(o.index?.status||0)>=400)||[];throw Error(`[search/opensearch] Bulk indexing failed for ${s.length} document(s)`)}return T(e,"documentAdditionOrUpdate")}async function Kt(e,t,n){let r=n?`?_source=${encodeURIComponent(Array.isArray(n)?n.join(","):String(n))}`:"",s=await f("GET",`${m(e)}/_doc/${encodeURIComponent(String(t))}${r}`);return{id:s._source?.id??s._id,...s._source}}async function zt(e,t){return await f("DELETE",`${m(e)}/_doc/${encodeURIComponent(String(t))}?refresh=wait_for`),T(e,"documentDeletion")}async function Wt(e,t){let n=(Array.isArray(t)?t:[t]).filter(Boolean);return await f("POST",`${m(e)}/_delete_by_query?refresh=true`,{query:n.length>0?{bool:{filter:n.map((r)=>({query_string:{query:r}}))}}:{match_all:{}}}),T(e,"documentDeletion")}function h(e,t){return{get:async(n)=>(await ee(n))[e]??t,update:async(n,r)=>O(n,{[e]:r}),reset:async(n)=>O(n,{[e]:t})}}async function Yt(e){let t=await ee(e);return{filterableAttributes:t.filterableAttributes||[],searchableAttributes:t.searchableAttributes||[],sortableAttributes:t.sortableAttributes||[],displayedAttributes:t.displayedAttributes||[],pagination:t.pagination||{},synonyms:t.synonyms||{},rankingRules:t.rankingRules||[],distinctAttribute:t.distinctAttribute??null,faceting:t.faceting||{},typoTolerance:t.typoTolerance||{},dictionary:t.dictionary||[]}}async function Jt(e,t){let r=Object.fromEntries(["filterableAttributes","searchableAttributes","sortableAttributes","displayedAttributes","pagination","synonyms","rankingRules","distinctAttribute","faceting","typoTolerance","dictionary"].filter((s)=>(s in t)).map((s)=>[s,t[s]]));return await O(e,r)}async function Qt(e){return await O(e,{filterableAttributes:[],searchableAttributes:[],sortableAttributes:[],displayedAttributes:[],pagination:{},synonyms:{},rankingRules:[],distinctAttribute:null,faceting:{},typoTolerance:{},dictionary:[]})}var q,H,B,G,K,z,W,Y,J,Q,X,V,Xt,Vt;var ne=R(()=>{q=class q extends Error{status;constructor(e,t,n,r){super(`[search/opensearch] ${t} ${n} failed (${e}): ${r}`);this.status=e}};H=h("filterableAttributes",[]),B=h("searchableAttributes",[]),G=h("sortableAttributes",[]),K=h("displayedAttributes",[]),z=h("pagination",{}),W=h("synonyms",{}),Y=h("rankingRules",[]),J=h("distinctAttribute",null),Q=h("faceting",{}),X=h("typoTolerance",{}),V=h("dictionary",[]);Xt={client:()=>({request:f,configuration:Z}),search:Ut,createIndex:Lt,getIndex:Ht,updateIndex:Bt,deleteIndex:Gt,listAllIndexes:Ge,listAllIndices:Ge,addDocument:Ke,addDocuments:ze,updateDocument:Ke,updateDocuments:ze,getDocument:Kt,deleteDocument:zt,deleteDocuments:Wt,getFilterableAttributes:H.get,updateFilterableAttributes:H.update,resetFilterableAttributes:H.reset,getSearchableAttributes:B.get,updateSearchableAttributes:B.update,resetSearchableAttributes:B.reset,getSortableAttributes:G.get,updateSortableAttributes:G.update,resetSortableAttributes:G.reset,getDisplayedAttributes:K.get,updateDisplayedAttributes:K.update,resetDisplayedAttributes:K.reset,getSettings:Yt,updateSettings:Jt,resetSettings:Qt,getPagination:z.get,updatePagination:z.update,resetPagination:z.reset,getSynonyms:W.get,updateSynonyms:W.update,resetSynonyms:W.reset,getRankingRules:Y.get,updateRankingRules:Y.update,resetRankingRules:Y.reset,getDistinctAttribute:J.get,updateDistinctAttribute:J.update,resetDistinctAttribute:J.reset,getFaceting:Q.get,updateFaceting:Q.update,resetFaceting:Q.reset,getTypoTolerance:X.get,updateTypoTolerance:X.update,resetTypoTolerance:X.reset,getDictionary:V.get,updateDictionary:V.update,resetDictionary:V.reset},Vt=Xt});var ie={};E(ie,{default:()=>gn});import{searchEngine as _}from"@stacksjs/config";import{log as Zt}from"@stacksjs/logging";function Qe(){if(!v){let e=_.typesense?.host||process.env.TYPESENSE_HOST||"127.0.0.1",t=_.typesense?.port||Number(process.env.TYPESENSE_PORT||8108),n=_.typesense?.protocol||process.env.TYPESENSE_PROTOCOL||"http",r=_.typesense?.apiKey||process.env.TYPESENSE_API_KEY||"xyz";v={host:e,port:t,protocol:n,apiKey:r}}return v}function Xe(){let{protocol:e,host:t,port:n}=Qe();return`${e}://${t}:${n}`}function Ve(){return{"Content-Type":"application/json","X-TYPESENSE-API-KEY":Qe().apiKey}}function P(e){return{taskUid:0,indexUid:e,status:"succeeded",type:"documentAddition",enqueuedAt:new Date}}async function A(e,t,n){let r=await fetch(`${Xe()}${t}`,{method:e,headers:Ve(),body:n==null?void 0:JSON.stringify(n)});if(!r.ok){let s=await r.text().catch(()=>"");throw Error(`[search/typesense] ${e} ${t} failed (${r.status}): ${s}`)}if(r.status===204)return;return await r.json()}function en(e){if(!e)return;let t=[];for(let n in e){if(!Object.prototype.hasOwnProperty.call(e,n))continue;if(!Ze.test(n))throw Error(`[search/typesense] Refusing to build filter with unsafe field name: ${n}`);let r=e[n];if(r==null||r==="")continue;let s=String(r).replace(/`/g,"\\`");t.push(`${n}:=\`${s}\``)}return t.length?t.join(" && "):void 0}function tn(e){if(!e)return;let t=[];for(let n in e){if(!Object.prototype.hasOwnProperty.call(e,n))continue;if(!Ze.test(n))continue;let r=String(e[n]).toLowerCase()==="desc"?"desc":"asc";t.push(`${n}:${r}`)}return t.length?t.join(","):void 0}function nn(e){if(typeof e==="boolean")return"bool";if(typeof e==="number")return Number.isInteger(e)?"int64":"float";if(Array.isArray(e)){let t=e[0];if(typeof t==="boolean")return"bool[]";if(typeof t==="number")return Number.isInteger(t)?"int64[]":"float[]";return"string[]"}return"string"}async function j(e,t,n){try{await A("GET",`/collections/${e}`);return}catch{}if(!t)return;let r=new Set(["id"]),s=n?.searchableAttributes??[],o=n?.filterableAttributes??[],a=n?.sortableAttributes??[],d=n?.displayedAttributes??[];for(let c of[...s,...o,...a,...d])if(typeof c==="string")r.add(c);else for(let b of c.attributePatterns)r.add(b);if(t){for(let c of Object.keys(t))r.add(c);for(let c of r)if(t[c]===void 0)t[c]=""}let l=[...r].map((c)=>({name:c,type:c==="id"?"string":nn(t[c]),facet:o.includes(c),sort:a.includes(c),optional:c!=="id"}));await A("POST","/collections",{name:e,fields:l})}function re(e){let t={};for(let[n,r]of Object.entries(e)){if(r==null)continue;if(n==="id"||typeof r==="bigint")t[n]=String(r);else t[n]=r}if(e.id!=null&&t.id==null)t.id=String(e.id);return t}async function rn(e,t){let n=Number(t.page)||1,r=Number(t.perPage)||20,s=(n-1)*r,o=t.filter_by||en(t.filter),a=tn(t.sort),d=t.queryBy?.join(",")||t.query_by;if(!d)throw Error(`[search/typesense] search on "${e}" needs fields to search by. Pass \`query_by\`, or declare \`searchable\` on the model's \`useSearch\` trait so it can be supplied for you.`);let l=t.query??t.q,c=l==null||l===""?"*":String(l),b=new URLSearchParams({q:c,query_by:d,per_page:String(r),page:String(n)});if(o)b.set("filter_by",o);if(a)b.set("sort_by",a);let p=await A("GET",`/collections/${e}/documents/search?${b}`),S=(p.hits??[]).map((x)=>x.document);return{hits:S,query:c,processingTimeMs:p.search_time_ms??0,limit:r,offset:s,estimatedTotalHits:p.found??S.length}}async function We(e,t){let n=re(t);return await j(e,n),await A("POST",`/collections/${e}/documents?action=upsert`,n),P(e)}async function Ye(e,t){if(!Array.isArray(t)||t.length===0)return P(e);let n=t.map(re);await j(e,n[0]);let r=n.map((o)=>JSON.stringify(o)).join(`
5
+ `),s=await fetch(`${Xe()}/collections/${e}/documents/import?action=upsert`,{method:"POST",headers:{...Ve(),"Content-Type":"text/plain"},body:r});if(!s.ok){let o=await s.text().catch(()=>"");throw Error(`[search/typesense] bulk import failed (${s.status}): ${o}`)}return P(e)}async function sn(e,t){return await A("DELETE",`/collections/${e}/documents/${String(t)}`),P(e)}async function Je(e){try{await A("DELETE",`/collections/${e}`)}catch(t){Zt.debug(`[search/typesense] deleteIndex ${e}: ${t.message}`)}return P(e)}async function on(e,t){let n=t?.sampleDocument;return await j(e,n?re(n):void 0,t?.settings),P(e)}async function an(e){return await A("GET",`/collections/${e}`)}async function cn(e,t){return await j(e,void 0,t),P(e)}async function se(e){return((await A("GET",`/collections/${e}`)).fields??[]).map((n)=>n.name).filter((n)=>n!=="id")}async function et(e){return((await A("GET",`/collections/${e}`)).fields??[]).filter((n)=>n.facet).map((n)=>n.name)}async function tt(e){return((await A("GET",`/collections/${e}`)).fields??[]).map((n)=>n.name)}async function nt(e){return se(e)}async function un(e){return{searchableAttributes:await se(e),filterableAttributes:await et(e),sortableAttributes:await tt(e),displayedAttributes:await nt(e)}}function g(e,t){return Promise.resolve(P("typesense"))}var v=null,Ze,ln,gn;var oe=R(()=>{Ze=/^[a-z_][\w]*(?:\.[a-z_][\w]*)*$/i;ln={client:()=>({}),resetClient:()=>{v=null},search:rn,getIndex:an,createIndex:on,deleteIndex:Je,updateIndex:g,listAllIndexes:async()=>({results:[]}),listAllIndices:async()=>({results:[]}),addDocument:We,addDocuments:Ye,updateDocument:(e,t)=>We(e,t),updateDocuments:(e,t)=>Ye(e,t),deleteDocument:sn,deleteDocuments:async(e)=>Je(e),getDocument:async()=>P("typesense"),getFilterableAttributes:et,updateFilterableAttributes:g,resetFilterableAttributes:g,updateDisplayedAttributes:g,resetDisplayedAttributes:g,getDisplayedAttributes:nt,updateSearchableAttributes:g,resetSearchableAttributes:g,getSearchableAttributes:se,updateSortableAttributes:g,resetSortableAttributes:g,getSortableAttributes:tt,getSettings:un,updateSettings:cn,resetSettings:g,getPagination:async()=>({}),updatePagination:g,resetPagination:g,getSynonyms:async()=>({}),updateSynonyms:g,resetSynonyms:g,getRankingRules:async()=>[],updateRankingRules:g,resetRankingRules:g,getDistinctAttribute:async()=>null,updateDistinctAttribute:g,resetDistinctAttribute:g,getFaceting:async()=>({}),updateFaceting:g,resetFaceting:g,getTypoTolerance:async()=>({}),updateTypoTolerance:g,resetTypoTolerance:g,getDictionary:async()=>({}),updateDictionary:g,resetDictionary:g},gn=ln});var ce={};E(ce,{default:()=>gr});import{searchEngine as rt}from"@stacksjs/config";function i(){if(!ae)throw Error("The `meilisearch` search driver is selected but the `meilisearch` package is not installed. It is an opt-in dependency - run `bun add meilisearch` to enable it, or switch drivers in `config/search-engine.ts`.");if(!F){let e=rt.meilisearch?.host||"http://127.0.0.1:7700",t=rt.meilisearch?.apiKey||"";if(!e)throw Error("Meilisearch host is not configured. Please specify a search engine host.");F=new ae({host:e,apiKey:t})}return F}function dn(){F=null}async function yn(e,t){let n=Number(t.page)||1,r=Number(t.perPage)||20,s=(n-1)*r,o=cr(t.filter),a=ur(t.sort);return await i().index(e).search(t.query,{limit:r,filter:o,sort:a,offset:s})}async function pn(e,t){return await i().index(e).addDocuments([t])}async function fn(e,t){if(!Array.isArray(t))throw TypeError("[search/meilisearch] addDocuments requires an array of documents");if(t.length<=1000)return await i().index(e).addDocuments(t);let r;for(let s=0;s<t.length;s+=1000){let o=t.slice(s,s+1000),a=await i().index(e).addDocuments(o);if(!r)r=a}return r}async function mn(e){return await i().getIndex(e)}async function bn(e,t){return await i().createIndex(e,t)}async function hn(e,t){return await i().updateIndex(e,t)}async function An(e,t){return await i().index(e).updateDocuments([t])}async function Tn(e,t){return await i().index(e).updateDocuments(t)}async function Pn(e,t){return await i().index(e).deleteDocument(t)}async function Sn(e,t){return await i().index(e).deleteDocuments({filter:t})}async function wn(e,t,n){return await i().index(e).getDocument(t,n)}async function xn(e){return await i().deleteIndex(e)}async function st(){return await i().getIndexes()}async function kn(e){return i().index(e).getFilterableAttributes()}async function En(e,t){return i().index(e).updateFilterableAttributes(t)}async function $n(e){return i().index(e).resetFilterableAttributes()}async function Rn(e,t){return i().index(e).updateSearchableAttributes(t)}async function Dn(e){return i().index(e).resetSearchableAttributes()}async function In(e){return i().index(e).getSearchableAttributes()}async function On(e,t){return i().index(e).updateSortableAttributes(t)}async function qn(e){return i().index(e).resetSortableAttributes()}async function _n(e){return i().index(e).getSortableAttributes()}async function vn(e,t){return i().index(e).updateDisplayedAttributes(t)}async function jn(e){return i().index(e).getDisplayedAttributes()}async function Fn(e){return i().index(e).resetDisplayedAttributes()}async function Mn(e){return i().index(e).getSettings()}async function Cn(e,t){return i().index(e).updateSettings(t)}async function Nn(e){return i().index(e).resetSettings()}async function Un(e){return i().index(e).getPagination()}async function Ln(e,t){return i().index(e).updatePagination(t)}async function Hn(e){return i().index(e).resetPagination()}async function Bn(e){return i().index(e).getSynonyms()}async function Gn(e,t){return i().index(e).updateSynonyms(t)}async function Kn(e){return i().index(e).resetSynonyms()}async function zn(e){return i().index(e).getRankingRules()}async function Wn(e,t){return i().index(e).updateRankingRules(t)}async function Yn(e){return i().index(e).resetRankingRules()}async function Jn(e){return i().index(e).getDistinctAttribute()}async function Qn(e,t){return i().index(e).updateDistinctAttribute(t)}async function Xn(e){return i().index(e).resetDistinctAttribute()}async function Vn(e){return i().index(e).getFaceting()}async function Zn(e,t){return i().index(e).updateFaceting(t)}async function er(e){return i().index(e).resetFaceting()}async function tr(e){return i().index(e).getTypoTolerance()}async function nr(e,t){return i().index(e).updateTypoTolerance(t)}async function rr(e){return i().index(e).resetTypoTolerance()}async function sr(e){return i().index(e).getDictionary()}async function ir(e,t){return i().index(e).updateDictionary(t)}async function or(e){return i().index(e).resetDictionary()}function cr(e){if(!e)return[];let t=[];for(let n in e){if(!Object.prototype.hasOwnProperty.call(e,n))continue;if(!ar.test(n))throw Error(`[search/meilisearch] Refusing to build filter with unsafe field name: ${n}`);let r=e[n],s=String(r).replace(/'/g,"\\'");t.push(`${n}='${s}'`)}return t}function ur(e){if(!e)return[];let t=[];for(let n in e)if(Object.prototype.hasOwnProperty.call(e,n)){let s=String(e[n]).toLowerCase()==="desc"?"desc":"asc";t.push(`${n}:${s}`)}return t}var ae,F=null,ar,lr,gr;var ue=R(async()=>{try{({Meilisearch:ae}=await import("meilisearch"))}catch{}ar=/^[a-z_][\w]*(?:\.[a-z_][\w]*)*$/i;lr={client:i,resetClient:dn,search:yn,getIndex:mn,createIndex:bn,deleteIndex:xn,updateIndex:hn,listAllIndexes:st,listAllIndices:st,addDocument:pn,addDocuments:fn,updateDocument:An,updateDocuments:Tn,deleteDocument:Pn,deleteDocuments:Sn,getDocument:wn,getFilterableAttributes:kn,updateFilterableAttributes:En,resetFilterableAttributes:$n,updateDisplayedAttributes:vn,resetDisplayedAttributes:Fn,getDisplayedAttributes:jn,updateSearchableAttributes:Rn,resetSearchableAttributes:Dn,getSearchableAttributes:In,updateSortableAttributes:On,resetSortableAttributes:qn,getSortableAttributes:_n,getSettings:Mn,updateSettings:Cn,resetSettings:Nn,getPagination:Un,updatePagination:Ln,resetPagination:Hn,getSynonyms:Bn,updateSynonyms:Gn,resetSynonyms:Kn,getRankingRules:zn,updateRankingRules:Wn,resetRankingRules:Yn,getDistinctAttribute:Jn,updateDistinctAttribute:Qn,resetDistinctAttribute:Xn,getFaceting:Vn,updateFaceting:Zn,resetFaceting:er,getTypoTolerance:tr,updateTypoTolerance:nr,resetTypoTolerance:rr,getDictionary:sr,updateDictionary:ir,resetDictionary:or},gr=lr});import{overridesReady as dr,searchEngine as it}from"@stacksjs/config";import{err as gt,ok as dt}from"@stacksjs/error-handling";import{log as w}from"@stacksjs/logging";import{getModelName as yt,getTableName as pt}from"@stacksjs/orm";import{path as ge}from"@stacksjs/path";import{useSearchEngine as ft}from"@stacksjs/search-engine";import{globSync as mt}from"@stacksjs/storage";import{snakeCase as D}from"@stacksjs/strings";async function Sr(e){try{let t=mt([ge.userModelsPath("*.ts"),ge.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),{addDocument:n,updateSettings:r}=ft();for(let s of t){let o=(await import(s)).default,a=o.traits?.useSearch,d=pt(o,s),l=yt(o,s);if(e&&l!==e)continue;if(a&&(typeof a==="boolean"||typeof a==="object")){if(typeof a==="object")await r(d,{searchableAttributes:(a.searchable??[]).map((y)=>D(y)),filterableAttributes:(a.filterable??[]).map((y)=>D(y)),sortableAttributes:(a.sortable??[]).map((y)=>D(y)),displayedAttributes:(a.displayable??[]).map((y)=>D(y))});let c=o;if(typeof c.all!=="function"){w.warn(`[search] ${l}: model has no .all() - run generate:model-files or use defineModel`);continue}let b=c.makeAllSearchable;if(typeof b==="function"){let y=await b.call(c);w.info(`[search] ${l}: imported ${y}, skipped 0`);continue}let p=typeof a==="object"?a.denormalize:void 0,S=p?Array.from(new Set(Object.values(p).map((y)=>y.split(".")[0]).filter((y)=>Boolean(y)))):[],x;if(S.length>0&&typeof c.query==="function")try{x=await c.query().with(...S).get()}catch(y){w.warn(`[search] ${l}: eager-load of [${S.join(", ")}] failed - falling back to .all(); denormalized fields will be null. (${y.message})`),x=await c.all()}else x=await c.all();let le=0,C=0;for(let y of x)try{let k=y.toSearchableObject?.();if(k==null){C++;continue}await n(d,k),le++}catch(k){C++,w.warn(`[search] Skipped ${l}#${y.id??"?"}: ${k.message}`)}w.info(`[search] ${l}: imported ${le}, skipped ${C}`)}}return w.info(e),dt("Successfully imported models to search engine!")}catch(t){return w.error(t),gt(t?.message||String(t))}}import{ok as bt}from"@stacksjs/error-handling";import{log as ht}from"@stacksjs/logging";import{getModelName as At,getTableName as Tt}from"@stacksjs/orm";import{path as de}from"@stacksjs/path";import{useSearchEngine as Pt}from"@stacksjs/search-engine";import{globSync as St}from"@stacksjs/storage";async function Ir(e){try{let t=St([de.userModelsPath("*.ts"),de.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),{deleteIndex:n}=Pt();for(let r of t){let s=(await import(r)).default,o=s.traits?.useSearch,a=Tt(s,r),d=At(s,r);if(e&&d!==e)continue;if(o&&(typeof o==="boolean"||typeof o==="object"))await n(a)}return bt("Successfully flushed all model data from search engine!")}catch(t){return ht.error(t),t(t)}}import{ok as wt}from"@stacksjs/error-handling";import{log as xt}from"@stacksjs/logging";import{getTableName as kt}from"@stacksjs/orm";import{path as Et}from"@stacksjs/path";import{useSearchEngine as $t}from"@stacksjs/search-engine";async function Mr(e){try{let t=Et.userModelsPath(`${e}.ts`),n=(await import(t)).default,{getFilterableAttributes:r,getSortableAttributes:s,getSearchableAttributes:o,getDisplayedAttributes:a}=$t(),d=n.traits?.useSearch,l=kt(n,t);if(d&&typeof d==="object"){let c=await a(l),b=await r(l),p=await s(l),S=await o(l);console.table({displayedAttributes:c,filterableAttributes:b,sortableAttributes:p,searchableAttributes:S})}return wt("Successfully update index settings!")}catch(t){return xt.error(t),t(t)}}import{err as Rt,ok as Dt}from"@stacksjs/error-handling";import{log as It}from"@stacksjs/logging";import{getTableName as Ot}from"@stacksjs/orm";import{path as ye}from"@stacksjs/path";import{useSearchEngine as qt}from"@stacksjs/search-engine";import{globSync as _t}from"@stacksjs/storage";import{snakeCase as N}from"@stacksjs/strings";async function zr(){try{let e=_t([ye.userModelsPath("*.ts"),ye.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),{updateSettings:t}=qt();for(let n of e){let r=(await import(n)).default,s=r.traits?.useSearch,o=Ot(r,n);if(s&&typeof s==="object"){let a=(typeof r.traits?.useSearch==="object"&&r.traits?.useSearch.filterable||[]).map((c)=>N(c)),d=(typeof r.traits?.useSearch==="object"&&r.traits?.useSearch.sortable||[]).map((c)=>N(c)),l=(typeof r.traits?.useSearch==="object"&&r.traits?.useSearch.searchable||[]).map((c)=>N(c));await t(o,{filterableAttributes:a,sortableAttributes:d,searchableAttributes:l})}}return Dt("Successfully update index settings!")}catch(e){return It.error(e),Rt(e?.message||String(e))}}function yr(e){if(e==="algolia")return Promise.resolve().then(() => (L(),U));if(e==="opensearch")return Promise.resolve().then(() => (ne(),te));if(e==="typesense")return Promise.resolve().then(() => (oe(),ie));return ue().then(() => ce)}var M,ot=(async()=>(await dr,M=(await yr(it.driver)).default,M))();function ts(){return new Proxy({},{get(e,t){if(M)return Reflect.get(M,t);return(...n)=>ot.then((r)=>{let s=Reflect.get(r,t);return typeof s==="function"?s.apply(r,n):s})}})}function ns(){return ot}function rs(){return Promise.resolve().then(() => (L(),U)).then((e)=>e.default)}function ss(){return ue().then(() => ce).then((e)=>e.default)}function is(){return Promise.resolve().then(() => (ne(),te)).then((e)=>e.default)}function os(){return Promise.resolve().then(() => (oe(),ie)).then((e)=>e.default)}export{Ir as flushModelDocuments,Sr as importModelDocuments,Mr as listIndexSettings,ns as searchEngineReady,zr as updateIndexSettings,rs as useAlgolia,ss as useMeilisearch,is as useOpensearch,ts as useSearchEngine,os as useTypesense};
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@stacksjs/search-engine",
3
3
  "type": "module",
4
4
  "sideEffects": false,
5
- "version": "0.72.57",
5
+ "version": "0.72.61",
6
6
  "description": "The Stacks search engine integrations.",
7
7
  "author": "Chris Breuer",
8
8
  "contributors": [
@@ -72,7 +72,7 @@
72
72
  }
73
73
  },
74
74
  "devDependencies": {
75
- "@stacksjs/config": "0.72.57",
75
+ "@stacksjs/config": "0.72.61",
76
76
  "better-dx": "^0.2.24",
77
77
  "meilisearch": "^0.59.0"
78
78
  }