@functional-systems/lambdadb 0.4.2 → 0.5.0-rc.1

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 (223) hide show
  1. package/CHANGELOG.md +71 -0
  2. package/FUNCTIONS.md +7 -2
  3. package/README.md +60 -2
  4. package/RUNTIMES.md +7 -0
  5. package/USAGE.md +20 -0
  6. package/dist/commonjs/client.d.ts +25 -10
  7. package/dist/commonjs/client.d.ts.map +1 -1
  8. package/dist/commonjs/client.js +233 -59
  9. package/dist/commonjs/client.js.map +1 -1
  10. package/dist/commonjs/compat/qdrant/client.d.ts +6 -10
  11. package/dist/commonjs/compat/qdrant/client.d.ts.map +1 -1
  12. package/dist/commonjs/compat/qdrant/client.js +33 -15
  13. package/dist/commonjs/compat/qdrant/client.js.map +1 -1
  14. package/dist/commonjs/compat/qdrant/filters.js +5 -1
  15. package/dist/commonjs/compat/qdrant/filters.js.map +1 -1
  16. package/dist/commonjs/funcs/collectionsCreate.js +1 -1
  17. package/dist/commonjs/funcs/collectionsDelete.js +1 -1
  18. package/dist/commonjs/funcs/collectionsDocsGetBulkUpsert.js +4 -0
  19. package/dist/commonjs/funcs/collectionsDocsGetBulkUpsert.js.map +1 -1
  20. package/dist/commonjs/funcs/collectionsDocsListDocs.js +3 -0
  21. package/dist/commonjs/funcs/collectionsDocsListDocs.js.map +1 -1
  22. package/dist/commonjs/funcs/collectionsDocsListDocsExtended.d.ts +15 -0
  23. package/dist/commonjs/funcs/collectionsDocsListDocsExtended.d.ts.map +1 -0
  24. package/dist/commonjs/funcs/collectionsDocsListDocsExtended.js +131 -0
  25. package/dist/commonjs/funcs/collectionsDocsListDocsExtended.js.map +1 -0
  26. package/dist/commonjs/index.d.ts +4 -1
  27. package/dist/commonjs/index.d.ts.map +1 -1
  28. package/dist/commonjs/index.js +15 -1
  29. package/dist/commonjs/index.js.map +1 -1
  30. package/dist/commonjs/lib/config.d.ts +2 -2
  31. package/dist/commonjs/lib/config.js +2 -2
  32. package/dist/commonjs/lib/config.js.map +1 -1
  33. package/dist/commonjs/lib/queryInput.d.ts +3 -11
  34. package/dist/commonjs/lib/queryInput.d.ts.map +1 -1
  35. package/dist/commonjs/lib/queryInput.js.map +1 -1
  36. package/dist/commonjs/models/collectionresponse.d.ts +12 -21
  37. package/dist/commonjs/models/collectionresponse.d.ts.map +1 -1
  38. package/dist/commonjs/models/collectionresponse.js +5 -6
  39. package/dist/commonjs/models/collectionresponse.js.map +1 -1
  40. package/dist/commonjs/models/index.d.ts +1 -0
  41. package/dist/commonjs/models/index.d.ts.map +1 -1
  42. package/dist/commonjs/models/index.js +1 -0
  43. package/dist/commonjs/models/index.js.map +1 -1
  44. package/dist/commonjs/models/operations/bulkupsertdocs.d.ts +6 -0
  45. package/dist/commonjs/models/operations/bulkupsertdocs.d.ts.map +1 -1
  46. package/dist/commonjs/models/operations/bulkupsertdocs.js +2 -0
  47. package/dist/commonjs/models/operations/bulkupsertdocs.js.map +1 -1
  48. package/dist/commonjs/models/operations/createcollection.d.ts +20 -13
  49. package/dist/commonjs/models/operations/createcollection.d.ts.map +1 -1
  50. package/dist/commonjs/models/operations/createcollection.js +15 -7
  51. package/dist/commonjs/models/operations/createcollection.js.map +1 -1
  52. package/dist/commonjs/models/operations/deletedocs.d.ts +3 -0
  53. package/dist/commonjs/models/operations/deletedocs.d.ts.map +1 -1
  54. package/dist/commonjs/models/operations/deletedocs.js +1 -0
  55. package/dist/commonjs/models/operations/deletedocs.js.map +1 -1
  56. package/dist/commonjs/models/operations/fetchdocs.d.ts +3 -0
  57. package/dist/commonjs/models/operations/fetchdocs.d.ts.map +1 -1
  58. package/dist/commonjs/models/operations/fetchdocs.js +9 -0
  59. package/dist/commonjs/models/operations/fetchdocs.js.map +1 -1
  60. package/dist/commonjs/models/operations/getbulkupsertdocs.d.ts +5 -0
  61. package/dist/commonjs/models/operations/getbulkupsertdocs.d.ts.map +1 -1
  62. package/dist/commonjs/models/operations/getbulkupsertdocs.js +5 -3
  63. package/dist/commonjs/models/operations/getbulkupsertdocs.js.map +1 -1
  64. package/dist/commonjs/models/operations/listdocs.d.ts +69 -0
  65. package/dist/commonjs/models/operations/listdocs.d.ts.map +1 -1
  66. package/dist/commonjs/models/operations/listdocs.js +41 -1
  67. package/dist/commonjs/models/operations/listdocs.js.map +1 -1
  68. package/dist/commonjs/models/operations/querycollection.d.ts +3 -0
  69. package/dist/commonjs/models/operations/querycollection.d.ts.map +1 -1
  70. package/dist/commonjs/models/operations/querycollection.js +9 -0
  71. package/dist/commonjs/models/operations/querycollection.js.map +1 -1
  72. package/dist/commonjs/models/operations/updatecollection.d.ts +10 -4
  73. package/dist/commonjs/models/operations/updatecollection.d.ts.map +1 -1
  74. package/dist/commonjs/models/operations/updatecollection.js +8 -1
  75. package/dist/commonjs/models/operations/updatecollection.js.map +1 -1
  76. package/dist/commonjs/models/operations/updatedocs.d.ts +3 -0
  77. package/dist/commonjs/models/operations/updatedocs.d.ts.map +1 -1
  78. package/dist/commonjs/models/operations/updatedocs.js +1 -0
  79. package/dist/commonjs/models/operations/updatedocs.js.map +1 -1
  80. package/dist/commonjs/models/operations/upsertdocs.d.ts +3 -0
  81. package/dist/commonjs/models/operations/upsertdocs.d.ts.map +1 -1
  82. package/dist/commonjs/models/operations/upsertdocs.js +1 -0
  83. package/dist/commonjs/models/operations/upsertdocs.js.map +1 -1
  84. package/dist/commonjs/models/versioning.d.ts +100 -0
  85. package/dist/commonjs/models/versioning.d.ts.map +1 -0
  86. package/dist/commonjs/models/versioning.js +93 -0
  87. package/dist/commonjs/models/versioning.js.map +1 -0
  88. package/dist/commonjs/types/public.d.ts +86 -8
  89. package/dist/commonjs/types/public.d.ts.map +1 -1
  90. package/dist/commonjs/types/public.js +30 -7
  91. package/dist/commonjs/types/public.js.map +1 -1
  92. package/dist/commonjs/versioning.d.ts +63 -0
  93. package/dist/commonjs/versioning.d.ts.map +1 -0
  94. package/dist/commonjs/versioning.js +390 -0
  95. package/dist/commonjs/versioning.js.map +1 -0
  96. package/dist/esm/client.d.ts +25 -10
  97. package/dist/esm/client.d.ts.map +1 -1
  98. package/dist/esm/client.js +234 -61
  99. package/dist/esm/client.js.map +1 -1
  100. package/dist/esm/compat/qdrant/client.d.ts +6 -10
  101. package/dist/esm/compat/qdrant/client.d.ts.map +1 -1
  102. package/dist/esm/compat/qdrant/client.js +33 -15
  103. package/dist/esm/compat/qdrant/client.js.map +1 -1
  104. package/dist/esm/compat/qdrant/filters.js +5 -1
  105. package/dist/esm/compat/qdrant/filters.js.map +1 -1
  106. package/dist/esm/funcs/collectionsCreate.js +1 -1
  107. package/dist/esm/funcs/collectionsDelete.js +1 -1
  108. package/dist/esm/funcs/collectionsDocsGetBulkUpsert.js +5 -1
  109. package/dist/esm/funcs/collectionsDocsGetBulkUpsert.js.map +1 -1
  110. package/dist/esm/funcs/collectionsDocsListDocs.js +3 -0
  111. package/dist/esm/funcs/collectionsDocsListDocs.js.map +1 -1
  112. package/dist/esm/funcs/collectionsDocsListDocsExtended.d.ts +15 -0
  113. package/dist/esm/funcs/collectionsDocsListDocsExtended.d.ts.map +1 -0
  114. package/dist/esm/funcs/collectionsDocsListDocsExtended.js +95 -0
  115. package/dist/esm/funcs/collectionsDocsListDocsExtended.js.map +1 -0
  116. package/dist/esm/index.d.ts +4 -1
  117. package/dist/esm/index.d.ts.map +1 -1
  118. package/dist/esm/index.js +3 -1
  119. package/dist/esm/index.js.map +1 -1
  120. package/dist/esm/lib/config.d.ts +2 -2
  121. package/dist/esm/lib/config.js +2 -2
  122. package/dist/esm/lib/config.js.map +1 -1
  123. package/dist/esm/lib/queryInput.d.ts +3 -11
  124. package/dist/esm/lib/queryInput.d.ts.map +1 -1
  125. package/dist/esm/lib/queryInput.js.map +1 -1
  126. package/dist/esm/models/collectionresponse.d.ts +12 -21
  127. package/dist/esm/models/collectionresponse.d.ts.map +1 -1
  128. package/dist/esm/models/collectionresponse.js +5 -6
  129. package/dist/esm/models/collectionresponse.js.map +1 -1
  130. package/dist/esm/models/index.d.ts +1 -0
  131. package/dist/esm/models/index.d.ts.map +1 -1
  132. package/dist/esm/models/index.js +1 -0
  133. package/dist/esm/models/index.js.map +1 -1
  134. package/dist/esm/models/operations/bulkupsertdocs.d.ts +6 -0
  135. package/dist/esm/models/operations/bulkupsertdocs.d.ts.map +1 -1
  136. package/dist/esm/models/operations/bulkupsertdocs.js +2 -0
  137. package/dist/esm/models/operations/bulkupsertdocs.js.map +1 -1
  138. package/dist/esm/models/operations/createcollection.d.ts +20 -13
  139. package/dist/esm/models/operations/createcollection.d.ts.map +1 -1
  140. package/dist/esm/models/operations/createcollection.js +15 -7
  141. package/dist/esm/models/operations/createcollection.js.map +1 -1
  142. package/dist/esm/models/operations/deletedocs.d.ts +3 -0
  143. package/dist/esm/models/operations/deletedocs.d.ts.map +1 -1
  144. package/dist/esm/models/operations/deletedocs.js +1 -0
  145. package/dist/esm/models/operations/deletedocs.js.map +1 -1
  146. package/dist/esm/models/operations/fetchdocs.d.ts +3 -0
  147. package/dist/esm/models/operations/fetchdocs.d.ts.map +1 -1
  148. package/dist/esm/models/operations/fetchdocs.js +9 -0
  149. package/dist/esm/models/operations/fetchdocs.js.map +1 -1
  150. package/dist/esm/models/operations/getbulkupsertdocs.d.ts +5 -0
  151. package/dist/esm/models/operations/getbulkupsertdocs.d.ts.map +1 -1
  152. package/dist/esm/models/operations/getbulkupsertdocs.js +6 -4
  153. package/dist/esm/models/operations/getbulkupsertdocs.js.map +1 -1
  154. package/dist/esm/models/operations/listdocs.d.ts +69 -0
  155. package/dist/esm/models/operations/listdocs.d.ts.map +1 -1
  156. package/dist/esm/models/operations/listdocs.js +38 -0
  157. package/dist/esm/models/operations/listdocs.js.map +1 -1
  158. package/dist/esm/models/operations/querycollection.d.ts +3 -0
  159. package/dist/esm/models/operations/querycollection.d.ts.map +1 -1
  160. package/dist/esm/models/operations/querycollection.js +9 -0
  161. package/dist/esm/models/operations/querycollection.js.map +1 -1
  162. package/dist/esm/models/operations/updatecollection.d.ts +10 -4
  163. package/dist/esm/models/operations/updatecollection.d.ts.map +1 -1
  164. package/dist/esm/models/operations/updatecollection.js +8 -1
  165. package/dist/esm/models/operations/updatecollection.js.map +1 -1
  166. package/dist/esm/models/operations/updatedocs.d.ts +3 -0
  167. package/dist/esm/models/operations/updatedocs.d.ts.map +1 -1
  168. package/dist/esm/models/operations/updatedocs.js +1 -0
  169. package/dist/esm/models/operations/updatedocs.js.map +1 -1
  170. package/dist/esm/models/operations/upsertdocs.d.ts +3 -0
  171. package/dist/esm/models/operations/upsertdocs.d.ts.map +1 -1
  172. package/dist/esm/models/operations/upsertdocs.js +1 -0
  173. package/dist/esm/models/operations/upsertdocs.js.map +1 -1
  174. package/dist/esm/models/versioning.d.ts +100 -0
  175. package/dist/esm/models/versioning.d.ts.map +1 -0
  176. package/dist/esm/models/versioning.js +57 -0
  177. package/dist/esm/models/versioning.js.map +1 -0
  178. package/dist/esm/types/public.d.ts +86 -8
  179. package/dist/esm/types/public.d.ts.map +1 -1
  180. package/dist/esm/types/public.js +26 -7
  181. package/dist/esm/types/public.js.map +1 -1
  182. package/dist/esm/versioning.d.ts +63 -0
  183. package/dist/esm/versioning.d.ts.map +1 -0
  184. package/dist/esm/versioning.js +344 -0
  185. package/dist/esm/versioning.js.map +1 -0
  186. package/jsr.json +3 -1
  187. package/package.json +14 -2
  188. package/src/client.ts +367 -72
  189. package/src/compat/qdrant/client.ts +46 -20
  190. package/src/compat/qdrant/filters.ts +5 -3
  191. package/src/funcs/collectionsCreate.ts +1 -1
  192. package/src/funcs/collectionsDelete.ts +1 -1
  193. package/src/funcs/collectionsDocsGetBulkUpsert.ts +6 -1
  194. package/src/funcs/collectionsDocsListDocs.ts +3 -0
  195. package/src/funcs/collectionsDocsListDocsExtended.ts +201 -0
  196. package/src/index.ts +17 -0
  197. package/src/lib/config.ts +2 -2
  198. package/src/lib/queryInput.ts +3 -10
  199. package/src/models/collectionresponse.ts +17 -26
  200. package/src/models/index.ts +1 -0
  201. package/src/models/operations/bulkupsertdocs.ts +8 -0
  202. package/src/models/operations/createcollection.ts +39 -18
  203. package/src/models/operations/deletedocs.ts +4 -0
  204. package/src/models/operations/fetchdocs.ts +12 -0
  205. package/src/models/operations/getbulkupsertdocs.ts +11 -4
  206. package/src/models/operations/listdocs.ts +120 -0
  207. package/src/models/operations/querycollection.ts +12 -0
  208. package/src/models/operations/updatecollection.ts +21 -3
  209. package/src/models/operations/updatedocs.ts +4 -0
  210. package/src/models/operations/upsertdocs.ts +4 -0
  211. package/src/models/versioning.ts +118 -0
  212. package/src/types/public.ts +136 -16
  213. package/src/versioning.ts +490 -0
  214. package/examples/collectionScoped.example.ts +0 -38
  215. package/examples/collectionsList.example.ts +0 -25
  216. package/examples/package-lock.json +0 -612
  217. package/examples/package.json +0 -18
  218. package/test/integration/qdrant-compat-external.test.mjs +0 -351
  219. package/test/integration/qdrant-compat-live.test.mjs +0 -122
  220. package/test/null-response.test.mjs +0 -73
  221. package/test/public-api.test.mjs +0 -489
  222. package/test/qdrant-compat.test.mjs +0 -467
  223. package/tsconfig.json +0 -39
