@stacksjs/search-engine 0.70.88 → 0.70.90
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { overridesReady } from '@stacksjs/config';
|
|
2
|
+
import type { SearchEngineDriver } from '@stacksjs/types';
|
|
3
|
+
export declare function useSearchEngine(): SearchEngineDriver;
|
|
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;
|
|
14
|
+
export * from './documents/index';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
var hG=Object.defineProperty;var DG=(G)=>G;function NG(G,J){this[G]=DG.bind(null,J)}var C=(G,J)=>{for(var Q in J)hG(G,Q,{get:J[Q],enumerable:!0,configurable:!0,set:NG.bind(J,Q)})};var S=(G,J)=>()=>(G&&(J=G(G=0)),J);var bG=import.meta.require;var j={};C(j,{waitTask:()=>UG,setSettings:()=>HG,searchSynonyms:()=>MG,searchRules:()=>PG,search:()=>s,saveSynonym:()=>LG,saveRule:()=>OG,saveObjects:()=>t,saveObject:()=>n,partialUpdateObject:()=>a,multiSearch:()=>i,moveIndex:()=>VG,listIndices:()=>WG,indexExists:()=>KG,getSettings:()=>$G,getObjects:()=>YG,getObject:()=>QG,deleteObjects:()=>GG,deleteObject:()=>e,deleteIndex:()=>zG,deleteBy:()=>JG,default:()=>zJ,copyIndex:()=>XG,configure:()=>d,clearSynonyms:()=>BG,clearRules:()=>wG,clearObjects:()=>ZG,browse:()=>_G,algolia:()=>EG});import{searchEngine as m}from"@stacksjs/config";import{log as WJ}from"@stacksjs/logging";function r(){if(!R){let G=m.algolia?.appId||process.env.ALGOLIA_APP_ID||"",J=m.algolia?.apiKey||process.env.ALGOLIA_API_KEY||"";if(!G||!J)throw WJ.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 XJ(){let{appId:G}=r();return`https://${G}.algolia.net`}function VJ(){let{appId:G,apiKey:J}=r();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(`${XJ()}${J}`,{method:G,headers:VJ(),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 d(G){R=G}async function s(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 i(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 n(G,J,Q){if(Q)return V("PUT",`/1/indexes/${G}/${Q}`,J);return V("POST",`/1/indexes/${G}`,J)}async function t(G,J){return V("POST",`/1/indexes/${G}/batch`,{requests:J.map((Q)=>({action:Q.objectID?"updateObject":"addObject",body:Q}))})}async function a(G,J,Q,Y=!0){return V("POST",`/1/indexes/${G}/${J}/partial${Y?"":"?createIfNotExists=false"}`,Q)}async function e(G,J){return V("DELETE",`/1/indexes/${G}/${J}`)}async function GG(G,J){return V("POST",`/1/indexes/${G}/batch`,{requests:J.map((Q)=>({action:"deleteObject",body:{objectID:Q}}))})}async function JG(G,J){return V("POST",`/1/indexes/${G}/deleteByQuery`,{filters:J})}async function QG(G,J,Q){let Y=Q?`?attributesToRetrieve=${Q.join(",")}`:"";return V("GET",`/1/indexes/${G}/${J}${Y}`)}async function YG(G,J,Q){return V("POST","/1/indexes/*/objects",{requests:J.map((Y)=>({indexName:G,objectID:Y,attributesToRetrieve:Q}))})}async function ZG(G){return V("POST",`/1/indexes/${G}/clear`)}async function $G(G){return V("GET",`/1/indexes/${G}/settings`)}async function HG(G,J,Q=!1){return V("PUT",`/1/indexes/${G}/settings${Q?"?forwardToReplicas=true":""}`,J)}async function WG(){return V("GET","/1/indexes")}async function XG(G,J,Q){return V("POST",`/1/indexes/${G}/operation`,{operation:"copy",destination:J,scope:Q})}async function VG(G,J){return V("POST",`/1/indexes/${G}/operation`,{operation:"move",destination:J})}async function zG(G){return V("DELETE",`/1/indexes/${G}`)}async function KG(G){try{return await V("GET",`/1/indexes/${G}/settings`),!0}catch{return!1}}async function UG(G,J,Q=1e4,Y=100){let $=Date.now();while(Date.now()-$<Q){let W=await V("GET",`/1/indexes/${G}/task/${J}`);if(W.status==="published")return W;await new Promise((X)=>setTimeout(X,Y))}throw Error(`Task ${J} timed out after ${Q}ms`)}async function LG(G,J,Q=!1){return V("PUT",`/1/indexes/${G}/synonyms/${J.objectID}${Q?"?forwardToReplicas=true":""}`,J)}async function MG(G,J="",Q,Y=0,$=20){return V("POST",`/1/indexes/${G}/synonyms/search`,{query:J,type:Q,page:Y,hitsPerPage:$})}async function BG(G,J=!1){return V("POST",`/1/indexes/${G}/synonyms/clear${J?"?forwardToReplicas=true":""}`)}async function OG(G,J,Q=!1){return V("PUT",`/1/indexes/${G}/rules/${J.objectID}${Q?"?forwardToReplicas=true":""}`,J)}async function PG(G,J="",Q,Y,$=0,W=20){return V("POST",`/1/indexes/${G}/rules/search`,{query:J,anchoring:Q,context:Y,page:$,hitsPerPage:W})}async function wG(G,J=!1){return V("POST",`/1/indexes/${G}/rules/clear${J?"?forwardToReplicas=true":""}`)}async function*_G(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,EG,zJ;var y=S(()=>{EG={configure:d,search:s,multiSearch:i,saveObject:n,saveObjects:t,partialUpdateObject:a,deleteObject:e,deleteObjects:GG,deleteBy:JG,getObject:QG,getObjects:YG,clearObjects:ZG,getSettings:$G,setSettings:HG,listIndices:WG,copyIndex:XG,moveIndex:VG,deleteIndex:zG,indexExists:KG,waitTask:UG,saveSynonym:LG,searchSynonyms:MG,clearSynonyms:BG,saveRule:OG,searchRules:PG,clearRules:wG,browse:_G},zJ=EG});var I={};C(I,{default:()=>UJ});var KJ,UJ;var h=S(()=>{KJ={},UJ=KJ});var N={};C(N,{default:()=>RJ});import{searchEngine as A}from"@stacksjs/config";import{log as LJ}from"@stacksjs/logging";function RG(){if(!f){let G=A.typesense?.host||process.env.TYPESENSE_HOST||"127.0.0.1",J=A.typesense?.port||Number(process.env.TYPESENSE_PORT||8108),Q=A.typesense?.protocol||process.env.TYPESENSE_PROTOCOL||"http",Y=A.typesense?.apiKey||process.env.TYPESENSE_API_KEY||"xyz";f={host:G,port:J,protocol:Q,apiKey:Y}}return f}function AG(){let{protocol:G,host:J,port:Q}=RG();return`${G}://${J}:${Q}`}function fG(){return{"Content-Type":"application/json","X-TYPESENSE-API-KEY":RG().apiKey}}function O(G){return{taskUid:0,indexUid:G,status:"succeeded",type:"documentAddition",enqueuedAt:new Date}}async function B(G,J,Q){let Y=await fetch(`${AG()}${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 MJ(G){if(!G)return;let J=[];for(let Q in G){if(!Object.prototype.hasOwnProperty.call(G,Q))continue;if(!TG.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 BJ(G){if(!G)return;let J=[];for(let Q in G){if(!Object.prototype.hasOwnProperty.call(G,Q))continue;if(!TG.test(Q))continue;let Y=String(G[Q]).toLowerCase()==="desc"?"desc":"asc";J.push(`${Q}:${Y}`)}return J.length?J.join(","):void 0}function OJ(G){return"string"}async function T(G,J,Q){try{await B("GET",`/collections/${G}`);return}catch{}let Y=new Set(["id"]),$=Q?.searchableAttributes??[],W=Q?.filterableAttributes??[],X=Q?.sortableAttributes??[],L=Q?.displayedAttributes??[];for(let H of[...$,...W,...X,...L])if(typeof H==="string")Y.add(H);else for(let M of H.attributePatterns)Y.add(M);if(J){for(let H of Object.keys(J))Y.add(H);for(let H of Y)if(J[H]===void 0)J[H]=""}let K=[...Y].map((H)=>({name:H,type:H==="id"?"string":OJ(J?.[H]),facet:W.includes(H),sort:X.includes(H),optional:H!=="id"}));await B("POST","/collections",{name:G,fields:K})}function vG(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 PJ(G,J){let Q=Number(J.page)||1,Y=Number(J.perPage)||20,$=(Q-1)*Y,W=J.filter_by||MJ(J.filter),X=BJ(J.sort),L=J.queryBy?.join(",")||J.query_by||"id",K=J.query==null||J.query===""?"*":String(J.query),H=new URLSearchParams({q:K,query_by:L,per_page:String(Y),page:String(Q)});if(W)H.set("filter_by",W);if(X)H.set("sort_by",X);let M=await B("GET",`/collections/${G}/documents/search?${H}`),P=(M.hits??[]).map((w)=>w.document);return{hits:P,query:K,processingTimeMs:M.search_time_ms??0,limit:Y,offset:$,estimatedTotalHits:M.found??P.length}}async function CG(G,J){let Q=vG(J);return await T(G,Q),await B("POST",`/collections/${G}/documents?action=upsert`,Q),O(G)}async function SG(G,J){if(!Array.isArray(J)||J.length===0)return O(G);let Q=J.map(vG);await T(G,Q[0]);let Y=Q.map((W)=>JSON.stringify(W)).join(`
|
|
3
|
+
`),$=await fetch(`${AG()}/collections/${G}/documents/import?action=upsert`,{method:"POST",headers:{...fG(),"Content-Type":"text/plain"},body:Y});if(!$.ok){let W=await $.text().catch(()=>"");throw Error(`[search/typesense] bulk import failed (${$.status}): ${W}`)}return O(G)}async function wJ(G,J){return await B("DELETE",`/collections/${G}/documents/${String(J)}`),O(G)}async function FG(G){try{await B("DELETE",`/collections/${G}`)}catch(J){LJ.debug(`[search/typesense] deleteIndex ${G}: ${J.message}`)}return O(G)}async function _J(G){return await T(G),O(G)}async function EJ(G){return await B("GET",`/collections/${G}`)}async function CJ(G,J){return await T(G,void 0,J),O(G)}async function D(G){return((await B("GET",`/collections/${G}`)).fields??[]).map((Q)=>Q.name).filter((Q)=>Q!=="id")}async function qG(G){return((await B("GET",`/collections/${G}`)).fields??[]).filter((Q)=>Q.facet).map((Q)=>Q.name)}async function kG(G){return((await B("GET",`/collections/${G}`)).fields??[]).map((Q)=>Q.name)}async function jG(G){return D(G)}async function SJ(G){return{searchableAttributes:await D(G),filterableAttributes:await qG(G),sortableAttributes:await kG(G),displayedAttributes:await jG(G)}}function z(G,J){return Promise.resolve(O("typesense"))}var f=null,TG,FJ,RJ;var b=S(()=>{TG=/^[a-z_][\w]*(?:\.[a-z_][\w]*)*$/i;FJ={client:()=>({}),resetClient:()=>{f=null},search:PJ,getIndex:EJ,createIndex:_J,deleteIndex:FG,updateIndex:z,listAllIndexes:async()=>({results:[]}),listAllIndices:async()=>({results:[]}),addDocument:CG,addDocuments:SG,updateDocument:(G,J)=>CG(G,J),updateDocuments:(G,J)=>SG(G,J),deleteDocument:wJ,deleteDocuments:async(G)=>FG(G),getDocument:async()=>O("typesense"),getFilterableAttributes:qG,updateFilterableAttributes:z,resetFilterableAttributes:z,updateDisplayedAttributes:z,resetDisplayedAttributes:z,getDisplayedAttributes:jG,updateSearchableAttributes:z,resetSearchableAttributes:z,getSearchableAttributes:D,updateSortableAttributes:z,resetSortableAttributes:z,getSortableAttributes:kG,getSettings:SJ,updateSettings:CJ,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},RJ=FJ});var u={};C(u,{default:()=>RQ});import{searchEngine as yG}from"@stacksjs/config";function Z(){if(!g)throw Error("The `meilisearch` search driver is selected but the `meilisearch` package is not installed. "+"It is an opt-in dependency \u2014 run `bun add meilisearch` to enable it, or switch drivers in `config/search-engine.ts`.");if(!v){let G=yG.meilisearch?.host||"http://127.0.0.1:7700",J=yG.meilisearch?.apiKey||"";if(!G)throw Error("Meilisearch host is not configured. Please specify a search engine host.");v=new g({host:G,apiKey:J})}return v}function AJ(){v=null}async function fJ(G,J){let Q=Number(J.page)||1,Y=Number(J.perPage)||20,$=(Q-1)*Y,W=CQ(J.filter),X=SQ(J.sort);return await Z().index(G).search(J.query,{limit:Y,filter:W,sort:X,offset:$})}async function TJ(G,J){return await Z().index(G).addDocuments([J])}async function vJ(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 W=J.slice($,$+1000),X=await Z().index(G).addDocuments(W);if(!Y)Y=X}return Y}async function qJ(G){return await Z().getIndex(G)}async function kJ(G,J){return await Z().createIndex(G,J)}async function jJ(G,J){return await Z().updateIndex(G,J)}async function yJ(G,J){return await Z().index(G).updateDocuments([J])}async function IJ(G,J){return await Z().index(G).updateDocuments(J)}async function hJ(G,J){return await Z().index(G).deleteDocument(J)}async function DJ(G,J){return await Z().index(G).deleteDocuments({filter:J})}async function NJ(G,J,Q){return await Z().index(G).getDocument(J,Q)}async function bJ(G){return await Z().deleteIndex(G)}async function IG(){return await Z().getIndexes()}async function gJ(G){return Z().index(G).getFilterableAttributes()}async function uJ(G,J){return Z().index(G).updateFilterableAttributes(J)}async function pJ(G){return Z().index(G).resetFilterableAttributes()}async function xJ(G,J){return Z().index(G).updateSearchableAttributes(J)}async function cJ(G){return Z().index(G).resetSearchableAttributes()}async function oJ(G){return Z().index(G).getSearchableAttributes()}async function lJ(G,J){return Z().index(G).updateSortableAttributes(J)}async function mJ(G){return Z().index(G).resetSortableAttributes()}async function rJ(G){return Z().index(G).getSortableAttributes()}async function dJ(G,J){return Z().index(G).updateDisplayedAttributes(J)}async function sJ(G){return Z().index(G).getDisplayedAttributes()}async function iJ(G){return Z().index(G).resetDisplayedAttributes()}async function nJ(G){return Z().index(G).getSettings()}async function tJ(G,J){return Z().index(G).updateSettings(J)}async function aJ(G){return Z().index(G).resetSettings()}async function eJ(G){return Z().index(G).getPagination()}async function GQ(G,J){return Z().index(G).updatePagination(J)}async function JQ(G){return Z().index(G).resetPagination()}async function QQ(G){return Z().index(G).getSynonyms()}async function YQ(G,J){return Z().index(G).updateSynonyms(J)}async function ZQ(G){return Z().index(G).resetSynonyms()}async function $Q(G){return Z().index(G).getRankingRules()}async function HQ(G,J){return Z().index(G).updateRankingRules(J)}async function WQ(G){return Z().index(G).resetRankingRules()}async function XQ(G){return Z().index(G).getDistinctAttribute()}async function VQ(G,J){return Z().index(G).updateDistinctAttribute(J)}async function zQ(G){return Z().index(G).resetDistinctAttribute()}async function KQ(G){return Z().index(G).getFaceting()}async function UQ(G,J){return Z().index(G).updateFaceting(J)}async function LQ(G){return Z().index(G).resetFaceting()}async function MQ(G){return Z().index(G).getTypoTolerance()}async function BQ(G,J){return Z().index(G).updateTypoTolerance(J)}async function OQ(G){return Z().index(G).resetTypoTolerance()}async function PQ(G){return Z().index(G).getDictionary()}async function wQ(G,J){return Z().index(G).updateDictionary(J)}async function _Q(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(!EQ.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 SQ(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 g,v=null,EQ,FQ,RQ;var p=S(async()=>{try{({Meilisearch:g}=await import("meilisearch"))}catch{}EQ=/^[a-z_][\w]*(?:\.[a-z_][\w]*)*$/i;FQ={client:Z,resetClient:AJ,search:fJ,getIndex:qJ,createIndex:kJ,deleteIndex:bJ,updateIndex:jJ,listAllIndexes:IG,listAllIndices:IG,addDocument:TJ,addDocuments:vJ,updateDocument:yJ,updateDocuments:IJ,deleteDocument:hJ,deleteDocuments:DJ,getDocument:NJ,getFilterableAttributes:gJ,updateFilterableAttributes:uJ,resetFilterableAttributes:pJ,updateDisplayedAttributes:dJ,resetDisplayedAttributes:iJ,getDisplayedAttributes:sJ,updateSearchableAttributes:xJ,resetSearchableAttributes:cJ,getSearchableAttributes:oJ,updateSortableAttributes:lJ,resetSortableAttributes:mJ,getSortableAttributes:rJ,getSettings:nJ,updateSettings:tJ,resetSettings:aJ,getPagination:eJ,updatePagination:GQ,resetPagination:JQ,getSynonyms:QQ,updateSynonyms:YQ,resetSynonyms:ZQ,getRankingRules:$Q,updateRankingRules:HQ,resetRankingRules:WQ,getDistinctAttribute:XQ,updateDistinctAttribute:VQ,resetDistinctAttribute:zQ,getFaceting:KQ,updateFaceting:UQ,resetFaceting:LQ,getTypoTolerance:MQ,updateTypoTolerance:BQ,resetTypoTolerance:OQ,getDictionary:PQ,updateDictionary:wQ,resetDictionary:_Q},RQ=FQ});import{overridesReady as AQ,searchEngine as fQ}from"@stacksjs/config";import{err as gG,ok as uG}from"@stacksjs/error-handling";import{log as _}from"@stacksjs/logging";import{getModelName as pG,getTableName as xG}from"@stacksjs/orm";import{path as c}from"@stacksjs/path";import{useSearchEngine as cG}from"@stacksjs/search-engine";import{globSync as oG}from"@stacksjs/storage";import{snakeCase as F}from"@stacksjs/strings";async function gQ(G){try{let J=oG([c.userModelsPath("*.ts"),c.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),{addDocument:Q,updateSettings:Y}=cG();for(let $ of J){let W=(await import($)).default,X=W.traits?.useSearch,L=xG(W,$),K=pG(W,$);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 H=W;if(typeof H.all!=="function"){_.warn(`[search] ${K}: model has no .all() \u2014 run generate:model-files or use defineModel`);continue}let M=typeof X==="object"?X.denormalize:void 0,P=M?Array.from(new Set(Object.values(M).map((U)=>U.split(".")[0]).filter((U)=>Boolean(U)))):[],w;if(P.length>0&&typeof H.query==="function")try{w=await H.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 H.all()}else w=await H.all();let x=0,q=0;for(let U of w)try{let E=U.toSearchableObject?.();if(E==null){q++;continue}await Q(L,E),x++}catch(E){q++,_.warn(`[search] Skipped ${K}#${U.id??"?"}: ${E.message}`)}_.info(`[search] ${K}: imported ${x}, skipped ${q}`)}}return _.info(G),uG("Successfully imported models to search engine!")}catch(J){return _.error(J),gG(J?.message||String(J))}}import{ok as lG}from"@stacksjs/error-handling";import{log as mG}from"@stacksjs/logging";import{getModelName as rG,getTableName as dG}from"@stacksjs/orm";import{path as o}from"@stacksjs/path";import{useSearchEngine as sG}from"@stacksjs/search-engine";import{globSync as iG}from"@stacksjs/storage";async function rQ(G){try{let J=iG([o.userModelsPath("*.ts"),o.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),{deleteIndex:Q}=sG();for(let Y of J){let $=(await import(Y)).default,W=$.traits?.useSearch,X=dG($,Y),L=rG($,Y);if(G&&L!==G)continue;if(W&&(typeof W==="boolean"||typeof W==="object"))await Q(X)}return lG("Successfully flushed all model data from search engine!")}catch(J){return mG.error(J),J(J)}}import{ok as nG}from"@stacksjs/error-handling";import{log as tG}from"@stacksjs/logging";import{getTableName as aG}from"@stacksjs/orm";import{path as eG}from"@stacksjs/path";import{useSearchEngine as GJ}from"@stacksjs/search-engine";async function eQ(G){try{let J=eG.userModelsPath(`${G}.ts`),Q=(await import(J)).default,{getFilterableAttributes:Y,getSortableAttributes:$,getSearchableAttributes:W,getDisplayedAttributes:X}=GJ(),L=Q.traits?.useSearch,K=aG(Q,J);if(L&&typeof L==="object"){let H=await X(K),M=await Y(K),P=await $(K),w=await W(K);console.table({displayedAttributes:H,filterableAttributes:M,sortableAttributes:P,searchableAttributes:w})}return nG("Successfully update index settings!")}catch(J){return tG.error(J),J(J)}}import{err as JJ,ok as QJ}from"@stacksjs/error-handling";import{log as YJ}from"@stacksjs/logging";import{getTableName as ZJ}from"@stacksjs/orm";import{path as l}from"@stacksjs/path";import{useSearchEngine as $J}from"@stacksjs/search-engine";import{globSync as HJ}from"@stacksjs/storage";import{snakeCase as k}from"@stacksjs/strings";async function XY(){try{let G=HJ([l.userModelsPath("*.ts"),l.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),{updateSettings:J}=$J();for(let Q of G){let Y=(await import(Q)).default,$=Y.traits?.useSearch,W=ZJ(Y,Q);if($&&typeof $==="object"){let X=(typeof Y.traits?.useSearch==="object"&&Y.traits?.useSearch.filterable||[]).map((H)=>k(H)),L=(typeof Y.traits?.useSearch==="object"&&Y.traits?.useSearch.sortable||[]).map((H)=>k(H)),K=(typeof Y.traits?.useSearch==="object"&&Y.traits?.useSearch.searchable||[]).map((H)=>k(H));await J(W,{filterableAttributes:X,sortableAttributes:L,searchableAttributes:K})}}return QJ("Successfully update index settings!")}catch(G){return YJ.error(G),JJ(G?.message||String(G))}}await AQ;function TQ(G){if(G==="algolia")return Promise.resolve().then(() => (y(),j));if(G==="opensearch")return Promise.resolve().then(() => (h(),I));if(G==="typesense")return Promise.resolve().then(() => (b(),N));return p().then(() => u)}var vQ=await TQ(fQ.driver),qQ=vQ.default;function OY(){return qQ}function PY(){return Promise.resolve().then(() => (y(),j)).then((G)=>G.default)}function wY(){return p().then(() => u).then((G)=>G.default)}function _Y(){return Promise.resolve().then(() => (h(),I)).then((G)=>G.default)}function EY(){return Promise.resolve().then(() => (b(),N)).then((G)=>G.default)}export{EY as useTypesense,OY as useSearchEngine,_Y as useOpensearch,wY as useMeilisearch,PY as useAlgolia,XY as updateIndexSettings,eQ as listIndexSettings,gQ as importModelDocuments,rQ as flushModelDocuments};
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@stacksjs/search-engine",
|
|
3
3
|
"type": "module",
|
|
4
4
|
"sideEffects": false,
|
|
5
|
-
"version": "0.70.
|
|
5
|
+
"version": "0.70.90",
|
|
6
6
|
"description": "The Stacks search engine integrations.",
|
|
7
7
|
"author": "Chris Breuer",
|
|
8
8
|
"contributors": [
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
}
|
|
68
68
|
},
|
|
69
69
|
"devDependencies": {
|
|
70
|
-
"@stacksjs/config": "0.70.
|
|
70
|
+
"@stacksjs/config": "0.70.90",
|
|
71
71
|
"better-dx": "^0.2.16",
|
|
72
72
|
"meilisearch": "^0.59.0"
|
|
73
73
|
}
|