@stacksjs/search-engine 0.70.82 → 0.70.84
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.js +2 -2
- package/package.json +10 -4
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var
|
|
3
|
-
`),$=await fetch(`${RG()}/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 OJ(G,J){return await B("DELETE",`/collections/${G}/documents/${String(J)}`),O(G)}async function SG(G){try{await B("DELETE",`/collections/${G}`)}catch(J){KJ.debug(`[search/typesense] deleteIndex ${G}: ${J.message}`)}return O(G)}async function PJ(G){return await T(G),O(G)}async function wJ(G){return await B("GET",`/collections/${G}`)}async function _J(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 vG(G){return((await B("GET",`/collections/${G}`)).fields??[]).filter((Q)=>Q.facet).map((Q)=>Q.name)}async function qG(G){return((await B("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(O("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()=>O("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,W=CQ(J.filter),X=EQ(J.sort);return await Z().index(G).search(J.query,{limit:Y,filter:W,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 W=J.slice($,$+1000),X=await Z().index(G).addDocuments(W);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 IJ(G,J){return await Z().index(G).deleteDocument(J)}async function hJ(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:IJ,deleteDocuments:hJ,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 W=(await import($)).default,X=W.traits?.useSearch,L=uG(W,$),K=gG(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 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,W=$.traits?.useSearch,X=mG($,Y),L=lG($,Y);if(G&&L!==G)continue;if(W&&(typeof W==="boolean"||typeof W==="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:W,getDisplayedAttributes:X}=aG(),L=Q.traits?.useSearch,K=nG(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 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,W=QJ(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 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(() => (h(),I));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(() => (h(),I)).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};
|
|
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 f}from"@stacksjs/config";import{log as LJ}from"@stacksjs/logging";function RG(){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 fG(){let{protocol:G,host:J,port:Q}=RG();return`${G}://${J}:${Q}`}function AG(){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(`${fG()}${J}`,{method:G,headers:AG(),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(`${fG()}/collections/${G}/documents/import?action=upsert`,{method:"POST",headers:{...AG(),"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 A=null,TG,FJ,RJ;var b=S(()=>{TG=/^[a-z_][\w]*(?:\.[a-z_][\w]*)*$/i;FJ={client:()=>({}),resetClient:()=>{A=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 fJ(){v=null}async function AJ(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:fJ,search:AJ,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 fQ,searchEngine as AQ}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 fQ;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(AQ.driver),qQ=vQ.default;function CY(){return qQ}function SY(){return Promise.resolve().then(() => (y(),j)).then((G)=>G.default)}function FY(){return p().then(() => u).then((G)=>G.default)}function RY(){return Promise.resolve().then(() => (h(),I)).then((G)=>G.default)}function fY(){return Promise.resolve().then(() => (b(),N)).then((G)=>G.default)}export{fY as useTypesense,CY as useSearchEngine,RY as useOpensearch,FY as useMeilisearch,SY as useAlgolia,XY as updateIndexSettings,eQ as listIndexSettings,gQ as importModelDocuments,rQ as flushModelDocuments};
|
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.84",
|
|
5
5
|
"description": "The Stacks search engine integrations.",
|
|
6
6
|
"author": "Chris Breuer",
|
|
7
7
|
"contributors": [
|
|
@@ -57,11 +57,17 @@
|
|
|
57
57
|
"typecheck": "bun tsc --noEmit",
|
|
58
58
|
"prepublishOnly": "bun run build"
|
|
59
59
|
},
|
|
60
|
-
"
|
|
60
|
+
"peerDependencies": {
|
|
61
61
|
"meilisearch": "^0.59.0"
|
|
62
62
|
},
|
|
63
|
+
"peerDependenciesMeta": {
|
|
64
|
+
"meilisearch": {
|
|
65
|
+
"optional": true
|
|
66
|
+
}
|
|
67
|
+
},
|
|
63
68
|
"devDependencies": {
|
|
64
|
-
"@stacksjs/config": "0.70.
|
|
65
|
-
"better-dx": "^0.2.16"
|
|
69
|
+
"@stacksjs/config": "0.70.84",
|
|
70
|
+
"better-dx": "^0.2.16",
|
|
71
|
+
"meilisearch": "^0.59.0"
|
|
66
72
|
}
|
|
67
73
|
}
|