@@ -1,489 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import test from "node:test";
3
-
4
- import {
5
- BadRequestError,
6
- HTTPClient,
7
- LambdaDBClient,
8
- SDKValidationError,
9
- } from "../dist/esm/index.js";
10
-
11
- const BASE_URL = "https://api.test";
12
- const PROJECT_NAME = "project-one";
13
-
14
- function jsonResponse(body, init = {}) {
15
- return new Response(JSON.stringify(body), {
16
- status: 200,
17
- headers: { "content-type": "application/json" },
18
- ...init,
19
- });
20
- }
21
-
22
- function collectionFixture(collectionName, overrides = {}) {
23
- return {
24
- projectName: PROJECT_NAME,
25
- collectionName,
26
- indexConfigs: {},
27
- numPartitions: 1,
28
- numDocs: 2,
29
- sourceProjectName: null,
30
- sourceCollectionName: null,
31
- sourceCollectionVersionId: null,
32
- collectionStatus: "ACTIVE",
33
- createdAt: 1700000000,
34
- updatedAt: 1700000100,
35
- dataUpdatedAt: 1700000200,
36
- ...overrides,
37
- };
38
- }
39
-
40
- function createClient(handler) {
41
- const calls = [];
42
- const httpClient = new HTTPClient({
43
- fetcher: async (request) => {
44
- const body = await request.clone().text();
45
- const call = {
46
- body,
47
- headers: Object.fromEntries(request.headers.entries()),
48
- method: request.method,
49
- url: new URL(request.url),
50
- };
51
- calls.push(call);
52
- return handler(call, calls.length - 1);
53
- },
54
- });
55
-
56
- const client = new LambdaDBClient({
57
- baseUrl: BASE_URL,
58
- httpClient,
59
- projectApiKey: "test-key",
60
- projectName: PROJECT_NAME,
61
- });
62
-
63
- return { calls, client };
64
- }
65
-
66
- test("public client lists collections with project URL, auth header, and Date conversion", async () => {
67
- const { calls, client } = createClient(() =>
68
- jsonResponse({
69
- collections: [collectionFixture("alpha")],
70
- nextPageToken: null,
71
- })
72
- );
73
-
74
- const result = await client.listCollections({ size: 5 });
75
-
76
- assert.equal(calls.length, 1);
77
- assert.equal(calls[0].method, "GET");
78
- assert.equal(calls[0].url.pathname, "/projects/project-one/collections");
79
- assert.equal(calls[0].url.searchParams.get("size"), "5");
80
- assert.equal(calls[0].headers["x-api-key"], "test-key");
81
- assert.equal(result.nextPageToken, undefined);
82
- assert.equal(result.collections[0].collectionName, "alpha");
83
- assert.ok(result.collections[0].createdAt instanceof Date);
84
- assert.equal(result.collections[0].createdAt.toISOString(), "2023-11-14T22:13:20.000Z");
85
- });
86
-
87
- test("public client supports managed embedding vector index configs", async () => {
88
- const managedIndexConfigs = {
89
- body: {
90
- type: "text",
91
- analyzers: ["english"],
92
- },
93
- bodyEmbedding: {
94
- type: "vector",
95
- managedEmbedding: true,
96
- embedding: {
97
- provider: "openai",
98
- model: "text-embedding-3-small",
99
- sourceField: "body",
100
- },
101
- },
102
- };
103
-
104
- const { calls, client } = createClient((call) => {
105
- assert.equal(call.method, "POST");
106
- assert.equal(call.url.pathname, "/projects/project-one/collections");
107
- assert.deepEqual(JSON.parse(call.body), {
108
- collectionName: "semantic-items",
109
- indexConfigs: {
110
- body: {
111
- type: "text",
112
- analyzers: ["english"],
113
- },
114
- bodyEmbedding: {
115
- type: "vector",
116
- managedEmbedding: true,
117
- embedding: {
118
- provider: "openai",
119
- model: "text-embedding-3-small",
120
- sourceField: "body",
121
- },
122
- },
123
- },
124
- });
125
-
126
- return jsonResponse(
127
- {
128
- collection: collectionFixture("semantic-items", {
129
- indexConfigs: {
130
- ...managedIndexConfigs,
131
- bodyEmbedding: {
132
- ...managedIndexConfigs.bodyEmbedding,
133
- embedding: {
134
- ...managedIndexConfigs.bodyEmbedding.embedding,
135
- dimensions: 1536,
136
- similarity: "cosine",
137
- },
138
- },
139
- },
140
- }),
141
- },
142
- { status: 202 },
143
- );
144
- });
145
-
146
- const result = await client.createCollection({
147
- collectionName: "semantic-items",
148
- indexConfigs: managedIndexConfigs,
149
- });
150
-
151
- assert.equal(calls.length, 1);
152
- assert.deepEqual(
153
- result.collection.indexConfigs.bodyEmbedding.embedding,
154
- {
155
- ...managedIndexConfigs.bodyEmbedding.embedding,
156
- dimensions: 1536,
157
- similarity: "cosine",
158
- },
159
- );
160
- });
161
-
162
- test("managed embedding vector config supports optional embedding dimensions and similarity", async () => {
163
- const { calls, client } = createClient((call) => {
164
- assert.equal(call.method, "POST");
165
- assert.deepEqual(JSON.parse(call.body), {
166
- collectionName: "semantic-items",
167
- indexConfigs: {
168
- bodyEmbedding: {
169
- type: "vector",
170
- managedEmbedding: true,
171
- embedding: {
172
- provider: "openai",
173
- model: "text-embedding-3-small",
174
- sourceField: "body",
175
- dimensions: 1536,
176
- similarity: "cosine",
177
- },
178
- },
179
- },
180
- });
181
-
182
- return jsonResponse(
183
- {
184
- collection: collectionFixture("semantic-items", {
185
- indexConfigs: {
186
- bodyEmbedding: {
187
- type: "vector",
188
- managedEmbedding: true,
189
- embedding: {
190
- provider: "openai",
191
- model: "text-embedding-3-small",
192
- sourceField: "body",
193
- dimensions: 1536,
194
- similarity: "cosine",
195
- },
196
- },
197
- },
198
- }),
199
- },
200
- { status: 202 },
201
- );
202
- });
203
-
204
- const result = await client.createCollection({
205
- collectionName: "semantic-items",
206
- indexConfigs: {
207
- bodyEmbedding: {
208
- type: "vector",
209
- managedEmbedding: true,
210
- embedding: {
211
- provider: "openai",
212
- model: "text-embedding-3-small",
213
- sourceField: "body",
214
- dimensions: 1536,
215
- similarity: "cosine",
216
- },
217
- },
218
- },
219
- });
220
-
221
- assert.equal(calls.length, 1);
222
- assert.equal(
223
- result.collection.indexConfigs.bodyEmbedding.embedding.dimensions,
224
- 1536,
225
- );
226
- });
227
-
228
- test("managed embedding vector config rejects invalid Java contract shapes", async () => {
229
- const { calls, client } = createClient(() => {
230
- throw new Error("request should not be sent for invalid index configs");
231
- });
232
-
233
- const invalidIndexConfigs = [
234
- {
235
- type: "vector",
236
- dimensions: 1536,
237
- embedding: {
238
- provider: "openai",
239
- model: "text-embedding-3-small",
240
- sourceField: "body",
241
- },
242
- },
243
- {
244
- type: "vector",
245
- managedEmbedding: false,
246
- dimensions: 1536,
247
- embedding: {
248
- provider: "openai",
249
- model: "text-embedding-3-small",
250
- sourceField: "body",
251
- },
252
- },
253
- {
254
- type: "vector",
255
- managedEmbedding: true,
256
- dimensions: 1536,
257
- embedding: {
258
- provider: "openai",
259
- model: "text-embedding-3-small",
260
- sourceField: "body",
261
- },
262
- },
263
- {
264
- type: "vector",
265
- managedEmbedding: true,
266
- similarity: "cosine",
267
- embedding: {
268
- provider: "openai",
269
- model: "text-embedding-3-small",
270
- sourceField: "body",
271
- },
272
- },
273
- {
274
- type: "vector",
275
- managedEmbedding: true,
276
- },
277
- {
278
- type: "vector",
279
- managedEmbedding: true,
280
- embedding: {
281
- provider: "openai",
282
- model: "text-embedding-3-small",
283
- sourceField: "body",
284
- unsupported: true,
285
- },
286
- },
287
- ];
288
-
289
- for (const indexConfig of invalidIndexConfigs) {
290
- const result = await client.createCollectionSafe({
291
- collectionName: "invalid-vector",
292
- indexConfigs: { bodyEmbedding: indexConfig },
293
- });
294
-
295
- assert.equal(result.ok, false);
296
- assert.ok(result.error instanceof SDKValidationError);
297
- }
298
-
299
- assert.equal(calls.length, 0);
300
- });
301
-
302
- test("collection query supports managed embedding queryText KNN payloads", async () => {
303
- const { calls, client } = createClient((call) => {
304
- assert.equal(call.method, "POST");
305
- assert.equal(call.url.pathname, "/projects/project-one/collections/items/query");
306
- assert.deepEqual(JSON.parse(call.body), {
307
- size: 10,
308
- query: {
309
- knn: {
310
- field: "bodyEmbedding",
311
- queryText: "refund policy",
312
- k: 10,
313
- },
314
- },
315
- consistentRead: false,
316
- includeVectors: false,
317
- });
318
-
319
- return jsonResponse({
320
- took: 3,
321
- maxScore: 0.98,
322
- total: 1,
323
- docs: [{ collection: "items", score: 0.98, doc: { id: "a" } }],
324
- isDocsInline: true,
325
- docsUrl: null,
326
- });
327
- });
328
-
329
- const result = await client.collection("items").query({
330
- size: 10,
331
- query: {
332
- knn: {
333
- field: "bodyEmbedding",
334
- queryText: "refund policy",
335
- k: 10,
336
- },
337
- },
338
- });
339
-
340
- assert.equal(calls.length, 1);
341
- assert.equal(result.total, 1);
342
- });
343
-
344
- test("getBulkUpsertSafe exposes managed embedding unsupported bad requests", async () => {
345
- const { client } = createClient((call) => {
346
- assert.equal(call.method, "GET");
347
- assert.equal(call.url.pathname, "/projects/project-one/collections/items/docs/bulk-upsert");
348
-
349
- return jsonResponse(
350
- { message: "Bulk upsert is not supported for collections with managed embedding fields" },
351
- { status: 400 },
352
- );
353
- });
354
-
355
- const result = await client.collection("items").docs.getBulkUpsertSafe();
356
-
357
- assert.equal(result.ok, false);
358
- assert.ok(result.error instanceof BadRequestError);
359
- assert.equal(
360
- result.error.data$.message,
361
- "Bulk upsert is not supported for collections with managed embedding fields",
362
- );
363
- });
364
-
365
- test("public pagination helpers collect all collection pages", async () => {
366
- const { calls, client } = createClient((call, index) => {
367
- if (index === 0) {
368
- return jsonResponse({
369
- collections: [collectionFixture("alpha")],
370
- nextPageToken: "next-page",
371
- });
372
- }
373
-
374
- assert.equal(call.url.searchParams.get("pageToken"), "next-page");
375
- return jsonResponse({
376
- collections: [collectionFixture("beta")],
377
- nextPageToken: null,
378
- });
379
- });
380
-
381
- const result = await client.listAllCollections({ size: 1 });
382
-
383
- assert.equal(calls.length, 2);
384
- assert.deepEqual(
385
- result.collections.map((collection) => collection.collectionName),
386
- ["alpha", "beta"],
387
- );
388
- });
389
-
390
- test("collection docs helpers paginate through the user-facing scoped API", async () => {
391
- const { calls, client } = createClient((call, index) => {
392
- assert.equal(call.method, "GET");
393
- assert.equal(call.url.pathname, "/projects/project-one/collections/items/docs");
394
-
395
- if (index === 0) {
396
- return jsonResponse({
397
- total: 2,
398
- docs: [{ collection: "items", doc: { id: "a" } }],
399
- nextPageToken: "docs-page-2",
400
- isDocsInline: true,
401
- docsUrl: null,
402
- });
403
- }
404
-
405
- assert.equal(call.url.searchParams.get("pageToken"), "docs-page-2");
406
- return jsonResponse({
407
- total: 2,
408
- docs: [{ collection: "items", doc: { id: "b" } }],
409
- nextPageToken: null,
410
- isDocsInline: true,
411
- docsUrl: null,
412
- });
413
- });
414
-
415
- const result = await client.collection("items").docs.listAll({ size: 1 });
416
-
417
- assert.equal(calls.length, 2);
418
- assert.equal(result.total, 2);
419
- assert.deepEqual(result.docs, [
420
- { collection: "items", doc: { id: "a" } },
421
- { collection: "items", doc: { id: "b" } },
422
- ]);
423
- });
424
-
425
- test("collection query fetches docsUrl and returns inline docs through the public API", async () => {
426
- const originalFetch = globalThis.fetch;
427
- const docsUrlCalls = [];
428
- globalThis.fetch = async (input) => {
429
- docsUrlCalls.push(String(input));
430
- return jsonResponse({
431
- docs: [{ collection: "items", score: 0.9, doc: { id: "a" } }],
432
- });
433
- };
434
-
435
- try {
436
- const { calls, client } = createClient((call) => {
437
- assert.equal(call.method, "POST");
438
- assert.equal(call.url.pathname, "/projects/project-one/collections/items/query");
439
- assert.deepEqual(JSON.parse(call.body), {
440
- query: { text: "hello" },
441
- consistentRead: false,
442
- includeVectors: false,
443
- });
444
-
445
- return jsonResponse({
446
- took: 7,
447
- maxScore: null,
448
- total: 1,
449
- docs: [],
450
- isDocsInline: false,
451
- docsUrl: "https://download.test/query-docs.json",
452
- });
453
- });
454
-
455
- const result = await client.collection("items").querySafe({
456
- query: { text: "hello" },
457
- });
458
-
459
- assert.equal(calls.length, 1);
460
- assert.deepEqual(docsUrlCalls, ["https://download.test/query-docs.json"]);
461
- assert.equal(result.ok, true);
462
- assert.equal(result.value.isDocsInline, true);
463
- assert.deepEqual(result.value.docs, [
464
- { collection: "items", score: 0.9, doc: { id: "a" } },
465
- ]);
466
- } finally {
467
- globalThis.fetch = originalFetch;
468
- }
469
- });
470
-
471
- test("public safe methods expose typed API errors", async () => {
472
- const { client } = createClient((call) => {
473
- assert.equal(call.method, "POST");
474
- assert.equal(call.url.pathname, "/projects/project-one/collections");
475
-
476
- return jsonResponse(
477
- { message: null },
478
- { status: 400 },
479
- );
480
- });
481
-
482
- const result = await client.createCollectionSafe({ collectionName: "items" });
483
-
484
- assert.equal(result.ok, false);
485
- assert.ok(result.error instanceof BadRequestError);
486
- assert.equal(result.error.statusCode, 400);
487
- assert.equal(result.error.body, "{\"message\":null}");
488
- assert.equal(result.error.data$.message, undefined);
489
- });