@convex-dev/rag 0.1.7

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 (113) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +371 -0
  3. package/dist/client/_generated/_ignore.d.ts +1 -0
  4. package/dist/client/_generated/_ignore.d.ts.map +1 -0
  5. package/dist/client/_generated/_ignore.js +3 -0
  6. package/dist/client/_generated/_ignore.js.map +1 -0
  7. package/dist/client/defaultChunker.d.ts +15 -0
  8. package/dist/client/defaultChunker.d.ts.map +1 -0
  9. package/dist/client/defaultChunker.js +148 -0
  10. package/dist/client/defaultChunker.js.map +1 -0
  11. package/dist/client/fileUtils.d.ts +24 -0
  12. package/dist/client/fileUtils.d.ts.map +1 -0
  13. package/dist/client/fileUtils.js +179 -0
  14. package/dist/client/fileUtils.js.map +1 -0
  15. package/dist/client/index.d.ts +442 -0
  16. package/dist/client/index.d.ts.map +1 -0
  17. package/dist/client/index.js +597 -0
  18. package/dist/client/index.js.map +1 -0
  19. package/dist/client/types.d.ts +29 -0
  20. package/dist/client/types.d.ts.map +1 -0
  21. package/dist/client/types.js +2 -0
  22. package/dist/client/types.js.map +1 -0
  23. package/dist/component/_generated/api.d.ts +439 -0
  24. package/dist/component/_generated/api.d.ts.map +1 -0
  25. package/dist/component/_generated/api.js +22 -0
  26. package/dist/component/_generated/api.js.map +1 -0
  27. package/dist/component/_generated/dataModel.d.ts +60 -0
  28. package/dist/component/_generated/server.d.ts +149 -0
  29. package/dist/component/_generated/server.d.ts.map +1 -0
  30. package/dist/component/_generated/server.js +74 -0
  31. package/dist/component/_generated/server.js.map +1 -0
  32. package/dist/component/chunks.d.ts +139 -0
  33. package/dist/component/chunks.d.ts.map +1 -0
  34. package/dist/component/chunks.js +413 -0
  35. package/dist/component/chunks.js.map +1 -0
  36. package/dist/component/convex.config.d.ts +3 -0
  37. package/dist/component/convex.config.d.ts.map +1 -0
  38. package/dist/component/convex.config.js +6 -0
  39. package/dist/component/convex.config.js.map +1 -0
  40. package/dist/component/embeddings/importance.d.ts +21 -0
  41. package/dist/component/embeddings/importance.d.ts.map +1 -0
  42. package/dist/component/embeddings/importance.js +67 -0
  43. package/dist/component/embeddings/importance.js.map +1 -0
  44. package/dist/component/embeddings/index.d.ts +23 -0
  45. package/dist/component/embeddings/index.d.ts.map +1 -0
  46. package/dist/component/embeddings/index.js +54 -0
  47. package/dist/component/embeddings/index.js.map +1 -0
  48. package/dist/component/embeddings/tables.d.ts +39 -0
  49. package/dist/component/embeddings/tables.d.ts.map +1 -0
  50. package/dist/component/embeddings/tables.js +53 -0
  51. package/dist/component/embeddings/tables.js.map +1 -0
  52. package/dist/component/entries.d.ts +167 -0
  53. package/dist/component/entries.d.ts.map +1 -0
  54. package/dist/component/entries.js +409 -0
  55. package/dist/component/entries.js.map +1 -0
  56. package/dist/component/filters.d.ts +46 -0
  57. package/dist/component/filters.d.ts.map +1 -0
  58. package/dist/component/filters.js +72 -0
  59. package/dist/component/filters.js.map +1 -0
  60. package/dist/component/namespaces.d.ts +131 -0
  61. package/dist/component/namespaces.d.ts.map +1 -0
  62. package/dist/component/namespaces.js +222 -0
  63. package/dist/component/namespaces.js.map +1 -0
  64. package/dist/component/schema.d.ts +1697 -0
  65. package/dist/component/schema.d.ts.map +1 -0
  66. package/dist/component/schema.js +88 -0
  67. package/dist/component/schema.js.map +1 -0
  68. package/dist/component/search.d.ts +20 -0
  69. package/dist/component/search.d.ts.map +1 -0
  70. package/dist/component/search.js +69 -0
  71. package/dist/component/search.js.map +1 -0
  72. package/dist/package.json +3 -0
  73. package/dist/react/index.d.ts +2 -0
  74. package/dist/react/index.d.ts.map +1 -0
  75. package/dist/react/index.js +6 -0
  76. package/dist/react/index.js.map +1 -0
  77. package/dist/shared.d.ts +479 -0
  78. package/dist/shared.d.ts.map +1 -0
  79. package/dist/shared.js +98 -0
  80. package/dist/shared.js.map +1 -0
  81. package/package.json +97 -0
  82. package/src/client/_generated/_ignore.ts +1 -0
  83. package/src/client/defaultChunker.test.ts +243 -0
  84. package/src/client/defaultChunker.ts +183 -0
  85. package/src/client/fileUtils.ts +179 -0
  86. package/src/client/index.test.ts +475 -0
  87. package/src/client/index.ts +1125 -0
  88. package/src/client/setup.test.ts +28 -0
  89. package/src/client/types.ts +69 -0
  90. package/src/component/_generated/api.d.ts +439 -0
  91. package/src/component/_generated/api.js +23 -0
  92. package/src/component/_generated/dataModel.d.ts +60 -0
  93. package/src/component/_generated/server.d.ts +149 -0
  94. package/src/component/_generated/server.js +90 -0
  95. package/src/component/chunks.test.ts +915 -0
  96. package/src/component/chunks.ts +555 -0
  97. package/src/component/convex.config.ts +7 -0
  98. package/src/component/embeddings/importance.test.ts +249 -0
  99. package/src/component/embeddings/importance.ts +75 -0
  100. package/src/component/embeddings/index.test.ts +482 -0
  101. package/src/component/embeddings/index.ts +99 -0
  102. package/src/component/embeddings/tables.ts +114 -0
  103. package/src/component/entries.test.ts +341 -0
  104. package/src/component/entries.ts +546 -0
  105. package/src/component/filters.ts +119 -0
  106. package/src/component/namespaces.ts +299 -0
  107. package/src/component/schema.ts +106 -0
  108. package/src/component/search.test.ts +445 -0
  109. package/src/component/search.ts +97 -0
  110. package/src/component/setup.test.ts +5 -0
  111. package/src/react/index.ts +7 -0
  112. package/src/shared.ts +247 -0
  113. package/src/vitest.config.ts +7 -0
