@stacksjs/search-engine 0.70.327 → 0.70.328

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 fy=Object.defineProperty;var $y=(u)=>u;function wy(u,y){this[u]=$y.bind(null,y)}var K=(u,y)=>{for(var f in y)fy(u,f,{get:y[f],enumerable:!0,configurable:!0,set:wy.bind(y,f)})};var L=(u,y)=>()=>(u&&(y=u(u=0)),y);var Py=import.meta.require;var k={};K(k,{waitTask:()=>Fu,setSettings:()=>Ku,searchSynonyms:()=>ou,searchRules:()=>qu,search:()=>Gu,saveSynonym:()=>hu,saveRule:()=>cu,saveObjects:()=>Mu,saveObject:()=>gu,partialUpdateObject:()=>Yu,multiSearch:()=>Hu,moveIndex:()=>Bu,listIndices:()=>Lu,indexExists:()=>Cu,getSettings:()=>Eu,getObjects:()=>Vu,getObject:()=>Qu,deleteObjects:()=>Wu,deleteObject:()=>Zu,deleteIndex:()=>Tu,deleteBy:()=>Xu,default:()=>Fy,copyIndex:()=>Ru,configure:()=>Ju,clearSynonyms:()=>bu,clearRules:()=>ku,clearObjects:()=>zu,browse:()=>vu,algolia:()=>ju});import{searchEngine as Ou}from"@stacksjs/config";import{log as By}from"@stacksjs/logging";function ru(){if(!B){let u=Ou.algolia?.appId||process.env.ALGOLIA_APP_ID||"",y=Ou.algolia?.apiKey||process.env.ALGOLIA_API_KEY||"";if(!u||!y)throw By.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.");B={appId:u,apiKey:y}}return B}function Ty(){let{appId:u}=ru();return`https://${u}.algolia.net`}function Cy(){let{appId:u,apiKey:y}=ru();return{"X-Algolia-Application-Id":u,"X-Algolia-API-Key":y,"Content-Type":"application/json"}}async function A(u,y,f){let $=await fetch(`${Ty()}${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 Ju(u){B=u}async function Gu(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 Hu(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 gu(u,y,f){if(f)return A("PUT",`/1/indexes/${u}/${f}`,y);return A("POST",`/1/indexes/${u}`,y)}async function Mu(u,y){return A("POST",`/1/indexes/${u}/batch`,{requests:y.map((f)=>({action:f.objectID?"updateObject":"addObject",body:f}))})}async function Yu(u,y,f,$=!0){return A("POST",`/1/indexes/${u}/${y}/partial${$?"":"?createIfNotExists=false"}`,f)}async function Zu(u,y){return A("DELETE",`/1/indexes/${u}/${y}`)}async function Wu(u,y){return A("POST",`/1/indexes/${u}/batch`,{requests:y.map((f)=>({action:"deleteObject",body:{objectID:f}}))})}async function Xu(u,y){return A("POST",`/1/indexes/${u}/deleteByQuery`,{filters:y})}async function Qu(u,y,f){let $=f?`?attributesToRetrieve=${f.join(",")}`:"";return A("GET",`/1/indexes/${u}/${y}${$}`)}async function Vu(u,y,f){return A("POST","/1/indexes/*/objects",{requests:y.map(($)=>({indexName:u,objectID:$,attributesToRetrieve:f}))})}async function zu(u){return A("POST",`/1/indexes/${u}/clear`)}async function Eu(u){return A("GET",`/1/indexes/${u}/settings`)}async function Ku(u,y,f=!1){return A("PUT",`/1/indexes/${u}/settings${f?"?forwardToReplicas=true":""}`,y)}async function Lu(){return A("GET","/1/indexes")}async function Ru(u,y,f){return A("POST",`/1/indexes/${u}/operation`,{operation:"copy",destination:y,scope:f})}async function Bu(u,y){return A("POST",`/1/indexes/${u}/operation`,{operation:"move",destination:y})}async function Tu(u){return A("DELETE",`/1/indexes/${u}`)}async function Cu(u){try{return await A("GET",`/1/indexes/${u}/settings`),!0}catch{return!1}}async function Fu(u,y,f=1e4,$=100){let w=Date.now();while(Date.now()-w<f){let S=await A("GET",`/1/indexes/${u}/task/${y}`);if(S.status==="published")return S;await new Promise((_)=>setTimeout(_,$))}throw Error(`Task ${y} timed out after ${f}ms`)}async function hu(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 bu(u,y=!1){return A("POST",`/1/indexes/${u}/synonyms/clear${y?"?forwardToReplicas=true":""}`)}async function cu(u,y,f=!1){return A("PUT",`/1/indexes/${u}/rules/${y.objectID}${f?"?forwardToReplicas=true":""}`,y)}async function qu(u,y="",f,$,w=0,S=20){return A("POST",`/1/indexes/${u}/rules/search`,{query:y,anchoring:f,context:$,page:w,hitsPerPage:S})}async function ku(u,y=!1){return A("POST",`/1/indexes/${u}/rules/clear${y?"?forwardToReplicas=true":""}`)}async function*vu(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 B=null,ju,Fy;var v=L(()=>{ju={configure:Ju,search:Gu,multiSearch:Hu,saveObject:gu,saveObjects:Mu,partialUpdateObject:Yu,deleteObject:Zu,deleteObjects:Wu,deleteBy:Xu,getObject:Qu,getObjects:Vu,clearObjects:zu,getSettings:Eu,setSettings:Ku,listIndices:Lu,copyIndex:Ru,moveIndex:Bu,deleteIndex:Tu,indexExists:Cu,waitTask:Fu,saveSynonym:hu,searchSynonyms:ou,clearSynonyms:bu,saveRule:cu,searchRules:qu,clearRules:ku,browse:vu},Fy=ju});var e={};K(e,{default:()=>ly});import{searchEngine as hy}from"@stacksjs/config";function d(){let u=hy.opensearch,y=String(u?.host||"localhost").replace(/\/+$/,""),f=/^https?:\/\//i.test(y),$=String(u?.protocol||"http").replace(/:$/,""),w=Number(u?.port||9200),S=`${$}://${y}${w?`:${w}`:""}`;if(f){let _=new URL(y);if(!_.port&&u?.port)_.port=String(u.port);S=_.toString().replace(/\/+$/,"")}return{baseUrl:S,auth:String(u?.auth||"")}}function oy(u="application/json"){let{auth:y}=d();return{"Content-Type":u,...y?{Authorization:`Basic ${btoa(y)}`}:{}}}async function H(u,y,f,$){let{baseUrl:w}=d(),S=await fetch(`${w}${y}`,{method:u,headers:oy($),body:f===void 0?void 0:typeof f==="string"?f:JSON.stringify(f)});if(!S.ok){let r=await S.text();throw new C(S.status,u,y,r||S.statusText)}let _=await S.text();return _?JSON.parse(_):{}}function g(u){return`/${encodeURIComponent(u)}`}function X(u,y){return{taskUid:Date.now(),indexUid:u,status:"succeeded",type:y,enqueuedAt:new Date().toISOString()}}async function a(u){return(await H("GET",`${g(u)}/_mapping`))[u]?.mappings?._meta?.stacks||{}}async function T(u,y){let f;try{f=await a(u)}catch($){if(!($ instanceof C)||$.status!==404)throw $;await H("PUT",g(u)),f={}}return await H("PUT",`${g(u)}/_mapping`,{_meta:{stacks:{...f,...y}}}),X(u,"settingsUpdate")}async function by(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)*$)),S=Array.isArray(y.filter)?y.filter:y.filter?[y.filter]:[],_=f?{multi_match:{query:f,fields:y.attributesToSearchOn||["*"]}}:{match_all:{}},r=S.length>0?{bool:{must:[_],filter:S.map((J)=>({query_string:{query:typeof J==="string"?J:JSON.stringify(J)}}))}}:_,U=await H("POST",`${g(u)}/_search`,{query:r,from:w,size:$,...y.sort?{sort:y.sort}:{},...y.attributesToRetrieve?{_source:y.attributesToRetrieve}:{}}),t=typeof U.hits?.total==="number"?U.hits.total:Number(U.hits?.total?.value||0);return{hits:(U.hits?.hits||[]).map((J)=>({id:J._source?.id??J._id,...J._source})),estimatedTotalHits:t,processingTimeMs:Number(U.took||0),query:f,limit:$,offset:w}}async function cy(u,y={}){return await H("PUT",g(u),y),X(u,"indexCreation")}async function qy(u){return await H("GET",g(u))}async function ky(u,y){return await H("PUT",`${g(u)}/_settings`,y),X(u,"indexUpdate")}async function vy(u){try{await H("DELETE",g(u))}catch(y){if(!(y instanceof C)||y.status!==404)throw y}return X(u,"indexDeletion")}async function Iu(){let y=(await H("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 Du(u,y){let f=y?.id??y?.objectID,$=f===void 0||f===null?`${g(u)}/_doc?refresh=wait_for`:`${g(u)}/_doc/${encodeURIComponent(String(f))}?refresh=wait_for`;return await H(f===void 0||f===null?"POST":"PUT",$,y),X(u,"documentAdditionOrUpdate")}async function pu(u,y){if(!Array.isArray(y))throw TypeError("[search/opensearch] addDocuments requires an array of documents");if(y.length===0)return X(u,"documentAdditionOrUpdate");let f=y.flatMap((w)=>{let S=w?.id??w?.objectID;return[JSON.stringify({index:{_index:u,...S===void 0||S===null?{}:{_id:S}}}),JSON.stringify(w)]}),$=await H("POST","/_bulk?refresh=wait_for",`${f.join(`
2
+ var $y=Object.defineProperty;var wy=(u)=>u;function Py(u,y){this[u]=wy.bind(null,y)}var K=(u,y)=>{for(var f in y)$y(u,f,{get:y[f],enumerable:!0,configurable:!0,set:Py.bind(y,f)})};var L=(u,y)=>()=>(u&&(y=u(u=0)),y);var Sy=import.meta.require;var v={};K(v,{waitTask:()=>hu,setSettings:()=>Lu,searchSynonyms:()=>ou,searchRules:()=>vu,search:()=>Hu,saveSynonym:()=>bu,saveRule:()=>qu,saveObjects:()=>Zu,saveObject:()=>Yu,partialUpdateObject:()=>Mu,multiSearch:()=>gu,moveIndex:()=>Tu,listIndices:()=>Ru,indexExists:()=>Cu,getSettings:()=>Ku,getObjects:()=>zu,getObject:()=>Vu,deleteObjects:()=>Xu,deleteObject:()=>Wu,deleteIndex:()=>Fu,deleteBy:()=>Qu,default:()=>hy,copyIndex:()=>Bu,configure:()=>Gu,clearSynonyms:()=>cu,clearRules:()=>ku,clearObjects:()=>Eu,browse:()=>ju,algolia:()=>Iu});import{searchEngine as ru}from"@stacksjs/config";import{log as Ty}from"@stacksjs/logging";function Ju(){if(!B){let u=ru.algolia?.appId||process.env.ALGOLIA_APP_ID||"",y=ru.algolia?.apiKey||process.env.ALGOLIA_API_KEY||"";if(!u||!y)throw Ty.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.");B={appId:u,apiKey:y}}return B}function Fy(){let{appId:u}=Ju();return`https://${u}.algolia.net`}function Cy(){let{appId:u,apiKey:y}=Ju();return{"X-Algolia-Application-Id":u,"X-Algolia-API-Key":y,"Content-Type":"application/json"}}async function A(u,y,f){let $=await fetch(`${Fy()}${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 Gu(u){B=u}async function Hu(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 gu(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 Yu(u,y,f){if(f)return A("PUT",`/1/indexes/${u}/${f}`,y);return A("POST",`/1/indexes/${u}`,y)}async function Zu(u,y){return A("POST",`/1/indexes/${u}/batch`,{requests:y.map((f)=>({action:f.objectID?"updateObject":"addObject",body:f}))})}async function Mu(u,y,f,$=!0){return A("POST",`/1/indexes/${u}/${y}/partial${$?"":"?createIfNotExists=false"}`,f)}async function Wu(u,y){return A("DELETE",`/1/indexes/${u}/${y}`)}async function Xu(u,y){return A("POST",`/1/indexes/${u}/batch`,{requests:y.map((f)=>({action:"deleteObject",body:{objectID:f}}))})}async function Qu(u,y){return A("POST",`/1/indexes/${u}/deleteByQuery`,{filters:y})}async function Vu(u,y,f){let $=f?`?attributesToRetrieve=${f.join(",")}`:"";return A("GET",`/1/indexes/${u}/${y}${$}`)}async function zu(u,y,f){return A("POST","/1/indexes/*/objects",{requests:y.map(($)=>({indexName:u,objectID:$,attributesToRetrieve:f}))})}async function Eu(u){return A("POST",`/1/indexes/${u}/clear`)}async function Ku(u){return A("GET",`/1/indexes/${u}/settings`)}async function Lu(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 Bu(u,y,f){return A("POST",`/1/indexes/${u}/operation`,{operation:"copy",destination:y,scope:f})}async function Tu(u,y){return A("POST",`/1/indexes/${u}/operation`,{operation:"move",destination:y})}async function Fu(u){return A("DELETE",`/1/indexes/${u}`)}async function Cu(u){try{return await A("GET",`/1/indexes/${u}/settings`),!0}catch{return!1}}async function hu(u,y,f=1e4,$=100){let w=Date.now();while(Date.now()-w<f){let S=await A("GET",`/1/indexes/${u}/task/${y}`);if(S.status==="published")return S;await new Promise((_)=>setTimeout(_,$))}throw Error(`Task ${y} timed out after ${f}ms`)}async function bu(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 cu(u,y=!1){return A("POST",`/1/indexes/${u}/synonyms/clear${y?"?forwardToReplicas=true":""}`)}async function qu(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,S=20){return A("POST",`/1/indexes/${u}/rules/search`,{query:y,anchoring:f,context:$,page:w,hitsPerPage:S})}async function ku(u,y=!1){return A("POST",`/1/indexes/${u}/rules/clear${y?"?forwardToReplicas=true":""}`)}async function*ju(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 B=null,Iu,hy;var k=L(()=>{Iu={configure:Gu,search:Hu,multiSearch:gu,saveObject:Yu,saveObjects:Zu,partialUpdateObject:Mu,deleteObject:Wu,deleteObjects:Xu,deleteBy:Qu,getObject:Vu,getObjects:zu,clearObjects:Eu,getSettings:Ku,setSettings:Lu,listIndices:Ru,copyIndex:Bu,moveIndex:Tu,deleteIndex:Fu,indexExists:Cu,waitTask:hu,saveSynonym:bu,searchSynonyms:ou,clearSynonyms:cu,saveRule:qu,searchRules:vu,clearRules:ku,browse:ju},hy=Iu});var e={};K(e,{default:()=>sy});import{searchEngine as by}from"@stacksjs/config";function d(){let u=by.opensearch,y=String(u?.host||"localhost").replace(/\/+$/,""),f=/^https?:\/\//i.test(y),$=String(u?.protocol||"http").replace(/:$/,""),w=Number(u?.port||9200),S=`${$}://${y}${w?`:${w}`:""}`;if(f){let _=new URL(y);if(!_.port&&u?.port)_.port=String(u.port);S=_.toString().replace(/\/+$/,"")}return{baseUrl:S,auth:String(u?.auth||"")}}function oy(u="application/json"){let{auth:y}=d();return{"Content-Type":u,...y?{Authorization:`Basic ${btoa(y)}`}:{}}}async function H(u,y,f,$){let{baseUrl:w}=d(),S=await fetch(`${w}${y}`,{method:u,headers:oy($),body:f===void 0?void 0:typeof f==="string"?f:JSON.stringify(f)});if(!S.ok){let r=await S.text();throw new F(S.status,u,y,r||S.statusText)}let _=await S.text();return _?JSON.parse(_):{}}function g(u){return`/${encodeURIComponent(u)}`}function W(u,y){return{taskUid:Date.now(),indexUid:u,status:"succeeded",type:y,enqueuedAt:new Date().toISOString()}}async function a(u){return(await H("GET",`${g(u)}/_mapping`))[u]?.mappings?._meta?.stacks||{}}async function T(u,y){let f;try{f=await a(u)}catch($){if(!($ instanceof F)||$.status!==404)throw $;await H("PUT",g(u)),f={}}return await H("PUT",`${g(u)}/_mapping`,{_meta:{stacks:{...f,...y}}}),W(u,"settingsUpdate")}async function cy(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)*$)),S=Array.isArray(y.filter)?y.filter:y.filter?[y.filter]:[],_=f?{multi_match:{query:f,fields:y.attributesToSearchOn||["*"]}}:{match_all:{}},r=S.length>0?{bool:{must:[_],filter:S.map((G)=>({query_string:{query:typeof G==="string"?G:JSON.stringify(G)}}))}}:_,U=await H("POST",`${g(u)}/_search`,{query:r,from:w,size:$,...y.sort?{sort:y.sort}:{},...y.attributesToRetrieve?{_source:y.attributesToRetrieve}:{}}),t=typeof U.hits?.total==="number"?U.hits.total:Number(U.hits?.total?.value||0);return{hits:(U.hits?.hits||[]).map((G)=>({id:G._source?.id??G._id,...G._source})),estimatedTotalHits:t,processingTimeMs:Number(U.took||0),query:f,limit:$,offset:w}}async function qy(u,y={}){return await H("PUT",g(u),y),W(u,"indexCreation")}async function vy(u){return await H("GET",g(u))}async function ky(u,y){return await H("PUT",`${g(u)}/_settings`,y),W(u,"indexUpdate")}async function jy(u){try{await H("DELETE",g(u))}catch(y){if(!(y instanceof F)||y.status!==404)throw y}return W(u,"indexDeletion")}async function Du(){let y=(await H("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?`${g(u)}/_doc?refresh=wait_for`:`${g(u)}/_doc/${encodeURIComponent(String(f))}?refresh=wait_for`;return await H(f===void 0||f===null?"POST":"PUT",$,y),W(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 W(u,"documentAdditionOrUpdate");let f=y.flatMap((w)=>{let S=w?.id??w?.objectID;return[JSON.stringify({index:{_index:u,...S===void 0||S===null?{}:{_id:S}}}),JSON.stringify(w)]}),$=await H("POST","/_bulk?refresh=wait_for",`${f.join(`
3
3
  `)}
4
- `,"application/x-ndjson");if($.errors){let w=$.items?.filter((S)=>Number(S.index?.status||0)>=400)||[];throw Error(`[search/opensearch] Bulk indexing failed for ${w.length} document(s)`)}return X(u,"documentAdditionOrUpdate")}async function jy(u,y,f){let $=f?`?_source=${encodeURIComponent(Array.isArray(f)?f.join(","):String(f))}`:"",w=await H("GET",`${g(u)}/_doc/${encodeURIComponent(String(y))}${$}`);return{id:w._source?.id??w._id,...w._source}}async function Iy(u,y){return await H("DELETE",`${g(u)}/_doc/${encodeURIComponent(String(y))}?refresh=wait_for`),X(u,"documentDeletion")}async function Dy(u,y){let f=(Array.isArray(y)?y:[y]).filter(Boolean);return await H("POST",`${g(u)}/_delete_by_query?refresh=true`,{query:f.length>0?{bool:{filter:f.map(($)=>({query_string:{query:$}}))}}:{match_all:{}}}),X(u,"documentDeletion")}function Y(u,y){return{get:async(f)=>(await a(f))[u]??y,update:async(f,$)=>T(f,{[u]:$}),reset:async(f)=>T(f,{[u]:y})}}async function py(u){let y=await a(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 ny(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 T(u,$)}async function Ny(u){return await T(u,{filterableAttributes:[],searchableAttributes:[],sortableAttributes:[],displayedAttributes:[],pagination:{},synonyms:{},rankingRules:[],distinctAttribute:null,faceting:{},typoTolerance:{},dictionary:[]})}var C,j,I,D,p,n,N,i,l,s,x,m,iy,ly;var uu=L(()=>{C=class C extends Error{status;constructor(u,y,f,$){super(`[search/opensearch] ${y} ${f} failed (${u}): ${$}`);this.status=u}};j=Y("filterableAttributes",[]),I=Y("searchableAttributes",[]),D=Y("sortableAttributes",[]),p=Y("displayedAttributes",[]),n=Y("pagination",{}),N=Y("synonyms",{}),i=Y("rankingRules",[]),l=Y("distinctAttribute",null),s=Y("faceting",{}),x=Y("typoTolerance",{}),m=Y("dictionary",[]);iy={client:()=>({request:H,configuration:d}),search:by,createIndex:cy,getIndex:qy,updateIndex:ky,deleteIndex:vy,listAllIndexes:Iu,listAllIndices:Iu,addDocument:Du,addDocuments:pu,updateDocument:Du,updateDocuments:pu,getDocument:jy,deleteDocument:Iy,deleteDocuments:Dy,getFilterableAttributes:j.get,updateFilterableAttributes:j.update,resetFilterableAttributes:j.reset,getSearchableAttributes:I.get,updateSearchableAttributes:I.update,resetSearchableAttributes:I.reset,getSortableAttributes:D.get,updateSortableAttributes:D.update,resetSortableAttributes:D.reset,getDisplayedAttributes:p.get,updateDisplayedAttributes:p.update,resetDisplayedAttributes:p.reset,getSettings:py,updateSettings:ny,resetSettings:Ny,getPagination:n.get,updatePagination:n.update,resetPagination:n.reset,getSynonyms:N.get,updateSynonyms:N.update,resetSynonyms:N.reset,getRankingRules:i.get,updateRankingRules:i.update,resetRankingRules:i.reset,getDistinctAttribute:l.get,updateDistinctAttribute:l.update,resetDistinctAttribute:l.reset,getFaceting:s.get,updateFaceting:s.update,resetFaceting:s.reset,getTypoTolerance:x.get,updateTypoTolerance:x.update,resetTypoTolerance:x.reset,getDictionary:m.get,updateDictionary:m.update,resetDictionary:m.reset},ly=iy});var $u={};K($u,{default:()=>Pf});import{searchEngine as F}from"@stacksjs/config";import{log as sy}from"@stacksjs/logging";function lu(){if(!h){let u=F.typesense?.host||process.env.TYPESENSE_HOST||"127.0.0.1",y=F.typesense?.port||Number(process.env.TYPESENSE_PORT||8108),f=F.typesense?.protocol||process.env.TYPESENSE_PROTOCOL||"http",$=F.typesense?.apiKey||process.env.TYPESENSE_API_KEY||"xyz";h={host:u,port:y,protocol:f,apiKey:$}}return h}function su(){let{protocol:u,host:y,port:f}=lu();return`${u}://${y}:${f}`}function xu(){return{"Content-Type":"application/json","X-TYPESENSE-API-KEY":lu().apiKey}}function Q(u){return{taskUid:0,indexUid:u,status:"succeeded",type:"documentAddition",enqueuedAt:new Date}}async function Z(u,y,f){let $=await fetch(`${su()}${y}`,{method:u,headers:xu(),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 xy(u){if(!u)return;let y=[];for(let f in u){if(!Object.prototype.hasOwnProperty.call(u,f))continue;if(!mu.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 my(u){if(!u)return;let y=[];for(let f in u){if(!Object.prototype.hasOwnProperty.call(u,f))continue;if(!mu.test(f))continue;let $=String(u[f]).toLowerCase()==="desc"?"desc":"asc";y.push(`${f}:${$}`)}return y.length?y.join(","):void 0}function dy(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 o(u,y,f){try{await Z("GET",`/collections/${u}`);return}catch{}let $=new Set(["id"]),w=f?.searchableAttributes??[],S=f?.filterableAttributes??[],_=f?.sortableAttributes??[],r=f?.displayedAttributes??[];for(let t of[...w,...S,..._,...r])if(typeof t==="string")$.add(t);else for(let M of t.attributePatterns)$.add(M);if(y){for(let t of Object.keys(y))$.add(t);for(let t of $)if(y[t]===void 0)y[t]=""}let U=[...$].map((t)=>({name:t,type:t==="id"?"string":dy(y?.[t]),facet:S.includes(t),sort:_.includes(t),optional:t!=="id"}));await Z("POST","/collections",{name:u,fields:U})}function yu(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 ay(u,y){let f=Number(y.page)||1,$=Number(y.perPage)||20,w=(f-1)*$,S=y.filter_by||xy(y.filter),_=my(y.sort),r=y.queryBy?.join(",")||y.query_by;if(!r)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,t=U==null||U===""?"*":String(U),M=new URLSearchParams({q:t,query_by:r,per_page:String($),page:String(f)});if(S)M.set("filter_by",S);if(_)M.set("sort_by",_);let J=await Z("GET",`/collections/${u}/documents/search?${M}`),W=(J.hits??[]).map((z)=>z.document);return{hits:W,query:t,processingTimeMs:J.search_time_ms??0,limit:$,offset:w,estimatedTotalHits:J.found??W.length}}async function nu(u,y){let f=yu(y);return await o(u,f),await Z("POST",`/collections/${u}/documents?action=upsert`,f),Q(u)}async function Nu(u,y){if(!Array.isArray(y)||y.length===0)return Q(u);let f=y.map(yu);await o(u,f[0]);let $=f.map((S)=>JSON.stringify(S)).join(`
5
- `),w=await fetch(`${su()}/collections/${u}/documents/import?action=upsert`,{method:"POST",headers:{...xu(),"Content-Type":"text/plain"},body:$});if(!w.ok){let S=await w.text().catch(()=>"");throw Error(`[search/typesense] bulk import failed (${w.status}): ${S}`)}return Q(u)}async function ey(u,y){return await Z("DELETE",`/collections/${u}/documents/${String(y)}`),Q(u)}async function iu(u){try{await Z("DELETE",`/collections/${u}`)}catch(y){sy.debug(`[search/typesense] deleteIndex ${u}: ${y.message}`)}return Q(u)}async function uf(u,y){let f=y?.sampleDocument;return await o(u,f?yu(f):void 0,y?.settings),Q(u)}async function yf(u){return await Z("GET",`/collections/${u}`)}async function ff(u,y){return await o(u,void 0,y),Q(u)}async function fu(u){return((await Z("GET",`/collections/${u}`)).fields??[]).map((f)=>f.name).filter((f)=>f!=="id")}async function du(u){return((await Z("GET",`/collections/${u}`)).fields??[]).filter((f)=>f.facet).map((f)=>f.name)}async function au(u){return((await Z("GET",`/collections/${u}`)).fields??[]).map((f)=>f.name)}async function eu(u){return fu(u)}async function $f(u){return{searchableAttributes:await fu(u),filterableAttributes:await du(u),sortableAttributes:await au(u),displayedAttributes:await eu(u)}}function O(u,y){return Promise.resolve(Q("typesense"))}var h=null,mu,wf,Pf;var wu=L(()=>{mu=/^[a-z_][\w]*(?:\.[a-z_][\w]*)*$/i;wf={client:()=>({}),resetClient:()=>{h=null},search:ay,getIndex:yf,createIndex:uf,deleteIndex:iu,updateIndex:O,listAllIndexes:async()=>({results:[]}),listAllIndices:async()=>({results:[]}),addDocument:nu,addDocuments:Nu,updateDocument:(u,y)=>nu(u,y),updateDocuments:(u,y)=>Nu(u,y),deleteDocument:ey,deleteDocuments:async(u)=>iu(u),getDocument:async()=>Q("typesense"),getFilterableAttributes:du,updateFilterableAttributes:O,resetFilterableAttributes:O,updateDisplayedAttributes:O,resetDisplayedAttributes:O,getDisplayedAttributes:eu,updateSearchableAttributes:O,resetSearchableAttributes:O,getSearchableAttributes:fu,updateSortableAttributes:O,resetSortableAttributes:O,getSortableAttributes:au,getSettings:$f,updateSettings:ff,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},Pf=wf});var Su={};K(Su,{default:()=>S$});import{searchEngine as uy}from"@stacksjs/config";function P(){if(!Pu)throw Error("The `meilisearch` search driver is selected but the `meilisearch` package is not installed. "+"It is an opt-in dependency \u2014 run `bun add meilisearch` to enable it, or switch drivers in `config/search-engine.ts`.");if(!b){let u=uy.meilisearch?.host||"http://127.0.0.1:7700",y=uy.meilisearch?.apiKey||"";if(!u)throw Error("Meilisearch host is not configured. Please specify a search engine host.");b=new Pu({host:u,apiKey:y})}return b}function Sf(){b=null}async function _f(u,y){let f=Number(y.page)||1,$=Number(y.perPage)||20,w=(f-1)*$,S=$$(y.filter),_=w$(y.sort);return await P().index(u).search(y.query,{limit:$,filter:S,sort:_,offset:w})}async function tf(u,y){return await P().index(u).addDocuments([y])}async function Af(u,y){if(!Array.isArray(y))throw TypeError("[search/meilisearch] addDocuments requires an array of documents");if(y.length<=1000)return await P().index(u).addDocuments(y);let $;for(let w=0;w<y.length;w+=1000){let S=y.slice(w,w+1000),_=await P().index(u).addDocuments(S);if(!$)$=_}return $}async function Uf(u){return await P().getIndex(u)}async function Of(u,y){return await P().createIndex(u,y)}async function rf(u,y){return await P().updateIndex(u,y)}async function Jf(u,y){return await P().index(u).updateDocuments([y])}async function Gf(u,y){return await P().index(u).updateDocuments(y)}async function Hf(u,y){return await P().index(u).deleteDocument(y)}async function gf(u,y){return await P().index(u).deleteDocuments({filter:y})}async function Mf(u,y,f){return await P().index(u).getDocument(y,f)}async function Yf(u){return await P().deleteIndex(u)}async function yy(){return await P().getIndexes()}async function Zf(u){return P().index(u).getFilterableAttributes()}async function Wf(u,y){return P().index(u).updateFilterableAttributes(y)}async function Xf(u){return P().index(u).resetFilterableAttributes()}async function Qf(u,y){return P().index(u).updateSearchableAttributes(y)}async function Vf(u){return P().index(u).resetSearchableAttributes()}async function zf(u){return P().index(u).getSearchableAttributes()}async function Ef(u,y){return P().index(u).updateSortableAttributes(y)}async function Kf(u){return P().index(u).resetSortableAttributes()}async function Lf(u){return P().index(u).getSortableAttributes()}async function Rf(u,y){return P().index(u).updateDisplayedAttributes(y)}async function Bf(u){return P().index(u).getDisplayedAttributes()}async function Tf(u){return P().index(u).resetDisplayedAttributes()}async function Cf(u){return P().index(u).getSettings()}async function Ff(u,y){return P().index(u).updateSettings(y)}async function hf(u){return P().index(u).resetSettings()}async function of(u){return P().index(u).getPagination()}async function bf(u,y){return P().index(u).updatePagination(y)}async function cf(u){return P().index(u).resetPagination()}async function qf(u){return P().index(u).getSynonyms()}async function kf(u,y){return P().index(u).updateSynonyms(y)}async function vf(u){return P().index(u).resetSynonyms()}async function jf(u){return P().index(u).getRankingRules()}async function If(u,y){return P().index(u).updateRankingRules(y)}async function Df(u){return P().index(u).resetRankingRules()}async function pf(u){return P().index(u).getDistinctAttribute()}async function nf(u,y){return P().index(u).updateDistinctAttribute(y)}async function Nf(u){return P().index(u).resetDistinctAttribute()}async function lf(u){return P().index(u).getFaceting()}async function sf(u,y){return P().index(u).updateFaceting(y)}async function xf(u){return P().index(u).resetFaceting()}async function mf(u){return P().index(u).getTypoTolerance()}async function df(u,y){return P().index(u).updateTypoTolerance(y)}async function af(u){return P().index(u).resetTypoTolerance()}async function ef(u){return P().index(u).getDictionary()}async function u$(u,y){return P().index(u).updateDictionary(y)}async function y$(u){return P().index(u).resetDictionary()}function $$(u){if(!u)return[];let y=[];for(let f in u){if(!Object.prototype.hasOwnProperty.call(u,f))continue;if(!f$.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 w$(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,b=null,f$,P$,S$;var _u=L(async()=>{try{({Meilisearch:Pu}=await import("meilisearch"))}catch{}f$=/^[a-z_][\w]*(?:\.[a-z_][\w]*)*$/i;P$={client:P,resetClient:Sf,search:_f,getIndex:Uf,createIndex:Of,deleteIndex:Yf,updateIndex:rf,listAllIndexes:yy,listAllIndices:yy,addDocument:tf,addDocuments:Af,updateDocument:Jf,updateDocuments:Gf,deleteDocument:Hf,deleteDocuments:gf,getDocument:Mf,getFilterableAttributes:Zf,updateFilterableAttributes:Wf,resetFilterableAttributes:Xf,updateDisplayedAttributes:Rf,resetDisplayedAttributes:Tf,getDisplayedAttributes:Bf,updateSearchableAttributes:Qf,resetSearchableAttributes:Vf,getSearchableAttributes:zf,updateSortableAttributes:Ef,resetSortableAttributes:Kf,getSortableAttributes:Lf,getSettings:Cf,updateSettings:Ff,resetSettings:hf,getPagination:of,updatePagination:bf,resetPagination:cf,getSynonyms:qf,updateSynonyms:kf,resetSynonyms:vf,getRankingRules:jf,updateRankingRules:If,resetRankingRules:Df,getDistinctAttribute:pf,updateDistinctAttribute:nf,resetDistinctAttribute:Nf,getFaceting:lf,updateFaceting:sf,resetFaceting:xf,getTypoTolerance:mf,updateTypoTolerance:df,resetTypoTolerance:af,getDictionary:ef,updateDictionary:u$,resetDictionary:y$},S$=P$});import{overridesReady as _$,searchEngine as t$}from"@stacksjs/config";import{err as Sy,ok as _y}from"@stacksjs/error-handling";import{log as V}from"@stacksjs/logging";import{getModelName as ty,getTableName as Ay}from"@stacksjs/orm";import{path as tu}from"@stacksjs/path";import{useSearchEngine as Uy}from"@stacksjs/search-engine";import{globSync as Oy}from"@stacksjs/storage";import{snakeCase as R}from"@stacksjs/strings";async function W$(u){try{let y=Oy([tu.userModelsPath("*.ts"),tu.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),{addDocument:f,updateSettings:$}=Uy();for(let w of y){let S=(await import(w)).default,_=S.traits?.useSearch,r=Ay(S,w),U=ty(S,w);if(u&&U!==u)continue;if(_&&(typeof _==="boolean"||typeof _==="object")){if(typeof _==="object")await $(r,{searchableAttributes:(_.searchable??[]).map((G)=>R(G)),filterableAttributes:(_.filterable??[]).map((G)=>R(G)),sortableAttributes:(_.sortable??[]).map((G)=>R(G)),displayedAttributes:(_.displayable??[]).map((G)=>R(G))});let t=S;if(typeof t.all!=="function"){V.warn(`[search] ${U}: model has no .all() \u2014 run generate:model-files or use defineModel`);continue}let M=typeof _==="object"?_.denormalize:void 0,J=M?Array.from(new Set(Object.values(M).map((G)=>G.split(".")[0]).filter((G)=>Boolean(G)))):[],W;if(J.length>0&&typeof t.query==="function")try{W=await t.query().with(...J).get()}catch(G){V.warn(`[search] ${U}: eager-load of [${J.join(", ")}] failed \u2014 falling back to .all(); denormalized fields will be null. (${G.message})`),W=await t.all()}else W=await t.all();let z=0,c=0;for(let G of W)try{let E=G.toSearchableObject?.();if(E==null){c++;continue}await f(r,E),z++}catch(E){c++,V.warn(`[search] Skipped ${U}#${G.id??"?"}: ${E.message}`)}V.info(`[search] ${U}: imported ${z}, skipped ${c}`)}}return V.info(u),_y("Successfully imported models to search engine!")}catch(y){return V.error(y),Sy(y?.message||String(y))}}import{ok as ry}from"@stacksjs/error-handling";import{log as Jy}from"@stacksjs/logging";import{getModelName as Gy,getTableName as Hy}from"@stacksjs/orm";import{path as Au}from"@stacksjs/path";import{useSearchEngine as gy}from"@stacksjs/search-engine";import{globSync as My}from"@stacksjs/storage";async function R$(u){try{let y=My([Au.userModelsPath("*.ts"),Au.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),{deleteIndex:f}=gy();for(let $ of y){let w=(await import($)).default,S=w.traits?.useSearch,_=Hy(w,$),r=Gy(w,$);if(u&&r!==u)continue;if(S&&(typeof S==="boolean"||typeof S==="object"))await f(_)}return ry("Successfully flushed all model data from search engine!")}catch(y){return Jy.error(y),y(y)}}import{ok as Yy}from"@stacksjs/error-handling";import{log as Zy}from"@stacksjs/logging";import{getTableName as Wy}from"@stacksjs/orm";import{path as Xy}from"@stacksjs/path";import{useSearchEngine as Qy}from"@stacksjs/search-engine";async function b$(u){try{let y=Xy.userModelsPath(`${u}.ts`),f=(await import(y)).default,{getFilterableAttributes:$,getSortableAttributes:w,getSearchableAttributes:S,getDisplayedAttributes:_}=Qy(),r=f.traits?.useSearch,U=Wy(f,y);if(r&&typeof r==="object"){let t=await _(U),M=await $(U),J=await w(U),W=await S(U);console.table({displayedAttributes:t,filterableAttributes:M,sortableAttributes:J,searchableAttributes:W})}return Yy("Successfully update index settings!")}catch(y){return Zy.error(y),y(y)}}import{err as Vy,ok as zy}from"@stacksjs/error-handling";import{log as Ey}from"@stacksjs/logging";import{getTableName as Ky}from"@stacksjs/orm";import{path as Uu}from"@stacksjs/path";import{useSearchEngine as Ly}from"@stacksjs/search-engine";import{globSync as Ry}from"@stacksjs/storage";import{snakeCase as q}from"@stacksjs/strings";async function n$(){try{let u=Ry([Uu.userModelsPath("*.ts"),Uu.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),{updateSettings:y}=Ly();for(let f of u){let $=(await import(f)).default,w=$.traits?.useSearch,S=Ky($,f);if(w&&typeof w==="object"){let _=(typeof $.traits?.useSearch==="object"&&$.traits?.useSearch.filterable||[]).map((t)=>q(t)),r=(typeof $.traits?.useSearch==="object"&&$.traits?.useSearch.sortable||[]).map((t)=>q(t)),U=(typeof $.traits?.useSearch==="object"&&$.traits?.useSearch.searchable||[]).map((t)=>q(t));await y(S,{filterableAttributes:_,sortableAttributes:r,searchableAttributes:U})}}return zy("Successfully update index settings!")}catch(u){return Ey.error(u),Vy(u?.message||String(u))}}await _$;function A$(u){if(u==="algolia")return Promise.resolve().then(() => (v(),k));if(u==="opensearch")return Promise.resolve().then(() => (uu(),e));if(u==="typesense")return Promise.resolve().then(() => (wu(),$u));return _u().then(() => Su)}var U$=await A$(t$.driver),O$=U$.default;function e$(){return O$}function uw(){return Promise.resolve().then(() => (v(),k)).then((u)=>u.default)}function yw(){return _u().then(() => Su).then((u)=>u.default)}function fw(){return Promise.resolve().then(() => (uu(),e)).then((u)=>u.default)}function $w(){return Promise.resolve().then(() => (wu(),$u)).then((u)=>u.default)}export{$w as useTypesense,e$ as useSearchEngine,fw as useOpensearch,yw as useMeilisearch,uw as useAlgolia,n$ as updateIndexSettings,b$ as listIndexSettings,W$ as importModelDocuments,R$ as flushModelDocuments};
4
+ `,"application/x-ndjson");if($.errors){let w=$.items?.filter((S)=>Number(S.index?.status||0)>=400)||[];throw Error(`[search/opensearch] Bulk indexing failed for ${w.length} document(s)`)}return W(u,"documentAdditionOrUpdate")}async function Iy(u,y,f){let $=f?`?_source=${encodeURIComponent(Array.isArray(f)?f.join(","):String(f))}`:"",w=await H("GET",`${g(u)}/_doc/${encodeURIComponent(String(y))}${$}`);return{id:w._source?.id??w._id,...w._source}}async function Dy(u,y){return await H("DELETE",`${g(u)}/_doc/${encodeURIComponent(String(y))}?refresh=wait_for`),W(u,"documentDeletion")}async function py(u,y){let f=(Array.isArray(y)?y:[y]).filter(Boolean);return await H("POST",`${g(u)}/_delete_by_query?refresh=true`,{query:f.length>0?{bool:{filter:f.map(($)=>({query_string:{query:$}}))}}:{match_all:{}}}),W(u,"documentDeletion")}function Z(u,y){return{get:async(f)=>(await a(f))[u]??y,update:async(f,$)=>T(f,{[u]:$}),reset:async(f)=>T(f,{[u]:y})}}async function ny(u){let y=await a(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 Ny(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 T(u,$)}async function iy(u){return await T(u,{filterableAttributes:[],searchableAttributes:[],sortableAttributes:[],displayedAttributes:[],pagination:{},synonyms:{},rankingRules:[],distinctAttribute:null,faceting:{},typoTolerance:{},dictionary:[]})}var F,j,I,D,p,n,N,i,l,s,x,m,ly,sy;var uu=L(()=>{F=class F extends Error{status;constructor(u,y,f,$){super(`[search/opensearch] ${y} ${f} failed (${u}): ${$}`);this.status=u}};j=Z("filterableAttributes",[]),I=Z("searchableAttributes",[]),D=Z("sortableAttributes",[]),p=Z("displayedAttributes",[]),n=Z("pagination",{}),N=Z("synonyms",{}),i=Z("rankingRules",[]),l=Z("distinctAttribute",null),s=Z("faceting",{}),x=Z("typoTolerance",{}),m=Z("dictionary",[]);ly={client:()=>({request:H,configuration:d}),search:cy,createIndex:qy,getIndex:vy,updateIndex:ky,deleteIndex:jy,listAllIndexes:Du,listAllIndices:Du,addDocument:pu,addDocuments:nu,updateDocument:pu,updateDocuments:nu,getDocument:Iy,deleteDocument:Dy,deleteDocuments:py,getFilterableAttributes:j.get,updateFilterableAttributes:j.update,resetFilterableAttributes:j.reset,getSearchableAttributes:I.get,updateSearchableAttributes:I.update,resetSearchableAttributes:I.reset,getSortableAttributes:D.get,updateSortableAttributes:D.update,resetSortableAttributes:D.reset,getDisplayedAttributes:p.get,updateDisplayedAttributes:p.update,resetDisplayedAttributes:p.reset,getSettings:ny,updateSettings:Ny,resetSettings:iy,getPagination:n.get,updatePagination:n.update,resetPagination:n.reset,getSynonyms:N.get,updateSynonyms:N.update,resetSynonyms:N.reset,getRankingRules:i.get,updateRankingRules:i.update,resetRankingRules:i.reset,getDistinctAttribute:l.get,updateDistinctAttribute:l.update,resetDistinctAttribute:l.reset,getFaceting:s.get,updateFaceting:s.update,resetFaceting:s.reset,getTypoTolerance:x.get,updateTypoTolerance:x.update,resetTypoTolerance:x.reset,getDictionary:m.get,updateDictionary:m.update,resetDictionary:m.reset},sy=ly});var $u={};K($u,{default:()=>Sf});import{searchEngine as C}from"@stacksjs/config";import{log as xy}from"@stacksjs/logging";function su(){if(!h){let u=C.typesense?.host||process.env.TYPESENSE_HOST||"127.0.0.1",y=C.typesense?.port||Number(process.env.TYPESENSE_PORT||8108),f=C.typesense?.protocol||process.env.TYPESENSE_PROTOCOL||"http",$=C.typesense?.apiKey||process.env.TYPESENSE_API_KEY||"xyz";h={host:u,port:y,protocol:f,apiKey:$}}return h}function xu(){let{protocol:u,host:y,port:f}=su();return`${u}://${y}:${f}`}function mu(){return{"Content-Type":"application/json","X-TYPESENSE-API-KEY":su().apiKey}}function X(u){return{taskUid:0,indexUid:u,status:"succeeded",type:"documentAddition",enqueuedAt:new Date}}async function M(u,y,f){let $=await fetch(`${xu()}${y}`,{method:u,headers:mu(),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 my(u){if(!u)return;let y=[];for(let f in u){if(!Object.prototype.hasOwnProperty.call(u,f))continue;if(!du.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 dy(u){if(!u)return;let y=[];for(let f in u){if(!Object.prototype.hasOwnProperty.call(u,f))continue;if(!du.test(f))continue;let $=String(u[f]).toLowerCase()==="desc"?"desc":"asc";y.push(`${f}:${$}`)}return y.length?y.join(","):void 0}function ay(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 M("GET",`/collections/${u}`);return}catch{}let $=new Set(["id"]),w=f?.searchableAttributes??[],S=f?.filterableAttributes??[],_=f?.sortableAttributes??[],r=f?.displayedAttributes??[];for(let t of[...w,...S,..._,...r])if(typeof t==="string")$.add(t);else for(let Y of t.attributePatterns)$.add(Y);if(y){for(let t of Object.keys(y))$.add(t);for(let t of $)if(y[t]===void 0)y[t]=""}let U=y?[...$].map((t)=>({name:t,type:t==="id"?"string":ay(y?.[t]),facet:S.includes(t),sort:_.includes(t),optional:t!=="id"})):[{name:".*",type:"auto"}];await M("POST","/collections",{name:u,fields:U})}function yu(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 ey(u,y){let f=Number(y.page)||1,$=Number(y.perPage)||20,w=(f-1)*$,S=y.filter_by||my(y.filter),_=dy(y.sort),r=y.queryBy?.join(",")||y.query_by;if(!r)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,t=U==null||U===""?"*":String(U),Y=new URLSearchParams({q:t,query_by:r,per_page:String($),page:String(f)});if(S)Y.set("filter_by",S);if(_)Y.set("sort_by",_);let G=await M("GET",`/collections/${u}/documents/search?${Y}`),Q=(G.hits??[]).map((z)=>z.document);return{hits:Q,query:t,processingTimeMs:G.search_time_ms??0,limit:$,offset:w,estimatedTotalHits:G.found??Q.length}}async function Nu(u,y){let f=yu(y);return await b(u,f),await M("POST",`/collections/${u}/documents?action=upsert`,f),X(u)}async function iu(u,y){if(!Array.isArray(y)||y.length===0)return X(u);let f=y.map(yu);await b(u,f[0]);let $=f.map((S)=>JSON.stringify(S)).join(`
5
+ `),w=await fetch(`${xu()}/collections/${u}/documents/import?action=upsert`,{method:"POST",headers:{...mu(),"Content-Type":"text/plain"},body:$});if(!w.ok){let S=await w.text().catch(()=>"");throw Error(`[search/typesense] bulk import failed (${w.status}): ${S}`)}return X(u)}async function uf(u,y){return await M("DELETE",`/collections/${u}/documents/${String(y)}`),X(u)}async function lu(u){try{await M("DELETE",`/collections/${u}`)}catch(y){xy.debug(`[search/typesense] deleteIndex ${u}: ${y.message}`)}return X(u)}async function yf(u,y){let f=y?.sampleDocument;return await b(u,f?yu(f):void 0,y?.settings),X(u)}async function ff(u){return await M("GET",`/collections/${u}`)}async function $f(u,y){return await b(u,void 0,y),X(u)}async function fu(u){return((await M("GET",`/collections/${u}`)).fields??[]).map((f)=>f.name).filter((f)=>f!=="id")}async function au(u){return((await M("GET",`/collections/${u}`)).fields??[]).filter((f)=>f.facet).map((f)=>f.name)}async function eu(u){return((await M("GET",`/collections/${u}`)).fields??[]).map((f)=>f.name)}async function uy(u){return fu(u)}async function wf(u){return{searchableAttributes:await fu(u),filterableAttributes:await au(u),sortableAttributes:await eu(u),displayedAttributes:await uy(u)}}function O(u,y){return Promise.resolve(X("typesense"))}var h=null,du,Pf,Sf;var wu=L(()=>{du=/^[a-z_][\w]*(?:\.[a-z_][\w]*)*$/i;Pf={client:()=>({}),resetClient:()=>{h=null},search:ey,getIndex:ff,createIndex:yf,deleteIndex:lu,updateIndex:O,listAllIndexes:async()=>({results:[]}),listAllIndices:async()=>({results:[]}),addDocument:Nu,addDocuments:iu,updateDocument:(u,y)=>Nu(u,y),updateDocuments:(u,y)=>iu(u,y),deleteDocument:uf,deleteDocuments:async(u)=>lu(u),getDocument:async()=>X("typesense"),getFilterableAttributes:au,updateFilterableAttributes:O,resetFilterableAttributes:O,updateDisplayedAttributes:O,resetDisplayedAttributes:O,getDisplayedAttributes:uy,updateSearchableAttributes:O,resetSearchableAttributes:O,getSearchableAttributes:fu,updateSortableAttributes:O,resetSortableAttributes:O,getSortableAttributes:eu,getSettings:wf,updateSettings:$f,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},Sf=Pf});var Su={};K(Su,{default:()=>_$});import{searchEngine as yy}from"@stacksjs/config";function P(){if(!Pu)throw Error("The `meilisearch` search driver is selected but the `meilisearch` package is not installed. "+"It is an opt-in dependency \u2014 run `bun add meilisearch` to enable it, or switch drivers in `config/search-engine.ts`.");if(!o){let u=yy.meilisearch?.host||"http://127.0.0.1:7700",y=yy.meilisearch?.apiKey||"";if(!u)throw Error("Meilisearch host is not configured. Please specify a search engine host.");o=new Pu({host:u,apiKey:y})}return o}function _f(){o=null}async function tf(u,y){let f=Number(y.page)||1,$=Number(y.perPage)||20,w=(f-1)*$,S=w$(y.filter),_=P$(y.sort);return await P().index(u).search(y.query,{limit:$,filter:S,sort:_,offset:w})}async function Af(u,y){return await P().index(u).addDocuments([y])}async function Uf(u,y){if(!Array.isArray(y))throw TypeError("[search/meilisearch] addDocuments requires an array of documents");if(y.length<=1000)return await P().index(u).addDocuments(y);let $;for(let w=0;w<y.length;w+=1000){let S=y.slice(w,w+1000),_=await P().index(u).addDocuments(S);if(!$)$=_}return $}async function Of(u){return await P().getIndex(u)}async function rf(u,y){return await P().createIndex(u,y)}async function Jf(u,y){return await P().updateIndex(u,y)}async function Gf(u,y){return await P().index(u).updateDocuments([y])}async function Hf(u,y){return await P().index(u).updateDocuments(y)}async function gf(u,y){return await P().index(u).deleteDocument(y)}async function Yf(u,y){return await P().index(u).deleteDocuments({filter:y})}async function Zf(u,y,f){return await P().index(u).getDocument(y,f)}async function Mf(u){return await P().deleteIndex(u)}async function fy(){return await P().getIndexes()}async function Wf(u){return P().index(u).getFilterableAttributes()}async function Xf(u,y){return P().index(u).updateFilterableAttributes(y)}async function Qf(u){return P().index(u).resetFilterableAttributes()}async function Vf(u,y){return P().index(u).updateSearchableAttributes(y)}async function zf(u){return P().index(u).resetSearchableAttributes()}async function Ef(u){return P().index(u).getSearchableAttributes()}async function Kf(u,y){return P().index(u).updateSortableAttributes(y)}async function Lf(u){return P().index(u).resetSortableAttributes()}async function Rf(u){return P().index(u).getSortableAttributes()}async function Bf(u,y){return P().index(u).updateDisplayedAttributes(y)}async function Tf(u){return P().index(u).getDisplayedAttributes()}async function Ff(u){return P().index(u).resetDisplayedAttributes()}async function Cf(u){return P().index(u).getSettings()}async function hf(u,y){return P().index(u).updateSettings(y)}async function bf(u){return P().index(u).resetSettings()}async function of(u){return P().index(u).getPagination()}async function cf(u,y){return P().index(u).updatePagination(y)}async function qf(u){return P().index(u).resetPagination()}async function vf(u){return P().index(u).getSynonyms()}async function kf(u,y){return P().index(u).updateSynonyms(y)}async function jf(u){return P().index(u).resetSynonyms()}async function If(u){return P().index(u).getRankingRules()}async function Df(u,y){return P().index(u).updateRankingRules(y)}async function pf(u){return P().index(u).resetRankingRules()}async function nf(u){return P().index(u).getDistinctAttribute()}async function Nf(u,y){return P().index(u).updateDistinctAttribute(y)}async function lf(u){return P().index(u).resetDistinctAttribute()}async function sf(u){return P().index(u).getFaceting()}async function xf(u,y){return P().index(u).updateFaceting(y)}async function mf(u){return P().index(u).resetFaceting()}async function df(u){return P().index(u).getTypoTolerance()}async function af(u,y){return P().index(u).updateTypoTolerance(y)}async function ef(u){return P().index(u).resetTypoTolerance()}async function u$(u){return P().index(u).getDictionary()}async function y$(u,y){return P().index(u).updateDictionary(y)}async function f$(u){return P().index(u).resetDictionary()}function w$(u){if(!u)return[];let y=[];for(let f in u){if(!Object.prototype.hasOwnProperty.call(u,f))continue;if(!$$.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 P$(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,o=null,$$,S$,_$;var _u=L(async()=>{try{({Meilisearch:Pu}=await import("meilisearch"))}catch{}$$=/^[a-z_][\w]*(?:\.[a-z_][\w]*)*$/i;S$={client:P,resetClient:_f,search:tf,getIndex:Of,createIndex:rf,deleteIndex:Mf,updateIndex:Jf,listAllIndexes:fy,listAllIndices:fy,addDocument:Af,addDocuments:Uf,updateDocument:Gf,updateDocuments:Hf,deleteDocument:gf,deleteDocuments:Yf,getDocument:Zf,getFilterableAttributes:Wf,updateFilterableAttributes:Xf,resetFilterableAttributes:Qf,updateDisplayedAttributes:Bf,resetDisplayedAttributes:Ff,getDisplayedAttributes:Tf,updateSearchableAttributes:Vf,resetSearchableAttributes:zf,getSearchableAttributes:Ef,updateSortableAttributes:Kf,resetSortableAttributes:Lf,getSortableAttributes:Rf,getSettings:Cf,updateSettings:hf,resetSettings:bf,getPagination:of,updatePagination:cf,resetPagination:qf,getSynonyms:vf,updateSynonyms:kf,resetSynonyms:jf,getRankingRules:If,updateRankingRules:Df,resetRankingRules:pf,getDistinctAttribute:nf,updateDistinctAttribute:Nf,resetDistinctAttribute:lf,getFaceting:sf,updateFaceting:xf,resetFaceting:mf,getTypoTolerance:df,updateTypoTolerance:af,resetTypoTolerance:ef,getDictionary:u$,updateDictionary:y$,resetDictionary:f$},_$=S$});import{overridesReady as t$,searchEngine as A$}from"@stacksjs/config";import{err as _y,ok as ty}from"@stacksjs/error-handling";import{log as V}from"@stacksjs/logging";import{getModelName as Ay,getTableName as Uy}from"@stacksjs/orm";import{path as Au}from"@stacksjs/path";import{useSearchEngine as Oy}from"@stacksjs/search-engine";import{globSync as ry}from"@stacksjs/storage";import{snakeCase as R}from"@stacksjs/strings";async function X$(u){try{let y=ry([Au.userModelsPath("*.ts"),Au.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),{addDocument:f,updateSettings:$}=Oy();for(let w of y){let S=(await import(w)).default,_=S.traits?.useSearch,r=Uy(S,w),U=Ay(S,w);if(u&&U!==u)continue;if(_&&(typeof _==="boolean"||typeof _==="object")){if(typeof _==="object")await $(r,{searchableAttributes:(_.searchable??[]).map((J)=>R(J)),filterableAttributes:(_.filterable??[]).map((J)=>R(J)),sortableAttributes:(_.sortable??[]).map((J)=>R(J)),displayedAttributes:(_.displayable??[]).map((J)=>R(J))});let t=S;if(typeof t.all!=="function"){V.warn(`[search] ${U}: model has no .all() \u2014 run generate:model-files or use defineModel`);continue}let Y=t.makeAllSearchable;if(typeof Y==="function"){let J=await Y.call(t);V.info(`[search] ${U}: imported ${J}, skipped 0`);continue}let G=typeof _==="object"?_.denormalize:void 0,Q=G?Array.from(new Set(Object.values(G).map((J)=>J.split(".")[0]).filter((J)=>Boolean(J)))):[],z;if(Q.length>0&&typeof t.query==="function")try{z=await t.query().with(...Q).get()}catch(J){V.warn(`[search] ${U}: eager-load of [${Q.join(", ")}] failed \u2014 falling back to .all(); denormalized fields will be null. (${J.message})`),z=await t.all()}else z=await t.all();let tu=0,c=0;for(let J of z)try{let E=J.toSearchableObject?.();if(E==null){c++;continue}await f(r,E),tu++}catch(E){c++,V.warn(`[search] Skipped ${U}#${J.id??"?"}: ${E.message}`)}V.info(`[search] ${U}: imported ${tu}, skipped ${c}`)}}return V.info(u),ty("Successfully imported models to search engine!")}catch(y){return V.error(y),_y(y?.message||String(y))}}import{ok as Jy}from"@stacksjs/error-handling";import{log as Gy}from"@stacksjs/logging";import{getModelName as Hy,getTableName as gy}from"@stacksjs/orm";import{path as Uu}from"@stacksjs/path";import{useSearchEngine as Yy}from"@stacksjs/search-engine";import{globSync as Zy}from"@stacksjs/storage";async function B$(u){try{let y=Zy([Uu.userModelsPath("*.ts"),Uu.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),{deleteIndex:f}=Yy();for(let $ of y){let w=(await import($)).default,S=w.traits?.useSearch,_=gy(w,$),r=Hy(w,$);if(u&&r!==u)continue;if(S&&(typeof S==="boolean"||typeof S==="object"))await f(_)}return Jy("Successfully flushed all model data from search engine!")}catch(y){return Gy.error(y),y(y)}}import{ok as My}from"@stacksjs/error-handling";import{log as Wy}from"@stacksjs/logging";import{getTableName as Xy}from"@stacksjs/orm";import{path as Qy}from"@stacksjs/path";import{useSearchEngine as Vy}from"@stacksjs/search-engine";async function c$(u){try{let y=Qy.userModelsPath(`${u}.ts`),f=(await import(y)).default,{getFilterableAttributes:$,getSortableAttributes:w,getSearchableAttributes:S,getDisplayedAttributes:_}=Vy(),r=f.traits?.useSearch,U=Xy(f,y);if(r&&typeof r==="object"){let t=await _(U),Y=await $(U),G=await w(U),Q=await S(U);console.table({displayedAttributes:t,filterableAttributes:Y,sortableAttributes:G,searchableAttributes:Q})}return My("Successfully update index settings!")}catch(y){return Wy.error(y),y(y)}}import{err as zy,ok as Ey}from"@stacksjs/error-handling";import{log as Ky}from"@stacksjs/logging";import{getTableName as Ly}from"@stacksjs/orm";import{path as Ou}from"@stacksjs/path";import{useSearchEngine as Ry}from"@stacksjs/search-engine";import{globSync as By}from"@stacksjs/storage";import{snakeCase as q}from"@stacksjs/strings";async function N$(){try{let u=By([Ou.userModelsPath("*.ts"),Ou.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),{updateSettings:y}=Ry();for(let f of u){let $=(await import(f)).default,w=$.traits?.useSearch,S=Ly($,f);if(w&&typeof w==="object"){let _=(typeof $.traits?.useSearch==="object"&&$.traits?.useSearch.filterable||[]).map((t)=>q(t)),r=(typeof $.traits?.useSearch==="object"&&$.traits?.useSearch.sortable||[]).map((t)=>q(t)),U=(typeof $.traits?.useSearch==="object"&&$.traits?.useSearch.searchable||[]).map((t)=>q(t));await y(S,{filterableAttributes:_,sortableAttributes:r,searchableAttributes:U})}}return Ey("Successfully update index settings!")}catch(u){return Ky.error(u),zy(u?.message||String(u))}}await t$;function U$(u){if(u==="algolia")return Promise.resolve().then(() => (k(),v));if(u==="opensearch")return Promise.resolve().then(() => (uu(),e));if(u==="typesense")return Promise.resolve().then(() => (wu(),$u));return _u().then(() => Su)}var O$=await U$(A$.driver),r$=O$.default;function uw(){return r$}function yw(){return Promise.resolve().then(() => (k(),v)).then((u)=>u.default)}function fw(){return _u().then(() => Su).then((u)=>u.default)}function $w(){return Promise.resolve().then(() => (uu(),e)).then((u)=>u.default)}function ww(){return Promise.resolve().then(() => (wu(),$u)).then((u)=>u.default)}export{ww as useTypesense,uw as useSearchEngine,$w as useOpensearch,fw as useMeilisearch,yw as useAlgolia,N$ as updateIndexSettings,c$ as listIndexSettings,X$ as importModelDocuments,B$ as flushModelDocuments};
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.70.327",
5
+ "version": "0.70.328",
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.70.327",
75
+ "@stacksjs/config": "0.70.328",
76
76
  "better-dx": "^0.2.17",
77
77
  "meilisearch": "^0.59.0"
78
78
  }