@functional-systems/lambdadb 0.3.2 → 0.3.3
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/commonjs/client.d.ts.map +1 -1
- package/dist/commonjs/client.js +27 -3
- package/dist/commonjs/client.js.map +1 -1
- package/dist/commonjs/lib/matchers.d.ts.map +1 -1
- package/dist/commonjs/lib/matchers.js +17 -1
- package/dist/commonjs/lib/matchers.js.map +1 -1
- package/dist/commonjs/lib/schemas.d.ts +6 -0
- package/dist/commonjs/lib/schemas.d.ts.map +1 -1
- package/dist/commonjs/lib/schemas.js +9 -0
- package/dist/commonjs/lib/schemas.js.map +1 -1
- package/dist/commonjs/models/collectionresponse.js +4 -4
- package/dist/commonjs/models/collectionresponse.js.map +1 -1
- package/dist/commonjs/models/errors/badrequesterror.d.ts.map +1 -1
- package/dist/commonjs/models/errors/badrequesterror.js +2 -1
- package/dist/commonjs/models/errors/badrequesterror.js.map +1 -1
- package/dist/commonjs/models/errors/internalservererror.d.ts.map +1 -1
- package/dist/commonjs/models/errors/internalservererror.js +2 -1
- package/dist/commonjs/models/errors/internalservererror.js.map +1 -1
- package/dist/commonjs/models/errors/resourcealreadyexistserror.d.ts.map +1 -1
- package/dist/commonjs/models/errors/resourcealreadyexistserror.js +2 -1
- package/dist/commonjs/models/errors/resourcealreadyexistserror.js.map +1 -1
- package/dist/commonjs/models/errors/resourcenotfounderror.d.ts.map +1 -1
- package/dist/commonjs/models/errors/resourcenotfounderror.js +2 -1
- package/dist/commonjs/models/errors/resourcenotfounderror.js.map +1 -1
- package/dist/commonjs/models/errors/toomanyrequestserror.d.ts.map +1 -1
- package/dist/commonjs/models/errors/toomanyrequestserror.js +2 -1
- package/dist/commonjs/models/errors/toomanyrequestserror.js.map +1 -1
- package/dist/commonjs/models/errors/unauthenticatederror.d.ts.map +1 -1
- package/dist/commonjs/models/errors/unauthenticatederror.js +2 -1
- package/dist/commonjs/models/errors/unauthenticatederror.js.map +1 -1
- package/dist/commonjs/models/indexconfigsunion.js +2 -2
- package/dist/commonjs/models/indexconfigsunion.js.map +1 -1
- package/dist/commonjs/models/operations/fetchdocs.js +1 -1
- package/dist/commonjs/models/operations/fetchdocs.js.map +1 -1
- package/dist/commonjs/models/operations/getbulkupsertdocs.js +3 -3
- package/dist/commonjs/models/operations/getbulkupsertdocs.js.map +1 -1
- package/dist/commonjs/models/operations/listcollections.js +1 -1
- package/dist/commonjs/models/operations/listcollections.js.map +1 -1
- package/dist/commonjs/models/operations/listdocs.js +2 -2
- package/dist/commonjs/models/operations/listdocs.js.map +1 -1
- package/dist/commonjs/models/operations/querycollection.js +3 -3
- package/dist/commonjs/models/operations/querycollection.js.map +1 -1
- package/dist/commonjs/models/partitionconfig.js +3 -3
- package/dist/commonjs/models/partitionconfig.js.map +1 -1
- package/dist/esm/client.d.ts.map +1 -1
- package/dist/esm/client.js +27 -3
- package/dist/esm/client.js.map +1 -1
- package/dist/esm/lib/matchers.d.ts.map +1 -1
- package/dist/esm/lib/matchers.js +17 -1
- package/dist/esm/lib/matchers.js.map +1 -1
- package/dist/esm/lib/schemas.d.ts +6 -0
- package/dist/esm/lib/schemas.d.ts.map +1 -1
- package/dist/esm/lib/schemas.js +9 -1
- package/dist/esm/lib/schemas.js.map +1 -1
- package/dist/esm/models/collectionresponse.js +5 -5
- package/dist/esm/models/collectionresponse.js.map +1 -1
- package/dist/esm/models/errors/badrequesterror.d.ts.map +1 -1
- package/dist/esm/models/errors/badrequesterror.js +2 -1
- package/dist/esm/models/errors/badrequesterror.js.map +1 -1
- package/dist/esm/models/errors/internalservererror.d.ts.map +1 -1
- package/dist/esm/models/errors/internalservererror.js +2 -1
- package/dist/esm/models/errors/internalservererror.js.map +1 -1
- package/dist/esm/models/errors/resourcealreadyexistserror.d.ts.map +1 -1
- package/dist/esm/models/errors/resourcealreadyexistserror.js +2 -1
- package/dist/esm/models/errors/resourcealreadyexistserror.js.map +1 -1
- package/dist/esm/models/errors/resourcenotfounderror.d.ts.map +1 -1
- package/dist/esm/models/errors/resourcenotfounderror.js +2 -1
- package/dist/esm/models/errors/resourcenotfounderror.js.map +1 -1
- package/dist/esm/models/errors/toomanyrequestserror.d.ts.map +1 -1
- package/dist/esm/models/errors/toomanyrequestserror.js +2 -1
- package/dist/esm/models/errors/toomanyrequestserror.js.map +1 -1
- package/dist/esm/models/errors/unauthenticatederror.d.ts.map +1 -1
- package/dist/esm/models/errors/unauthenticatederror.js +2 -1
- package/dist/esm/models/errors/unauthenticatederror.js.map +1 -1
- package/dist/esm/models/indexconfigsunion.js +3 -3
- package/dist/esm/models/indexconfigsunion.js.map +1 -1
- package/dist/esm/models/operations/fetchdocs.js +2 -2
- package/dist/esm/models/operations/fetchdocs.js.map +1 -1
- package/dist/esm/models/operations/getbulkupsertdocs.js +4 -4
- package/dist/esm/models/operations/getbulkupsertdocs.js.map +1 -1
- package/dist/esm/models/operations/listcollections.js +2 -2
- package/dist/esm/models/operations/listcollections.js.map +1 -1
- package/dist/esm/models/operations/listdocs.js +3 -3
- package/dist/esm/models/operations/listdocs.js.map +1 -1
- package/dist/esm/models/operations/querycollection.js +4 -4
- package/dist/esm/models/operations/querycollection.js.map +1 -1
- package/dist/esm/models/partitionconfig.js +4 -4
- package/dist/esm/models/partitionconfig.js.map +1 -1
- package/package.json +2 -2
- package/src/client.ts +32 -3
- package/src/lib/matchers.ts +18 -1
- package/src/lib/schemas.ts +12 -0
- package/src/models/collectionresponse.ts +5 -5
- package/src/models/errors/badrequesterror.ts +2 -1
- package/src/models/errors/internalservererror.ts +2 -1
- package/src/models/errors/resourcealreadyexistserror.ts +2 -1
- package/src/models/errors/resourcenotfounderror.ts +2 -1
- package/src/models/errors/toomanyrequestserror.ts +2 -1
- package/src/models/errors/unauthenticatederror.ts +2 -1
- package/src/models/indexconfigsunion.ts +3 -3
- package/src/models/operations/fetchdocs.ts +2 -2
- package/src/models/operations/getbulkupsertdocs.ts +4 -4
- package/src/models/operations/listcollections.ts +2 -2
- package/src/models/operations/listdocs.ts +3 -3
- package/src/models/operations/querycollection.ts +4 -4
- package/src/models/partitionconfig.ts +4 -4
- package/test/null-response.test.mjs +73 -0
- package/test/public-api.test.mjs +210 -0
- package/.devcontainer/devcontainer.json +0 -45
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import * as z from "zod/v3";
|
|
6
|
-
import { safeParse } from "../../lib/schemas.js";
|
|
6
|
+
import { nullToUndefined, safeParse } from "../../lib/schemas.js";
|
|
7
7
|
import { ClosedEnum } from "../../types/enums.js";
|
|
8
8
|
import { Result as SafeParseResult } from "../../types/fp.js";
|
|
9
9
|
import { SDKValidationError } from "../errors/sdkvalidationerror.js";
|
|
@@ -101,10 +101,10 @@ export const GetBulkUpsertDocsResponse$inboundSchema: z.ZodType<
|
|
|
101
101
|
unknown
|
|
102
102
|
> = z.object({
|
|
103
103
|
url: z.string(),
|
|
104
|
-
type: Type$inboundSchema.default("application/json"),
|
|
105
|
-
httpMethod: HttpMethod$inboundSchema.default("PUT"),
|
|
104
|
+
type: nullToUndefined(Type$inboundSchema.default("application/json")),
|
|
105
|
+
httpMethod: nullToUndefined(HttpMethod$inboundSchema.default("PUT")),
|
|
106
106
|
objectKey: z.string(),
|
|
107
|
-
sizeLimitBytes: z.number().int().default(209715200),
|
|
107
|
+
sizeLimitBytes: nullToUndefined(z.number().int().default(209715200)),
|
|
108
108
|
});
|
|
109
109
|
|
|
110
110
|
export function getBulkUpsertDocsResponseFromJSON(
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import * as z from "zod/v3";
|
|
6
|
-
import { safeParse } from "../../lib/schemas.js";
|
|
6
|
+
import { nullToUndefined, safeParse } from "../../lib/schemas.js";
|
|
7
7
|
import { Result as SafeParseResult } from "../../types/fp.js";
|
|
8
8
|
import { SDKValidationError } from "../errors/sdkvalidationerror.js";
|
|
9
9
|
import * as models from "../index.js";
|
|
@@ -50,7 +50,7 @@ export const ListCollectionsResponse$inboundSchema: z.ZodType<
|
|
|
50
50
|
unknown
|
|
51
51
|
> = z.object({
|
|
52
52
|
collections: z.array(models.CollectionResponse$inboundSchema),
|
|
53
|
-
nextPageToken: z.string().optional(),
|
|
53
|
+
nextPageToken: nullToUndefined(z.string().optional()),
|
|
54
54
|
});
|
|
55
55
|
|
|
56
56
|
export function listCollectionsResponseFromJSON(
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import * as z from "zod/v3";
|
|
6
|
-
import { safeParse } from "../../lib/schemas.js";
|
|
6
|
+
import { nullToUndefined, safeParse } from "../../lib/schemas.js";
|
|
7
7
|
import { Result as SafeParseResult } from "../../types/fp.js";
|
|
8
8
|
import { SDKValidationError } from "../errors/sdkvalidationerror.js";
|
|
9
9
|
|
|
@@ -89,9 +89,9 @@ export const ListDocsResponse$inboundSchema: z.ZodType<
|
|
|
89
89
|
> = z.object({
|
|
90
90
|
total: z.number().int(),
|
|
91
91
|
docs: z.array(ListDocsDoc$inboundSchema),
|
|
92
|
-
nextPageToken: z.string().optional(),
|
|
92
|
+
nextPageToken: nullToUndefined(z.string().optional()),
|
|
93
93
|
isDocsInline: z.boolean(),
|
|
94
|
-
docsUrl: z.string().optional(),
|
|
94
|
+
docsUrl: nullToUndefined(z.string().optional()),
|
|
95
95
|
});
|
|
96
96
|
|
|
97
97
|
export function listDocsResponseFromJSON(
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import * as z from "zod/v3";
|
|
6
6
|
import { remap as remap$ } from "../../lib/primitives.js";
|
|
7
|
-
import { safeParse } from "../../lib/schemas.js";
|
|
7
|
+
import { nullToUndefined, safeParse } from "../../lib/schemas.js";
|
|
8
8
|
import { Result as SafeParseResult } from "../../types/fp.js";
|
|
9
9
|
import { SDKValidationError } from "../errors/sdkvalidationerror.js";
|
|
10
10
|
import * as models from "../index.js";
|
|
@@ -156,7 +156,7 @@ export const QueryCollectionDoc$inboundSchema: z.ZodType<
|
|
|
156
156
|
unknown
|
|
157
157
|
> = z.object({
|
|
158
158
|
collection: z.string(),
|
|
159
|
-
score: z.number().optional(),
|
|
159
|
+
score: nullToUndefined(z.number().optional()),
|
|
160
160
|
doc: z.record(z.any()),
|
|
161
161
|
});
|
|
162
162
|
|
|
@@ -177,11 +177,11 @@ export const QueryCollectionResponse$inboundSchema: z.ZodType<
|
|
|
177
177
|
unknown
|
|
178
178
|
> = z.object({
|
|
179
179
|
took: z.number().int(),
|
|
180
|
-
maxScore: z.number().optional(),
|
|
180
|
+
maxScore: nullToUndefined(z.number().optional()),
|
|
181
181
|
total: z.number().int(),
|
|
182
182
|
docs: z.array(z.lazy(() => QueryCollectionDoc$inboundSchema)),
|
|
183
183
|
isDocsInline: z.boolean(),
|
|
184
|
-
docsUrl: z.string().optional(),
|
|
184
|
+
docsUrl: nullToUndefined(z.string().optional()),
|
|
185
185
|
});
|
|
186
186
|
|
|
187
187
|
export function queryCollectionResponseFromJSON(
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import * as z from "zod/v3";
|
|
6
|
-
import { safeParse } from "../lib/schemas.js";
|
|
6
|
+
import { nullToUndefined, safeParse } from "../lib/schemas.js";
|
|
7
7
|
import { ClosedEnum } from "../types/enums.js";
|
|
8
8
|
import { Result as SafeParseResult } from "../types/fp.js";
|
|
9
9
|
import { SDKValidationError } from "./errors/sdkvalidationerror.js";
|
|
@@ -47,9 +47,9 @@ export const PartitionConfig$inboundSchema: z.ZodType<
|
|
|
47
47
|
z.ZodTypeDef,
|
|
48
48
|
unknown
|
|
49
49
|
> = z.object({
|
|
50
|
-
fieldName: z.string().optional(),
|
|
51
|
-
dataType: DataType$inboundSchema.optional(),
|
|
52
|
-
numPartitions: z.number().int().optional(),
|
|
50
|
+
fieldName: nullToUndefined(z.string().optional()),
|
|
51
|
+
dataType: nullToUndefined(DataType$inboundSchema.optional()),
|
|
52
|
+
numPartitions: nullToUndefined(z.number().int().optional()),
|
|
53
53
|
});
|
|
54
54
|
/** @internal */
|
|
55
55
|
export type PartitionConfig$Outbound = {
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
|
|
4
|
+
import { LambdaDBClient } from "../dist/esm/index.js";
|
|
5
|
+
import { HTTPClient } from "../dist/esm/lib/http.js";
|
|
6
|
+
import { ResponseValidationError } from "../dist/esm/models/errors/responsevalidationerror.js";
|
|
7
|
+
import { QueryCollectionResponse$inboundSchema } from "../dist/esm/models/operations/querycollection.js";
|
|
8
|
+
|
|
9
|
+
function jsonResponse(body, init = {}) {
|
|
10
|
+
return new Response(JSON.stringify(body), {
|
|
11
|
+
status: 200,
|
|
12
|
+
headers: { "content-type": "application/json" },
|
|
13
|
+
...init,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
test("response schemas accept null for optional response fields", () => {
|
|
18
|
+
const parsed = QueryCollectionResponse$inboundSchema.parse({
|
|
19
|
+
took: 1,
|
|
20
|
+
maxScore: null,
|
|
21
|
+
total: 1,
|
|
22
|
+
docs: [{ collection: "items", score: null, doc: { id: "a" } }],
|
|
23
|
+
isDocsInline: false,
|
|
24
|
+
docsUrl: null,
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
assert.equal(parsed.maxScore, undefined);
|
|
28
|
+
assert.equal(parsed.docsUrl, undefined);
|
|
29
|
+
assert.equal(parsed.docs[0].score, undefined);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test("safe methods return ResponseValidationError for invalid JSON bodies", async () => {
|
|
33
|
+
const httpClient = new HTTPClient({
|
|
34
|
+
fetcher: async () =>
|
|
35
|
+
new Response("{", {
|
|
36
|
+
status: 200,
|
|
37
|
+
headers: { "content-type": "application/json" },
|
|
38
|
+
}),
|
|
39
|
+
});
|
|
40
|
+
const client = new LambdaDBClient({ httpClient, projectApiKey: "test-key" });
|
|
41
|
+
|
|
42
|
+
const result = await client.listCollectionsSafe();
|
|
43
|
+
|
|
44
|
+
assert.equal(result.ok, false);
|
|
45
|
+
assert.ok(result.error instanceof ResponseValidationError);
|
|
46
|
+
assert.equal(result.error.rawValue, "{");
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
test("docsUrl fetches treat null document payloads as an empty docs array", async () => {
|
|
50
|
+
const originalFetch = globalThis.fetch;
|
|
51
|
+
globalThis.fetch = async () => jsonResponse(null);
|
|
52
|
+
|
|
53
|
+
try {
|
|
54
|
+
const httpClient = new HTTPClient({
|
|
55
|
+
fetcher: async () =>
|
|
56
|
+
jsonResponse({
|
|
57
|
+
total: 1,
|
|
58
|
+
docs: [],
|
|
59
|
+
isDocsInline: false,
|
|
60
|
+
docsUrl: "https://example.test/docs.json",
|
|
61
|
+
}),
|
|
62
|
+
});
|
|
63
|
+
const client = new LambdaDBClient({ httpClient, projectApiKey: "test-key" });
|
|
64
|
+
|
|
65
|
+
const result = await client.collection("items").docs.listSafe();
|
|
66
|
+
|
|
67
|
+
assert.equal(result.ok, true);
|
|
68
|
+
assert.deepEqual(result.value.docs, []);
|
|
69
|
+
assert.equal(result.value.isDocsInline, true);
|
|
70
|
+
} finally {
|
|
71
|
+
globalThis.fetch = originalFetch;
|
|
72
|
+
}
|
|
73
|
+
});
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
BadRequestError,
|
|
6
|
+
HTTPClient,
|
|
7
|
+
LambdaDBClient,
|
|
8
|
+
} from "../dist/esm/index.js";
|
|
9
|
+
|
|
10
|
+
const BASE_URL = "https://api.test";
|
|
11
|
+
const PROJECT_NAME = "project-one";
|
|
12
|
+
|
|
13
|
+
function jsonResponse(body, init = {}) {
|
|
14
|
+
return new Response(JSON.stringify(body), {
|
|
15
|
+
status: 200,
|
|
16
|
+
headers: { "content-type": "application/json" },
|
|
17
|
+
...init,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function collectionFixture(collectionName, overrides = {}) {
|
|
22
|
+
return {
|
|
23
|
+
projectName: PROJECT_NAME,
|
|
24
|
+
collectionName,
|
|
25
|
+
indexConfigs: {},
|
|
26
|
+
numPartitions: 1,
|
|
27
|
+
numDocs: 2,
|
|
28
|
+
sourceProjectName: null,
|
|
29
|
+
sourceCollectionName: null,
|
|
30
|
+
sourceCollectionVersionId: null,
|
|
31
|
+
collectionStatus: "ACTIVE",
|
|
32
|
+
createdAt: 1700000000,
|
|
33
|
+
updatedAt: 1700000100,
|
|
34
|
+
dataUpdatedAt: 1700000200,
|
|
35
|
+
...overrides,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function createClient(handler) {
|
|
40
|
+
const calls = [];
|
|
41
|
+
const httpClient = new HTTPClient({
|
|
42
|
+
fetcher: async (request) => {
|
|
43
|
+
const body = await request.clone().text();
|
|
44
|
+
const call = {
|
|
45
|
+
body,
|
|
46
|
+
headers: Object.fromEntries(request.headers.entries()),
|
|
47
|
+
method: request.method,
|
|
48
|
+
url: new URL(request.url),
|
|
49
|
+
};
|
|
50
|
+
calls.push(call);
|
|
51
|
+
return handler(call, calls.length - 1);
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
const client = new LambdaDBClient({
|
|
56
|
+
baseUrl: BASE_URL,
|
|
57
|
+
httpClient,
|
|
58
|
+
projectApiKey: "test-key",
|
|
59
|
+
projectName: PROJECT_NAME,
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
return { calls, client };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
test("public client lists collections with project URL, auth header, and Date conversion", async () => {
|
|
66
|
+
const { calls, client } = createClient(() =>
|
|
67
|
+
jsonResponse({
|
|
68
|
+
collections: [collectionFixture("alpha")],
|
|
69
|
+
nextPageToken: null,
|
|
70
|
+
})
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
const result = await client.listCollections({ size: 5 });
|
|
74
|
+
|
|
75
|
+
assert.equal(calls.length, 1);
|
|
76
|
+
assert.equal(calls[0].method, "GET");
|
|
77
|
+
assert.equal(calls[0].url.pathname, "/projects/project-one/collections");
|
|
78
|
+
assert.equal(calls[0].url.searchParams.get("size"), "5");
|
|
79
|
+
assert.equal(calls[0].headers["x-api-key"], "test-key");
|
|
80
|
+
assert.equal(result.nextPageToken, undefined);
|
|
81
|
+
assert.equal(result.collections[0].collectionName, "alpha");
|
|
82
|
+
assert.ok(result.collections[0].createdAt instanceof Date);
|
|
83
|
+
assert.equal(result.collections[0].createdAt.toISOString(), "2023-11-14T22:13:20.000Z");
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test("public pagination helpers collect all collection pages", async () => {
|
|
87
|
+
const { calls, client } = createClient((call, index) => {
|
|
88
|
+
if (index === 0) {
|
|
89
|
+
return jsonResponse({
|
|
90
|
+
collections: [collectionFixture("alpha")],
|
|
91
|
+
nextPageToken: "next-page",
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
assert.equal(call.url.searchParams.get("pageToken"), "next-page");
|
|
96
|
+
return jsonResponse({
|
|
97
|
+
collections: [collectionFixture("beta")],
|
|
98
|
+
nextPageToken: null,
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
const result = await client.listAllCollections({ size: 1 });
|
|
103
|
+
|
|
104
|
+
assert.equal(calls.length, 2);
|
|
105
|
+
assert.deepEqual(
|
|
106
|
+
result.collections.map((collection) => collection.collectionName),
|
|
107
|
+
["alpha", "beta"],
|
|
108
|
+
);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test("collection docs helpers paginate through the user-facing scoped API", async () => {
|
|
112
|
+
const { calls, client } = createClient((call, index) => {
|
|
113
|
+
assert.equal(call.method, "GET");
|
|
114
|
+
assert.equal(call.url.pathname, "/projects/project-one/collections/items/docs");
|
|
115
|
+
|
|
116
|
+
if (index === 0) {
|
|
117
|
+
return jsonResponse({
|
|
118
|
+
total: 2,
|
|
119
|
+
docs: [{ collection: "items", doc: { id: "a" } }],
|
|
120
|
+
nextPageToken: "docs-page-2",
|
|
121
|
+
isDocsInline: true,
|
|
122
|
+
docsUrl: null,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
assert.equal(call.url.searchParams.get("pageToken"), "docs-page-2");
|
|
127
|
+
return jsonResponse({
|
|
128
|
+
total: 2,
|
|
129
|
+
docs: [{ collection: "items", doc: { id: "b" } }],
|
|
130
|
+
nextPageToken: null,
|
|
131
|
+
isDocsInline: true,
|
|
132
|
+
docsUrl: null,
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
const result = await client.collection("items").docs.listAll({ size: 1 });
|
|
137
|
+
|
|
138
|
+
assert.equal(calls.length, 2);
|
|
139
|
+
assert.equal(result.total, 2);
|
|
140
|
+
assert.deepEqual(result.docs, [
|
|
141
|
+
{ collection: "items", doc: { id: "a" } },
|
|
142
|
+
{ collection: "items", doc: { id: "b" } },
|
|
143
|
+
]);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
test("collection query fetches docsUrl and returns inline docs through the public API", async () => {
|
|
147
|
+
const originalFetch = globalThis.fetch;
|
|
148
|
+
const docsUrlCalls = [];
|
|
149
|
+
globalThis.fetch = async (input) => {
|
|
150
|
+
docsUrlCalls.push(String(input));
|
|
151
|
+
return jsonResponse({
|
|
152
|
+
docs: [{ collection: "items", score: 0.9, doc: { id: "a" } }],
|
|
153
|
+
});
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
try {
|
|
157
|
+
const { calls, client } = createClient((call) => {
|
|
158
|
+
assert.equal(call.method, "POST");
|
|
159
|
+
assert.equal(call.url.pathname, "/projects/project-one/collections/items/query");
|
|
160
|
+
assert.deepEqual(JSON.parse(call.body), {
|
|
161
|
+
query: { text: "hello" },
|
|
162
|
+
consistentRead: false,
|
|
163
|
+
includeVectors: false,
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
return jsonResponse({
|
|
167
|
+
took: 7,
|
|
168
|
+
maxScore: null,
|
|
169
|
+
total: 1,
|
|
170
|
+
docs: [],
|
|
171
|
+
isDocsInline: false,
|
|
172
|
+
docsUrl: "https://download.test/query-docs.json",
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
const result = await client.collection("items").querySafe({
|
|
177
|
+
query: { text: "hello" },
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
assert.equal(calls.length, 1);
|
|
181
|
+
assert.deepEqual(docsUrlCalls, ["https://download.test/query-docs.json"]);
|
|
182
|
+
assert.equal(result.ok, true);
|
|
183
|
+
assert.equal(result.value.isDocsInline, true);
|
|
184
|
+
assert.deepEqual(result.value.docs, [
|
|
185
|
+
{ collection: "items", score: 0.9, doc: { id: "a" } },
|
|
186
|
+
]);
|
|
187
|
+
} finally {
|
|
188
|
+
globalThis.fetch = originalFetch;
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
test("public safe methods expose typed API errors", async () => {
|
|
193
|
+
const { client } = createClient((call) => {
|
|
194
|
+
assert.equal(call.method, "POST");
|
|
195
|
+
assert.equal(call.url.pathname, "/projects/project-one/collections");
|
|
196
|
+
|
|
197
|
+
return jsonResponse(
|
|
198
|
+
{ message: null },
|
|
199
|
+
{ status: 400 },
|
|
200
|
+
);
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
const result = await client.createCollectionSafe({ collectionName: "items" });
|
|
204
|
+
|
|
205
|
+
assert.equal(result.ok, false);
|
|
206
|
+
assert.ok(result.error instanceof BadRequestError);
|
|
207
|
+
assert.equal(result.error.statusCode, 400);
|
|
208
|
+
assert.equal(result.error.body, "{\"message\":null}");
|
|
209
|
+
assert.equal(result.error.data$.message, undefined);
|
|
210
|
+
});
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
|
|
2
|
-
// README at: https://github.com/devcontainers/images/tree/main/src/typescript-node
|
|
3
|
-
{
|
|
4
|
-
"name": "TypeScript",
|
|
5
|
-
"image": "mcr.microsoft.com/devcontainers/typescript-node:1-20-bullseye",
|
|
6
|
-
// Features to add to the dev container. More info: https://containers.dev/features.
|
|
7
|
-
// "features": {},
|
|
8
|
-
// Use 'forwardPorts' to make a list of ports inside the container available locally.
|
|
9
|
-
// "forwardPorts": [],
|
|
10
|
-
// Use 'postCreateCommand' to run commands after the container is created.
|
|
11
|
-
"postCreateCommand": "sudo chmod +x ./.devcontainer/setup.sh && ./.devcontainer/setup.sh",
|
|
12
|
-
"customizations": {
|
|
13
|
-
"vscode": {
|
|
14
|
-
"extensions": [
|
|
15
|
-
"ms-vscode.vscode-typescript-tslint-plugin",
|
|
16
|
-
"esbenp.prettier-vscode",
|
|
17
|
-
"github.vscode-pull-request-github"
|
|
18
|
-
],
|
|
19
|
-
"settings": {
|
|
20
|
-
"files.eol": "\n",
|
|
21
|
-
"editor.formatOnSave": true,
|
|
22
|
-
"typescript.tsc.autoDetect": "on",
|
|
23
|
-
"typescript.updateImportsOnFileMove.enabled": "always",
|
|
24
|
-
"typescript.preferences.importModuleSpecifier": "relative",
|
|
25
|
-
"[typescript]": {
|
|
26
|
-
"editor.codeActionsOnSave": {
|
|
27
|
-
"source.organizeImports": true
|
|
28
|
-
}
|
|
29
|
-
},
|
|
30
|
-
"[typescriptreact]": {
|
|
31
|
-
"editor.codeActionsOnSave": {
|
|
32
|
-
"source.organizeImports": true
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
},
|
|
37
|
-
"codespaces": {
|
|
38
|
-
"openFiles": [
|
|
39
|
-
".devcontainer/README.md"
|
|
40
|
-
]
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
|
|
44
|
-
// "remoteUser": "root"
|
|
45
|
-
}
|