@@ -0,0 +1,409 @@
1
+ import { assert, omit } from "convex-helpers";
2
+ import { createFunctionHandle, paginationOptsValidator } from "convex/server";
3
+ import { v } from "convex/values";
4
+ import { statuses, vActiveStatus, vCreateChunkArgs, vEntry, vPaginationResult, vStatus, } from "../shared.js";
5
+ import { api, internal } from "./_generated/api.js";
6
+ import { internalMutation, mutation, query, } from "./_generated/server.js";
7
+ import { deleteChunksPage, insertChunks } from "./chunks.js";
8
+ import schema, {} from "./schema.js";
9
+ import { mergedStream } from "convex-helpers/server/stream";
10
+ import { stream } from "convex-helpers/server/stream";
11
+ import { getCompatibleNamespaceHandler, publicNamespace, vNamespaceLookupArgs, } from "./namespaces.js";
12
+ import { vResultValidator, vWorkIdValidator, Workpool, } from "@convex-dev/workpool";
13
+ import { components } from "./_generated/api.js";
14
+ const workpool = new Workpool(components.workpool, {
15
+ retryActionsByDefault: true,
16
+ defaultRetryBehavior: {
17
+ maxAttempts: 3,
18
+ initialBackoffMs: 1000,
19
+ base: 2,
20
+ },
21
+ maxParallelism: 10,
22
+ });
23
+ export const addAsync = mutation({
24
+ args: {
25
+ entry: v.object({
26
+ ...omit(schema.tables.entries.validator.fields, ["version", "status"]),
27
+ }),
28
+ onComplete: v.optional(v.string()),
29
+ chunker: v.string(),
30
+ },
31
+ returns: v.object({
32
+ entryId: v.id("entries"),
33
+ status: vActiveStatus,
34
+ created: v.boolean(),
35
+ }),
36
+ handler: async (ctx, args) => {
37
+ const { namespaceId, key } = args.entry;
38
+ const namespace = await ctx.db.get(namespaceId);
39
+ assert(namespace, `Namespace ${namespaceId} not found`);
40
+ // iterate through the latest versions of the entry
41
+ const existing = await findExistingEntry(ctx, namespaceId, key);
42
+ if (existing?.status.kind === "ready" &&
43
+ entryIsSame(existing, args.entry)) {
44
+ return {
45
+ entryId: existing._id,
46
+ status: existing.status.kind,
47
+ created: false,
48
+ };
49
+ }
50
+ const version = existing ? existing.version + 1 : 0;
51
+ const status = {
52
+ kind: "pending",
53
+ onComplete: args.onComplete,
54
+ };
55
+ const entryId = await ctx.db.insert("entries", {
56
+ ...args.entry,
57
+ version,
58
+ status,
59
+ });
60
+ const chunkerAction = args.chunker;
61
+ // TODO: Cancel any existing chunker actions for this entry?
62
+ await workpool.enqueueAction(ctx, chunkerAction, {
63
+ namespace: publicNamespace(namespace),
64
+ entry: publicEntry({
65
+ ...args.entry,
66
+ _id: entryId,
67
+ status: status,
68
+ }),
69
+ insertChunks: await createFunctionHandle(api.chunks.insert),
70
+ }, {
71
+ name: workpoolName(namespace.namespace, args.entry.key, entryId),
72
+ onComplete: internal.entries.addAsyncOnComplete,
73
+ context: entryId,
74
+ });
75
+ return { entryId, status: status.kind, created: true };
76
+ },
77
+ });
78
+ function workpoolName(namespace, key, entryId) {
79
+ return `async-chunker-${namespace}-${key ? key + "-" + entryId : entryId}`;
80
+ }
81
+ export const addAsyncOnComplete = internalMutation({
82
+ args: {
83
+ workId: vWorkIdValidator,
84
+ context: v.id("entries"),
85
+ result: vResultValidator,
86
+ },
87
+ returns: v.null(),
88
+ handler: async (ctx, args) => {
89
+ const entryId = args.context;
90
+ const entry = await ctx.db.get(args.context);
91
+ if (!entry) {
92
+ console.error(`Entry ${args.context} not found when trying to complete chunker for async add`);
93
+ return;
94
+ }
95
+ if (args.result.kind === "success") {
96
+ await promoteToReadyHandler(ctx, { entryId });
97
+ }
98
+ else {
99
+ // await deleteAsyncHandler(ctx, { entryId, startOrder: 0 });
100
+ const namespace = await ctx.db.get(entry.namespaceId);
101
+ assert(namespace, `Namespace ${entry.namespaceId} not found`);
102
+ if (entry.status.kind === "pending" && entry.status.onComplete) {
103
+ await runOnComplete(ctx, entry.status.onComplete, namespace, entry, null, args.result.kind === "canceled" ? "Canceled" : args.result.error);
104
+ }
105
+ }
106
+ },
107
+ });
108
+ async function findExistingEntry(ctx, namespaceId, key) {
109
+ if (!key) {
110
+ return null;
111
+ }
112
+ const existing = await mergedStream(statuses.map((status) => stream(ctx.db, schema)
113
+ .query("entries")
114
+ .withIndex("namespaceId_status_key_version", (q) => q
115
+ .eq("namespaceId", namespaceId)
116
+ .eq("status.kind", status)
117
+ .eq("key", key))
118
+ .order("desc")), ["version"]).first();
119
+ return existing;
120
+ }
121
+ export const add = mutation({
122
+ args: {
123
+ entry: v.object({
124
+ ...omit(schema.tables.entries.validator.fields, ["version", "status"]),
125
+ }),
126
+ onComplete: v.optional(v.string()),
127
+ // If we can commit all chunks at the same time, the status is "ready"
128
+ allChunks: v.optional(v.array(vCreateChunkArgs)),
129
+ },
130
+ returns: v.object({
131
+ entryId: v.id("entries"),
132
+ status: vStatus,
133
+ created: v.boolean(),
134
+ replacedVersion: v.union(vEntry, v.null()),
135
+ }),
136
+ handler: async (ctx, args) => {
137
+ const { namespaceId, key } = args.entry;
138
+ const namespace = await ctx.db.get(namespaceId);
139
+ assert(namespace, `Namespace ${namespaceId} not found`);
140
+ // iterate through the latest versions of the entry
141
+ const existing = await findExistingEntry(ctx, namespaceId, key);
142
+ if (existing?.status.kind === "ready" &&
143
+ entryIsSame(existing, args.entry)) {
144
+ return {
145
+ entryId: existing._id,
146
+ status: existing.status.kind,
147
+ created: false,
148
+ replacedVersion: null,
149
+ };
150
+ }
151
+ const version = existing ? existing.version + 1 : 0;
152
+ const entryId = await ctx.db.insert("entries", {
153
+ ...args.entry,
154
+ version,
155
+ status: { kind: "pending", onComplete: args.onComplete },
156
+ });
157
+ if (args.allChunks) {
158
+ await insertChunks(ctx, {
159
+ entryId,
160
+ startOrder: 0,
161
+ chunks: args.allChunks,
162
+ });
163
+ const { replacedVersion } = await promoteToReadyHandler(ctx, {
164
+ entryId,
165
+ });
166
+ return {
167
+ entryId,
168
+ status: "ready",
169
+ created: true,
170
+ replacedVersion,
171
+ };
172
+ }
173
+ return {
174
+ entryId,
175
+ status: "pending",
176
+ created: true,
177
+ replacedVersion: null,
178
+ };
179
+ },
180
+ });
181
+ async function runOnComplete(ctx, onComplete, namespace, entry, replacedEntry, error) {
182
+ await ctx.runMutation(onComplete, {
183
+ namespace: publicNamespace(namespace),
184
+ entry: publicEntry(entry),
185
+ replacedEntry: replacedEntry ? publicEntry(replacedEntry) : undefined,
186
+ error,
187
+ });
188
+ }
189
+ function entryIsSame(existing, newEntry) {
190
+ if (!existing.contentHash || !newEntry.contentHash) {
191
+ return false;
192
+ }
193
+ if (existing.contentHash !== newEntry.contentHash) {
194
+ return false;
195
+ }
196
+ if (existing.importance !== newEntry.importance) {
197
+ return false;
198
+ }
199
+ if (newEntry.filterValues.length !== existing.filterValues.length) {
200
+ return false;
201
+ }
202
+ if (!existing.filterValues.every((filter) => newEntry.filterValues.some((f) => f.name === filter.name && f.value === filter.value))) {
203
+ return false;
204
+ }
205
+ return true;
206
+ }
207
+ /**
208
+ * Lists entries in order of their most recent change
209
+ */
210
+ export const list = query({
211
+ args: {
212
+ namespaceId: v.id("namespaces"),
213
+ order: v.optional(v.union(v.literal("desc"), v.literal("asc"))),
214
+ status: vStatus,
215
+ paginationOpts: paginationOptsValidator,
216
+ },
217
+ returns: vPaginationResult(vEntry),
218
+ handler: async (ctx, args) => {
219
+ const results = await stream(ctx.db, schema)
220
+ .query("entries")
221
+ .withIndex("status_namespaceId", (q) => q
222
+ .eq("status.kind", args.status ?? "ready")
223
+ .eq("namespaceId", args.namespaceId))
224
+ .order(args.order ?? "asc")
225
+ .paginate(args.paginationOpts);
226
+ return {
227
+ ...results,
228
+ page: results.page.map(publicEntry),
229
+ };
230
+ },
231
+ });
232
+ /**
233
+ * Gets a entry by its id.
234
+ */
235
+ export const get = query({
236
+ args: { entryId: v.id("entries") },
237
+ returns: v.union(vEntry, v.null()),
238
+ handler: async (ctx, args) => {
239
+ const entry = await ctx.db.get(args.entryId);
240
+ if (!entry) {
241
+ return null;
242
+ }
243
+ return publicEntry(entry);
244
+ },
245
+ });
246
+ /**
247
+ * Finds a entry by its key and content hash.
248
+ */
249
+ export const findByContentHash = query({
250
+ args: {
251
+ ...vNamespaceLookupArgs,
252
+ key: v.string(),
253
+ contentHash: v.string(),
254
+ },
255
+ returns: v.union(vEntry, v.null()),
256
+ handler: async (ctx, args) => {
257
+ const namespace = await getCompatibleNamespaceHandler(ctx, args);
258
+ if (!namespace) {
259
+ return null;
260
+ }
261
+ let attempts = 0;
262
+ for await (const entry of mergedStream(statuses.map((status) => stream(ctx.db, schema)
263
+ .query("entries")
264
+ .withIndex("namespaceId_status_key_version", (q) => q
265
+ .eq("namespaceId", namespace._id)
266
+ .eq("status.kind", status)
267
+ .eq("key", args.key))
268
+ .order("desc")), ["version"])) {
269
+ attempts++;
270
+ if (attempts > 20) {
271
+ console.debug(`Giving up after checking ${attempts} entries for ${args.key} content hash ${args.contentHash}, returning null`);
272
+ return null;
273
+ }
274
+ if (entryIsSame(entry, {
275
+ key: args.key,
276
+ contentHash: args.contentHash,
277
+ filterValues: entry.filterValues,
278
+ importance: entry.importance,
279
+ })) {
280
+ return publicEntry(entry);
281
+ }
282
+ }
283
+ return null;
284
+ },
285
+ });
286
+ /**
287
+ * Promotes a entry to ready, replacing any existing ready entry by key.
288
+ * It will also call the associated onComplete function if it was pending.
289
+ * Note: this will not replace the chunks automatically, so you should first
290
+ * call `replaceChunksPage` on all its chunks.
291
+ * Edge case: if the entry has already been replaced, it will return the
292
+ * same entry (replacedVersion.entryId === args.entryId).
293
+ */
294
+ export const promoteToReady = mutation({
295
+ args: v.object({
296
+ entryId: v.id("entries"),
297
+ }),
298
+ returns: v.object({
299
+ replacedVersion: v.union(vEntry, v.null()),
300
+ }),
301
+ handler: promoteToReadyHandler,
302
+ });
303
+ async function promoteToReadyHandler(ctx, args) {
304
+ const entry = await ctx.db.get(args.entryId);
305
+ assert(entry, `Entry ${args.entryId} not found`);
306
+ const namespace = await ctx.db.get(entry.namespaceId);
307
+ assert(namespace, `Namespace for ${entry.namespaceId} not found`);
308
+ if (entry.status.kind === "ready") {
309
+ console.debug(`Entry ${args.entryId} is already ready, skipping...`);
310
+ return { replacedVersion: null };
311
+ }
312
+ else if (entry.status.kind === "replaced") {
313
+ console.debug(`Entry ${args.entryId} is already replaced, returning the current version...`);
314
+ return { replacedVersion: publicEntry(entry) };
315
+ }
316
+ const previousEntry = await getPreviousEntry(ctx, entry);
317
+ // First mark the previous entry as replaced,
318
+ // so there are never two "ready" entries.
319
+ if (previousEntry) {
320
+ previousEntry.status = { kind: "replaced", replacedAt: Date.now() };
321
+ await ctx.db.replace(previousEntry._id, previousEntry);
322
+ }
323
+ const previousStatus = entry.status;
324
+ entry.status = { kind: "ready" };
325
+ // Only then mark the current entry as ready,
326
+ // so there are never two "ready" entries.
327
+ await ctx.db.replace(args.entryId, entry);
328
+ // Then run the onComplete function where it can observe itself as "ready".
329
+ if (previousStatus.kind === "pending" && previousStatus.onComplete) {
330
+ await runOnComplete(ctx, previousStatus.onComplete, namespace, entry, previousEntry);
331
+ }
332
+ // Then mark all previous pending entries as replaced,
333
+ // so they can observe the new entry and onComplete side-effects.
334
+ if (entry.key) {
335
+ const previousPendingEntries = await ctx.db
336
+ .query("entries")
337
+ .withIndex("namespaceId_status_key_version", (q) => q
338
+ .eq("namespaceId", entry.namespaceId)
339
+ .eq("status.kind", "pending")
340
+ .eq("key", entry.key)
341
+ .lt("version", entry.version))
342
+ .collect();
343
+ await Promise.all(previousPendingEntries.map(async (entry) => {
344
+ const previousStatus = entry.status;
345
+ entry.status = { kind: "replaced", replacedAt: Date.now() };
346
+ await ctx.db.replace(entry._id, entry);
347
+ if (previousStatus.kind === "pending" && previousStatus.onComplete) {
348
+ await runOnComplete(ctx, previousStatus.onComplete, namespace, entry, null);
349
+ }
350
+ }));
351
+ }
352
+ return {
353
+ replacedVersion: previousEntry ? publicEntry(previousEntry) : null,
354
+ };
355
+ }
356
+ export async function getPreviousEntry(ctx, entry) {
357
+ if (!entry.key) {
358
+ return null;
359
+ }
360
+ const previousEntry = await ctx.db
361
+ .query("entries")
362
+ .withIndex("namespaceId_status_key_version", (q) => q
363
+ .eq("namespaceId", entry.namespaceId)
364
+ .eq("status.kind", "ready")
365
+ .eq("key", entry.key))
366
+ .unique();
367
+ if (previousEntry?._id === entry._id)
368
+ return null;
369
+ return previousEntry;
370
+ }
371
+ export function publicEntry(entry) {
372
+ const { key, importance, filterValues, contentHash, title, metadata } = entry;
373
+ return {
374
+ entryId: entry._id,
375
+ key,
376
+ title,
377
+ metadata,
378
+ importance,
379
+ filterValues,
380
+ contentHash,
381
+ status: entry.status.kind,
382
+ };
383
+ }
384
+ export const deleteAsync = mutation({
385
+ args: v.object({
386
+ entryId: v.id("entries"),
387
+ startOrder: v.number(),
388
+ }),
389
+ returns: v.null(),
390
+ handler: deleteAsyncHandler,
391
+ });
392
+ async function deleteAsyncHandler(ctx, args) {
393
+ const { entryId, startOrder } = args;
394
+ const entry = await ctx.db.get(entryId);
395
+ if (!entry) {
396
+ throw new Error(`Entry ${entryId} not found`);
397
+ }
398
+ const status = await deleteChunksPage(ctx, { entryId, startOrder });
399
+ if (status.isDone) {
400
+ await ctx.db.delete(entryId);
401
+ }
402
+ else {
403
+ await workpool.enqueueMutation(ctx, api.entries.deleteAsync, {
404
+ entryId,
405
+ startOrder: status.nextStartOrder,
406
+ });
407
+ }
408
+ }
409
+ //# sourceMappingURL=entries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entries.js","sourceRoot":"","sources":["../../src/component/entries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { type GenericId, type Infer, type Value, type VAny, type VArray, type VId } from "convex/values";
2
+ export declare const vFilterFieldValue: VArray<[GenericId<"namespaces">, Value], VId<"namespaces"> | VAny>;
3
+ export type FilterFieldValue = Infer<typeof vFilterFieldValue>;
4
+ export declare const filterFieldNames: ("filter0" | "filter1" | "filter2" | "filter3")[];
5
+ export type NamedFilterField = {
6
+ [K in (typeof filterFieldNames)[number]]?: FilterFieldValue;
7
+ };
8
+ export type NumberedFilter = Record<number, Value>;
9
+ export declare const vAllFilterFields: {
10
+ namespaceId: VId<GenericId<"namespaces">, "required">;
11
+ filter0: VArray<[GenericId<"namespaces">, Value] | undefined, VId<"namespaces", "required"> | VAny<any, "required", string>, "optional">;
12
+ filter1: VArray<[GenericId<"namespaces">, Value] | undefined, VId<"namespaces", "required"> | VAny<any, "required", string>, "optional">;
13
+ filter2: VArray<[GenericId<"namespaces">, Value] | undefined, VId<"namespaces", "required"> | VAny<any, "required", string>, "optional">;
14
+ filter3: VArray<[GenericId<"namespaces">, Value] | undefined, VId<"namespaces", "required"> | VAny<any, "required", string>, "optional">;
15
+ };
16
+ export declare const allFilterFieldNames: ("filter0" | "filter1" | "filter2" | "filter3" | "namespaceId")[];
17
+ export declare const vNamedFilter: import("convex/values").VObject<{
18
+ name: string;
19
+ value: any;
20
+ }, {
21
+ name: import("convex/values").VString<string, "required">;
22
+ value: VAny<any, "required", string>;
23
+ }, "required", "name" | "value" | `value.${string}`>;
24
+ export type NamedFilter<K extends string = string, V = Value> = {
25
+ name: K;
26
+ value: V;
27
+ };
28
+ /**
29
+ * { 1: "foo", 2: "bar" }
30
+ * -> { filter1: ["namespace", "foo"], filter2: ["namespace", "bar"] }
31
+ */
32
+ export declare function filterFieldsFromNumbers(namespaceId: GenericId<"namespaces">, filters: NumberedFilter | undefined): NamedFilterField;
33
+ /**
34
+ * [{ name: "Foo", value: "foo" }, { name: "Baz", value: "baz" }]
35
+ * -> { 0: "foo", 2: "baz" }
36
+ */
37
+ export declare function numberedFilterFromNamedFilters(namedFilters: Array<{
38
+ name: string;
39
+ value: Value;
40
+ }>, filterNames: string[]): NumberedFilter;
41
+ /**
42
+ * [{ name: "Foo", value: "foo" }, { name: "Baz", value: "baz" }]
43
+ * -> [{ 0: "foo" }, { 2: "baz" }]
44
+ */
45
+ export declare function numberedFiltersFromNamedFilters(filters: NamedFilter[], filterNames: string[]): Array<NumberedFilter>;
46
+ //# sourceMappingURL=filters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../src/component/filters.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,KAAK,EAEV,KAAK,KAAK,EACV,KAAK,IAAI,EACT,KAAK,MAAM,EACX,KAAK,GAAG,EACT,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,iBAAiB,EAAkC,MAAM,CACpE,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,EAChC,GAAG,CAAC,YAAY,CAAC,GAAG,IAAI,CACzB,CAAC;AACF,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE/D,eAAO,MAAM,gBAAgB,mDAK5B,CAAC;AACF,MAAM,MAAM,gBAAgB,GAAG;KAC5B,CAAC,IAAI,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,gBAAgB;CAC5D,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAEnD,eAAO,MAAM,gBAAgB;;;;;;CAM5B,CAAC;AAEF,eAAO,MAAM,mBAAmB,mEAG/B,CAAC;AAEF,eAAO,MAAM,YAAY;;;;;;oDAGvB,CAAC;AAEH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,KAAK,IAAI;IAC9D,IAAI,EAAE,CAAC,CAAC;IACR,KAAK,EAAE,CAAC,CAAC;CACV,CAAC;AAEF;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,SAAS,CAAC,YAAY,CAAC,EACpC,OAAO,EAAE,cAAc,GAAG,SAAS,GAClC,gBAAgB,CAclB;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,YAAY,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC,EACnD,WAAW,EAAE,MAAM,EAAE,GACpB,cAAc,CAchB;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,WAAW,EAAE,EACtB,WAAW,EAAE,MAAM,EAAE,GACpB,KAAK,CAAC,cAAc,CAAC,CAcvB"}
@@ -0,0 +1,72 @@
1
+ import { v, } from "convex/values";
2
+ export const vFilterFieldValue = v.array(v.any());
3
+ export const filterFieldNames = [
4
+ "filter0",
5
+ "filter1",
6
+ "filter2",
7
+ "filter3",
8
+ ];
9
+ export const vAllFilterFields = {
10
+ namespaceId: v.id("namespaces"),
11
+ filter0: v.optional(vFilterFieldValue),
12
+ filter1: v.optional(vFilterFieldValue),
13
+ filter2: v.optional(vFilterFieldValue),
14
+ filter3: v.optional(vFilterFieldValue),
15
+ };
16
+ export const allFilterFieldNames = [
17
+ "namespaceId",
18
+ ...filterFieldNames,
19
+ ];
20
+ export const vNamedFilter = v.object({
21
+ name: v.string(),
22
+ value: v.any(),
23
+ });
24
+ /**
25
+ * { 1: "foo", 2: "bar" }
26
+ * -> { filter1: ["namespace", "foo"], filter2: ["namespace", "bar"] }
27
+ */
28
+ export function filterFieldsFromNumbers(namespaceId, filters) {
29
+ const filterFields = {};
30
+ if (!filters)
31
+ return filterFields;
32
+ for (const [i, filter] of Object.entries(filters)) {
33
+ const index = Number(i);
34
+ if (isNaN(index) || index < 0 || index >= filterFieldNames.length) {
35
+ console.warn(`Unknown filter index: ${index} for value ${JSON.stringify(filter)}`);
36
+ break;
37
+ }
38
+ filterFields[filterFieldNames[index]] = [namespaceId, filter];
39
+ }
40
+ return filterFields;
41
+ }
42
+ /**
43
+ * [{ name: "Foo", value: "foo" }, { name: "Baz", value: "baz" }]
44
+ * -> { 0: "foo", 2: "baz" }
45
+ */
46
+ export function numberedFilterFromNamedFilters(namedFilters, filterNames) {
47
+ const numberedFilter = {};
48
+ for (const namedFilter of namedFilters) {
49
+ const index = filterNames.indexOf(namedFilter.name);
50
+ if (index === -1) {
51
+ throw new Error(`Unknown filter name: ${namedFilter.name} for namespace with names ${filterNames.join(", ")}`);
52
+ }
53
+ numberedFilter[index] = namedFilter.value;
54
+ }
55
+ return numberedFilter;
56
+ }
57
+ /**
58
+ * [{ name: "Foo", value: "foo" }, { name: "Baz", value: "baz" }]
59
+ * -> [{ 0: "foo" }, { 2: "baz" }]
60
+ */
61
+ export function numberedFiltersFromNamedFilters(filters, filterNames) {
62
+ const filterFields = [];
63
+ for (const filter of filters) {
64
+ const index = filterNames.indexOf(filter.name);
65
+ if (index === -1) {
66
+ throw new Error(`Unknown filter name: ${filter.name} for namespace with names ${filterNames.join(", ")}`);
67
+ }
68
+ filterFields.push({ [index]: filter.value });
69
+ }
70
+ return filterFields;
71
+ }
72
+ //# sourceMappingURL=filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.js","sourceRoot":"","sources":["../../src/component/filters.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,CAAC,GAKF,MAAM,eAAe,CAAC;AAEvB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAG/C,CAAC;AAGF,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,SAAkB;IAClB,SAAkB;IAClB,SAAkB;IAClB,SAAkB;CACnB,CAAC;AAOF,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC;IAC/B,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IACtC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IACtC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IACtC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;CACvC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,aAAsB;IACtB,GAAG,gBAAgB;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE;CACf,CAAC,CAAC;AAOH;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,WAAoC,EACpC,OAAmC;IAEnC,MAAM,YAAY,GAAqB,EAAE,CAAC;IAC1C,IAAI,CAAC,OAAO;QAAE,OAAO,YAAY,CAAC;IAClC,KAAK,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAClD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,gBAAgB,CAAC,MAAM,EAAE,CAAC;YAClE,OAAO,CAAC,IAAI,CACV,yBAAyB,KAAK,cAAc,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CACrE,CAAC;YACF,MAAM;QACR,CAAC;QACD,YAAY,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,8BAA8B,CAC5C,YAAmD,EACnD,WAAqB;IAErB,MAAM,cAAc,GAAmB,EAAE,CAAC;IAC1C,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACb,wBAAwB,WAAW,CAAC,IAAI,6BAA6B,WAAW,CAAC,IAAI,CACnF,IAAI,CACL,EAAE,CACJ,CAAC;QACJ,CAAC;QACD,cAAc,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC;IAC5C,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,+BAA+B,CAC7C,OAAsB,EACtB,WAAqB;IAErB,MAAM,YAAY,GAA0B,EAAE,CAAC;IAC/C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACb,wBAAwB,MAAM,CAAC,IAAI,6BAA6B,WAAW,CAAC,IAAI,CAC9E,IAAI,CACL,EAAE,CACJ,CAAC;QACJ,CAAC;QACD,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC"}