@frogbotai/db-mongodb 0.25.0 → 0.27.0

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.
Files changed (101) hide show
  1. package/dist/index.d.ts +5 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +2 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/search/buildSchema.d.ts +3 -0
  6. package/dist/search/buildSchema.d.ts.map +1 -0
  7. package/dist/search/buildSchema.js +25 -0
  8. package/dist/search/buildSchema.js.map +1 -0
  9. package/dist/search/buildSearchIndexes.d.ts +9 -0
  10. package/dist/search/buildSearchIndexes.d.ts.map +1 -0
  11. package/dist/search/buildSearchIndexes.js +119 -0
  12. package/dist/search/buildSearchIndexes.js.map +1 -0
  13. package/dist/search/capabilities.d.ts +3 -0
  14. package/dist/search/capabilities.d.ts.map +1 -0
  15. package/dist/search/capabilities.js +68 -0
  16. package/dist/search/capabilities.js.map +1 -0
  17. package/dist/search/createSearchSetupError.d.ts +8 -0
  18. package/dist/search/createSearchSetupError.d.ts.map +1 -0
  19. package/dist/search/createSearchSetupError.js +25 -0
  20. package/dist/search/createSearchSetupError.js.map +1 -0
  21. package/dist/search/ensureSearchIndexes.d.ts +6 -0
  22. package/dist/search/ensureSearchIndexes.d.ts.map +1 -0
  23. package/dist/search/ensureSearchIndexes.js +65 -0
  24. package/dist/search/ensureSearchIndexes.js.map +1 -0
  25. package/dist/search/findSearchIndex.d.ts +13 -0
  26. package/dist/search/findSearchIndex.d.ts.map +1 -0
  27. package/dist/search/findSearchIndex.js +5 -0
  28. package/dist/search/findSearchIndex.js.map +1 -0
  29. package/dist/search/getSearchIndexes.d.ts +8 -0
  30. package/dist/search/getSearchIndexes.d.ts.map +1 -0
  31. package/dist/search/getSearchIndexes.js +8 -0
  32. package/dist/search/getSearchIndexes.js.map +1 -0
  33. package/dist/search/getSearchModel.d.ts +9 -0
  34. package/dist/search/getSearchModel.d.ts.map +1 -0
  35. package/dist/search/getSearchModel.js +4 -0
  36. package/dist/search/getSearchModel.js.map +1 -0
  37. package/dist/search/getSearchPath.d.ts +25 -0
  38. package/dist/search/getSearchPath.d.ts.map +1 -0
  39. package/dist/search/getSearchPath.js +35 -0
  40. package/dist/search/getSearchPath.js.map +1 -0
  41. package/dist/search/index.d.ts +4 -0
  42. package/dist/search/index.d.ts.map +1 -0
  43. package/dist/search/index.js +12 -0
  44. package/dist/search/index.js.map +1 -0
  45. package/dist/search/isDraftSearch.d.ts +7 -0
  46. package/dist/search/isDraftSearch.d.ts.map +1 -0
  47. package/dist/search/isDraftSearch.js +4 -0
  48. package/dist/search/isDraftSearch.js.map +1 -0
  49. package/dist/search/isSearchIndexDefinitionEqual.d.ts +5 -0
  50. package/dist/search/isSearchIndexDefinitionEqual.d.ts.map +1 -0
  51. package/dist/search/isSearchIndexDefinitionEqual.js +33 -0
  52. package/dist/search/isSearchIndexDefinitionEqual.js.map +1 -0
  53. package/dist/search/pipelines/buildHybridPipeline.d.ts +15 -0
  54. package/dist/search/pipelines/buildHybridPipeline.d.ts.map +1 -0
  55. package/dist/search/pipelines/buildHybridPipeline.js +99 -0
  56. package/dist/search/pipelines/buildHybridPipeline.js.map +1 -0
  57. package/dist/search/pipelines/buildSearchStage.d.ts +7 -0
  58. package/dist/search/pipelines/buildSearchStage.d.ts.map +1 -0
  59. package/dist/search/pipelines/buildSearchStage.js +12 -0
  60. package/dist/search/pipelines/buildSearchStage.js.map +1 -0
  61. package/dist/search/pipelines/buildVectorScore.d.ts +6 -0
  62. package/dist/search/pipelines/buildVectorScore.d.ts.map +1 -0
  63. package/dist/search/pipelines/buildVectorScore.js +6 -0
  64. package/dist/search/pipelines/buildVectorScore.js.map +1 -0
  65. package/dist/search/pipelines/buildVectorSearchStage.d.ts +15 -0
  66. package/dist/search/pipelines/buildVectorSearchStage.d.ts.map +1 -0
  67. package/dist/search/pipelines/buildVectorSearchStage.js +20 -0
  68. package/dist/search/pipelines/buildVectorSearchStage.js.map +1 -0
  69. package/dist/search/queries/buildSearchFilter.d.ts +10 -0
  70. package/dist/search/queries/buildSearchFilter.d.ts.map +1 -0
  71. package/dist/search/queries/buildSearchFilter.js +19 -0
  72. package/dist/search/queries/buildSearchFilter.js.map +1 -0
  73. package/dist/search/queries/buildSearchOperator.d.ts +3 -0
  74. package/dist/search/queries/buildSearchOperator.d.ts.map +1 -0
  75. package/dist/search/queries/buildSearchOperator.js +21 -0
  76. package/dist/search/queries/buildSearchOperator.js.map +1 -0
  77. package/dist/search/queries/buildVectorSearchFilter.d.ts +3 -0
  78. package/dist/search/queries/buildVectorSearchFilter.d.ts.map +1 -0
  79. package/dist/search/queries/buildVectorSearchFilter.js +21 -0
  80. package/dist/search/queries/buildVectorSearchFilter.js.map +1 -0
  81. package/dist/search/queries/parseSearchFilter.d.ts +7 -0
  82. package/dist/search/queries/parseSearchFilter.d.ts.map +1 -0
  83. package/dist/search/queries/parseSearchFilter.js +166 -0
  84. package/dist/search/queries/parseSearchFilter.js.map +1 -0
  85. package/dist/search/readiness.d.ts +3 -0
  86. package/dist/search/readiness.d.ts.map +1 -0
  87. package/dist/search/readiness.js +32 -0
  88. package/dist/search/readiness.js.map +1 -0
  89. package/dist/search/search.d.ts +3 -0
  90. package/dist/search/search.d.ts.map +1 -0
  91. package/dist/search/search.js +150 -0
  92. package/dist/search/search.js.map +1 -0
  93. package/dist/search/supportsRankFusion.d.ts +3 -0
  94. package/dist/search/supportsRankFusion.d.ts.map +1 -0
  95. package/dist/search/supportsRankFusion.js +25 -0
  96. package/dist/search/supportsRankFusion.js.map +1 -0
  97. package/dist/search/types.d.ts +41 -0
  98. package/dist/search/types.d.ts.map +1 -0
  99. package/dist/search/types.js +2 -0
  100. package/dist/search/types.js.map +1 -0
  101. package/package.json +6 -5
