@stacksjs/search-engine 0.75.299 → 0.75.301
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.
- package/dist/documents/models.d.ts +2 -0
- package/dist/index.js +4 -4
- package/package.json +9 -8
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var sn=Object.defineProperty;var on=(e)=>e;function an(e,t){this[e]=on.bind(null,t)}var J=(e,t)=>{for(var n in t)sn(e,n,{get:t[n],enumerable:!0,configurable:!0,set:an.bind(t,n)})};var H=(e,t,n)=>()=>{if(e)try{t=e(e=0)}catch(r){n=[r]}if(n)throw n[0];return t};function oe(e,t){let n=Number(t);if(!Number.isInteger(n)||n<0)throw TypeError(`[search] \`${e}\` must be a non-negative integer, got ${JSON.stringify(t)}`);return n}function j(e,t=20){let n=typeof e==="string"?{q:e}:e??{},r=n.q??n.query,s=r==null?"":String(r),i=n.limit??n.perPage,o=i==null?t:oe(n.limit!=null?"limit":"perPage",i),a=0;if(n.offset!=null)a=oe("offset",n.offset);else if(n.page!=null){let c=oe("page",n.page);if(c<1)throw TypeError("[search] `page` is 1-based and must be at least 1");a=(c-1)*o}return{query:s,limit:o,offset:a,filter:n.filter,sort:n.sort}}function R(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}function D(e,t){if(!jn.test(t))throw Error(`[search/${e}] Refusing to build filter with unsafe field name: ${t}`)}function M(e,t){if(t==null)return[];if(typeof t==="string")return t?[t]:[];if(Array.isArray(t))return t.filter(Boolean);let n=[];for(let[r,s]of Object.entries(t))D(e,r),n.push(`${r}:${String(s).toLowerCase()==="desc"?"desc":"asc"}`);return n}var F=20,jn;var N=H(()=>{jn=/^[a-z_]\w*(?:\.[a-z_]\w*)*$/i});var $t={};J($t,{AlgoliaRequestError:()=>W,algolia:()=>Cn,browse:()=>Et,clearObjects:()=>we,clearRules:()=>xt,clearSynonyms:()=>Re,configure:()=>he,copyIndex:()=>ht,default:()=>Ot,deleteBy:()=>Ae,deleteIndex:()=>xe,deleteObject:()=>Se,deleteObjects:()=>mt,getObject:()=>Te,getObjects:()=>bt,getSettings:()=>Pe,indexExists:()=>At,listIndices:()=>Q,moveIndex:()=>St,multiSearch:()=>pt,partialUpdateObject:()=>ft,saveObject:()=>Y,saveObjects:()=>yt,saveRule:()=>Pt,saveSynonym:()=>wt,search:()=>gt,searchRules:()=>kt,searchSynonyms:()=>Ee,setSettings:()=>ke,waitTask:()=>Tt});import{searchEngine as me}from"@stacksjs/config";import{log as ct}from"@stacksjs/logging";function lt(){if(!B){let e=me.algolia?.appId||process.env.ALGOLIA_APP_ID||"",t=me.algolia?.apiKey||process.env.ALGOLIA_API_KEY||"";if(!e||!t)throw ct.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:e,apiKey:t}}return B}function _n(){let{appId:e}=lt();return`https://${e}.algolia.net`}function vn(){let{appId:e,apiKey:t}=lt();return{"X-Algolia-Application-Id":e,"X-Algolia-API-Key":t,"Content-Type":"application/json"}}async function d(e,t,n){let r=await fetch(`${_n()}${t}`,{method:e,headers:vn(),body:n?JSON.stringify(n):void 0});if(!r.ok){let s=await r.json().catch(()=>({message:r.statusText}));throw new W(r.status,s.message||r.statusText)}return r.json()}function dt(e){return e instanceof W&&e.status===404}function he(e){B=e}async function gt(e,t={}){return d("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 pt(e){return d("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 Y(e,t,n){if(n)return d("PUT",`/1/indexes/${e}/${n}`,t);return d("POST",`/1/indexes/${e}`,t)}async function yt(e,t){return d("POST",`/1/indexes/${e}/batch`,{requests:t.map((n)=>({action:n.objectID?"updateObject":"addObject",body:n}))})}async function ft(e,t,n,r=!0){return d("POST",`/1/indexes/${e}/${t}/partial${r?"":"?createIfNotExists=false"}`,n)}async function Se(e,t){return d("DELETE",`/1/indexes/${e}/${t}`)}async function mt(e,t){return d("POST",`/1/indexes/${e}/batch`,{requests:t.map((n)=>({action:"deleteObject",body:{objectID:n}}))})}async function Ae(e,t){return d("POST",`/1/indexes/${e}/deleteByQuery`,{filters:t})}async function Te(e,t,n){let r=n?`?attributesToRetrieve=${n.join(",")}`:"";return d("GET",`/1/indexes/${e}/${t}${r}`)}async function bt(e,t,n){return d("POST","/1/indexes/*/objects",{requests:t.map((r)=>({indexName:e,objectID:r,attributesToRetrieve:n}))})}async function we(e){return d("POST",`/1/indexes/${e}/clear`)}async function Pe(e){return d("GET",`/1/indexes/${e}/settings`)}async function ke(e,t,n=!1){return d("PUT",`/1/indexes/${e}/settings${n?"?forwardToReplicas=true":""}`,t)}async function Q(){return d("GET","/1/indexes")}async function ht(e,t,n){return d("POST",`/1/indexes/${e}/operation`,{operation:"copy",destination:t,scope:n})}async function St(e,t){return d("POST",`/1/indexes/${e}/operation`,{operation:"move",destination:t})}async function xe(e){return d("DELETE",`/1/indexes/${e}`)}async function At(e){try{return await d("GET",`/1/indexes/${e}/settings`),!0}catch{return!1}}async function Tt(e,t,n=1e4,r=100){let s=Date.now();while(Date.now()-s<n){let i=await d("GET",`/1/indexes/${e}/task/${t}`);if(i.status==="published")return i;await new Promise((o)=>setTimeout(o,r))}throw Error(`Task ${t} timed out after ${n}ms`)}async function wt(e,t,n=!1){return d("PUT",`/1/indexes/${e}/synonyms/${t.objectID}${n?"?forwardToReplicas=true":""}`,t)}async function Ee(e,t="",n,r=0,s=20){return d("POST",`/1/indexes/${e}/synonyms/search`,{query:t,type:n,page:r,hitsPerPage:s})}async function Re(e,t=!1){return d("POST",`/1/indexes/${e}/synonyms/clear${t?"?forwardToReplicas=true":""}`)}async function Pt(e,t,n=!1){return d("PUT",`/1/indexes/${e}/rules/${t.objectID}${n?"?forwardToReplicas=true":""}`,t)}async function kt(e,t="",n,r,s=0,i=20){return d("POST",`/1/indexes/${e}/rules/search`,{query:t,anchoring:n,context:r,page:s,hitsPerPage:i})}async function xt(e,t=!1){return d("POST",`/1/indexes/${e}/rules/clear${t?"?forwardToReplicas=true":""}`)}async function*Et(e,t={}){let n;do{let r=await d("POST",`/1/indexes/${e}/browse`,{...t,cursor:n});for(let s of r.hits)yield s;n=r.cursor}while(n)}function I(e,t){throw Error(`[search/algolia] ${e} is not supported by Algolia. ${t}`)}function A(e,t,n){return{taskUid:Number(n?.taskID??0),indexUid:e,status:"enqueued",type:t,enqueuedAt:n?.createdAt??n?.updatedAt??new Date().toISOString()}}function De(e){let t=e.objectID??e.id;return t==null?{...e}:{...e,objectID:String(t)}}async function Rt(e,t){let n;for(let r=0;r<t.length;r+=rt)n=await d("POST",`/1/indexes/${e}/batch`,{requests:t.slice(r,r+rt)});return n}function Un(e){return`"${String(e).replace(/\\/g,"\\\\").replace(/"/g,"\\\"")}"`}function st(e,t){if(typeof t==="number")return`${e} = ${t}`;if(typeof t==="boolean")return`${e}:${t}`;return`${e}:${Un(t)}`}function Dt(e){if(e==null||e==="")return;if(typeof e==="string")return e;if(Array.isArray(e)){let n=e.filter(Boolean).map((r)=>Array.isArray(r)?`(${r.join(" OR ")})`:`(${r})`);return n.length>0?n.join(" AND "):void 0}if(!R(e))throw TypeError(`[search/algolia] Unsupported filter: ${JSON.stringify(e)}`);let t=[];for(let[n,r]of Object.entries(e)){if(D("algolia",n),r===void 0)continue;if(r===null)throw TypeError(`[search/algolia] Algolia cannot filter on a missing value (${n}: null)`);t.push(Array.isArray(r)?`(${r.map((s)=>st(n,s)).join(" OR ")})`:st(n,r))}return t.length>0?t.join(" AND "):void 0}async function Ln(e,t={}){let{query:n,limit:r,offset:s,filter:i,sort:o}=j(t,me.perPage??F);if(M("algolia",o).length>0)I("Sorting at query time","Algolia sorts through replica indices: create a replica ranked by the attribute (e.g. `products_price_asc`) and search that index instead.");let a={query:n};if(r>0&&s%r===0)a.page=s/r,a.hitsPerPage=r;else a.offset=s,a.length=r;let c=t.filters||Dt(i);if(c)a.filters=c;for(let p of Mn)if(t[p]!==void 0)a[p]=t[p];let l=await d("POST",`/1/indexes/${e}/query`,a);return{hits:l.hits??[],query:l.query??n,processingTimeMs:l.processingTimeMS??0,limit:r,offset:s,estimatedTotalHits:l.nbHits??l.hits?.length??0,...l.facets?{facetDistribution:l.facets}:{}}}function it(e){let t=/^\w+\((.+)\)$/.exec(e);return t?t[1]:e}function Hn(e){if(e==null)return null;return e.flatMap((t)=>typeof t==="string"?[t]:t.attributePatterns)}function ot(e){if(e==null||e.length===0||e.length===1&&e[0]==="*")return null;return e}function Nn(e){return e.flatMap((t)=>{let n=/^([\w.]+):(asc|desc)$/.exec(t);if(n)return[`${n[2]}(${n[1]})`];if(t==="exactness")return["exact"];if(t==="sort")return[];return[t]})}function Bn(e){return e.map((t)=>{let n=/^(asc|desc)\(([\w.]+)\)$/.exec(t);if(n)return`${n[2]}:${n[1]}`;return t==="exact"?"exactness":t})}function Wn(e){if(e==null)return{typoTolerance:null,minWordSizefor1Typo:null,minWordSizefor2Typos:null,disableTypoToleranceOnAttributes:null,disableTypoToleranceOnWords:null};let t={};if(e.enabled!=null)t.typoTolerance=e.enabled;if(e.minWordSizeForTypos?.oneTypo!=null)t.minWordSizefor1Typo=e.minWordSizeForTypos.oneTypo;if(e.minWordSizeForTypos?.twoTypos!=null)t.minWordSizefor2Typos=e.minWordSizeForTypos.twoTypos;if(e.disableOnAttributes!==void 0)t.disableTypoToleranceOnAttributes=e.disableOnAttributes;if(e.disableOnWords!==void 0)t.disableTypoToleranceOnWords=e.disableOnWords;if(e.disableOnNumbers!=null)t.allowTyposOnNumericTokens=!e.disableOnNumbers;return t}function Kn(e){let t={},n=[];for(let[r,s]of Object.entries(e)){if(s===void 0)continue;switch(r){case"searchableAttributes":t.searchableAttributes=ot(s);break;case"filterableAttributes":t.attributesForFaceting=Hn(s);break;case"displayedAttributes":t.attributesToRetrieve=ot(s);break;case"rankingRules":t.ranking=s==null?null:Nn(s);break;case"distinctAttribute":t.attributeForDistinct=s,t.distinct=s==null?null:!0;break;case"pagination":t.paginationLimitedTo=s?.maxTotalHits??null;break;case"faceting":{let i=s;t.maxValuesPerFacet=i?.maxValuesPerFacet??null;let o=i?.sortFacetValuesBy?.["*"];if(o!==void 0||i==null)t.sortFacetValuesBy=o??null;break}case"typoTolerance":Object.assign(t,Wn(s));break;case"synonyms":break;default:n.push(r)}}if(n.length>0)ct.warn(`[search/algolia] Skipped settings with no Algolia equivalent: ${n.join(", ")}. Algolia sorts through replica indices.`);return t}function Gn(e){return{searchableAttributes:(e.searchableAttributes??["*"]).map(it),filterableAttributes:(e.attributesForFaceting??[]).map(it),sortableAttributes:[],displayedAttributes:e.attributesToRetrieve??["*"],rankingRules:Bn(e.ranking??[]),distinctAttribute:e.distinct?e.attributeForDistinct??null:null,pagination:{maxTotalHits:e.paginationLimitedTo??null},faceting:{maxValuesPerFacet:e.maxValuesPerFacet??null,...e.sortFacetValuesBy?{sortFacetValuesBy:{"*":e.sortFacetValuesBy}}:{}},typoTolerance:{enabled:e.typoTolerance===void 0?!0:e.typoTolerance!==!1,minWordSizeForTypos:{oneTypo:e.minWordSizefor1Typo??null,twoTypos:e.minWordSizefor2Typos??null},disableOnAttributes:e.disableTypoToleranceOnAttributes??[],disableOnWords:e.disableTypoToleranceOnWords??[]}}}async function be(e){return Gn(await Pe(e))}async function C(e,t,n="settingsUpdate"){let r=Kn(t),s=await ke(e,r);return A(e,n,s)}function U(e,t){return{get:async(n)=>(await be(n))[e],update:(n,r)=>C(n,{[e]:r}),reset:(n)=>C(n,{[e]:t})}}async function zn(e,t){if(t==null)return It(e);let n=Object.entries(t).map(([s,i])=>({objectID:`stacks-${s}`,type:"oneWaySynonym",input:s,synonyms:i})),r=await d("POST",`/1/indexes/${e}/synonyms/batch?replaceExistingSynonyms=true`,n);return A(e,"settingsUpdate",r)}async function It(e){return A(e,"settingsUpdate",await Re(e))}async function Jn(e){let t={},n=0;while(!0){let{hits:r,nbHits:s}=await Ee(e,"",void 0,n,100);for(let i of r)if(i.type==="oneWaySynonym"&&i.input)t[i.input]=[...t[i.input]??[],...i.synonyms??[]];else if(i.type==="synonym")for(let o of i.synonyms??[])t[o]=[...t[o]??[],...(i.synonyms??[]).filter((a)=>a!==o)];if(n++,r.length===0||n*100>=s)break}return t}async function Vn(e,t){if(t?.primaryKey&&t.primaryKey!=="id"&&t.primaryKey!=="objectID")I(`A primary key other than \`id\` (${t.primaryKey})`,"Algolia keys every record by `objectID`, which the driver takes from `id`.");return await C(e,t?.settings??{},"indexCreation")}async function Yn(e){let{items:t}=await Q(),n=t.find((r)=>r.name===e);if(!n)throw new W(404,`Index ${e} does not exist`);return{uid:n.name,primaryKey:"objectID",createdAt:n.createdAt,updatedAt:n.updatedAt}}async function at(){let{items:e}=await Q(),t=e.map((n)=>({uid:n.name,primaryKey:"objectID",createdAt:n.createdAt,updatedAt:n.updatedAt}));return{results:t,offset:0,limit:t.length,total:t.length}}async function Qn(e){try{return A(e,"indexDeletion",await xe(e))}catch(t){if(!dt(t))throw t;return A(e,"indexDeletion")}}async function Xn(e,t){let n=De(t),r=n.objectID==null?await Y(e,n):await Y(e,n,encodeURIComponent(String(n.objectID)));return A(e,"documentAdditionOrUpdate",r)}async function Zn(e,t){if(!Array.isArray(t))throw TypeError("[search/algolia] addDocuments requires an array of documents");let n=t.map((r)=>{let s=De(r);return{action:s.objectID==null?"addObject":"updateObject",body:s}});return A(e,"documentAdditionOrUpdate",await Rt(e,n))}async function ut(e,t){let n=t.map((r)=>{let s=De(r);if(s.objectID==null)throw Error("[search/algolia] updateDocuments needs an `id` (or `objectID`) on every document");return{action:"partialUpdateObject",body:s}});return A(e,"documentAdditionOrUpdate",await Rt(e,n))}async function er(e,t,n){let r=Array.isArray(n)?n:Array.isArray(n?.fields)?n.fields:void 0;return await Te(e,encodeURIComponent(String(t)),r)}async function tr(e,t){return A(e,"documentDeletion",await Se(e,encodeURIComponent(String(t))))}async function nr(e,t){let n=Dt(t);if(!n)throw Error(`[search/algolia] deleteDocuments on "${e}" needs a filter. Use deleteAllDocuments to empty the index.`);return A(e,"documentDeletion",await Ae(e,n))}async function rr(e){try{return A(e,"documentDeletion",await we(e))}catch(t){if(!dt(t))throw t;return A(e,"documentDeletion")}}async function sr(e){return await C(e,{searchableAttributes:null,filterableAttributes:null,displayedAttributes:null,rankingRules:null,distinctAttribute:null,pagination:null,faceting:null,typoTolerance:null})}var B=null,W,Cn,rt=1000,Mn,ae,ue,ce,le,de,ge,pe,ye="Algolia sorts through replica indices: create a replica ranked by the attribute and search that index instead.",fe="Use Algolia's dictionaries API (stop words, plurals, compounds) from the Algolia dashboard instead.",ir,Ot;var Ie=H(()=>{N();W=class W extends Error{status;constructor(e,t){super(`Algolia API error: ${t}`);this.status=e}};Cn={configure:he,search:gt,multiSearch:pt,saveObject:Y,saveObjects:yt,partialUpdateObject:ft,deleteObject:Se,deleteObjects:mt,deleteBy:Ae,getObject:Te,getObjects:bt,clearObjects:we,getSettings:Pe,setSettings:ke,listIndices:Q,copyIndex:ht,moveIndex:St,deleteIndex:xe,indexExists:At,waitTask:Tt,saveSynonym:wt,searchSynonyms:Ee,clearSynonyms:Re,saveRule:Pt,searchRules:kt,clearRules:xt,browse:Et};Mn=["facets","attributesToRetrieve","attributesToHighlight","attributesToSnippet","restrictSearchableAttributes"];ae=U("filterableAttributes",null),ue=U("searchableAttributes",null),ce=U("displayedAttributes",null),le=U("rankingRules",null),de=U("pagination",null),ge=U("faceting",null),pe=U("typoTolerance",null);ir={client:()=>({request:d,configure:he}),resetClient:()=>{B=null},search:Ln,createIndex:Vn,getIndex:Yn,updateIndex:(e,t)=>I("Changing an index's primary key","Algolia keys every record by `objectID`, which the driver takes from `id`."),deleteIndex:Qn,listAllIndexes:at,listAllIndices:at,addDocument:Xn,addDocuments:Zn,updateDocument:(e,t)=>ut(e,[t]),updateDocuments:ut,getDocument:er,deleteDocument:tr,deleteDocuments:nr,deleteAllDocuments:rr,getFilterableAttributes:async(e)=>(await ae.get(e)).filter((t)=>typeof t==="string"),updateFilterableAttributes:ae.update,resetFilterableAttributes:ae.reset,getSearchableAttributes:ue.get,updateSearchableAttributes:ue.update,resetSearchableAttributes:ue.reset,getSortableAttributes:async()=>I("Sortable attributes",ye),updateSortableAttributes:async()=>I("Sortable attributes",ye),resetSortableAttributes:async()=>I("Sortable attributes",ye),getDisplayedAttributes:ce.get,updateDisplayedAttributes:ce.update,resetDisplayedAttributes:ce.reset,getSettings:be,updateSettings:(e,t)=>C(e,t),resetSettings:sr,getPagination:de.get,updatePagination:de.update,resetPagination:de.reset,getSynonyms:Jn,updateSynonyms:zn,resetSynonyms:It,getRankingRules:le.get,updateRankingRules:le.update,resetRankingRules:le.reset,getDistinctAttribute:async(e)=>(await be(e)).distinctAttribute??null,updateDistinctAttribute:(e,t)=>C(e,{distinctAttribute:t}),resetDistinctAttribute:(e)=>C(e,{distinctAttribute:null}),getFaceting:ge.get,updateFaceting:ge.update,resetFaceting:ge.reset,getTypoTolerance:pe.get,updateTypoTolerance:pe.update,resetTypoTolerance:pe.reset,getDictionary:async()=>I("A custom dictionary",fe),updateDictionary:async()=>I("A custom dictionary",fe),resetDictionary:async()=>I("A custom dictionary",fe)},Ot=ir});var vt={};J(vt,{default:()=>Ct});import{searchEngine as _t}from"@stacksjs/config";function He(){let e=_t.opensearch,t=String(e?.host||"localhost").replace(/\/+$/,""),n=/^https?:\/\//i.test(t),r=String(e?.protocol||"http").replace(/:$/,""),s=Number(e?.port||9200),i=`${r}://${t}${s?`:${s}`:""}`;if(n){let o=new URL(t);if(!o.port&&e?.port)o.port=String(e.port);i=o.toString().replace(/\/+$/,"")}return{baseUrl:i,auth:String(e?.auth||"")}}function or(e="application/json"){let{auth:t}=He();return{"Content-Type":e,...t?{Authorization:`Basic ${btoa(t)}`}:{}}}async function b(e,t,n,r){let{baseUrl:s}=He(),i=await fetch(`${s}${t}`,{method:e,headers:or(r),body:n===void 0?void 0:typeof n==="string"?n:JSON.stringify(n)});if(!i.ok){let a=await i.text();throw new K(i.status,e,t,a||i.statusText)}let o=await i.text();return o?JSON.parse(o):{}}function S(e){return`/${encodeURIComponent(e)}`}function E(e,t){return{taskUid:Date.now(),indexUid:e,status:"succeeded",type:t,enqueuedAt:new Date().toISOString()}}async function Ne(e){return(await b("GET",`${S(e)}/_mapping`))[e]?.mappings?._meta?.stacks||{}}async function X(e,t){let n;try{n=await Ne(e)}catch(r){if(!(r instanceof K)||r.status!==404)throw r;await b("PUT",S(e)),n={}}return await b("PUT",`${S(e)}/_mapping`,{_meta:{stacks:{...n,...t}}}),E(e,"settingsUpdate")}function ar(e){if(e==null||e==="")return[];if(typeof e==="string")return[{query_string:{query:e}}];if(Array.isArray(e))return e.filter(Boolean).map((n)=>({query_string:{query:Array.isArray(n)?n.map((r)=>`(${r})`).join(" OR "):n}}));if(!R(e))throw TypeError(`[search/opensearch] Unsupported filter: ${JSON.stringify(e)}`);let t=[];for(let[n,r]of Object.entries(e)){if(D("opensearch",n),r===void 0)continue;if(r===null)t.push({bool:{must_not:{exists:{field:n}}}});else if(Array.isArray(r))t.push({bool:{should:r.map((s)=>({match_phrase:{[n]:s}})),minimum_should_match:1}});else t.push({match_phrase:{[n]:r}})}return t}async function ur(e,t={}){let{query:n,limit:r,offset:s,filter:i,sort:o}=j(t,_t.perPage??F),a=typeof t==="string"?{}:t,c=ar(i),l=n?{multi_match:{query:n,fields:a.attributesToSearchOn||["*"]}}:{match_all:{}},p=c.length>0?{bool:{must:[l],filter:c}}:l,f=await b("POST",`${S(e)}/_search`,{query:p,from:s,size:r,...o?{sort:R(o)?Object.entries(o).map(([k,L])=>({[k]:{order:String(L).toLowerCase()==="desc"?"desc":"asc"}})):o}:{},...a.attributesToRetrieve?{_source:a.attributesToRetrieve}:{}}),T=typeof f.hits?.total==="number"?f.hits.total:Number(f.hits?.total?.value||0);return{hits:(f.hits?.hits||[]).map((k)=>({id:k._source?.id??k._id,...k._source})),estimatedTotalHits:T,processingTimeMs:Number(f.took||0),query:n,limit:r,offset:s}}async function cr(e,t={}){return await b("PUT",S(e),t),E(e,"indexCreation")}async function lr(e){return await b("GET",S(e))}async function dr(e,t){return await b("PUT",`${S(e)}/_settings`,t),E(e,"indexUpdate")}async function gr(e){try{await b("DELETE",S(e))}catch(t){if(!(t instanceof K)||t.status!==404)throw t}return E(e,"indexDeletion")}async function qt(){let t=(await b("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 Ft(e,t){let n=t?.id??t?.objectID,r=n===void 0||n===null?`${S(e)}/_doc?refresh=wait_for`:`${S(e)}/_doc/${encodeURIComponent(String(n))}?refresh=wait_for`;return await b(n===void 0||n===null?"POST":"PUT",r,t),E(e,"documentAdditionOrUpdate")}async function jt(e,t){if(!Array.isArray(t))throw TypeError("[search/opensearch] addDocuments requires an array of documents");if(t.length===0)return E(e,"documentAdditionOrUpdate");let n=t.flatMap((s)=>{let i=s?.id??s?.objectID;return[JSON.stringify({index:{_index:e,...i===void 0||i===null?{}:{_id:i}}}),JSON.stringify(s)]}),r=await b("POST","/_bulk?refresh=wait_for",`${n.join(`
|
|
2
|
+
var nn=Object.defineProperty;var rn=(e)=>e;function sn(e,t){this[e]=rn.bind(null,t)}var V=(e,t)=>{for(var n in t)nn(e,n,{get:t[n],enumerable:!0,configurable:!0,set:sn.bind(t,n)})};var N=(e,t,n)=>()=>{if(e)try{t=e(e=0)}catch(r){n=[r]}if(n)throw n[0];return t};function ae(e,t){let n=Number(t);if(!Number.isInteger(n)||n<0)throw TypeError(`[search] \`${e}\` must be a non-negative integer, got ${JSON.stringify(t)}`);return n}function j(e,t=20){let n=typeof e==="string"?{q:e}:e??{},r=n.q??n.query,s=r==null?"":String(r),i=n.limit??n.perPage,o=i==null?t:ae(n.limit!=null?"limit":"perPage",i),a=0;if(n.offset!=null)a=ae("offset",n.offset);else if(n.page!=null){let c=ae("page",n.page);if(c<1)throw TypeError("[search] `page` is 1-based and must be at least 1");a=(c-1)*o}return{query:s,limit:o,offset:a,filter:n.filter,sort:n.sort}}function R(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}function D(e,t){if(!On.test(t))throw Error(`[search/${e}] Refusing to build filter with unsafe field name: ${t}`)}function L(e,t){if(t==null)return[];if(typeof t==="string")return t?[t]:[];if(Array.isArray(t))return t.filter(Boolean);let n=[];for(let[r,s]of Object.entries(t))D(e,r),n.push(`${r}:${String(s).toLowerCase()==="desc"?"desc":"asc"}`);return n}var q=20,On;var B=N(()=>{On=/^[a-z_]\w*(?:\.[a-z_]\w*)*$/i});var Dt={};V(Dt,{AlgoliaRequestError:()=>K,algolia:()=>jn,browse:()=>kt,clearObjects:()=>Pe,clearRules:()=>Pt,clearSynonyms:()=>De,configure:()=>Se,copyIndex:()=>mt,default:()=>It,deleteBy:()=>Te,deleteIndex:()=>Ee,deleteObject:()=>Ae,deleteObjects:()=>pt,getObject:()=>we,getObjects:()=>ft,getSettings:()=>ke,indexExists:()=>ht,listIndices:()=>X,moveIndex:()=>bt,multiSearch:()=>dt,partialUpdateObject:()=>yt,saveObject:()=>Q,saveObjects:()=>gt,saveRule:()=>Tt,saveSynonym:()=>At,search:()=>lt,searchRules:()=>wt,searchSynonyms:()=>Re,setSettings:()=>xe,waitTask:()=>St});import{searchEngine as be}from"@stacksjs/config";import{log as at}from"@stacksjs/logging";function ut(){if(!W){let e=be.algolia?.appId||process.env.ALGOLIA_APP_ID||"",t=be.algolia?.apiKey||process.env.ALGOLIA_API_KEY||"";if(!e||!t)throw at.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.");W={appId:e,apiKey:t}}return W}function Fn(){let{appId:e}=ut();return`https://${e}.algolia.net`}function qn(){let{appId:e,apiKey:t}=ut();return{"X-Algolia-Application-Id":e,"X-Algolia-API-Key":t,"Content-Type":"application/json"}}async function d(e,t,n){let r=await fetch(`${Fn()}${t}`,{method:e,headers:qn(),body:n?JSON.stringify(n):void 0});if(!r.ok){let s=await r.json().catch(()=>({message:r.statusText}));throw new K(r.status,s.message||r.statusText)}return r.json()}function ct(e){return e instanceof K&&e.status===404}function Se(e){W=e}async function lt(e,t={}){return d("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 dt(e){return d("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 Q(e,t,n){if(n)return d("PUT",`/1/indexes/${e}/${n}`,t);return d("POST",`/1/indexes/${e}`,t)}async function gt(e,t){return d("POST",`/1/indexes/${e}/batch`,{requests:t.map((n)=>({action:n.objectID?"updateObject":"addObject",body:n}))})}async function yt(e,t,n,r=!0){return d("POST",`/1/indexes/${e}/${t}/partial${r?"":"?createIfNotExists=false"}`,n)}async function Ae(e,t){return d("DELETE",`/1/indexes/${e}/${t}`)}async function pt(e,t){return d("POST",`/1/indexes/${e}/batch`,{requests:t.map((n)=>({action:"deleteObject",body:{objectID:n}}))})}async function Te(e,t){return d("POST",`/1/indexes/${e}/deleteByQuery`,{filters:t})}async function we(e,t,n){let r=n?`?attributesToRetrieve=${n.join(",")}`:"";return d("GET",`/1/indexes/${e}/${t}${r}`)}async function ft(e,t,n){return d("POST","/1/indexes/*/objects",{requests:t.map((r)=>({indexName:e,objectID:r,attributesToRetrieve:n}))})}async function Pe(e){return d("POST",`/1/indexes/${e}/clear`)}async function ke(e){return d("GET",`/1/indexes/${e}/settings`)}async function xe(e,t,n=!1){return d("PUT",`/1/indexes/${e}/settings${n?"?forwardToReplicas=true":""}`,t)}async function X(){return d("GET","/1/indexes")}async function mt(e,t,n){return d("POST",`/1/indexes/${e}/operation`,{operation:"copy",destination:t,scope:n})}async function bt(e,t){return d("POST",`/1/indexes/${e}/operation`,{operation:"move",destination:t})}async function Ee(e){return d("DELETE",`/1/indexes/${e}`)}async function ht(e){try{return await d("GET",`/1/indexes/${e}/settings`),!0}catch{return!1}}async function St(e,t,n=1e4,r=100){let s=Date.now();while(Date.now()-s<n){let i=await d("GET",`/1/indexes/${e}/task/${t}`);if(i.status==="published")return i;await new Promise((o)=>setTimeout(o,r))}throw Error(`Task ${t} timed out after ${n}ms`)}async function At(e,t,n=!1){return d("PUT",`/1/indexes/${e}/synonyms/${t.objectID}${n?"?forwardToReplicas=true":""}`,t)}async function Re(e,t="",n,r=0,s=20){return d("POST",`/1/indexes/${e}/synonyms/search`,{query:t,type:n,page:r,hitsPerPage:s})}async function De(e,t=!1){return d("POST",`/1/indexes/${e}/synonyms/clear${t?"?forwardToReplicas=true":""}`)}async function Tt(e,t,n=!1){return d("PUT",`/1/indexes/${e}/rules/${t.objectID}${n?"?forwardToReplicas=true":""}`,t)}async function wt(e,t="",n,r,s=0,i=20){return d("POST",`/1/indexes/${e}/rules/search`,{query:t,anchoring:n,context:r,page:s,hitsPerPage:i})}async function Pt(e,t=!1){return d("POST",`/1/indexes/${e}/rules/clear${t?"?forwardToReplicas=true":""}`)}async function*kt(e,t={}){let n;do{let r=await d("POST",`/1/indexes/${e}/browse`,{...t,cursor:n});for(let s of r.hits)yield s;n=r.cursor}while(n)}function I(e,t){throw Error(`[search/algolia] ${e} is not supported by Algolia. ${t}`)}function A(e,t,n){return{taskUid:Number(n?.taskID??0),indexUid:e,status:"enqueued",type:t,enqueuedAt:n?.createdAt??n?.updatedAt??new Date().toISOString()}}function Ie(e){let t=e.objectID??e.id;return t==null?{...e}:{...e,objectID:String(t)}}async function xt(e,t){let n;for(let r=0;r<t.length;r+=tt)n=await d("POST",`/1/indexes/${e}/batch`,{requests:t.slice(r,r+tt)});return n}function _n(e){return`"${String(e).replace(/\\/g,"\\\\").replace(/"/g,"\\\"")}"`}function nt(e,t){if(typeof t==="number")return`${e} = ${t}`;if(typeof t==="boolean")return`${e}:${t}`;return`${e}:${_n(t)}`}function Et(e){if(e==null||e==="")return;if(typeof e==="string")return e;if(Array.isArray(e)){let n=e.filter(Boolean).map((r)=>Array.isArray(r)?`(${r.join(" OR ")})`:`(${r})`);return n.length>0?n.join(" AND "):void 0}if(!R(e))throw TypeError(`[search/algolia] Unsupported filter: ${JSON.stringify(e)}`);let t=[];for(let[n,r]of Object.entries(e)){if(D("algolia",n),r===void 0)continue;if(r===null)throw TypeError(`[search/algolia] Algolia cannot filter on a missing value (${n}: null)`);t.push(Array.isArray(r)?`(${r.map((s)=>nt(n,s)).join(" OR ")})`:nt(n,r))}return t.length>0?t.join(" AND "):void 0}async function Cn(e,t={}){let{query:n,limit:r,offset:s,filter:i,sort:o}=j(t,be.perPage??q);if(L("algolia",o).length>0)I("Sorting at query time","Algolia sorts through replica indices: create a replica ranked by the attribute (e.g. `products_price_asc`) and search that index instead.");let a={query:n};if(r>0&&s%r===0)a.page=s/r,a.hitsPerPage=r;else a.offset=s,a.length=r;let c=t.filters||Et(i);if(c)a.filters=c;for(let y of vn)if(t[y]!==void 0)a[y]=t[y];let l=await d("POST",`/1/indexes/${e}/query`,a);return{hits:l.hits??[],query:l.query??n,processingTimeMs:l.processingTimeMS??0,limit:r,offset:s,estimatedTotalHits:l.nbHits??l.hits?.length??0,...l.facets?{facetDistribution:l.facets}:{}}}function rt(e){let t=/^\w+\((.+)\)$/.exec(e);return t?t[1]:e}function Un(e){if(e==null)return null;return e.flatMap((t)=>typeof t==="string"?[t]:t.attributePatterns)}function st(e){if(e==null||e.length===0||e.length===1&&e[0]==="*")return null;return e}function Mn(e){return e.flatMap((t)=>{let n=/^([\w.]+):(asc|desc)$/.exec(t);if(n)return[`${n[2]}(${n[1]})`];if(t==="exactness")return["exact"];if(t==="sort")return[];return[t]})}function Ln(e){return e.map((t)=>{let n=/^(asc|desc)\(([\w.]+)\)$/.exec(t);if(n)return`${n[2]}:${n[1]}`;return t==="exact"?"exactness":t})}function Hn(e){if(e==null)return{typoTolerance:null,minWordSizefor1Typo:null,minWordSizefor2Typos:null,disableTypoToleranceOnAttributes:null,disableTypoToleranceOnWords:null};let t={};if(e.enabled!=null)t.typoTolerance=e.enabled;if(e.minWordSizeForTypos?.oneTypo!=null)t.minWordSizefor1Typo=e.minWordSizeForTypos.oneTypo;if(e.minWordSizeForTypos?.twoTypos!=null)t.minWordSizefor2Typos=e.minWordSizeForTypos.twoTypos;if(e.disableOnAttributes!==void 0)t.disableTypoToleranceOnAttributes=e.disableOnAttributes;if(e.disableOnWords!==void 0)t.disableTypoToleranceOnWords=e.disableOnWords;if(e.disableOnNumbers!=null)t.allowTyposOnNumericTokens=!e.disableOnNumbers;return t}function Nn(e){let t={},n=[];for(let[r,s]of Object.entries(e)){if(s===void 0)continue;switch(r){case"searchableAttributes":t.searchableAttributes=st(s);break;case"filterableAttributes":t.attributesForFaceting=Un(s);break;case"displayedAttributes":t.attributesToRetrieve=st(s);break;case"rankingRules":t.ranking=s==null?null:Mn(s);break;case"distinctAttribute":t.attributeForDistinct=s,t.distinct=s==null?null:!0;break;case"pagination":t.paginationLimitedTo=s?.maxTotalHits??null;break;case"faceting":{let i=s;t.maxValuesPerFacet=i?.maxValuesPerFacet??null;let o=i?.sortFacetValuesBy?.["*"];if(o!==void 0||i==null)t.sortFacetValuesBy=o??null;break}case"typoTolerance":Object.assign(t,Hn(s));break;case"synonyms":break;default:n.push(r)}}if(n.length>0)at.warn(`[search/algolia] Skipped settings with no Algolia equivalent: ${n.join(", ")}. Algolia sorts through replica indices.`);return t}function Bn(e){return{searchableAttributes:(e.searchableAttributes??["*"]).map(rt),filterableAttributes:(e.attributesForFaceting??[]).map(rt),sortableAttributes:[],displayedAttributes:e.attributesToRetrieve??["*"],rankingRules:Ln(e.ranking??[]),distinctAttribute:e.distinct?e.attributeForDistinct??null:null,pagination:{maxTotalHits:e.paginationLimitedTo??null},faceting:{maxValuesPerFacet:e.maxValuesPerFacet??null,...e.sortFacetValuesBy?{sortFacetValuesBy:{"*":e.sortFacetValuesBy}}:{}},typoTolerance:{enabled:e.typoTolerance===void 0?!0:e.typoTolerance!==!1,minWordSizeForTypos:{oneTypo:e.minWordSizefor1Typo??null,twoTypos:e.minWordSizefor2Typos??null},disableOnAttributes:e.disableTypoToleranceOnAttributes??[],disableOnWords:e.disableTypoToleranceOnWords??[]}}}async function he(e){return Bn(await ke(e))}async function C(e,t,n="settingsUpdate"){let r=Nn(t),s=await xe(e,r);return A(e,n,s)}function U(e,t){return{get:async(n)=>(await he(n))[e],update:(n,r)=>C(n,{[e]:r}),reset:(n)=>C(n,{[e]:t})}}async function Wn(e,t){if(t==null)return Rt(e);let n=Object.entries(t).map(([s,i])=>({objectID:`stacks-${s}`,type:"oneWaySynonym",input:s,synonyms:i})),r=await d("POST",`/1/indexes/${e}/synonyms/batch?replaceExistingSynonyms=true`,n);return A(e,"settingsUpdate",r)}async function Rt(e){return A(e,"settingsUpdate",await De(e))}async function Kn(e){let t={},n=0;while(!0){let{hits:r,nbHits:s}=await Re(e,"",void 0,n,100);for(let i of r)if(i.type==="oneWaySynonym"&&i.input)t[i.input]=[...t[i.input]??[],...i.synonyms??[]];else if(i.type==="synonym")for(let o of i.synonyms??[])t[o]=[...t[o]??[],...(i.synonyms??[]).filter((a)=>a!==o)];if(n++,r.length===0||n*100>=s)break}return t}async function Gn(e,t){if(t?.primaryKey&&t.primaryKey!=="id"&&t.primaryKey!=="objectID")I(`A primary key other than \`id\` (${t.primaryKey})`,"Algolia keys every record by `objectID`, which the driver takes from `id`.");return await C(e,t?.settings??{},"indexCreation")}async function zn(e){let{items:t}=await X(),n=t.find((r)=>r.name===e);if(!n)throw new K(404,`Index ${e} does not exist`);return{uid:n.name,primaryKey:"objectID",createdAt:n.createdAt,updatedAt:n.updatedAt}}async function it(){let{items:e}=await X(),t=e.map((n)=>({uid:n.name,primaryKey:"objectID",createdAt:n.createdAt,updatedAt:n.updatedAt}));return{results:t,offset:0,limit:t.length,total:t.length}}async function Jn(e){try{return A(e,"indexDeletion",await Ee(e))}catch(t){if(!ct(t))throw t;return A(e,"indexDeletion")}}async function Vn(e,t){let n=Ie(t),r=n.objectID==null?await Q(e,n):await Q(e,n,encodeURIComponent(String(n.objectID)));return A(e,"documentAdditionOrUpdate",r)}async function Yn(e,t){if(!Array.isArray(t))throw TypeError("[search/algolia] addDocuments requires an array of documents");let n=t.map((r)=>{let s=Ie(r);return{action:s.objectID==null?"addObject":"updateObject",body:s}});return A(e,"documentAdditionOrUpdate",await xt(e,n))}async function ot(e,t){let n=t.map((r)=>{let s=Ie(r);if(s.objectID==null)throw Error("[search/algolia] updateDocuments needs an `id` (or `objectID`) on every document");return{action:"partialUpdateObject",body:s}});return A(e,"documentAdditionOrUpdate",await xt(e,n))}async function Qn(e,t,n){let r=Array.isArray(n)?n:Array.isArray(n?.fields)?n.fields:void 0;return await we(e,encodeURIComponent(String(t)),r)}async function Xn(e,t){return A(e,"documentDeletion",await Ae(e,encodeURIComponent(String(t))))}async function Zn(e,t){let n=Et(t);if(!n)throw Error(`[search/algolia] deleteDocuments on "${e}" needs a filter. Use deleteAllDocuments to empty the index.`);return A(e,"documentDeletion",await Te(e,n))}async function er(e){try{return A(e,"documentDeletion",await Pe(e))}catch(t){if(!ct(t))throw t;return A(e,"documentDeletion")}}async function tr(e){return await C(e,{searchableAttributes:null,filterableAttributes:null,displayedAttributes:null,rankingRules:null,distinctAttribute:null,pagination:null,faceting:null,typoTolerance:null})}var W=null,K,jn,tt=1000,vn,ue,ce,le,de,ge,ye,pe,fe="Algolia sorts through replica indices: create a replica ranked by the attribute and search that index instead.",me="Use Algolia's dictionaries API (stop words, plurals, compounds) from the Algolia dashboard instead.",nr,It;var $e=N(()=>{B();K=class K extends Error{status;constructor(e,t){super(`Algolia API error: ${t}`);this.status=e}};jn={configure:Se,search:lt,multiSearch:dt,saveObject:Q,saveObjects:gt,partialUpdateObject:yt,deleteObject:Ae,deleteObjects:pt,deleteBy:Te,getObject:we,getObjects:ft,clearObjects:Pe,getSettings:ke,setSettings:xe,listIndices:X,copyIndex:mt,moveIndex:bt,deleteIndex:Ee,indexExists:ht,waitTask:St,saveSynonym:At,searchSynonyms:Re,clearSynonyms:De,saveRule:Tt,searchRules:wt,clearRules:Pt,browse:kt};vn=["facets","attributesToRetrieve","attributesToHighlight","attributesToSnippet","restrictSearchableAttributes"];ue=U("filterableAttributes",null),ce=U("searchableAttributes",null),le=U("displayedAttributes",null),de=U("rankingRules",null),ge=U("pagination",null),ye=U("faceting",null),pe=U("typoTolerance",null);nr={client:()=>({request:d,configure:Se}),resetClient:()=>{W=null},search:Cn,createIndex:Gn,getIndex:zn,updateIndex:(e,t)=>I("Changing an index's primary key","Algolia keys every record by `objectID`, which the driver takes from `id`."),deleteIndex:Jn,listAllIndexes:it,listAllIndices:it,addDocument:Vn,addDocuments:Yn,updateDocument:(e,t)=>ot(e,[t]),updateDocuments:ot,getDocument:Qn,deleteDocument:Xn,deleteDocuments:Zn,deleteAllDocuments:er,getFilterableAttributes:async(e)=>(await ue.get(e)).filter((t)=>typeof t==="string"),updateFilterableAttributes:ue.update,resetFilterableAttributes:ue.reset,getSearchableAttributes:ce.get,updateSearchableAttributes:ce.update,resetSearchableAttributes:ce.reset,getSortableAttributes:async()=>I("Sortable attributes",fe),updateSortableAttributes:async()=>I("Sortable attributes",fe),resetSortableAttributes:async()=>I("Sortable attributes",fe),getDisplayedAttributes:le.get,updateDisplayedAttributes:le.update,resetDisplayedAttributes:le.reset,getSettings:he,updateSettings:(e,t)=>C(e,t),resetSettings:tr,getPagination:ge.get,updatePagination:ge.update,resetPagination:ge.reset,getSynonyms:Kn,updateSynonyms:Wn,resetSynonyms:Rt,getRankingRules:de.get,updateRankingRules:de.update,resetRankingRules:de.reset,getDistinctAttribute:async(e)=>(await he(e)).distinctAttribute??null,updateDistinctAttribute:(e,t)=>C(e,{distinctAttribute:t}),resetDistinctAttribute:(e)=>C(e,{distinctAttribute:null}),getFaceting:ye.get,updateFaceting:ye.update,resetFaceting:ye.reset,getTypoTolerance:pe.get,updateTypoTolerance:pe.update,resetTypoTolerance:pe.reset,getDictionary:async()=>I("A custom dictionary",me),updateDictionary:async()=>I("A custom dictionary",me),resetDictionary:async()=>I("A custom dictionary",me)},It=nr});var jt={};V(jt,{default:()=>_t});import{searchEngine as qt}from"@stacksjs/config";function Ne(){let e=qt.opensearch,t=String(e?.host||"localhost").replace(/\/+$/,""),n=/^https?:\/\//i.test(t),r=String(e?.protocol||"http").replace(/:$/,""),s=Number(e?.port||9200),i=`${r}://${t}${s?`:${s}`:""}`;if(n){let o=new URL(t);if(!o.port&&e?.port)o.port=String(e.port);i=o.toString().replace(/\/+$/,"")}return{baseUrl:i,auth:String(e?.auth||"")}}function rr(e="application/json"){let{auth:t}=Ne();return{"Content-Type":e,...t?{Authorization:`Basic ${btoa(t)}`}:{}}}async function b(e,t,n,r){let{baseUrl:s}=Ne(),i=await fetch(`${s}${t}`,{method:e,headers:rr(r),body:n===void 0?void 0:typeof n==="string"?n:JSON.stringify(n)});if(!i.ok){let a=await i.text();throw new G(i.status,e,t,a||i.statusText)}let o=await i.text();return o?JSON.parse(o):{}}function S(e){return`/${encodeURIComponent(e)}`}function E(e,t){return{taskUid:Date.now(),indexUid:e,status:"succeeded",type:t,enqueuedAt:new Date().toISOString()}}async function Be(e){return(await b("GET",`${S(e)}/_mapping`))[e]?.mappings?._meta?.stacks||{}}async function Z(e,t){let n;try{n=await Be(e)}catch(r){if(!(r instanceof G)||r.status!==404)throw r;await b("PUT",S(e)),n={}}return await b("PUT",`${S(e)}/_mapping`,{_meta:{stacks:{...n,...t}}}),E(e,"settingsUpdate")}function sr(e){if(e==null||e==="")return[];if(typeof e==="string")return[{query_string:{query:e}}];if(Array.isArray(e))return e.filter(Boolean).map((n)=>({query_string:{query:Array.isArray(n)?n.map((r)=>`(${r})`).join(" OR "):n}}));if(!R(e))throw TypeError(`[search/opensearch] Unsupported filter: ${JSON.stringify(e)}`);let t=[];for(let[n,r]of Object.entries(e)){if(D("opensearch",n),r===void 0)continue;if(r===null)t.push({bool:{must_not:{exists:{field:n}}}});else if(Array.isArray(r))t.push({bool:{should:r.map((s)=>({match_phrase:{[n]:s}})),minimum_should_match:1}});else t.push({match_phrase:{[n]:r}})}return t}async function ir(e,t={}){let{query:n,limit:r,offset:s,filter:i,sort:o}=j(t,qt.perPage??q),a=typeof t==="string"?{}:t,c=sr(i),l=n?{multi_match:{query:n,fields:a.attributesToSearchOn||["*"]}}:{match_all:{}},y=c.length>0?{bool:{must:[l],filter:c}}:l,f=await b("POST",`${S(e)}/_search`,{query:y,from:s,size:r,...o?{sort:R(o)?Object.entries(o).map(([k,H])=>({[k]:{order:String(H).toLowerCase()==="desc"?"desc":"asc"}})):o}:{},...a.attributesToRetrieve?{_source:a.attributesToRetrieve}:{}}),T=typeof f.hits?.total==="number"?f.hits.total:Number(f.hits?.total?.value||0);return{hits:(f.hits?.hits||[]).map((k)=>({id:k._source?.id??k._id,...k._source})),estimatedTotalHits:T,processingTimeMs:Number(f.took||0),query:n,limit:r,offset:s}}async function or(e,t={}){return await b("PUT",S(e),t),E(e,"indexCreation")}async function ar(e){return await b("GET",S(e))}async function ur(e,t){return await b("PUT",`${S(e)}/_settings`,t),E(e,"indexUpdate")}async function cr(e){try{await b("DELETE",S(e))}catch(t){if(!(t instanceof G)||t.status!==404)throw t}return E(e,"indexDeletion")}async function $t(){let t=(await b("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 Ot(e,t){let n=t?.id??t?.objectID,r=n===void 0||n===null?`${S(e)}/_doc?refresh=wait_for`:`${S(e)}/_doc/${encodeURIComponent(String(n))}?refresh=wait_for`;return await b(n===void 0||n===null?"POST":"PUT",r,t),E(e,"documentAdditionOrUpdate")}async function Ft(e,t){if(!Array.isArray(t))throw TypeError("[search/opensearch] addDocuments requires an array of documents");if(t.length===0)return E(e,"documentAdditionOrUpdate");let n=t.flatMap((s)=>{let i=s?.id??s?.objectID;return[JSON.stringify({index:{_index:e,...i===void 0||i===null?{}:{_id:i}}}),JSON.stringify(s)]}),r=await b("POST","/_bulk?refresh=wait_for",`${n.join(`
|
|
3
3
|
`)}
|
|
4
|
-
`,"application/x-ndjson");if(r.errors){let s=r.items?.filter((i)=>Number(i.index?.status||0)>=400)||[];throw Error(`[search/opensearch] Bulk indexing failed for ${s.length} document(s)`)}return E(e,"documentAdditionOrUpdate")}async function
|
|
5
|
-
`),s=await fetch(`${
|
|
6
|
-
`).filter((a)=>a.trim()!=="").forEach((a,c)=>{let l;try{l=JSON.parse(a)}catch{l={success:!1,error:a}}if(l.success!==!0)o.push({id:n[c]?.id,error:l.error??"not written"})}),o.length>0)throw new Je(e,o,n.length);return P(e)}async function $r(e,t){return await y("DELETE",`${m(e)}/documents/${encodeURIComponent(String(t))}`),P(e)}async function Or(e,t){let n=Wt(t);if(!n)throw Error(`[search/typesense] deleteDocuments on "${e}" needs a filter. Use deleteAllDocuments to empty the collection.`);return await y("DELETE",`${m(e)}/documents?${new URLSearchParams({filter_by:n})}`),P(e)}async function qr(e){try{await y("DELETE",`${m(e)}/documents?truncate=true`)}catch(t){if(!Ge(t))throw t}return P(e)}async function Fr(e){try{await y("DELETE",m(e))}catch(t){if(!Ge(t))throw t;Tr.debug(`[search/typesense] deleteIndex ${e}: already absent`)}return ne.delete(e),P(e)}async function jr(e,t){let n=t?.sampleDocument;return await re(e,n?[ze(n)]:void 0,t?.settings),P(e)}async function _r(e){return await y("GET",m(e))}async function We(e,t){return await re(e,void 0,t),P(e)}function Z(e){return(t,n)=>We(t,{[e]:n??[]})}async function Ve(e){return((await y("GET",m(e))).fields??[]).map((n)=>n.name).filter((n)=>n!=="id")}async function Gt(e){return((await y("GET",m(e))).fields??[]).filter((n)=>n.facet).map((n)=>n.name)}async function zt(e){return((await y("GET",m(e))).fields??[]).filter((n)=>n.sort).map((n)=>n.name)}async function Jt(e){return Ve(e)}async function vr(e){return{searchableAttributes:await Ve(e),filterableAttributes:await Gt(e),sortableAttributes:await zt(e),displayedAttributes:await Jt(e)}}function g(e,t){throw Error(`[search/typesense] ${e} is not supported by Typesense. ${t}`)}async function Lt(){let t=(await y("GET","/collections")).map((n)=>({...n,uid:n.name,primaryKey:"id"}));return{results:t,offset:0,limit:t.length,total:t.length}}async function Cr(e,t){return await y("GET",`${m(e)}/documents/${encodeURIComponent(String(t))}`)}async function Ur(e){let t=await y("GET",`${m(e)}/synonyms`),n={};for(let r of t.synonyms??[]){if(r.root){n[r.root]=[...n[r.root]??[],...r.synonyms];continue}for(let s of r.synonyms)n[s]=[...n[s]??[],...r.synonyms.filter((i)=>i!==s)]}return n}async function Mr(e,t){await Vt(e);for(let[n,r]of Object.entries(t??{})){if(!r?.length)continue;await y("PUT",`${m(e)}/synonyms/${encodeURIComponent(`stacks-${n}`)}`,{root:n,synonyms:r})}return P(e)}async function Vt(e){let t=await y("GET",`${m(e)}/synonyms`);for(let n of t.synonyms??[])await y("DELETE",`${m(e)}/synonyms/${encodeURIComponent(n.id)}`);return P(e)}var te=null,Ke,ne,Je,h="Typesense takes it per search request, not as an index setting.",ee="Typesense derives it from the collection schema: declare it in the model's useSearch trait.",Lr,Qt;var Ye=H(()=>{N();Ke=class Ke extends Error{status;constructor(e,t,n,r){super(`[search/typesense] ${t} ${n} failed (${e}): ${r}`);this.status=e}};ne=new Map;Je=class Je extends Error{indexName;failures;total;constructor(e,t,n){let r=t.slice(0,5).map((i)=>`#${String(i.id??"?")}: ${i.error}`).join("; "),s=t.length>5?`; and ${t.length-5} more`:"";super(`[search/typesense] import into "${e}" rejected ${t.length} of ${n} document(s): ${r}${s}`);this.indexName=e;this.failures=t;this.total=n}};Lr={client:()=>({}),resetClient:()=>{te=null,ne.clear()},search:Ir,getIndex:_r,createIndex:jr,deleteIndex:Fr,updateIndex:()=>g("updateIndex (changing the primary key)","A Typesense collection's key is always `id`."),listAllIndexes:Lt,listAllIndices:Lt,addDocument:Ut,addDocuments:Mt,updateDocument:(e,t)=>Ut(e,t),updateDocuments:(e,t)=>Mt(e,t),deleteDocument:$r,deleteDocuments:Or,deleteAllDocuments:qr,getDocument:Cr,getFilterableAttributes:Gt,updateFilterableAttributes:Z("filterableAttributes"),resetFilterableAttributes:(e)=>We(e,{filterableAttributes:[]}),updateDisplayedAttributes:Z("displayedAttributes"),resetDisplayedAttributes:()=>g("resetDisplayedAttributes",ee),getDisplayedAttributes:Jt,updateSearchableAttributes:Z("searchableAttributes"),resetSearchableAttributes:()=>g("resetSearchableAttributes",ee),getSearchableAttributes:Ve,updateSortableAttributes:Z("sortableAttributes"),resetSortableAttributes:()=>g("resetSortableAttributes",ee),getSortableAttributes:zt,getSettings:vr,updateSettings:We,resetSettings:()=>g("resetSettings",ee),getPagination:()=>g("Index pagination settings",h),updatePagination:()=>g("Index pagination settings",h),resetPagination:()=>g("Index pagination settings",h),getSynonyms:Ur,updateSynonyms:Mr,resetSynonyms:Vt,getRankingRules:()=>g("Ranking rules",h),updateRankingRules:()=>g("Ranking rules",h),resetRankingRules:()=>g("Ranking rules",h),getDistinctAttribute:()=>g("A distinct attribute",h),updateDistinctAttribute:()=>g("A distinct attribute",h),resetDistinctAttribute:()=>g("A distinct attribute",h),getFaceting:()=>g("Faceting settings",h),updateFaceting:()=>g("Faceting settings",h),resetFaceting:()=>g("Faceting settings",h),getTypoTolerance:()=>g("Typo tolerance settings",h),updateTypoTolerance:()=>g("Typo tolerance settings",h),resetTypoTolerance:()=>g("Typo tolerance settings",h),getDictionary:()=>g("Custom dictionaries","Typesense has no equivalent."),updateDictionary:()=>g("Custom dictionaries","Typesense has no equivalent."),resetDictionary:()=>g("Custom dictionaries","Typesense has no equivalent.")},Qt=Lr});var en={};J(en,{default:()=>tn});import{searchEngine as Qe}from"@stacksjs/config";function u(){if(!Xe)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(!se){let e=Qe.meilisearch?.host||"http://127.0.0.1:7700",t=Qe.meilisearch?.apiKey||"";if(!e)throw Error("Meilisearch host is not configured. Please specify a search engine host.");se=new Xe({host:e,apiKey:t})}return se}function Hr(){se=null}async function Br(e,t={}){let{query:n,limit:r,offset:s,filter:i,sort:o}=j(t,Qe.perPage??F),a={limit:r,offset:s},c=Us(i);if(c!==void 0)a.filter=c;let l=M("meilisearch",o);if(l.length>0)a.sort=l;for(let p of Nr)if(t[p]!==void 0)a[p]=t[p];return await u().index(e).search(n,a)}async function Wr(e,t){return await u().index(e).addDocuments([t])}async function Kr(e,t){if(!Array.isArray(t))throw TypeError("[search/meilisearch] addDocuments requires an array of documents");if(t.length<=1000)return await u().index(e).addDocuments(t);let r;for(let s=0;s<t.length;s+=1000){let i=t.slice(s,s+1000),o=await u().index(e).addDocuments(i);if(!r)r=o}return r}async function Gr(e){return await u().getIndex(e)}async function zr(e,t){return await u().createIndex(e,t)}async function Jr(e,t){return await u().updateIndex(e,t)}async function Vr(e,t){return await u().index(e).updateDocuments([t])}async function Yr(e,t){return await u().index(e).updateDocuments(t)}async function Qr(e,t){return await u().index(e).deleteDocument(t)}async function Xr(e,t){return await u().index(e).deleteDocuments({filter:t})}async function Zr(e){return await u().index(e).deleteAllDocuments()}async function es(e,t,n){return await u().index(e).getDocument(t,n)}async function ts(e){return await u().deleteIndex(e)}async function Xt(){return await u().getIndexes()}async function ns(e){return(await u().index(e).getFilterableAttributes()??[]).filter((n)=>typeof n==="string")}async function rs(e,t){return u().index(e).updateFilterableAttributes(t)}async function ss(e){return u().index(e).resetFilterableAttributes()}async function is(e,t){return u().index(e).updateSearchableAttributes(t)}async function os(e){return u().index(e).resetSearchableAttributes()}async function as(e){return u().index(e).getSearchableAttributes()}async function us(e,t){return u().index(e).updateSortableAttributes(t)}async function cs(e){return u().index(e).resetSortableAttributes()}async function ls(e){return u().index(e).getSortableAttributes()}async function ds(e,t){return u().index(e).updateDisplayedAttributes(t)}async function gs(e){return u().index(e).getDisplayedAttributes()}async function ps(e){return u().index(e).resetDisplayedAttributes()}async function ys(e){return u().index(e).getSettings()}async function fs(e,t){return u().index(e).updateSettings(t)}async function ms(e){return u().index(e).resetSettings()}async function bs(e){return u().index(e).getPagination()}async function hs(e,t){return u().index(e).updatePagination(t)}async function Ss(e){return u().index(e).resetPagination()}async function As(e){return u().index(e).getSynonyms()}async function Ts(e,t){return u().index(e).updateSynonyms(t)}async function ws(e){return u().index(e).resetSynonyms()}async function Ps(e){return u().index(e).getRankingRules()}async function ks(e,t){return u().index(e).updateRankingRules(t)}async function xs(e){return u().index(e).resetRankingRules()}async function Es(e){return u().index(e).getDistinctAttribute()}async function Rs(e,t){return u().index(e).updateDistinctAttribute(t)}async function Ds(e){return u().index(e).resetDistinctAttribute()}async function Is(e){return u().index(e).getFaceting()}async function $s(e,t){return u().index(e).updateFaceting(t)}async function Os(e){return u().index(e).resetFaceting()}async function qs(e){return u().index(e).getTypoTolerance()}async function Fs(e,t){return u().index(e).updateTypoTolerance(t)}async function js(e){return u().index(e).resetTypoTolerance()}async function _s(e){return u().index(e).getDictionary()}async function vs(e,t){return u().index(e).updateDictionary(t)}async function Cs(e){return u().index(e).resetDictionary()}function Zt(e){return`'${String(e).replace(/\\/g,"\\\\").replace(/'/g,"\\'")}'`}function Us(e){if(e==null||e==="")return;if(typeof e==="string"||Array.isArray(e))return e;if(!R(e))throw TypeError(`[search/meilisearch] Unsupported filter: ${JSON.stringify(e)}`);let t=[];for(let[n,r]of Object.entries(e)){if(D("meilisearch",n),r===void 0)continue;if(r===null)t.push(`${n} IS NULL`);else if(Array.isArray(r))t.push(`${n} IN [${r.map(Zt).join(", ")}]`);else t.push(`${n} = ${Zt(r)}`)}return t.length>0?t:void 0}var Xe,se=null,Nr,Ms,tn;var Ze=H(async()=>{N();try{({Meilisearch:Xe}=await import("meilisearch"))}catch{}Nr=["attributesToRetrieve","attributesToHighlight","attributesToCrop","attributesToSearchOn","cropLength","cropMarker","distinct","facets","highlightPreTag","highlightPostTag","matchingStrategy","showMatchesPosition","showRankingScore"];Ms={client:u,resetClient:Hr,search:Br,getIndex:Gr,createIndex:zr,deleteIndex:ts,updateIndex:Jr,listAllIndexes:Xt,listAllIndices:Xt,addDocument:Wr,addDocuments:Kr,updateDocument:Vr,updateDocuments:Yr,deleteDocument:Qr,deleteDocuments:Xr,deleteAllDocuments:Zr,getDocument:es,getFilterableAttributes:ns,updateFilterableAttributes:rs,resetFilterableAttributes:ss,updateDisplayedAttributes:ds,resetDisplayedAttributes:ps,getDisplayedAttributes:gs,updateSearchableAttributes:is,resetSearchableAttributes:os,getSearchableAttributes:as,updateSortableAttributes:us,resetSortableAttributes:cs,getSortableAttributes:ls,getSettings:ys,updateSettings:fs,resetSettings:ms,getPagination:bs,updatePagination:hs,resetPagination:Ss,getSynonyms:As,updateSynonyms:Ts,resetSynonyms:ws,getRankingRules:Ps,updateRankingRules:ks,resetRankingRules:xs,getDistinctAttribute:Es,updateDistinctAttribute:Rs,resetDistinctAttribute:Ds,getFaceting:Is,updateFaceting:$s,resetFaceting:Os,getTypoTolerance:qs,updateTypoTolerance:Fs,resetTypoTolerance:js,getDictionary:_s,updateDictionary:vs,resetDictionary:Cs},tn=Ms});import{overridesReady as Ls,searchEngine as nn}from"@stacksjs/config";import{err as cn,ok as ln}from"@stacksjs/error-handling";import{log as v}from"@stacksjs/logging";import{getModelName as dn,getTableName as gn}from"@stacksjs/orm";import{path as et}from"@stacksjs/path";import{useSearchEngine as pn}from"@stacksjs/search-engine";import{globSync as yn}from"@stacksjs/storage";import{snakeCase as un}from"@stacksjs/strings";function V(e,t={}){let n={},r=(c)=>Array.isArray(c)?c.map((l)=>un(l)):void 0,s=r(e.searchable),i=r(e.filterable),o=r(e.sortable),a=t.displayed===!1?void 0:r(e.displayable);if(s)n.searchableAttributes=s;if(i)n.filterableAttributes=i;if(o)n.sortableAttributes=o;if(a)n.displayedAttributes=a;return n}function q(e,t){return typeof e==="object"&&e.index?e.index:t}async function Xs(e){try{let t=yn([et.userModelsPath("*.ts"),et.defaultsPath("app/Models/**/*.ts")],{absolute:!0}),{addDocument:n,updateSettings:r}=pn();for(let s of t){let i=(await import(s)).default,o=i.traits?.useSearch,a=q(o,gn(i,s)),c=dn(i,s);if(e&&c!==e)continue;if(o&&(typeof o==="boolean"||typeof o==="object")){if(typeof o==="object")await r(a,V(o));let l=i;if(typeof l.all!=="function"){v.warn(`[search] ${c}: model has no .all() - define it with defineModel`);continue}let p=l.makeAllSearchable;if(typeof p==="function"){let x=await p.call(l);v.info(`[search] ${c}: imported ${x}, skipped 0`);continue}let f=typeof o==="object"?o.denormalize:void 0,T=f?Array.from(new Set(Object.values(f).map((x)=>x.split(".")[0]).filter((x)=>Boolean(x)))):[],O;if(T.length>0&&typeof l.query==="function")try{O=await l.query().with(...T).get()}catch(x){v.warn(`[search] ${c}: eager-load of [${T.join(", ")}] failed - falling back to .all(); denormalized fields will be null. (${x.message})`),O=await l.all()}else O=await l.all();let k=0,L=0;for(let x of O)try{let z=x.toSearchableObject?.();if(z==null){L++;continue}await n(a,z),k++}catch(z){L++,v.warn(`[search] Skipped ${c}#${x.id??"?"}: ${z.message}`)}v.info(`[search] ${c}: imported ${k}, skipped ${L}`)}}return v.info(e),ln("Successfully imported models to search engine!")}catch(t){return v.error(t),cn(t?.message||String(t))}}import{err as fn,ok as mn}from"@stacksjs/error-handling";import{log as bn}from"@stacksjs/logging";import{getModelName as hn,getTableName as Sn}from"@stacksjs/orm";import{path as tt}from"@stacksjs/path";import{useSearchEngine as An}from"@stacksjs/search-engine";import{globSync as Tn}from"@stacksjs/storage";async function ai(e){try{let t=Tn([tt.userModelsPath("*.ts"),tt.defaultsPath("app/Models/**/*.ts")],{absolute:!0}),{deleteIndex:n}=An();for(let r of t){let s=(await import(r)).default,i=s.traits?.useSearch,o=q(i,Sn(s,r)),a=hn(s,r);if(e&&a!==e)continue;if(i&&(typeof i==="boolean"||typeof i==="object"))await n(o)}return mn("Successfully flushed all model data from search engine!")}catch(t){return bn.error(t),fn(t instanceof Error?t.message:String(t))}}import{err as wn,ok as Pn}from"@stacksjs/error-handling";import{log as kn}from"@stacksjs/logging";import{getTableName as xn}from"@stacksjs/orm";import{path as En}from"@stacksjs/path";import{useSearchEngine as Rn}from"@stacksjs/search-engine";async function fi(e){try{let t=En.userModelsPath(`${e}.ts`),n=(await import(t)).default,{getFilterableAttributes:r,getSortableAttributes:s,getSearchableAttributes:i,getDisplayedAttributes:o}=Rn(),a=n.traits?.useSearch,c=q(a,xn(n,t));if(a&&typeof a==="object"){let l=await o(c),p=await r(c),f=await s(c),T=await i(c);console.table({displayedAttributes:l,filterableAttributes:p,sortableAttributes:f,searchableAttributes:T})}return Pn("Successfully update index settings!")}catch(t){return kn.error(t),wn(t instanceof Error?t.message:String(t))}}import{err as Dn,ok as In}from"@stacksjs/error-handling";import{log as $n}from"@stacksjs/logging";import{getTableName as On}from"@stacksjs/orm";import{path as nt}from"@stacksjs/path";import{useSearchEngine as qn}from"@stacksjs/search-engine";import{globSync as Fn}from"@stacksjs/storage";async function ki(){try{let e=Fn([nt.userModelsPath("*.ts"),nt.defaultsPath("app/Models/**/*.ts")],{absolute:!0}),{updateSettings:t}=qn();for(let n of e){let r=(await import(n)).default,s=r.traits?.useSearch,i=q(s,On(r,n));if(s&&typeof s==="object")await t(i,V(s,{displayed:!1}))}return In("Successfully update index settings!")}catch(e){return $n.error(e),Dn(e?.message||String(e))}}function Hs(e){if(e==="algolia")return Promise.resolve().then(() => (Ie(),$t));if(e==="opensearch")return Promise.resolve().then(() => (Be(),vt));if(e==="typesense")return Promise.resolve().then(() => (Ye(),Yt));return Ze().then(() => en)}var ie,rn=(async()=>(await Ls,ie=(await Hs(nn.driver)).default,ie))();function Ui(){return new Proxy({},{get(e,t){if(ie)return Reflect.get(ie,t);if(typeof t==="symbol"||t==="then")return;return(...n)=>rn.then((r)=>{let s=Reflect.get(r,t);if(typeof s!=="function")throw TypeError(`The ${nn.driver??"configured"} search engine driver has no method "${t}"`);return s.apply(r,n)})}})}function Mi(){return rn}function Li(){return Promise.resolve().then(() => (Ie(),{})).then((e)=>Ot)}function Hi(){return Ze().then(() => ({})).then((e)=>tn)}function Ni(){return Promise.resolve().then(() => (Be(),{})).then((e)=>Ct)}function Bi(){return Promise.resolve().then(() => (Ye(),{})).then((e)=>Qt)}export{ai as flushModelDocuments,Xs as importModelDocuments,fi as listIndexSettings,Mi as searchEngineReady,q as searchIndexName,V as settingsFromSearchTrait,ki as updateIndexSettings,Li as useAlgolia,Hi as useMeilisearch,Ni as useOpensearch,Ui as useSearchEngine,Bi as useTypesense};
|
|
4
|
+
`,"application/x-ndjson");if(r.errors){let s=r.items?.filter((i)=>Number(i.index?.status||0)>=400)||[];throw Error(`[search/opensearch] Bulk indexing failed for ${s.length} document(s)`)}return E(e,"documentAdditionOrUpdate")}async function lr(e,t,n){let r=n?`?_source=${encodeURIComponent(Array.isArray(n)?n.join(","):String(n))}`:"",s=await b("GET",`${S(e)}/_doc/${encodeURIComponent(String(t))}${r}`);return{id:s._source?.id??s._id,...s._source}}async function dr(e,t){return await b("DELETE",`${S(e)}/_doc/${encodeURIComponent(String(t))}?refresh=wait_for`),E(e,"documentDeletion")}async function gr(e,t){let n=(Array.isArray(t)?t:[t]).filter(Boolean);if(n.length===0)throw Error(`[search/opensearch] deleteDocuments on "${e}" needs a filter. Use deleteAllDocuments to empty the index.`);return await b("POST",`${S(e)}/_delete_by_query?refresh=true`,{query:{bool:{filter:n.map((r)=>({query_string:{query:r}}))}}}),E(e,"documentDeletion")}async function yr(e){try{await b("POST",`${S(e)}/_delete_by_query?refresh=true`,{query:{match_all:{}}})}catch(t){if(!(t instanceof G)||t.status!==404)throw t}return E(e,"documentDeletion")}function w(e,t){return{get:async(n)=>(await Be(n))[e]??t,update:async(n,r)=>Z(n,{[e]:r}),reset:async(n)=>Z(n,{[e]:t})}}async function pr(e){let t=await Be(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 fr(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 Z(e,r)}async function mr(e){return await Z(e,{filterableAttributes:[],searchableAttributes:[],sortableAttributes:[],displayedAttributes:[],pagination:{},synonyms:{},rankingRules:[],distinctAttribute:null,faceting:{},typoTolerance:{},dictionary:[]})}var G,Oe,Fe,qe,je,_e,ve,Ce,Ue,Me,Le,He,br,_t;var We=N(()=>{B();G=class G extends Error{status;constructor(e,t,n,r){super(`[search/opensearch] ${t} ${n} failed (${e}): ${r}`);this.status=e}};Oe=w("filterableAttributes",[]),Fe=w("searchableAttributes",[]),qe=w("sortableAttributes",[]),je=w("displayedAttributes",[]),_e=w("pagination",{}),ve=w("synonyms",{}),Ce=w("rankingRules",[]),Ue=w("distinctAttribute",null),Me=w("faceting",{}),Le=w("typoTolerance",{}),He=w("dictionary",[]);br={client:()=>({request:b,configuration:Ne}),search:ir,createIndex:or,getIndex:ar,updateIndex:ur,deleteIndex:cr,listAllIndexes:$t,listAllIndices:$t,addDocument:Ot,addDocuments:Ft,updateDocument:Ot,updateDocuments:Ft,getDocument:lr,deleteDocument:dr,deleteDocuments:gr,deleteAllDocuments:yr,getFilterableAttributes:Oe.get,updateFilterableAttributes:Oe.update,resetFilterableAttributes:Oe.reset,getSearchableAttributes:Fe.get,updateSearchableAttributes:Fe.update,resetSearchableAttributes:Fe.reset,getSortableAttributes:qe.get,updateSortableAttributes:qe.update,resetSortableAttributes:qe.reset,getDisplayedAttributes:je.get,updateDisplayedAttributes:je.update,resetDisplayedAttributes:je.reset,getSettings:pr,updateSettings:fr,resetSettings:mr,getPagination:_e.get,updatePagination:_e.update,resetPagination:_e.reset,getSynonyms:ve.get,updateSynonyms:ve.update,resetSynonyms:ve.reset,getRankingRules:Ce.get,updateRankingRules:Ce.update,resetRankingRules:Ce.reset,getDistinctAttribute:Ue.get,updateDistinctAttribute:Ue.update,resetDistinctAttribute:Ue.reset,getFaceting:Me.get,updateFaceting:Me.update,resetFaceting:Me.reset,getTypoTolerance:Le.get,updateTypoTolerance:Le.update,resetTypoTolerance:Le.reset,getDictionary:He.get,updateDictionary:He.update,resetDictionary:He.reset},_t=br});var Jt={};V(Jt,{TypesenseImportError:()=>Ve,default:()=>Vt});import{searchEngine as z}from"@stacksjs/config";import{log as hr}from"@stacksjs/logging";function Mt(){if(!ne){let e=z.typesense?.host||process.env.TYPESENSE_HOST||"127.0.0.1",t=z.typesense?.port||Number(process.env.TYPESENSE_PORT||8108),n=z.typesense?.protocol||process.env.TYPESENSE_PROTOCOL||"http",r=z.typesense?.apiKey||process.env.TYPESENSE_API_KEY||"xyz";ne={host:e,port:t,protocol:n,apiKey:r}}return ne}function Lt(){let{protocol:e,host:t,port:n}=Mt();return`${e}://${t}:${n}`}function Ht(){return{"Content-Type":"application/json","X-TYPESENSE-API-KEY":Mt().apiKey}}function P(e){return{taskUid:0,indexUid:e,status:"succeeded",type:"documentAddition",enqueuedAt:new Date}}function ze(e){return e instanceof Ge&&e.status===404}async function p(e,t,n){let r=await fetch(`${Lt()}${t}`,{method:e,headers:Ht(),body:n==null?void 0:JSON.stringify(n)});if(!r.ok){let s=await r.text().catch(()=>"");throw new Ge(r.status,e,t,s)}if(r.status===204)return;return await r.json()}function m(e){return`/collections/${encodeURIComponent(e)}`}function Nt(e){if(e==null||e==="")return;if(typeof e==="string")return e;if(Array.isArray(e))return e.map((r)=>Array.isArray(r)?`(${r.join(" || ")})`:r).filter(Boolean).join(" && ")||void 0;if(!R(e))throw TypeError(`[search/typesense] Unsupported filter: ${JSON.stringify(e)}`);let t=(r)=>`\`${String(r).replace(/`/g,"\\`")}\``,n=[];for(let[r,s]of Object.entries(e)){if(D("typesense",r),s==null||s==="")continue;n.push(Array.isArray(s)?`${r}:=[${s.map(t).join(",")}]`:`${r}:=${t(s)}`)}return n.length?n.join(" && "):void 0}function Sr(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"}function Ar(e,t){let n={...re.get(e)};for(let[r,s]of Object.entries(t??{}))if(s!==void 0)n[r]=s;return re.set(e,n),n}function _(e){let t=[];for(let n of e??[])if(typeof n==="string")t.push(n);else t.push(...n.attributePatterns);return t}function Tr(e){let t={};for(let n of e)for(let[r,s]of Object.entries(n)){if(s==null)continue;let i=t[r];if(i===void 0||Array.isArray(i)&&i.length===0&&Array.isArray(s)&&s.length>0)t[r]=s}return t}function Bt(e,t,n){let r={name:e,type:e==="id"?"string":Sr(t??""),facet:_(n.filterableAttributes).includes(e),optional:e!=="id"};if(_(n.sortableAttributes).includes(e))r.sort=!0;return r}async function wr(e){try{return await p("GET",m(e))}catch(t){if(ze(t))return;throw t}}function Pr(e,t,n){let r={name:e.name,type:e.type,facet:t,optional:e.optional??!0};if(n!==void 0)r.sort=n;if(e.index===!1)r.index=!1;if(e.infix===!0)r.infix=!0;if(typeof e.locale==="string"&&e.locale!=="")r.locale=e.locale;return r}function kr(e,t,n){let r=[],s=new Set(e.map((c)=>c.name)),i=n.filterableAttributes!=null,o=_(n.filterableAttributes),a=_(n.sortableAttributes);for(let c of e){if(c.name==="id"||c.name.includes("*"))continue;let l=i?o.includes(c.name):Boolean(c.facet),y=a.includes(c.name)?!0:c.sort;if(l!==Boolean(c.facet)||y!==c.sort)r.push({name:c.name,drop:!0},Pr(c,l,y))}for(let[c,l]of Object.entries(t)){if(c==="id"||s.has(c))continue;r.push(Bt(c,l,n))}return r}async function se(e,t,n){let r=Ar(e,n),s=Tr(t??[]),i=await wr(e);if(i){let a=kr(i.fields??[],s,r);if(a.length>0)await p("PATCH",m(e),{fields:a});return}if(!t||t.length===0)return;let o=new Set(["id"]);for(let a of[..._(r.searchableAttributes),..._(r.filterableAttributes),..._(r.sortableAttributes),..._(r.displayedAttributes),...Object.keys(s)])o.add(a);await p("POST","/collections",{name:e,fields:[...o].map((a)=>Bt(a,s[a],r))})}function Je(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}function xr(e){let t=e.queryBy??e.query_by;if(t==null)return;return(Array.isArray(t)?t.join(","):String(t))||void 0}async function Er(e,t={}){let{query:n,limit:r,offset:s,filter:i,sort:o}=j(t,z.perPage??q),a=t.filter_by||Nt(i),c=t.sort_by||L("typesense",o).join(","),l=xr(t);if(!l)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 y=n===""?"*":n,f=new URLSearchParams({q:y,query_by:l});if(r>0&&s%r===0)f.set("per_page",String(r)),f.set("page",String(s/r+1));else f.set("offset",String(s)),f.set("limit",String(r));if(a)f.set("filter_by",a);if(c)f.set("sort_by",c);let T=await p("GET",`${m(e)}/documents/search?${f}`),O=(T.hits??[]).map((k)=>k.document);return{hits:O,query:y,processingTimeMs:T.search_time_ms??0,limit:r,offset:s,estimatedTotalHits:T.found??O.length}}async function vt(e,t){let n=Je(t);return await se(e,[n]),await p("POST",`${m(e)}/documents?action=upsert`,n),P(e)}async function Ct(e,t){if(!Array.isArray(t))throw TypeError("[search/typesense] addDocuments requires an array of documents");if(t.length===0)return P(e);let n=t.map(Je);await se(e,n);let r=n.map((a)=>JSON.stringify(a)).join(`
|
|
5
|
+
`),s=await fetch(`${Lt()}${m(e)}/documents/import?action=upsert`,{method:"POST",headers:{...Ht(),"Content-Type":"text/plain"},body:r}),i=await s.text().catch(()=>"");if(!s.ok)throw Error(`[search/typesense] bulk import failed (${s.status}): ${i}`);let o=[];if(i.split(`
|
|
6
|
+
`).filter((a)=>a.trim()!=="").forEach((a,c)=>{let l;try{l=JSON.parse(a)}catch{l={success:!1,error:a}}if(l.success!==!0)o.push({id:n[c]?.id,error:l.error??"not written"})}),o.length>0)throw new Ve(e,o,n.length);return P(e)}async function Rr(e,t){return await p("DELETE",`${m(e)}/documents/${encodeURIComponent(String(t))}`),P(e)}async function Dr(e,t){let n=Nt(t);if(!n)throw Error(`[search/typesense] deleteDocuments on "${e}" needs a filter. Use deleteAllDocuments to empty the collection.`);return await p("DELETE",`${m(e)}/documents?${new URLSearchParams({filter_by:n})}`),P(e)}async function Ir(e){try{await p("DELETE",`${m(e)}/documents?truncate=true`)}catch(t){if(!ze(t))throw t}return P(e)}async function $r(e){try{await p("DELETE",m(e))}catch(t){if(!ze(t))throw t;hr.debug(`[search/typesense] deleteIndex ${e}: already absent`)}return re.delete(e),P(e)}async function Or(e,t){let n=t?.sampleDocument;return await se(e,n?[Je(n)]:void 0,t?.settings),P(e)}async function Fr(e){return await p("GET",m(e))}async function Ke(e,t){return await se(e,void 0,t),P(e)}function ee(e){return(t,n)=>Ke(t,{[e]:n??[]})}async function Ye(e){return((await p("GET",m(e))).fields??[]).map((n)=>n.name).filter((n)=>n!=="id")}async function Wt(e){return((await p("GET",m(e))).fields??[]).filter((n)=>n.facet).map((n)=>n.name)}async function Kt(e){return((await p("GET",m(e))).fields??[]).filter((n)=>n.sort).map((n)=>n.name)}async function Gt(e){return Ye(e)}async function qr(e){return{searchableAttributes:await Ye(e),filterableAttributes:await Wt(e),sortableAttributes:await Kt(e),displayedAttributes:await Gt(e)}}function g(e,t){throw Error(`[search/typesense] ${e} is not supported by Typesense. ${t}`)}async function Ut(){let t=(await p("GET","/collections")).map((n)=>({...n,uid:n.name,primaryKey:"id"}));return{results:t,offset:0,limit:t.length,total:t.length}}async function jr(e,t){return await p("GET",`${m(e)}/documents/${encodeURIComponent(String(t))}`)}async function _r(e){let t=await p("GET",`${m(e)}/synonyms`),n={};for(let r of t.synonyms??[]){if(r.root){n[r.root]=[...n[r.root]??[],...r.synonyms];continue}for(let s of r.synonyms)n[s]=[...n[s]??[],...r.synonyms.filter((i)=>i!==s)]}return n}async function vr(e,t){await zt(e);for(let[n,r]of Object.entries(t??{})){if(!r?.length)continue;await p("PUT",`${m(e)}/synonyms/${encodeURIComponent(`stacks-${n}`)}`,{root:n,synonyms:r})}return P(e)}async function zt(e){let t=await p("GET",`${m(e)}/synonyms`);for(let n of t.synonyms??[])await p("DELETE",`${m(e)}/synonyms/${encodeURIComponent(n.id)}`);return P(e)}var ne=null,Ge,re,Ve,h="Typesense takes it per search request, not as an index setting.",te="Typesense derives it from the collection schema: declare it in the model's useSearch trait.",Cr,Vt;var Qe=N(()=>{B();Ge=class Ge extends Error{status;constructor(e,t,n,r){super(`[search/typesense] ${t} ${n} failed (${e}): ${r}`);this.status=e}};re=new Map;Ve=class Ve extends Error{indexName;failures;total;constructor(e,t,n){let r=t.slice(0,5).map((i)=>`#${String(i.id??"?")}: ${i.error}`).join("; "),s=t.length>5?`; and ${t.length-5} more`:"";super(`[search/typesense] import into "${e}" rejected ${t.length} of ${n} document(s): ${r}${s}`);this.indexName=e;this.failures=t;this.total=n}};Cr={client:()=>({}),resetClient:()=>{ne=null,re.clear()},search:Er,getIndex:Fr,createIndex:Or,deleteIndex:$r,updateIndex:()=>g("updateIndex (changing the primary key)","A Typesense collection's key is always `id`."),listAllIndexes:Ut,listAllIndices:Ut,addDocument:vt,addDocuments:Ct,updateDocument:(e,t)=>vt(e,t),updateDocuments:(e,t)=>Ct(e,t),deleteDocument:Rr,deleteDocuments:Dr,deleteAllDocuments:Ir,getDocument:jr,getFilterableAttributes:Wt,updateFilterableAttributes:ee("filterableAttributes"),resetFilterableAttributes:(e)=>Ke(e,{filterableAttributes:[]}),updateDisplayedAttributes:ee("displayedAttributes"),resetDisplayedAttributes:()=>g("resetDisplayedAttributes",te),getDisplayedAttributes:Gt,updateSearchableAttributes:ee("searchableAttributes"),resetSearchableAttributes:()=>g("resetSearchableAttributes",te),getSearchableAttributes:Ye,updateSortableAttributes:ee("sortableAttributes"),resetSortableAttributes:()=>g("resetSortableAttributes",te),getSortableAttributes:Kt,getSettings:qr,updateSettings:Ke,resetSettings:()=>g("resetSettings",te),getPagination:()=>g("Index pagination settings",h),updatePagination:()=>g("Index pagination settings",h),resetPagination:()=>g("Index pagination settings",h),getSynonyms:_r,updateSynonyms:vr,resetSynonyms:zt,getRankingRules:()=>g("Ranking rules",h),updateRankingRules:()=>g("Ranking rules",h),resetRankingRules:()=>g("Ranking rules",h),getDistinctAttribute:()=>g("A distinct attribute",h),updateDistinctAttribute:()=>g("A distinct attribute",h),resetDistinctAttribute:()=>g("A distinct attribute",h),getFaceting:()=>g("Faceting settings",h),updateFaceting:()=>g("Faceting settings",h),resetFaceting:()=>g("Faceting settings",h),getTypoTolerance:()=>g("Typo tolerance settings",h),updateTypoTolerance:()=>g("Typo tolerance settings",h),resetTypoTolerance:()=>g("Typo tolerance settings",h),getDictionary:()=>g("Custom dictionaries","Typesense has no equivalent."),updateDictionary:()=>g("Custom dictionaries","Typesense has no equivalent."),resetDictionary:()=>g("Custom dictionaries","Typesense has no equivalent.")},Vt=Cr});var Xt={};V(Xt,{default:()=>Zt});import{searchEngine as Xe}from"@stacksjs/config";function u(){if(!Ze)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(!ie){let e=Xe.meilisearch?.host||"http://127.0.0.1:7700",t=Xe.meilisearch?.apiKey||"";if(!e)throw Error("Meilisearch host is not configured. Please specify a search engine host.");ie=new Ze({host:e,apiKey:t})}return ie}function Ur(){ie=null}async function Lr(e,t={}){let{query:n,limit:r,offset:s,filter:i,sort:o}=j(t,Xe.perPage??q),a={limit:r,offset:s},c=_s(i);if(c!==void 0)a.filter=c;let l=L("meilisearch",o);if(l.length>0)a.sort=l;for(let y of Mr)if(t[y]!==void 0)a[y]=t[y];return await u().index(e).search(n,a)}async function Hr(e,t){return await u().index(e).addDocuments([t])}async function Nr(e,t){if(!Array.isArray(t))throw TypeError("[search/meilisearch] addDocuments requires an array of documents");if(t.length<=1000)return await u().index(e).addDocuments(t);let r;for(let s=0;s<t.length;s+=1000){let i=t.slice(s,s+1000),o=await u().index(e).addDocuments(i);if(!r)r=o}return r}async function Br(e){return await u().getIndex(e)}async function Wr(e,t){return await u().createIndex(e,t)}async function Kr(e,t){return await u().updateIndex(e,t)}async function Gr(e,t){return await u().index(e).updateDocuments([t])}async function zr(e,t){return await u().index(e).updateDocuments(t)}async function Jr(e,t){return await u().index(e).deleteDocument(t)}async function Vr(e,t){return await u().index(e).deleteDocuments({filter:t})}async function Yr(e){return await u().index(e).deleteAllDocuments()}async function Qr(e,t,n){return await u().index(e).getDocument(t,n)}async function Xr(e){return await u().deleteIndex(e)}async function Yt(){return await u().getIndexes()}async function Zr(e){return(await u().index(e).getFilterableAttributes()??[]).filter((n)=>typeof n==="string")}async function es(e,t){return u().index(e).updateFilterableAttributes(t)}async function ts(e){return u().index(e).resetFilterableAttributes()}async function ns(e,t){return u().index(e).updateSearchableAttributes(t)}async function rs(e){return u().index(e).resetSearchableAttributes()}async function ss(e){return u().index(e).getSearchableAttributes()}async function is(e,t){return u().index(e).updateSortableAttributes(t)}async function os(e){return u().index(e).resetSortableAttributes()}async function as(e){return u().index(e).getSortableAttributes()}async function us(e,t){return u().index(e).updateDisplayedAttributes(t)}async function cs(e){return u().index(e).getDisplayedAttributes()}async function ls(e){return u().index(e).resetDisplayedAttributes()}async function ds(e){return u().index(e).getSettings()}async function gs(e,t){return u().index(e).updateSettings(t)}async function ys(e){return u().index(e).resetSettings()}async function ps(e){return u().index(e).getPagination()}async function fs(e,t){return u().index(e).updatePagination(t)}async function ms(e){return u().index(e).resetPagination()}async function bs(e){return u().index(e).getSynonyms()}async function hs(e,t){return u().index(e).updateSynonyms(t)}async function Ss(e){return u().index(e).resetSynonyms()}async function As(e){return u().index(e).getRankingRules()}async function Ts(e,t){return u().index(e).updateRankingRules(t)}async function ws(e){return u().index(e).resetRankingRules()}async function Ps(e){return u().index(e).getDistinctAttribute()}async function ks(e,t){return u().index(e).updateDistinctAttribute(t)}async function xs(e){return u().index(e).resetDistinctAttribute()}async function Es(e){return u().index(e).getFaceting()}async function Rs(e,t){return u().index(e).updateFaceting(t)}async function Ds(e){return u().index(e).resetFaceting()}async function Is(e){return u().index(e).getTypoTolerance()}async function $s(e,t){return u().index(e).updateTypoTolerance(t)}async function Os(e){return u().index(e).resetTypoTolerance()}async function Fs(e){return u().index(e).getDictionary()}async function qs(e,t){return u().index(e).updateDictionary(t)}async function js(e){return u().index(e).resetDictionary()}function Qt(e){return`'${String(e).replace(/\\/g,"\\\\").replace(/'/g,"\\'")}'`}function _s(e){if(e==null||e==="")return;if(typeof e==="string"||Array.isArray(e))return e;if(!R(e))throw TypeError(`[search/meilisearch] Unsupported filter: ${JSON.stringify(e)}`);let t=[];for(let[n,r]of Object.entries(e)){if(D("meilisearch",n),r===void 0)continue;if(r===null)t.push(`${n} IS NULL`);else if(Array.isArray(r))t.push(`${n} IN [${r.map(Qt).join(", ")}]`);else t.push(`${n} = ${Qt(r)}`)}return t.length>0?t:void 0}var Ze,ie=null,Mr,vs,Zt;var et=N(async()=>{B();try{({Meilisearch:Ze}=await import("meilisearch"))}catch{}Mr=["attributesToRetrieve","attributesToHighlight","attributesToCrop","attributesToSearchOn","cropLength","cropMarker","distinct","facets","highlightPreTag","highlightPostTag","matchingStrategy","showMatchesPosition","showRankingScore"];vs={client:u,resetClient:Ur,search:Lr,getIndex:Br,createIndex:Wr,deleteIndex:Xr,updateIndex:Kr,listAllIndexes:Yt,listAllIndices:Yt,addDocument:Hr,addDocuments:Nr,updateDocument:Gr,updateDocuments:zr,deleteDocument:Jr,deleteDocuments:Vr,deleteAllDocuments:Yr,getDocument:Qr,getFilterableAttributes:Zr,updateFilterableAttributes:es,resetFilterableAttributes:ts,updateDisplayedAttributes:us,resetDisplayedAttributes:ls,getDisplayedAttributes:cs,updateSearchableAttributes:ns,resetSearchableAttributes:rs,getSearchableAttributes:ss,updateSortableAttributes:is,resetSortableAttributes:os,getSortableAttributes:as,getSettings:ds,updateSettings:gs,resetSettings:ys,getPagination:ps,updatePagination:fs,resetPagination:ms,getSynonyms:bs,updateSynonyms:hs,resetSynonyms:Ss,getRankingRules:As,updateRankingRules:Ts,resetRankingRules:ws,getDistinctAttribute:Ps,updateDistinctAttribute:ks,resetDistinctAttribute:xs,getFaceting:Es,updateFaceting:Rs,resetFaceting:Ds,getTypoTolerance:Is,updateTypoTolerance:$s,resetTypoTolerance:Os,getDictionary:Fs,updateDictionary:qs,resetDictionary:js},Zt=vs});import{overridesReady as Cs,searchEngine as en}from"@stacksjs/config";import{err as cn,ok as ln}from"@stacksjs/error-handling";import{log as v}from"@stacksjs/logging";import{getModelName as dn,getTableName as gn}from"@stacksjs/orm";import{useSearchEngine as yn}from"@stacksjs/search-engine";import{overridesReady as on}from"@stacksjs/config";import{resolveModelSources as an}from"@stacksjs/database/model-sources";async function M(){return await on,(an()?.models??[]).map((e)=>e.file)}import{snakeCase as un}from"@stacksjs/strings";function Y(e,t={}){let n={},r=(c)=>Array.isArray(c)?c.map((l)=>un(l)):void 0,s=r(e.searchable),i=r(e.filterable),o=r(e.sortable),a=t.displayed===!1?void 0:r(e.displayable);if(s)n.searchableAttributes=s;if(i)n.filterableAttributes=i;if(o)n.sortableAttributes=o;if(a)n.displayedAttributes=a;return n}function F(e,t){return typeof e==="object"&&e.index?e.index:t}async function Qs(e){try{let t=await M(),{addDocument:n,updateSettings:r}=yn();for(let s of t){let i=(await import(s)).default,o=i.traits?.useSearch,a=F(o,gn(i,s)),c=dn(i,s);if(e&&c!==e)continue;if(o&&(typeof o==="boolean"||typeof o==="object")){if(typeof o==="object")await r(a,Y(o));let l=i;if(typeof l.all!=="function"){v.warn(`[search] ${c}: model has no .all() - define it with defineModel`);continue}let y=l.makeAllSearchable;if(typeof y==="function"){let x=await y.call(l);v.info(`[search] ${c}: imported ${x}, skipped 0`);continue}let f=typeof o==="object"?o.denormalize:void 0,T=f?Array.from(new Set(Object.values(f).map((x)=>x.split(".")[0]).filter((x)=>Boolean(x)))):[],O;if(T.length>0&&typeof l.query==="function")try{O=await l.query().with(...T).get()}catch(x){v.warn(`[search] ${c}: eager-load of [${T.join(", ")}] failed - falling back to .all(); denormalized fields will be null. (${x.message})`),O=await l.all()}else O=await l.all();let k=0,H=0;for(let x of O)try{let J=x.toSearchableObject?.();if(J==null){H++;continue}await n(a,J),k++}catch(J){H++,v.warn(`[search] Skipped ${c}#${x.id??"?"}: ${J.message}`)}v.info(`[search] ${c}: imported ${k}, skipped ${H}`)}}return v.info(e),ln("Successfully imported models to search engine!")}catch(t){return v.error(t),cn(t?.message||String(t))}}import{err as pn,ok as fn}from"@stacksjs/error-handling";import{log as mn}from"@stacksjs/logging";import{getModelName as bn,getTableName as hn}from"@stacksjs/orm";import{useSearchEngine as Sn}from"@stacksjs/search-engine";async function ii(e){try{let t=await M(),{deleteIndex:n}=Sn();for(let r of t){let s=(await import(r)).default,i=s.traits?.useSearch,o=F(i,hn(s,r)),a=bn(s,r);if(e&&a!==e)continue;if(i&&(typeof i==="boolean"||typeof i==="object"))await n(o)}return fn("Successfully flushed all model data from search engine!")}catch(t){return mn.error(t),pn(t instanceof Error?t.message:String(t))}}import{err as An,ok as Tn}from"@stacksjs/error-handling";import{log as wn}from"@stacksjs/logging";import{getTableName as Pn}from"@stacksjs/orm";import{path as kn}from"@stacksjs/path";import{useSearchEngine as xn}from"@stacksjs/search-engine";async function yi(e){try{let t=kn.userModelsPath(`${e}.ts`),n=(await import(t)).default,{getFilterableAttributes:r,getSortableAttributes:s,getSearchableAttributes:i,getDisplayedAttributes:o}=xn(),a=n.traits?.useSearch,c=F(a,Pn(n,t));if(a&&typeof a==="object"){let l=await o(c),y=await r(c),f=await s(c),T=await i(c);console.table({displayedAttributes:l,filterableAttributes:y,sortableAttributes:f,searchableAttributes:T})}return Tn("Successfully update index settings!")}catch(t){return wn.error(t),An(t instanceof Error?t.message:String(t))}}import{err as En,ok as Rn}from"@stacksjs/error-handling";import{log as Dn}from"@stacksjs/logging";import{getTableName as In}from"@stacksjs/orm";import{useSearchEngine as $n}from"@stacksjs/search-engine";async function Ti(){try{let e=await M(),{updateSettings:t}=$n();for(let n of e){let r=(await import(n)).default,s=r.traits?.useSearch,i=F(s,In(r,n));if(s&&typeof s==="object")await t(i,Y(s,{displayed:!1}))}return Rn("Successfully update index settings!")}catch(e){return Dn.error(e),En(e?.message||String(e))}}function Us(e){if(e==="algolia")return Promise.resolve().then(() => ($e(),Dt));if(e==="opensearch")return Promise.resolve().then(() => (We(),jt));if(e==="typesense")return Promise.resolve().then(() => (Qe(),Jt));return et().then(() => Xt)}var oe,tn=(async()=>(await Cs,oe=(await Us(en.driver)).default,oe))();function _i(){return new Proxy({},{get(e,t){if(oe)return Reflect.get(oe,t);if(typeof t==="symbol"||t==="then")return;return(...n)=>tn.then((r)=>{let s=Reflect.get(r,t);if(typeof s!=="function")throw TypeError(`The ${en.driver??"configured"} search engine driver has no method "${t}"`);return s.apply(r,n)})}})}function vi(){return tn}function Ci(){return Promise.resolve().then(() => ($e(),{})).then((e)=>It)}function Ui(){return et().then(() => ({})).then((e)=>Zt)}function Mi(){return Promise.resolve().then(() => (We(),{})).then((e)=>_t)}function Li(){return Promise.resolve().then(() => (Qe(),{})).then((e)=>Vt)}export{ii as flushModelDocuments,Qs as importModelDocuments,yi as listIndexSettings,vi as searchEngineReady,F as searchIndexName,Y as settingsFromSearchTrait,Ti as updateIndexSettings,Ci as useAlgolia,Ui as useMeilisearch,Mi as useOpensearch,_i as useSearchEngine,Li 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.75.
|
|
5
|
+
"version": "0.75.301",
|
|
6
6
|
"description": "The Stacks search engine integrations.",
|
|
7
7
|
"author": "Chris Breuer",
|
|
8
8
|
"contributors": [
|
|
@@ -64,13 +64,14 @@
|
|
|
64
64
|
"prepublishOnly": "bun run build"
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
|
-
"@stacksjs/config": "0.75.
|
|
68
|
-
"@stacksjs/
|
|
69
|
-
"@stacksjs/
|
|
70
|
-
"@stacksjs/
|
|
71
|
-
"@stacksjs/
|
|
72
|
-
"@stacksjs/
|
|
73
|
-
"@stacksjs/
|
|
67
|
+
"@stacksjs/config": "0.75.301",
|
|
68
|
+
"@stacksjs/database": "0.75.301",
|
|
69
|
+
"@stacksjs/error-handling": "0.75.301",
|
|
70
|
+
"@stacksjs/logging": "0.75.301",
|
|
71
|
+
"@stacksjs/orm": "0.75.301",
|
|
72
|
+
"@stacksjs/path": "0.75.301",
|
|
73
|
+
"@stacksjs/storage": "0.75.301",
|
|
74
|
+
"@stacksjs/strings": "0.75.301"
|
|
74
75
|
},
|
|
75
76
|
"peerDependencies": {
|
|
76
77
|
"meilisearch": "^0.62.0"
|