@stacksjs/search-engine 0.70.45 → 0.70.53
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/LICENSE.md +21 -0
- package/dist/index.js +2 -1
- package/dist/src/index.d.ts +11 -8
- package/package.json +2 -2
- package/dist/src/drivers/algolia.d.ts +0 -231
- package/dist/src/drivers/meilisearch.d.ts +0 -2
- package/dist/src/drivers/opensearch.d.ts +0 -48
package/LICENSE.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 Open Web Foundation
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{searchEngine as y}from"@stacksjs/config";import{searchEngine as F}from"@stacksjs/config";import{Meilisearch as q}from"meilisearch";var U=null;function M(){if(!U){let f=F.meilisearch?.host||"http://127.0.0.1:7700",G=F.meilisearch?.apiKey||"";if(!f)throw Error("Meilisearch host is not configured. Please specify a search engine host.");U=new q({host:f,apiKey:G})}return U}function I(){U=null}async function D(f,G){let J=Number(G.page)||1,Q=Number(G.perPage)||20,Y=(J-1)*Q,$=Af(G.filter),z=Tf(G.sort);return await M().index(f).search(G.query,{limit:Q,filter:$,sort:z,offset:Y})}async function j(f,G){return await M().index(f).addDocuments([G])}async function g(f,G){if(!Array.isArray(G))throw TypeError("[search/meilisearch] addDocuments requires an array of documents");if(G.length<=1000)return await M().index(f).addDocuments(G);let Q;for(let Y=0;Y<G.length;Y+=1000){let $=G.slice(Y,Y+1000),z=await M().index(f).addDocuments($);if(!Q)Q=z}return Q}async function u(f){return await M().getIndex(f)}async function p(f,G){return await M().createIndex(f,G)}async function N(f,G){return await M().updateIndex(f,G)}async function b(f,G){return await M().index(f).updateDocuments([G])}async function o(f,G){return await M().index(f).updateDocuments(G)}async function m(f,G){return await M().index(f).deleteDocument(G)}async function c(f,G){return await M().index(f).deleteDocuments({filter:G})}async function r(f,G,J){return await M().index(f).getDocument(G,J)}async function x(f){return await M().deleteIndex(f)}async function h(){return await M().getIndexes()}async function l(f){return M().index(f).getFilterableAttributes()}async function d(f,G){return M().index(f).updateFilterableAttributes(G)}async function s(f){return M().index(f).resetFilterableAttributes()}async function n(f,G){return M().index(f).updateSearchableAttributes(G)}async function a(f){return M().index(f).resetSearchableAttributes()}async function i(f){return M().index(f).getSearchableAttributes()}async function t(f,G){return M().index(f).updateSortableAttributes(G)}async function e(f){return M().index(f).resetSortableAttributes()}async function ff(f){return M().index(f).getSortableAttributes()}async function Gf(f,G){return M().index(f).updateDisplayedAttributes(G)}async function Jf(f){return M().index(f).getDisplayedAttributes()}async function Mf(f){return M().index(f).resetDisplayedAttributes()}async function Qf(f){return M().index(f).getSettings()}async function Yf(f,G){return M().index(f).updateSettings(G)}async function Zf(f){return M().index(f).resetSettings()}async function $f(f){return M().index(f).getPagination()}async function zf(f,G){return M().index(f).updatePagination(G)}async function Ef(f){return M().index(f).resetPagination()}async function Hf(f){return M().index(f).getSynonyms()}async function Wf(f,G){return M().index(f).updateSynonyms(G)}async function Xf(f){return M().index(f).resetSynonyms()}async function Vf(f){return M().index(f).getRankingRules()}async function Bf(f,G){return M().index(f).updateRankingRules(G)}async function Uf(f){return M().index(f).resetRankingRules()}async function Cf(f){return M().index(f).getDistinctAttribute()}async function Kf(f,G){return M().index(f).updateDistinctAttribute(G)}async function Lf(f){return M().index(f).resetDistinctAttribute()}async function Sf(f){return M().index(f).getFaceting()}async function Of(f,G){return M().index(f).updateFaceting(G)}async function Pf(f){return M().index(f).resetFaceting()}async function _f(f){return M().index(f).getTypoTolerance()}async function vf(f,G){return M().index(f).updateTypoTolerance(G)}async function wf(f){return M().index(f).resetTypoTolerance()}async function Ff(f){return M().index(f).getDictionary()}async function hf(f,G){return M().index(f).updateDictionary(G)}async function Rf(f){return M().index(f).resetDictionary()}var kf=/^[a-z_][\w]*(?:\.[a-z_][\w]*)*$/i;function Af(f){if(!f)return[];let G=[];for(let J in f){if(!Object.prototype.hasOwnProperty.call(f,J))continue;if(!kf.test(J))throw Error(`[search/meilisearch] Refusing to build filter with unsafe field name: ${J}`);let Q=f[J],Y=String(Q).replace(/'/g,"\\'");G.push(`${J}='${Y}'`)}return G}function Tf(f){if(!f)return[];let G=[];for(let J in f)if(Object.prototype.hasOwnProperty.call(f,J)){let Y=String(f[J]).toLowerCase()==="desc"?"desc":"asc";G.push(`${J}:${Y}`)}return G}var yf={client:M,resetClient:I,search:D,getIndex:u,createIndex:p,deleteIndex:x,updateIndex:N,listAllIndexes:h,listAllIndices:h,addDocument:j,addDocuments:g,updateDocument:b,updateDocuments:o,deleteDocument:m,deleteDocuments:c,getDocument:r,getFilterableAttributes:l,updateFilterableAttributes:d,resetFilterableAttributes:s,updateDisplayedAttributes:Gf,resetDisplayedAttributes:Mf,getDisplayedAttributes:Jf,updateSearchableAttributes:n,resetSearchableAttributes:a,getSearchableAttributes:i,updateSortableAttributes:t,resetSortableAttributes:e,getSortableAttributes:ff,getSettings:Qf,updateSettings:Yf,resetSettings:Zf,getPagination:$f,updatePagination:zf,resetPagination:Ef,getSynonyms:Hf,updateSynonyms:Wf,resetSynonyms:Xf,getRankingRules:Vf,updateRankingRules:Bf,resetRankingRules:Uf,getDistinctAttribute:Cf,updateDistinctAttribute:Kf,resetDistinctAttribute:Lf,getFaceting:Sf,updateFaceting:Of,resetFaceting:Pf,getTypoTolerance:_f,updateTypoTolerance:vf,resetTypoTolerance:wf,getDictionary:Ff,updateDictionary:hf,resetDictionary:Rf},S=yf;import{searchEngine as R}from"@stacksjs/config";import{log as qf}from"@stacksjs/logging";var C=null;function k(){if(!C){let f=R.algolia?.appId||process.env.ALGOLIA_APP_ID||"",G=R.algolia?.apiKey||process.env.ALGOLIA_API_KEY||"";if(!f||!G)throw qf.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.");C={appId:f,apiKey:G}}return C}function If(){let{appId:f}=k();return`https://${f}.algolia.net`}function Df(){let{appId:f,apiKey:G}=k();return{"X-Algolia-Application-Id":f,"X-Algolia-API-Key":G,"Content-Type":"application/json"}}async function Z(f,G,J){let Q=await fetch(`${If()}${G}`,{method:f,headers:Df(),body:J?JSON.stringify(J):void 0});if(!Q.ok){let Y=await Q.json().catch(()=>({message:Q.statusText}));throw Error(`Algolia API error: ${Y.message||Q.statusText}`)}return Q.json()}function jf(f){C=f}async function gf(f,G={}){return Z("POST",`/1/indexes/${f}/query`,{query:G.query||"",page:G.page||0,hitsPerPage:G.hitsPerPage||20,filters:G.filters,facets:G.facets,attributesToRetrieve:G.attributesToRetrieve,attributesToHighlight:G.attributesToHighlight,attributesToSnippet:G.attributesToSnippet})}async function uf(f){return Z("POST","/1/indexes/*/queries",{requests:f.map((G)=>({indexName:G.indexName,params:new URLSearchParams({query:G.params?.query||"",page:String(G.params?.page||0),hitsPerPage:String(G.params?.hitsPerPage||20),...G.params?.filters&&{filters:G.params.filters}}).toString()}))})}async function pf(f,G,J){if(J)return Z("PUT",`/1/indexes/${f}/${J}`,G);return Z("POST",`/1/indexes/${f}`,G)}async function Nf(f,G){return Z("POST",`/1/indexes/${f}/batch`,{requests:G.map((J)=>({action:J.objectID?"updateObject":"addObject",body:J}))})}async function bf(f,G,J,Q=!0){return Z("POST",`/1/indexes/${f}/${G}/partial${Q?"":"?createIfNotExists=false"}`,J)}async function of(f,G){return Z("DELETE",`/1/indexes/${f}/${G}`)}async function mf(f,G){return Z("POST",`/1/indexes/${f}/batch`,{requests:G.map((J)=>({action:"deleteObject",body:{objectID:J}}))})}async function cf(f,G){return Z("POST",`/1/indexes/${f}/deleteByQuery`,{filters:G})}async function rf(f,G,J){let Q=J?`?attributesToRetrieve=${J.join(",")}`:"";return Z("GET",`/1/indexes/${f}/${G}${Q}`)}async function xf(f,G,J){return Z("POST","/1/indexes/*/objects",{requests:G.map((Q)=>({indexName:f,objectID:Q,attributesToRetrieve:J}))})}async function lf(f){return Z("POST",`/1/indexes/${f}/clear`)}async function df(f){return Z("GET",`/1/indexes/${f}/settings`)}async function sf(f,G,J=!1){return Z("PUT",`/1/indexes/${f}/settings${J?"?forwardToReplicas=true":""}`,G)}async function nf(){return Z("GET","/1/indexes")}async function af(f,G,J){return Z("POST",`/1/indexes/${f}/operation`,{operation:"copy",destination:G,scope:J})}async function tf(f,G){return Z("POST",`/1/indexes/${f}/operation`,{operation:"move",destination:G})}async function ef(f){return Z("DELETE",`/1/indexes/${f}`)}async function fG(f){try{return await Z("GET",`/1/indexes/${f}/settings`),!0}catch{return!1}}async function GG(f,G,J=1e4,Q=100){let Y=Date.now();while(Date.now()-Y<J){let $=await Z("GET",`/1/indexes/${f}/task/${G}`);if($.status==="published")return $;await new Promise((z)=>setTimeout(z,Q))}throw Error(`Task ${G} timed out after ${J}ms`)}async function JG(f,G,J=!1){return Z("PUT",`/1/indexes/${f}/synonyms/${G.objectID}${J?"?forwardToReplicas=true":""}`,G)}async function MG(f,G="",J,Q=0,Y=20){return Z("POST",`/1/indexes/${f}/synonyms/search`,{query:G,type:J,page:Q,hitsPerPage:Y})}async function QG(f,G=!1){return Z("POST",`/1/indexes/${f}/synonyms/clear${G?"?forwardToReplicas=true":""}`)}async function YG(f,G,J=!1){return Z("PUT",`/1/indexes/${f}/rules/${G.objectID}${J?"?forwardToReplicas=true":""}`,G)}async function ZG(f,G="",J,Q,Y=0,$=20){return Z("POST",`/1/indexes/${f}/rules/search`,{query:G,anchoring:J,context:Q,page:Y,hitsPerPage:$})}async function $G(f,G=!1){return Z("POST",`/1/indexes/${f}/rules/clear${G?"?forwardToReplicas=true":""}`)}async function*zG(f,G={}){let J;do{let Q=await Z("POST",`/1/indexes/${f}/browse`,{...G,cursor:J});for(let Y of Q.hits)yield Y;J=Q.cursor}while(J)}var EG={configure:jf,search:gf,multiSearch:uf,saveObject:pf,saveObjects:Nf,partialUpdateObject:bf,deleteObject:of,deleteObjects:mf,deleteBy:cf,getObject:rf,getObjects:xf,clearObjects:lf,getSettings:df,setSettings:sf,listIndices:nf,copyIndex:af,moveIndex:tf,deleteIndex:ef,indexExists:fG,waitTask:GG,saveSynonym:JG,searchSynonyms:MG,clearSynonyms:QG,saveRule:YG,searchRules:ZG,clearRules:$G,browse:zG},O=EG;var HG={},P=HG;import{err as WG,ok as XG}from"@stacksjs/error-handling";import{log as K}from"@stacksjs/logging";import{getModelName as VG,getTableName as BG}from"@stacksjs/orm";import{path as _}from"@stacksjs/path";import{useSearchEngine as UG}from"@stacksjs/search-engine";import{globSync as CG}from"@stacksjs/storage";async function dG(f){try{let G=CG([_.userModelsPath("*.ts"),_.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),{addDocument:J}=UG();for(let Q of G){let Y=(await import(Q)).default,$=Y.traits?.useSearch,z=BG(Y,Q),E=VG(Y,Q);if($&&(typeof $==="boolean"||typeof $==="object")){let L=await(await import(_.storagePath(`framework/orm/src/models/${E}.ts`))).default.all(),V=0,X=0;for(let w of L)try{let B=w.toSearchableObject?.();if(B==null){X++;continue}await J(z,B),V++}catch(B){X++,K.warn(`[search] Skipped ${E}#${w.id??"?"}: ${B.message}`)}K.info(`[search] ${E}: imported ${V}, skipped ${X}`)}}return K.info(f),XG("Successfully imported models to search engine!")}catch(G){return K.error(G),WG(G?.message||String(G))}}import{ok as KG}from"@stacksjs/error-handling";import{log as LG}from"@stacksjs/logging";import{getModelName as SG,getTableName as OG}from"@stacksjs/orm";import{path as A}from"@stacksjs/path";import{useSearchEngine as PG}from"@stacksjs/search-engine";import{globSync as _G}from"@stacksjs/storage";async function GJ(f){try{let G=_G([A.userModelsPath("*.ts"),A.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),{deleteIndex:J}=PG();for(let Q of G){let Y=(await import(Q)).default,$=Y.traits?.useSearch,z=OG(Y,Q),E=SG(Y,Q);if(f&&E!==f)continue;if($&&(typeof $==="boolean"||typeof $==="object"))await J(z)}return KG("Successfully flushed all model data from search engine!")}catch(G){return LG.error(G),G(G)}}import{ok as vG}from"@stacksjs/error-handling";import{log as wG}from"@stacksjs/logging";import{getTableName as FG}from"@stacksjs/orm";import{path as hG}from"@stacksjs/path";import{useSearchEngine as RG}from"@stacksjs/search-engine";async function zJ(f){try{let G=hG.userModelsPath(`${f}.ts`),J=(await import(G)).default,{getFilterableAttributes:Q,getSortableAttributes:Y,getSearchableAttributes:$,getDisplayedAttributes:z}=RG(),E=J.traits?.useSearch,W=FG(J,G);if(E&&typeof E==="object"){let H=await z(W),L=await Q(W),V=await Y(W),X=await $(W);console.table({displayedAttributes:H,filterableAttributes:L,sortableAttributes:V,searchableAttributes:X})}return vG("Successfully update index settings!")}catch(G){return wG.error(G),G(G)}}import{ok as kG}from"@stacksjs/error-handling";import{log as AG}from"@stacksjs/logging";import{getTableName as TG}from"@stacksjs/orm";import{path as T}from"@stacksjs/path";import{useSearchEngine as yG}from"@stacksjs/search-engine";import{globSync as qG}from"@stacksjs/storage";import{snakeCase as v}from"@stacksjs/strings";async function KJ(){try{let f=qG([T.userModelsPath("*.ts"),T.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),{updateSettings:G}=yG();for(let J of f){let Q=(await import(J)).default,Y=Q.traits?.useSearch,$=TG(Q,J);if(Y&&typeof Y==="object"){let z=(typeof Q.traits?.useSearch==="object"&&Q.traits?.useSearch.filterable||[]).map((H)=>v(H)),E=(typeof Q.traits?.useSearch==="object"&&Q.traits?.useSearch.sortable||[]).map((H)=>v(H)),W=(typeof Q.traits?.useSearch==="object"&&Q.traits?.useSearch.searchable||[]).map((H)=>v(H));await G($,{filterableAttributes:z,sortableAttributes:E,searchableAttributes:W})}}return kG("Successfully update index settings!")}catch(f){return AG.error(f),f(f)}}function IG(){switch(y.driver||"meilisearch"){case"algolia":return O;case"opensearch":return P;case"meilisearch":default:return S}}function kJ(){return IG()}function AJ(){return O}function TJ(){return S}function yJ(){return P}export{kJ as useSearchEngine,yJ as useOpensearch,TJ as useMeilisearch,AJ as useAlgolia,KJ as updateIndexSettings,P as opensearch,S as meilisearch,zJ as listIndexSettings,dG as importModelDocuments,GJ as flushModelDocuments,O as algolia};
|
|
2
|
+
var hG=Object.defineProperty;var IG=(G)=>G;function DG(G,J){this[G]=IG.bind(null,J)}var E=(G,J)=>{for(var Q in J)hG(G,Q,{get:J[Q],enumerable:!0,configurable:!0,set:DG.bind(J,Q)})};var S=(G,J)=>()=>(G&&(J=G(G=0)),J);var j={};E(j,{waitTask:()=>KG,setSettings:()=>$G,searchSynonyms:()=>LG,searchRules:()=>OG,search:()=>d,saveSynonym:()=>UG,saveRule:()=>BG,saveObjects:()=>n,saveObject:()=>i,partialUpdateObject:()=>t,multiSearch:()=>s,moveIndex:()=>XG,listIndices:()=>HG,indexExists:()=>zG,getSettings:()=>ZG,getObjects:()=>QG,getObject:()=>JG,deleteObjects:()=>e,deleteObject:()=>a,deleteIndex:()=>VG,deleteBy:()=>GG,default:()=>XJ,copyIndex:()=>WG,configure:()=>r,clearSynonyms:()=>MG,clearRules:()=>PG,clearObjects:()=>YG,browse:()=>wG,algolia:()=>_G});import{searchEngine as l}from"@stacksjs/config";import{log as $J}from"@stacksjs/logging";function m(){if(!R){let G=l.algolia?.appId||process.env.ALGOLIA_APP_ID||"",J=l.algolia?.apiKey||process.env.ALGOLIA_API_KEY||"";if(!G||!J)throw $J.error("Algolia credentials not configured. Set ALGOLIA_APP_ID and ALGOLIA_API_KEY."),Error("Algolia credentials not configured. Set ALGOLIA_APP_ID and ALGOLIA_API_KEY.");R={appId:G,apiKey:J}}return R}function HJ(){let{appId:G}=m();return`https://${G}.algolia.net`}function WJ(){let{appId:G,apiKey:J}=m();return{"X-Algolia-Application-Id":G,"X-Algolia-API-Key":J,"Content-Type":"application/json"}}async function V(G,J,Q){let Y=await fetch(`${HJ()}${J}`,{method:G,headers:WJ(),body:Q?JSON.stringify(Q):void 0});if(!Y.ok){let $=await Y.json().catch(()=>({message:Y.statusText}));throw Error(`Algolia API error: ${$.message||Y.statusText}`)}return Y.json()}function r(G){R=G}async function d(G,J={}){return V("POST",`/1/indexes/${G}/query`,{query:J.query||"",page:J.page||0,hitsPerPage:J.hitsPerPage||20,filters:J.filters,facets:J.facets,attributesToRetrieve:J.attributesToRetrieve,attributesToHighlight:J.attributesToHighlight,attributesToSnippet:J.attributesToSnippet})}async function s(G){return V("POST","/1/indexes/*/queries",{requests:G.map((J)=>({indexName:J.indexName,params:new URLSearchParams({query:J.params?.query||"",page:String(J.params?.page||0),hitsPerPage:String(J.params?.hitsPerPage||20),...J.params?.filters&&{filters:J.params.filters}}).toString()}))})}async function i(G,J,Q){if(Q)return V("PUT",`/1/indexes/${G}/${Q}`,J);return V("POST",`/1/indexes/${G}`,J)}async function n(G,J){return V("POST",`/1/indexes/${G}/batch`,{requests:J.map((Q)=>({action:Q.objectID?"updateObject":"addObject",body:Q}))})}async function t(G,J,Q,Y=!0){return V("POST",`/1/indexes/${G}/${J}/partial${Y?"":"?createIfNotExists=false"}`,Q)}async function a(G,J){return V("DELETE",`/1/indexes/${G}/${J}`)}async function e(G,J){return V("POST",`/1/indexes/${G}/batch`,{requests:J.map((Q)=>({action:"deleteObject",body:{objectID:Q}}))})}async function GG(G,J){return V("POST",`/1/indexes/${G}/deleteByQuery`,{filters:J})}async function JG(G,J,Q){let Y=Q?`?attributesToRetrieve=${Q.join(",")}`:"";return V("GET",`/1/indexes/${G}/${J}${Y}`)}async function QG(G,J,Q){return V("POST","/1/indexes/*/objects",{requests:J.map((Y)=>({indexName:G,objectID:Y,attributesToRetrieve:Q}))})}async function YG(G){return V("POST",`/1/indexes/${G}/clear`)}async function ZG(G){return V("GET",`/1/indexes/${G}/settings`)}async function $G(G,J,Q=!1){return V("PUT",`/1/indexes/${G}/settings${Q?"?forwardToReplicas=true":""}`,J)}async function HG(){return V("GET","/1/indexes")}async function WG(G,J,Q){return V("POST",`/1/indexes/${G}/operation`,{operation:"copy",destination:J,scope:Q})}async function XG(G,J){return V("POST",`/1/indexes/${G}/operation`,{operation:"move",destination:J})}async function VG(G){return V("DELETE",`/1/indexes/${G}`)}async function zG(G){try{return await V("GET",`/1/indexes/${G}/settings`),!0}catch{return!1}}async function KG(G,J,Q=1e4,Y=100){let $=Date.now();while(Date.now()-$<Q){let H=await V("GET",`/1/indexes/${G}/task/${J}`);if(H.status==="published")return H;await new Promise((X)=>setTimeout(X,Y))}throw Error(`Task ${J} timed out after ${Q}ms`)}async function UG(G,J,Q=!1){return V("PUT",`/1/indexes/${G}/synonyms/${J.objectID}${Q?"?forwardToReplicas=true":""}`,J)}async function LG(G,J="",Q,Y=0,$=20){return V("POST",`/1/indexes/${G}/synonyms/search`,{query:J,type:Q,page:Y,hitsPerPage:$})}async function MG(G,J=!1){return V("POST",`/1/indexes/${G}/synonyms/clear${J?"?forwardToReplicas=true":""}`)}async function BG(G,J,Q=!1){return V("PUT",`/1/indexes/${G}/rules/${J.objectID}${Q?"?forwardToReplicas=true":""}`,J)}async function OG(G,J="",Q,Y,$=0,H=20){return V("POST",`/1/indexes/${G}/rules/search`,{query:J,anchoring:Q,context:Y,page:$,hitsPerPage:H})}async function PG(G,J=!1){return V("POST",`/1/indexes/${G}/rules/clear${J?"?forwardToReplicas=true":""}`)}async function*wG(G,J={}){let Q;do{let Y=await V("POST",`/1/indexes/${G}/browse`,{...J,cursor:Q});for(let $ of Y.hits)yield $;Q=Y.cursor}while(Q)}var R=null,_G,XJ;var y=S(()=>{_G={configure:r,search:d,multiSearch:s,saveObject:i,saveObjects:n,partialUpdateObject:t,deleteObject:a,deleteObjects:e,deleteBy:GG,getObject:JG,getObjects:QG,clearObjects:YG,getSettings:ZG,setSettings:$G,listIndices:HG,copyIndex:WG,moveIndex:XG,deleteIndex:VG,indexExists:zG,waitTask:KG,saveSynonym:UG,searchSynonyms:LG,clearSynonyms:MG,saveRule:BG,searchRules:OG,clearRules:PG,browse:wG},XJ=_G});var h={};E(h,{default:()=>zJ});var VJ,zJ;var I=S(()=>{VJ={},zJ=VJ});var N={};E(N,{default:()=>SJ});import{searchEngine as f}from"@stacksjs/config";import{log as KJ}from"@stacksjs/logging";function FG(){if(!A){let G=f.typesense?.host||process.env.TYPESENSE_HOST||"127.0.0.1",J=f.typesense?.port||Number(process.env.TYPESENSE_PORT||8108),Q=f.typesense?.protocol||process.env.TYPESENSE_PROTOCOL||"http",Y=f.typesense?.apiKey||process.env.TYPESENSE_API_KEY||"xyz";A={host:G,port:J,protocol:Q,apiKey:Y}}return A}function RG(){let{protocol:G,host:J,port:Q}=FG();return`${G}://${J}:${Q}`}function fG(){return{"Content-Type":"application/json","X-TYPESENSE-API-KEY":FG().apiKey}}function B(G){return{taskUid:0,indexUid:G,status:"succeeded",type:"documentAddition",enqueuedAt:new Date}}async function M(G,J,Q){let Y=await fetch(`${RG()}${J}`,{method:G,headers:fG(),body:Q==null?void 0:JSON.stringify(Q)});if(!Y.ok){let $=await Y.text().catch(()=>"");throw Error(`[search/typesense] ${G} ${J} failed (${Y.status}): ${$}`)}if(Y.status===204)return;return await Y.json()}function UJ(G){if(!G)return;let J=[];for(let Q in G){if(!Object.prototype.hasOwnProperty.call(G,Q))continue;if(!AG.test(Q))throw Error(`[search/typesense] Refusing to build filter with unsafe field name: ${Q}`);let Y=G[Q];if(Y==null||Y==="")continue;let $=String(Y).replace(/`/g,"\\`");J.push(`${Q}:=\`${$}\``)}return J.length?J.join(" && "):void 0}function LJ(G){if(!G)return;let J=[];for(let Q in G){if(!Object.prototype.hasOwnProperty.call(G,Q))continue;if(!AG.test(Q))continue;let Y=String(G[Q]).toLowerCase()==="desc"?"desc":"asc";J.push(`${Q}:${Y}`)}return J.length?J.join(","):void 0}function MJ(G){return"string"}async function T(G,J,Q){try{await M("GET",`/collections/${G}`);return}catch{}let Y=new Set(["id"]),$=Q?.searchableAttributes??[],H=Q?.filterableAttributes??[],X=Q?.sortableAttributes??[],L=Q?.displayedAttributes??[];for(let W of[...$,...H,...X,...L])Y.add(W);if(J){for(let W of Object.keys(J))Y.add(W);for(let W of Y)if(J[W]===void 0)J[W]=""}let K=[...Y].map((W)=>({name:W,type:W==="id"?"string":MJ(J?.[W]),facet:H.includes(W),sort:X.includes(W),optional:W!=="id"}));await M("POST","/collections",{name:G,fields:K})}function TG(G){let J={};for(let[Q,Y]of Object.entries(G)){if(Y==null)continue;if(Q==="id"||typeof Y==="number"||typeof Y==="bigint")J[Q]=String(Y);else J[Q]=Y}if(G.id!=null&&J.id==null)J.id=String(G.id);return J}async function BJ(G,J){let Q=Number(J.page)||1,Y=Number(J.perPage)||20,$=(Q-1)*Y,H=J.filter_by||UJ(J.filter),X=LJ(J.sort),L=J.queryBy?.join(",")||J.query_by||"id",K=J.query==null||J.query===""?"*":String(J.query),W=new URLSearchParams({q:K,query_by:L,per_page:String(Y),page:String(Q)});if(H)W.set("filter_by",H);if(X)W.set("sort_by",X);let O=await M("GET",`/collections/${G}/documents/search?${W}`),P=(O.hits??[]).map((w)=>w.document);return{hits:P,query:K,processingTimeMs:O.search_time_ms??0,limit:Y,offset:$,estimatedTotalHits:O.found??P.length}}async function CG(G,J){let Q=TG(J);return await T(G,Q),await M("POST",`/collections/${G}/documents?action=upsert`,Q),B(G)}async function EG(G,J){if(!Array.isArray(J)||J.length===0)return B(G);let Q=J.map(TG);await T(G,Q[0]);let Y=Q.map((H)=>JSON.stringify(H)).join(`
|
|
3
|
+
`),$=await fetch(`${RG()}/collections/${G}/documents/import?action=upsert`,{method:"POST",headers:{...fG(),"Content-Type":"text/plain"},body:Y});if(!$.ok){let H=await $.text().catch(()=>"");throw Error(`[search/typesense] bulk import failed (${$.status}): ${H}`)}return B(G)}async function OJ(G,J){return await M("DELETE",`/collections/${G}/documents/${String(J)}`),B(G)}async function SG(G){try{await M("DELETE",`/collections/${G}`)}catch(J){KJ.debug(`[search/typesense] deleteIndex ${G}: ${J.message}`)}return B(G)}async function PJ(G){return await T(G),B(G)}async function wJ(G){return await M("GET",`/collections/${G}`)}async function _J(G,J){return await T(G,void 0,J),B(G)}async function D(G){return((await M("GET",`/collections/${G}`)).fields??[]).map((Q)=>Q.name).filter((Q)=>Q!=="id")}async function vG(G){return((await M("GET",`/collections/${G}`)).fields??[]).filter((Q)=>Q.facet).map((Q)=>Q.name)}async function qG(G){return((await M("GET",`/collections/${G}`)).fields??[]).map((Q)=>Q.name)}async function kG(G){return D(G)}async function CJ(G){return{searchableAttributes:await D(G),filterableAttributes:await vG(G),sortableAttributes:await qG(G),displayedAttributes:await kG(G)}}function z(G,J){return Promise.resolve(B("typesense"))}var A=null,AG,EJ,SJ;var b=S(()=>{AG=/^[a-z_][\w]*(?:\.[a-z_][\w]*)*$/i;EJ={client:()=>({}),resetClient:()=>{A=null},search:BJ,getIndex:wJ,createIndex:PJ,deleteIndex:SG,updateIndex:z,listAllIndexes:async()=>({results:[]}),listAllIndices:async()=>({results:[]}),addDocument:CG,addDocuments:EG,updateDocument:(G,J)=>CG(G,J),updateDocuments:(G,J)=>EG(G,J),deleteDocument:OJ,deleteDocuments:async(G)=>SG(G),getDocument:async()=>B("typesense"),getFilterableAttributes:vG,updateFilterableAttributes:z,resetFilterableAttributes:z,updateDisplayedAttributes:z,resetDisplayedAttributes:z,getDisplayedAttributes:kG,updateSearchableAttributes:z,resetSearchableAttributes:z,getSearchableAttributes:D,updateSortableAttributes:z,resetSortableAttributes:z,getSortableAttributes:qG,getSettings:CJ,updateSettings:_J,resetSettings:z,getPagination:async()=>({}),updatePagination:z,resetPagination:z,getSynonyms:async()=>({}),updateSynonyms:z,resetSynonyms:z,getRankingRules:async()=>[],updateRankingRules:z,resetRankingRules:z,getDistinctAttribute:async()=>null,updateDistinctAttribute:z,resetDistinctAttribute:z,getFaceting:async()=>({}),updateFaceting:z,resetFaceting:z,getTypoTolerance:async()=>({}),updateTypoTolerance:z,resetTypoTolerance:z,getDictionary:async()=>({}),updateDictionary:z,resetDictionary:z},SJ=EJ});var g={};E(g,{default:()=>FQ});import{searchEngine as jG}from"@stacksjs/config";import{Meilisearch as FJ}from"meilisearch";function Z(){if(!v){let G=jG.meilisearch?.host||"http://127.0.0.1:7700",J=jG.meilisearch?.apiKey||"";if(!G)throw Error("Meilisearch host is not configured. Please specify a search engine host.");v=new FJ({host:G,apiKey:J})}return v}function RJ(){v=null}async function fJ(G,J){let Q=Number(J.page)||1,Y=Number(J.perPage)||20,$=(Q-1)*Y,H=CQ(J.filter),X=EQ(J.sort);return await Z().index(G).search(J.query,{limit:Y,filter:H,sort:X,offset:$})}async function AJ(G,J){return await Z().index(G).addDocuments([J])}async function TJ(G,J){if(!Array.isArray(J))throw TypeError("[search/meilisearch] addDocuments requires an array of documents");if(J.length<=1000)return await Z().index(G).addDocuments(J);let Y;for(let $=0;$<J.length;$+=1000){let H=J.slice($,$+1000),X=await Z().index(G).addDocuments(H);if(!Y)Y=X}return Y}async function vJ(G){return await Z().getIndex(G)}async function qJ(G,J){return await Z().createIndex(G,J)}async function kJ(G,J){return await Z().updateIndex(G,J)}async function jJ(G,J){return await Z().index(G).updateDocuments([J])}async function yJ(G,J){return await Z().index(G).updateDocuments(J)}async function hJ(G,J){return await Z().index(G).deleteDocument(J)}async function IJ(G,J){return await Z().index(G).deleteDocuments({filter:J})}async function DJ(G,J,Q){return await Z().index(G).getDocument(J,Q)}async function NJ(G){return await Z().deleteIndex(G)}async function yG(){return await Z().getIndexes()}async function bJ(G){return Z().index(G).getFilterableAttributes()}async function gJ(G,J){return Z().index(G).updateFilterableAttributes(J)}async function uJ(G){return Z().index(G).resetFilterableAttributes()}async function pJ(G,J){return Z().index(G).updateSearchableAttributes(J)}async function xJ(G){return Z().index(G).resetSearchableAttributes()}async function cJ(G){return Z().index(G).getSearchableAttributes()}async function oJ(G,J){return Z().index(G).updateSortableAttributes(J)}async function lJ(G){return Z().index(G).resetSortableAttributes()}async function mJ(G){return Z().index(G).getSortableAttributes()}async function rJ(G,J){return Z().index(G).updateDisplayedAttributes(J)}async function dJ(G){return Z().index(G).getDisplayedAttributes()}async function sJ(G){return Z().index(G).resetDisplayedAttributes()}async function iJ(G){return Z().index(G).getSettings()}async function nJ(G,J){return Z().index(G).updateSettings(J)}async function tJ(G){return Z().index(G).resetSettings()}async function aJ(G){return Z().index(G).getPagination()}async function eJ(G,J){return Z().index(G).updatePagination(J)}async function GQ(G){return Z().index(G).resetPagination()}async function JQ(G){return Z().index(G).getSynonyms()}async function QQ(G,J){return Z().index(G).updateSynonyms(J)}async function YQ(G){return Z().index(G).resetSynonyms()}async function ZQ(G){return Z().index(G).getRankingRules()}async function $Q(G,J){return Z().index(G).updateRankingRules(J)}async function HQ(G){return Z().index(G).resetRankingRules()}async function WQ(G){return Z().index(G).getDistinctAttribute()}async function XQ(G,J){return Z().index(G).updateDistinctAttribute(J)}async function VQ(G){return Z().index(G).resetDistinctAttribute()}async function zQ(G){return Z().index(G).getFaceting()}async function KQ(G,J){return Z().index(G).updateFaceting(J)}async function UQ(G){return Z().index(G).resetFaceting()}async function LQ(G){return Z().index(G).getTypoTolerance()}async function MQ(G,J){return Z().index(G).updateTypoTolerance(J)}async function BQ(G){return Z().index(G).resetTypoTolerance()}async function OQ(G){return Z().index(G).getDictionary()}async function PQ(G,J){return Z().index(G).updateDictionary(J)}async function wQ(G){return Z().index(G).resetDictionary()}function CQ(G){if(!G)return[];let J=[];for(let Q in G){if(!Object.prototype.hasOwnProperty.call(G,Q))continue;if(!_Q.test(Q))throw Error(`[search/meilisearch] Refusing to build filter with unsafe field name: ${Q}`);let Y=G[Q],$=String(Y).replace(/'/g,"\\'");J.push(`${Q}='${$}'`)}return J}function EQ(G){if(!G)return[];let J=[];for(let Q in G)if(Object.prototype.hasOwnProperty.call(G,Q)){let $=String(G[Q]).toLowerCase()==="desc"?"desc":"asc";J.push(`${Q}:${$}`)}return J}var v=null,_Q,SQ,FQ;var u=S(()=>{_Q=/^[a-z_][\w]*(?:\.[a-z_][\w]*)*$/i;SQ={client:Z,resetClient:RJ,search:fJ,getIndex:vJ,createIndex:qJ,deleteIndex:NJ,updateIndex:kJ,listAllIndexes:yG,listAllIndices:yG,addDocument:AJ,addDocuments:TJ,updateDocument:jJ,updateDocuments:yJ,deleteDocument:hJ,deleteDocuments:IJ,getDocument:DJ,getFilterableAttributes:bJ,updateFilterableAttributes:gJ,resetFilterableAttributes:uJ,updateDisplayedAttributes:rJ,resetDisplayedAttributes:sJ,getDisplayedAttributes:dJ,updateSearchableAttributes:pJ,resetSearchableAttributes:xJ,getSearchableAttributes:cJ,updateSortableAttributes:oJ,resetSortableAttributes:lJ,getSortableAttributes:mJ,getSettings:iJ,updateSettings:nJ,resetSettings:tJ,getPagination:aJ,updatePagination:eJ,resetPagination:GQ,getSynonyms:JQ,updateSynonyms:QQ,resetSynonyms:YQ,getRankingRules:ZQ,updateRankingRules:$Q,resetRankingRules:HQ,getDistinctAttribute:WQ,updateDistinctAttribute:XQ,resetDistinctAttribute:VQ,getFaceting:zQ,updateFaceting:KQ,resetFaceting:UQ,getTypoTolerance:LQ,updateTypoTolerance:MQ,resetTypoTolerance:BQ,getDictionary:OQ,updateDictionary:PQ,resetDictionary:wQ},FQ=SQ});import{overridesReady as RQ,searchEngine as fQ}from"@stacksjs/config";import{err as NG,ok as bG}from"@stacksjs/error-handling";import{log as _}from"@stacksjs/logging";import{getModelName as gG,getTableName as uG}from"@stacksjs/orm";import{path as x}from"@stacksjs/path";import{useSearchEngine as pG}from"@stacksjs/search-engine";import{globSync as xG}from"@stacksjs/storage";import{snakeCase as F}from"@stacksjs/strings";async function bQ(G){try{let J=xG([x.userModelsPath("*.ts"),x.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),{addDocument:Q,updateSettings:Y}=pG();for(let $ of J){let H=(await import($)).default,X=H.traits?.useSearch,L=uG(H,$),K=gG(H,$);if(G&&K!==G)continue;if(X&&(typeof X==="boolean"||typeof X==="object")){if(typeof X==="object")await Y(L,{searchableAttributes:(X.searchable??[]).map((U)=>F(U)),filterableAttributes:(X.filterable??[]).map((U)=>F(U)),sortableAttributes:(X.sortable??[]).map((U)=>F(U)),displayedAttributes:(X.displayable??[]).map((U)=>F(U))});let W=H;if(typeof W.all!=="function"){_.warn(`[search] ${K}: model has no .all() \u2014 run generate:model-files or use defineModel`);continue}let O=typeof X==="object"?X.denormalize:void 0,P=O?Array.from(new Set(Object.values(O).map((U)=>U.split(".")[0]).filter(Boolean))):[],w;if(P.length>0&&typeof W.query==="function")try{w=await W.query().with(...P).get()}catch(U){_.warn(`[search] ${K}: eager-load of [${P.join(", ")}] failed \u2014 falling back to .all(); denormalized fields will be null. (${U.message})`),w=await W.all()}else w=await W.all();let p=0,q=0;for(let U of w)try{let C=U.toSearchableObject?.();if(C==null){q++;continue}await Q(L,C),p++}catch(C){q++,_.warn(`[search] Skipped ${K}#${U.id??"?"}: ${C.message}`)}_.info(`[search] ${K}: imported ${p}, skipped ${q}`)}}return _.info(G),bG("Successfully imported models to search engine!")}catch(J){return _.error(J),NG(J?.message||String(J))}}import{ok as cG}from"@stacksjs/error-handling";import{log as oG}from"@stacksjs/logging";import{getModelName as lG,getTableName as mG}from"@stacksjs/orm";import{path as c}from"@stacksjs/path";import{useSearchEngine as rG}from"@stacksjs/search-engine";import{globSync as dG}from"@stacksjs/storage";async function mQ(G){try{let J=dG([c.userModelsPath("*.ts"),c.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),{deleteIndex:Q}=rG();for(let Y of J){let $=(await import(Y)).default,H=$.traits?.useSearch,X=mG($,Y),L=lG($,Y);if(G&&L!==G)continue;if(H&&(typeof H==="boolean"||typeof H==="object"))await Q(X)}return cG("Successfully flushed all model data from search engine!")}catch(J){return oG.error(J),J(J)}}import{ok as sG}from"@stacksjs/error-handling";import{log as iG}from"@stacksjs/logging";import{getTableName as nG}from"@stacksjs/orm";import{path as tG}from"@stacksjs/path";import{useSearchEngine as aG}from"@stacksjs/search-engine";async function aQ(G){try{let J=tG.userModelsPath(`${G}.ts`),Q=(await import(J)).default,{getFilterableAttributes:Y,getSortableAttributes:$,getSearchableAttributes:H,getDisplayedAttributes:X}=aG(),L=Q.traits?.useSearch,K=nG(Q,J);if(L&&typeof L==="object"){let W=await X(K),O=await Y(K),P=await $(K),w=await H(K);console.table({displayedAttributes:W,filterableAttributes:O,sortableAttributes:P,searchableAttributes:w})}return sG("Successfully update index settings!")}catch(J){return iG.error(J),J(J)}}import{err as eG,ok as GJ}from"@stacksjs/error-handling";import{log as JJ}from"@stacksjs/logging";import{getTableName as QJ}from"@stacksjs/orm";import{path as o}from"@stacksjs/path";import{useSearchEngine as YJ}from"@stacksjs/search-engine";import{globSync as ZJ}from"@stacksjs/storage";import{snakeCase as k}from"@stacksjs/strings";async function WY(){try{let G=ZJ([o.userModelsPath("*.ts"),o.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),{updateSettings:J}=YJ();for(let Q of G){let Y=(await import(Q)).default,$=Y.traits?.useSearch,H=QJ(Y,Q);if($&&typeof $==="object"){let X=(typeof Y.traits?.useSearch==="object"&&Y.traits?.useSearch.filterable||[]).map((W)=>k(W)),L=(typeof Y.traits?.useSearch==="object"&&Y.traits?.useSearch.sortable||[]).map((W)=>k(W)),K=(typeof Y.traits?.useSearch==="object"&&Y.traits?.useSearch.searchable||[]).map((W)=>k(W));await J(H,{filterableAttributes:X,sortableAttributes:L,searchableAttributes:K})}}return GJ("Successfully update index settings!")}catch(G){return JJ.error(G),eG(G?.message||String(G))}}await RQ;function AQ(G){if(G==="algolia")return Promise.resolve().then(() => (y(),j));if(G==="opensearch")return Promise.resolve().then(() => (I(),h));if(G==="typesense")return Promise.resolve().then(() => (b(),N));return Promise.resolve().then(() => (u(),g))}var TQ=await AQ(fQ.driver),vQ=TQ.default;function EY(){return vQ}function SY(){return Promise.resolve().then(() => (y(),j)).then((G)=>G.default)}function FY(){return Promise.resolve().then(() => (u(),g)).then((G)=>G.default)}function RY(){return Promise.resolve().then(() => (I(),h)).then((G)=>G.default)}function fY(){return Promise.resolve().then(() => (b(),N)).then((G)=>G.default)}export{fY as useTypesense,EY as useSearchEngine,RY as useOpensearch,FY as useMeilisearch,SY as useAlgolia,WY as updateIndexSettings,aQ as listIndexSettings,bQ as importModelDocuments,mQ as flushModelDocuments};
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
import
|
|
2
|
-
import meilisearch from './drivers/meilisearch';
|
|
3
|
-
import opensearch from './drivers/opensearch';
|
|
1
|
+
import { overridesReady } from '@stacksjs/config';
|
|
4
2
|
import type { SearchEngineDriver } from '@stacksjs/types';
|
|
5
3
|
export declare function useSearchEngine(): SearchEngineDriver;
|
|
6
|
-
export declare function useAlgolia(): typeof algolia
|
|
7
|
-
export declare function useMeilisearch(): typeof meilisearch
|
|
8
|
-
export declare function useOpensearch(): typeof opensearch
|
|
9
|
-
export
|
|
4
|
+
export declare function useAlgolia(): Promise<typeof import('./drivers/algolia').default>;
|
|
5
|
+
export declare function useMeilisearch(): Promise<typeof import('./drivers/meilisearch').default>;
|
|
6
|
+
export declare function useOpensearch(): Promise<typeof import('./drivers/opensearch').default>;
|
|
7
|
+
export declare function useTypesense(): Promise<typeof import('./drivers/typesense').default>;
|
|
8
|
+
export type SearchDriver = 'meilisearch' | 'algolia' | 'opensearch' | 'typesense'
|
|
9
|
+
|
|
10
|
+
// User `config/search-engine.ts` loads asynchronously via `overridesReady`.
|
|
11
|
+
// Without awaiting it here, the first import would read framework defaults
|
|
12
|
+
// (`driver: 'opensearch'`) and bind the empty stub driver forever.
|
|
13
|
+
await overridesReady;
|
|
10
14
|
export * from './documents/index';
|
|
11
|
-
export { algolia, meilisearch, opensearch };
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stacksjs/search-engine",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.70.
|
|
4
|
+
"version": "0.70.53",
|
|
5
5
|
"description": "The Stacks search engine integrations.",
|
|
6
6
|
"author": "Chris Breuer",
|
|
7
7
|
"contributors": [
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"prepublishOnly": "bun run build"
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
|
-
"@stacksjs/config": "
|
|
57
|
+
"@stacksjs/config": "0.70.53",
|
|
58
58
|
"better-dx": "^0.2.12"
|
|
59
59
|
}
|
|
60
60
|
}
|
|
@@ -1,231 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Configure Algolia client
|
|
3
|
-
*/
|
|
4
|
-
export declare function configure(options: AlgoliaConfig): void;
|
|
5
|
-
/**
|
|
6
|
-
* Search an index
|
|
7
|
-
*/
|
|
8
|
-
export declare function search(indexName: string, params?: AlgoliaSearchParams): Promise<AlgoliaSearchResponse>;
|
|
9
|
-
/**
|
|
10
|
-
* Multi-index search
|
|
11
|
-
*/
|
|
12
|
-
export declare function multiSearch(queries: Array<{ indexName: string, params?: AlgoliaSearchParams }>): Promise<{ results: AlgoliaSearchResponse[] }>;
|
|
13
|
-
/**
|
|
14
|
-
* Add or update a single object
|
|
15
|
-
*/
|
|
16
|
-
export declare function saveObject(indexName: string, object: Record<string, any>, objectID?: string): Promise<AlgoliaTask>;
|
|
17
|
-
/**
|
|
18
|
-
* Add or update multiple objects
|
|
19
|
-
*/
|
|
20
|
-
export declare function saveObjects(indexName: string, objects: Array<Record<string, any>>): Promise<AlgoliaTask>;
|
|
21
|
-
/**
|
|
22
|
-
* Partially update an object
|
|
23
|
-
*/
|
|
24
|
-
export declare function partialUpdateObject(indexName: string, objectID: string, attributes: Record<string, any>, createIfNotExists?: boolean): Promise<AlgoliaTask>;
|
|
25
|
-
/**
|
|
26
|
-
* Delete an object
|
|
27
|
-
*/
|
|
28
|
-
export declare function deleteObject(indexName: string, objectID: string): Promise<AlgoliaTask>;
|
|
29
|
-
/**
|
|
30
|
-
* Delete multiple objects
|
|
31
|
-
*/
|
|
32
|
-
export declare function deleteObjects(indexName: string, objectIDs: string[]): Promise<AlgoliaTask>;
|
|
33
|
-
/**
|
|
34
|
-
* Delete objects matching a filter
|
|
35
|
-
*/
|
|
36
|
-
export declare function deleteBy(indexName: string, filters: string): Promise<AlgoliaTask>;
|
|
37
|
-
/**
|
|
38
|
-
* Get an object by ID
|
|
39
|
-
*/
|
|
40
|
-
export declare function getObject(indexName: string, objectID: string, attributesToRetrieve?: string[]): Promise<AlgoliaHit>;
|
|
41
|
-
/**
|
|
42
|
-
* Get multiple objects by IDs
|
|
43
|
-
*/
|
|
44
|
-
export declare function getObjects(indexName: string, objectIDs: string[], attributesToRetrieve?: string[]): Promise<{ results: AlgoliaHit[] }>;
|
|
45
|
-
/**
|
|
46
|
-
* Clear all objects from an index
|
|
47
|
-
*/
|
|
48
|
-
export declare function clearObjects(indexName: string): Promise<AlgoliaTask>;
|
|
49
|
-
/**
|
|
50
|
-
* Get index settings
|
|
51
|
-
*/
|
|
52
|
-
export declare function getSettings(indexName: string): Promise<AlgoliaIndexSettings>;
|
|
53
|
-
/**
|
|
54
|
-
* Update index settings
|
|
55
|
-
*/
|
|
56
|
-
export declare function setSettings(indexName: string, settings: AlgoliaIndexSettings, forwardToReplicas?: boolean): Promise<AlgoliaTask>;
|
|
57
|
-
/**
|
|
58
|
-
* List all indices
|
|
59
|
-
*/
|
|
60
|
-
export declare function listIndices(): Promise<{
|
|
61
|
-
items: Array<{
|
|
62
|
-
name: string
|
|
63
|
-
createdAt: string
|
|
64
|
-
updatedAt: string
|
|
65
|
-
entries: number
|
|
66
|
-
dataSize: number
|
|
67
|
-
fileSize: number
|
|
68
|
-
lastBuildTimeS: number
|
|
69
|
-
numberOfPendingTasks: number
|
|
70
|
-
pendingTask: boolean
|
|
71
|
-
primary?: string
|
|
72
|
-
replicas?: string[]
|
|
73
|
-
}>
|
|
74
|
-
}>;
|
|
75
|
-
/**
|
|
76
|
-
* Copy an index
|
|
77
|
-
*/
|
|
78
|
-
export declare function copyIndex(srcIndexName: string, dstIndexName: string, scope?: Array<'settings' | 'synonyms' | 'rules'>): Promise<AlgoliaTask>;
|
|
79
|
-
/**
|
|
80
|
-
* Move an index
|
|
81
|
-
*/
|
|
82
|
-
export declare function moveIndex(srcIndexName: string, dstIndexName: string): Promise<AlgoliaTask>;
|
|
83
|
-
/**
|
|
84
|
-
* Delete an index
|
|
85
|
-
*/
|
|
86
|
-
export declare function deleteIndex(indexName: string): Promise<AlgoliaTask>;
|
|
87
|
-
/**
|
|
88
|
-
* Check if an index exists
|
|
89
|
-
*/
|
|
90
|
-
export declare function indexExists(indexName: string): Promise<boolean>;
|
|
91
|
-
/**
|
|
92
|
-
* Wait for a task to complete
|
|
93
|
-
*/
|
|
94
|
-
export declare function waitTask(indexName: string, taskID: number, timeoutMs?: number, intervalMs?: number): Promise<{ status: 'published' | 'notPublished' }>;
|
|
95
|
-
/**
|
|
96
|
-
* Add a synonym
|
|
97
|
-
*/
|
|
98
|
-
export declare function saveSynonym(indexName: string, synonym: {
|
|
99
|
-
objectID: string
|
|
100
|
-
type: 'synonym' | 'oneWaySynonym' | 'altCorrection1' | 'altCorrection2' | 'placeholder'
|
|
101
|
-
synonyms?: string[]
|
|
102
|
-
input?: string
|
|
103
|
-
word?: string
|
|
104
|
-
corrections?: string[]
|
|
105
|
-
placeholder?: string
|
|
106
|
-
replacements?: string[]
|
|
107
|
-
}, forwardToReplicas?: boolean): Promise<AlgoliaTask>;
|
|
108
|
-
/**
|
|
109
|
-
* Search synonyms
|
|
110
|
-
*/
|
|
111
|
-
export declare function searchSynonyms(indexName: string, query?: string, type?: string, page?: number, hitsPerPage?: number): Promise<{ hits: any[], nbHits: number }>;
|
|
112
|
-
/**
|
|
113
|
-
* Clear all synonyms
|
|
114
|
-
*/
|
|
115
|
-
export declare function clearSynonyms(indexName: string, forwardToReplicas?: boolean): Promise<AlgoliaTask>;
|
|
116
|
-
/**
|
|
117
|
-
* Add a rule
|
|
118
|
-
*/
|
|
119
|
-
export declare function saveRule(indexName: string, rule: {
|
|
120
|
-
objectID: string
|
|
121
|
-
conditions?: Array<{
|
|
122
|
-
pattern?: string
|
|
123
|
-
anchoring?: 'is' | 'startsWith' | 'endsWith' | 'contains'
|
|
124
|
-
context?: string
|
|
125
|
-
}>
|
|
126
|
-
consequence: {
|
|
127
|
-
params?: Record<string, any>
|
|
128
|
-
promote?: Array<{ objectID: string, position: number }>
|
|
129
|
-
hide?: Array<{ objectID: string }>
|
|
130
|
-
userData?: Record<string, any>
|
|
131
|
-
}
|
|
132
|
-
description?: string
|
|
133
|
-
enabled?: boolean
|
|
134
|
-
validity?: Array<{ from: number, until: number }>
|
|
135
|
-
}, forwardToReplicas?: boolean): Promise<AlgoliaTask>;
|
|
136
|
-
/**
|
|
137
|
-
* Search rules
|
|
138
|
-
*/
|
|
139
|
-
export declare function searchRules(indexName: string, query?: string, anchoring?: string, context?: string, page?: number, hitsPerPage?: number): Promise<{ hits: any[], nbHits: number }>;
|
|
140
|
-
/**
|
|
141
|
-
* Clear all rules
|
|
142
|
-
*/
|
|
143
|
-
export declare function clearRules(indexName: string, forwardToReplicas?: boolean): Promise<AlgoliaTask>;
|
|
144
|
-
/**
|
|
145
|
-
* Browse all records in an index
|
|
146
|
-
*/
|
|
147
|
-
export declare function browse(indexName: string, params?: AlgoliaSearchParams): AsyncGenerator<AlgoliaHit>;
|
|
148
|
-
export declare const algolia: {
|
|
149
|
-
|
|
150
|
-
};
|
|
151
|
-
export declare interface AlgoliaConfig {
|
|
152
|
-
appId: string
|
|
153
|
-
apiKey: string
|
|
154
|
-
searchOnlyApiKey?: string
|
|
155
|
-
}
|
|
156
|
-
export declare interface AlgoliaSearchParams {
|
|
157
|
-
query?: string
|
|
158
|
-
page?: number
|
|
159
|
-
hitsPerPage?: number
|
|
160
|
-
filters?: string
|
|
161
|
-
facets?: string[]
|
|
162
|
-
attributesToRetrieve?: string[]
|
|
163
|
-
attributesToHighlight?: string[]
|
|
164
|
-
attributesToSnippet?: string[]
|
|
165
|
-
sortBy?: string
|
|
166
|
-
}
|
|
167
|
-
export declare interface AlgoliaHit {
|
|
168
|
-
objectID: string
|
|
169
|
-
[key: string]: any
|
|
170
|
-
}
|
|
171
|
-
export declare interface AlgoliaSearchResponse {
|
|
172
|
-
hits: AlgoliaHit[]
|
|
173
|
-
nbHits: number
|
|
174
|
-
page: number
|
|
175
|
-
nbPages: number
|
|
176
|
-
hitsPerPage: number
|
|
177
|
-
processingTimeMS: number
|
|
178
|
-
query: string
|
|
179
|
-
params: string
|
|
180
|
-
facets?: Record<string, Record<string, number>>
|
|
181
|
-
}
|
|
182
|
-
export declare interface AlgoliaIndexSettings {
|
|
183
|
-
searchableAttributes?: string[]
|
|
184
|
-
attributesForFaceting?: string[]
|
|
185
|
-
unretrievableAttributes?: string[]
|
|
186
|
-
attributesToRetrieve?: string[]
|
|
187
|
-
ranking?: string[]
|
|
188
|
-
customRanking?: string[]
|
|
189
|
-
replicas?: string[]
|
|
190
|
-
maxValuesPerFacet?: number
|
|
191
|
-
sortFacetValuesBy?: 'count' | 'alpha'
|
|
192
|
-
attributesToHighlight?: string[]
|
|
193
|
-
attributesToSnippet?: string[]
|
|
194
|
-
highlightPreTag?: string
|
|
195
|
-
highlightPostTag?: string
|
|
196
|
-
snippetEllipsisText?: string
|
|
197
|
-
restrictHighlightAndSnippetArrays?: boolean
|
|
198
|
-
minWordSizefor1Typo?: number
|
|
199
|
-
minWordSizefor2Typos?: number
|
|
200
|
-
typoTolerance?: boolean | 'min' | 'strict'
|
|
201
|
-
allowTyposOnNumericTokens?: boolean
|
|
202
|
-
disableTypoToleranceOnAttributes?: string[]
|
|
203
|
-
ignorePlurals?: boolean | string[]
|
|
204
|
-
removeStopWords?: boolean | string[]
|
|
205
|
-
separatorsToIndex?: string
|
|
206
|
-
queryType?: 'prefixLast' | 'prefixAll' | 'prefixNone'
|
|
207
|
-
removeWordsIfNoResults?: 'none' | 'lastWords' | 'firstWords' | 'allOptional'
|
|
208
|
-
advancedSyntax?: boolean
|
|
209
|
-
optionalWords?: string[]
|
|
210
|
-
disablePrefixOnAttributes?: string[]
|
|
211
|
-
disableExactOnAttributes?: string[]
|
|
212
|
-
exactOnSingleWordQuery?: 'attribute' | 'none' | 'word'
|
|
213
|
-
alternativesAsExact?: Array<'ignorePlurals' | 'singleWordSynonym' | 'multiWordsSynonym'>
|
|
214
|
-
numericAttributesForFiltering?: string[]
|
|
215
|
-
allowCompressionOfIntegerArray?: boolean
|
|
216
|
-
attributeForDistinct?: string
|
|
217
|
-
distinct?: boolean | number
|
|
218
|
-
replaceSynonymsInHighlight?: boolean
|
|
219
|
-
minProximity?: number
|
|
220
|
-
responseFields?: string[]
|
|
221
|
-
maxFacetHits?: number
|
|
222
|
-
paginationLimitedTo?: number
|
|
223
|
-
}
|
|
224
|
-
export declare interface AlgoliaTask {
|
|
225
|
-
taskID: number
|
|
226
|
-
objectID?: string
|
|
227
|
-
objectIDs?: string[]
|
|
228
|
-
createdAt?: string
|
|
229
|
-
updatedAt?: string
|
|
230
|
-
}
|
|
231
|
-
export default algolia;
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// const host = searchEngine.openSearch?.host
|
|
3
|
-
// const protocol = searchEngine.openSearch?.protocol
|
|
4
|
-
// const port = searchEngine.openSearch?.port
|
|
5
|
-
// const auth = searchEngine.openSearch?.auth
|
|
6
|
-
//
|
|
7
|
-
// const client = new Client({
|
|
8
|
-
// node: `${protocol}://${auth}@${host}:${port}`,
|
|
9
|
-
// })
|
|
10
|
-
//
|
|
11
|
-
// async function search(index: string, params?: any) {
|
|
12
|
-
// const response = await client.search({
|
|
13
|
-
// index,
|
|
14
|
-
// body: params.query,
|
|
15
|
-
// })
|
|
16
|
-
//
|
|
17
|
-
// return response
|
|
18
|
-
// }
|
|
19
|
-
//
|
|
20
|
-
// async function createIndex(indexName: string, settings?: any): Promise<ApiResponse<any, any>> {
|
|
21
|
-
// return await client.indices.create({ index: indexName, body: settings })
|
|
22
|
-
// }
|
|
23
|
-
// // async function updateIndex(indexName: string, settings?: any): Promise<ApiResponse<any, any>> {
|
|
24
|
-
// // return await client.indices.update({ index: indexName, body: settings })
|
|
25
|
-
// // }
|
|
26
|
-
//
|
|
27
|
-
// async function deleteIndex(indexName: string): Promise<ApiResponse<any, any>> {
|
|
28
|
-
// return await client.indices.delete({ index: indexName })
|
|
29
|
-
// }
|
|
30
|
-
//
|
|
31
|
-
// async function addDocument(indexName: string, document: any): Promise<ApiResponse<any, any>> {
|
|
32
|
-
// return await client.index({
|
|
33
|
-
// id: document.id,
|
|
34
|
-
// index: indexName,
|
|
35
|
-
// body: document,
|
|
36
|
-
// refresh: true,
|
|
37
|
-
// })
|
|
38
|
-
// }
|
|
39
|
-
//
|
|
40
|
-
// async function deleteDocument(indexName: string, document: any): Promise<ApiResponse<any, any>> {
|
|
41
|
-
// return await client.delete({
|
|
42
|
-
// id: document.id,
|
|
43
|
-
// index: indexName,
|
|
44
|
-
// })
|
|
45
|
-
// }
|
|
46
|
-
//
|
|
47
|
-
declare const opensearch: SearchEngineDriver;
|
|
48
|
-
export default opensearch;
|