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