@@ -0,0 +1,32 @@
1
+ import { SearchReadinessError } from 'frogbot/search';
2
+ import { createSearchSetupError } from './createSearchSetupError.js';
3
+ import { findSearchIndex } from './findSearchIndex.js';
4
+ import { getSearchIndexes } from './getSearchIndexes.js';
5
+ import { getSearchModel } from './getSearchModel.js';
6
+ import { isDraftSearch } from './isDraftSearch.js';
7
+ export const readiness = async ({ collection, db, draft, index, mode }) => {
8
+ const adapter = db;
9
+ const versions = isDraftSearch({ adapter, collection, draft });
10
+ const searchIndexes = getSearchIndexes(adapter).filter((searchIndex) => searchIndex.collection === collection &&
11
+ searchIndex.index === index.name &&
12
+ searchIndex.versions === versions &&
13
+ (mode === 'hybrid' || searchIndex.mode === mode));
14
+ for (const searchIndex of searchIndexes) {
15
+ const Model = getSearchModel({ adapter, collection, versions: searchIndex.versions });
16
+ let existing;
17
+ try {
18
+ existing = await findSearchIndex({ Model, name: searchIndex.name });
19
+ }
20
+ catch (error) {
21
+ const setupError = createSearchSetupError({ error, searchIndex });
22
+ throw setupError.reason === 'setup-failed' ? error : setupError;
23
+ }
24
+ if (!existing) {
25
+ throw new SearchReadinessError(`Search index '${searchIndex.name}' on '${Model.collection.name}' does not exist.`);
26
+ }
27
+ if (!existing.queryable) {
28
+ throw new SearchReadinessError(`Search index '${searchIndex.name}' on '${Model.collection.name}' is not queryable yet (${existing.status ?? 'unknown'}).`);
29
+ }
30
+ }
31
+ };
32
+ //# sourceMappingURL=readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness.js","sourceRoot":"","sources":["../../src/search/readiness.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,CAAC,MAAM,SAAS,GAAoB,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;IACzF,MAAM,OAAO,GAAG,EAAqB,CAAC;IACtC,MAAM,QAAQ,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IAE/D,MAAM,aAAa,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC,MAAM,CACpD,CAAC,WAAW,EAAE,EAAE,CACd,WAAW,CAAC,UAAU,KAAK,UAAU;QACrC,WAAW,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI;QAChC,WAAW,CAAC,QAAQ,KAAK,QAAQ;QACjC,CAAC,IAAI,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,KAAK,IAAI,CAAC,CACnD,CAAC;IAEF,KAAK,MAAM,WAAW,IAAI,aAAa,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,cAAc,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEtF,IAAI,QAAqD,CAAC;QAE1D,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,UAAU,GAAG,sBAAsB,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;YAElE,MAAM,UAAU,CAAC,MAAM,KAAK,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC;QAClE,CAAC;QAED,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,oBAAoB,CAC5B,iBAAiB,WAAW,CAAC,IAAI,SAAS,KAAK,CAAC,UAAU,CAAC,IAAI,mBAAmB,CACnF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,oBAAoB,CAC5B,iBAAiB,WAAW,CAAC,IAAI,SAAS,KAAK,CAAC,UAAU,CAAC,IAAI,2BAA2B,QAAQ,CAAC,MAAM,IAAI,SAAS,IAAI,CAC3H,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { AdapterSearch } from 'frogbot/search';
2
+ export declare const search: AdapterSearch;
3
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/search/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EAMd,MAAM,gBAAgB,CAAC;AAsGxB,eAAO,MAAM,MAAM,EAAE,aAmHpB,CAAC"}
@@ -0,0 +1,150 @@
1
+ import { SearchReadinessError } from 'frogbot/search';
2
+ import { getSearchIndexes } from './getSearchIndexes.js';
3
+ import { getSearchModel } from './getSearchModel.js';
4
+ import { getSearchFields, getSearchPath } from './getSearchPath.js';
5
+ import { isDraftSearch } from './isDraftSearch.js';
6
+ import { buildHybridPipeline } from './pipelines/buildHybridPipeline.js';
7
+ import { buildSearchStage } from './pipelines/buildSearchStage.js';
8
+ import { buildVectorScore } from './pipelines/buildVectorScore.js';
9
+ import { buildVectorSearchStage, isApproximateVectorSearch, } from './pipelines/buildVectorSearchStage.js';
10
+ import { buildSearchFilter } from './queries/buildSearchFilter.js';
11
+ import { buildSearchOperator } from './queries/buildSearchOperator.js';
12
+ import { buildVectorSearchFilter } from './queries/buildVectorSearchFilter.js';
13
+ import { supportsRankFusion } from './supportsRankFusion.js';
14
+ const distinctParentStages = [
15
+ { $sort: { score: -1, id: 1 } },
16
+ { $group: { _id: '$id', row: { $first: '$$ROOT' } } },
17
+ { $replaceRoot: { newRoot: '$row' } },
18
+ { $sort: { score: -1, id: 1 } },
19
+ ];
20
+ function getRanking({ approximate, index, mode, }) {
21
+ const lexical = {
22
+ method: 'mongodb-search',
23
+ higherIsBetter: true,
24
+ approximate: false,
25
+ };
26
+ const vector = {
27
+ method: approximate ? 'mongodb-hnsw' : 'mongodb-exact',
28
+ higherIsBetter: index.vector?.metric !== 'euclidean',
29
+ approximate,
30
+ };
31
+ if (mode === 'lexical')
32
+ return lexical;
33
+ if (mode === 'vector')
34
+ return vector;
35
+ return { method: 'rrf', higherIsBetter: true, approximate, components: { lexical, vector } };
36
+ }
37
+ function buildScoreStage({ index, mode, }) {
38
+ if (mode === 'lexical')
39
+ return undefined;
40
+ const { metric } = index.vector;
41
+ if (mode === 'vector') {
42
+ return { $project: { _id: 0, id: 1, score: buildVectorScore({ metric, score: '$score' }) } };
43
+ }
44
+ return {
45
+ $project: {
46
+ _id: 0,
47
+ id: 1,
48
+ score: 1,
49
+ lexical: 1,
50
+ vector: {
51
+ $cond: [
52
+ { $eq: [{ $ifNull: ['$vector', null] }, null] },
53
+ null,
54
+ { rank: '$vector.rank', score: buildVectorScore({ metric, score: '$vector.score' }) },
55
+ ],
56
+ },
57
+ },
58
+ };
59
+ }
60
+ function getComponent(component) {
61
+ if (!component || typeof component !== 'object')
62
+ return null;
63
+ const { rank, score } = component;
64
+ return { rank: Number(rank), score: Number(score) };
65
+ }
66
+ export const search = async ({ candidates, collection, db, draft, index, limit, locale: requestedLocale, mode, query, where, }) => {
67
+ const adapter = db;
68
+ const { localization } = adapter.payload.config;
69
+ const locale = requestedLocale ?? (localization ? localization.defaultLocale : undefined);
70
+ const versions = isDraftSearch({ adapter, collection, draft });
71
+ const searchIndexes = getSearchIndexes(adapter).filter((searchIndex) => searchIndex.collection === collection &&
72
+ searchIndex.index === index.name &&
73
+ searchIndex.versions === versions);
74
+ if (!searchIndexes.length) {
75
+ throw new SearchReadinessError(`Search index '${index.name}' is not set up for collection '${collection}'. Restart to apply search configuration changes.`);
76
+ }
77
+ const lexicalIndex = searchIndexes.find((searchIndex) => searchIndex.mode === 'lexical');
78
+ const vectorIndex = searchIndexes.find((searchIndex) => searchIndex.mode === 'vector');
79
+ const depth = Math.max(limit, candidates ?? limit);
80
+ const vectorLimit = mode === 'hybrid' ? depth : limit;
81
+ const approximate = mode !== 'lexical' &&
82
+ isApproximateVectorSearch({ approximate: index.vector.approximate, limit: vectorLimit });
83
+ const ranking = getRanking({ approximate, index, mode });
84
+ const filter = await buildSearchFilter({ adapter, locale, searchIndex: searchIndexes[0], where });
85
+ if (filter === false)
86
+ return { ranking, rows: [] };
87
+ const Model = getSearchModel({ adapter, collection, versions });
88
+ const fields = getSearchFields({ adapter, collection, versions });
89
+ const idPath = versions ? 'parent' : '_id';
90
+ const getPath = (path) => getSearchPath({ adapter, collection, fields, locale, path, versions }).path;
91
+ const getSearchPipeline = (searchLimit) => [
92
+ buildSearchStage({
93
+ filter: filter === true ? undefined : buildSearchOperator(filter),
94
+ name: lexicalIndex.name,
95
+ paths: index.lexical.fields.map(({ path }) => getPath(path)),
96
+ text: query.text,
97
+ }),
98
+ { $limit: searchLimit },
99
+ ];
100
+ const getVectorSearchStage = () => buildVectorSearchStage({
101
+ approximate,
102
+ candidates: depth,
103
+ filter: filter === true ? undefined : buildVectorSearchFilter(filter),
104
+ limit: vectorLimit,
105
+ name: vectorIndex.name,
106
+ path: getPath(index.vector.path),
107
+ vector: query.vector,
108
+ });
109
+ let pipeline;
110
+ if (mode === 'lexical') {
111
+ pipeline = [
112
+ ...getSearchPipeline(limit),
113
+ { $project: { _id: 0, id: `$${idPath}`, score: { $meta: 'searchScore' } } },
114
+ ];
115
+ }
116
+ else if (mode === 'vector') {
117
+ pipeline = [
118
+ getVectorSearchStage(),
119
+ { $project: { _id: 0, id: `$${idPath}`, score: { $meta: 'vectorSearchScore' } } },
120
+ ];
121
+ }
122
+ else {
123
+ pipeline = buildHybridPipeline({
124
+ collection: Model.collection.name,
125
+ idPath,
126
+ limit,
127
+ rankFusion: await supportsRankFusion(Model),
128
+ searchPipeline: getSearchPipeline(depth),
129
+ vectorSearchStage: getVectorSearchStage(),
130
+ weights: index.hybrid.weights,
131
+ });
132
+ }
133
+ if (versions)
134
+ pipeline.push(...distinctParentStages);
135
+ const scoreStage = buildScoreStage({ index, mode });
136
+ if (scoreStage)
137
+ pipeline.push(scoreStage);
138
+ const rows = await Model.aggregate(pipeline).exec();
139
+ return {
140
+ ranking,
141
+ rows: rows.map(({ id, lexical, score, vector }) => ({
142
+ id: typeof id === 'number' ? id : String(id),
143
+ score,
144
+ ...(mode === 'hybrid'
145
+ ? { components: { lexical: getComponent(lexical), vector: getComponent(vector) } }
146
+ : {}),
147
+ })),
148
+ };
149
+ };
150
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/search/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { SearchModel } from './getSearchModel.js';
2
+ export declare function supportsRankFusion(Model: SearchModel): Promise<boolean>;
3
+ //# sourceMappingURL=supportsRankFusion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supportsRankFusion.d.ts","sourceRoot":"","sources":["../../src/search/supportsRankFusion.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,qBAAqB,CAAC;AAMvE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CA6BvE"}
@@ -0,0 +1,25 @@
1
+ import { getErrorCode } from './createSearchSetupError.js';
2
+ const unsupportedCodes = new Set([224, 40324]);
3
+ const rankFusionSupport = new WeakMap();
4
+ export function supportsRankFusion(Model) {
5
+ const connection = Model.db;
6
+ const cached = rankFusionSupport.get(connection);
7
+ if (cached)
8
+ return cached;
9
+ const pipeline = [
10
+ { $rankFusion: { input: { pipelines: { probe: [{ $sort: { _id: 1 } }, { $limit: 1 }] } } } },
11
+ { $limit: 1 },
12
+ ];
13
+ const supported = Model.aggregate(pipeline)
14
+ .exec()
15
+ .then(() => true, (error) => {
16
+ const code = getErrorCode(error);
17
+ if (typeof code === 'number' && unsupportedCodes.has(code))
18
+ return false;
19
+ rankFusionSupport.delete(connection);
20
+ throw error;
21
+ });
22
+ rankFusionSupport.set(connection, supported);
23
+ return supported;
24
+ }
25
+ //# sourceMappingURL=supportsRankFusion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supportsRankFusion.js","sourceRoot":"","sources":["../../src/search/supportsRankFusion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAG3D,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAE/C,MAAM,iBAAiB,GAAG,IAAI,OAAO,EAA4B,CAAC;AAElE,MAAM,UAAU,kBAAkB,CAAC,KAAkB;IACnD,MAAM,UAAU,GAAG,KAAK,CAAC,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAEjD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,QAAQ,GAAG;QACf,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE;QAC5F,EAAE,MAAM,EAAE,CAAC,EAAE;KACd,CAAC;IAEF,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,QAAqC,CAAC;SACrE,IAAI,EAAE;SACN,IAAI,CACH,GAAG,EAAE,CAAC,IAAI,EACV,CAAC,KAAc,EAAE,EAAE;QACjB,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QAEjC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QAEzE,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAErC,MAAM,KAAK,CAAC;IACd,CAAC,CACF,CAAC;IAEJ,iBAAiB,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAE7C,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,41 @@
1
+ export type SearchIndexType = 'search' | 'vectorSearch';
2
+ export type SearchFieldType = 'boolean' | 'date' | 'number' | 'objectId' | 'token';
3
+ export type SearchIndexDefinition = Record<string, unknown>;
4
+ export type SearchIndex = {
5
+ collection: string;
6
+ definition: SearchIndexDefinition;
7
+ fields: Map<string, SearchFieldType>;
8
+ index: string;
9
+ mode: 'lexical' | 'vector';
10
+ name: string;
11
+ type: SearchIndexType;
12
+ versions: boolean;
13
+ };
14
+ export type SearchRange = Partial<Record<'gt' | 'gte' | 'lt' | 'lte', unknown>>;
15
+ export type SearchFilterNode = {
16
+ type: 'and';
17
+ filters: SearchFilterNode[];
18
+ } | {
19
+ type: 'equals';
20
+ path: string;
21
+ value: unknown;
22
+ } | {
23
+ type: 'exists';
24
+ path: string;
25
+ } | {
26
+ type: 'in';
27
+ path: string;
28
+ values: unknown[];
29
+ } | {
30
+ type: 'not';
31
+ filter: SearchFilterNode;
32
+ } | {
33
+ type: 'or';
34
+ filters: SearchFilterNode[];
35
+ } | {
36
+ type: 'range';
37
+ path: string;
38
+ range: SearchRange;
39
+ };
40
+ export type SearchFilter = boolean | SearchFilterNode;
41
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/search/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,cAAc,CAAC;AAExD,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;AAEnF,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5D,MAAM,MAAM,WAAW,GAAG;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,qBAAqB,CAAC;IAClC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;AAEhF,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,gBAAgB,EAAE,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,EAAE,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,gBAAgB,EAAE,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,CAAC;AAExD,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,gBAAgB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/search/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@frogbotai/db-mongodb",
3
- "version": "0.25.0",
3
+ "version": "0.27.0",
4
4
  "description": "FrogBot MongoDB adapter.",
5
5
  "license": "MIT",
6
6
  "author": "Colby Gilbert",
@@ -25,20 +25,21 @@
25
25
  ],
26
26
  "sideEffects": false,
27
27
  "dependencies": {
28
- "@payloadcms/db-mongodb": "3.90.1"
28
+ "@payloadcms/db-mongodb": "3.90.1",
29
+ "payload": "3.90.1"
29
30
  },
30
31
  "peerDependencies": {
31
- "frogbot": "0.25.0"
32
+ "frogbot": "0.27.0"
32
33
  },
33
34
  "devDependencies": {
34
35
  "typescript": "5.6.2",
35
- "frogbot": "0.25.0"
36
+ "frogbot": "0.27.0"
36
37
  },
37
38
  "publishConfig": {
38
39
  "access": "public"
39
40
  },
40
41
  "scripts": {
41
- "build": "tsc -p tsconfig.json",
42
+ "build": "rm -rf dist && tsc -p tsconfig.json",
42
43
  "clean": "rm -rf dist",
43
44
  "typecheck": "tsc --noEmit"
44
45
  }