convex 1.36.1 → 1.37.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.
- package/CHANGELOG.md +47 -25
- package/dist/browser.bundle.js +1 -1
- package/dist/browser.bundle.js.map +1 -1
- package/dist/cjs/cli/codegen_templates/agentsmd.js +8 -2
- package/dist/cjs/cli/codegen_templates/agentsmd.js.map +2 -2
- package/dist/cjs/cli/codegen_templates/claudemd.js +2 -0
- package/dist/cjs/cli/codegen_templates/claudemd.js.map +2 -2
- package/dist/cjs/cli/configure.js +0 -8
- package/dist/cjs/cli/configure.js.map +2 -2
- package/dist/cjs/cli/deployment.js +2 -1
- package/dist/cjs/cli/deployment.js.map +2 -2
- package/dist/cjs/cli/deploymentToken.js +30 -0
- package/dist/cjs/cli/deploymentToken.js.map +7 -0
- package/dist/cjs/cli/deploymentTokenCreate.js +109 -0
- package/dist/cjs/cli/deploymentTokenCreate.js.map +7 -0
- package/dist/cjs/cli/deploymentTokenDelete.js +87 -0
- package/dist/cjs/cli/deploymentTokenDelete.js.map +7 -0
- package/dist/cjs/cli/envDefault.js +1 -1
- package/dist/cjs/cli/envDefault.js.map +1 -1
- package/dist/cjs/cli/generatedApi.js.map +1 -1
- package/dist/cjs/cli/lib/generatedFunctionLogsApi.js.map +1 -1
- package/dist/cjs/cli/lib/usage.js +13 -6
- package/dist/cjs/cli/lib/usage.js.map +2 -2
- package/dist/cjs/cli/lib/workos/environmentApi.js +6 -12
- package/dist/cjs/cli/lib/workos/environmentApi.js.map +3 -3
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/react/client.js +40 -42
- package/dist/cjs/react/client.js.map +2 -2
- package/dist/cjs/react/index.js +1 -0
- package/dist/cjs/react/index.js.map +2 -2
- package/dist/cjs/react/use_paginated_query.js +5 -46
- package/dist/cjs/react/use_paginated_query.js.map +2 -2
- package/dist/cjs/react/use_paginated_query2.js.map +2 -2
- package/dist/cjs/server/audit_logging.js +67 -0
- package/dist/cjs/server/audit_logging.js.map +7 -0
- package/dist/cjs/server/impl/meta_impl.js +27 -3
- package/dist/cjs/server/impl/meta_impl.js.map +2 -2
- package/dist/cjs/server/impl/registration_impl.js +2 -0
- package/dist/cjs/server/impl/registration_impl.js.map +2 -2
- package/dist/cjs/server/index.js +2 -0
- package/dist/cjs/server/index.js.map +2 -2
- package/dist/cjs/server/log.js +30 -0
- package/dist/cjs/server/log.js.map +7 -0
- package/dist/cjs/server/logVars.js +48 -0
- package/dist/cjs/server/logVars.js.map +7 -0
- package/dist/cjs/server/meta.js.map +1 -1
- package/dist/cjs/server/registration.js.map +1 -1
- package/dist/cjs-types/cli/codegen_templates/agentsmd.d.ts.map +1 -1
- package/dist/cjs-types/cli/codegen_templates/claudemd.d.ts.map +1 -1
- package/dist/cjs-types/cli/configure.d.ts.map +1 -1
- package/dist/cjs-types/cli/deployment.d.ts.map +1 -1
- package/dist/cjs-types/cli/deploymentToken.d.ts +3 -0
- package/dist/cjs-types/cli/deploymentToken.d.ts.map +1 -0
- package/dist/cjs-types/cli/deploymentToken.test.d.ts +2 -0
- package/dist/cjs-types/cli/deploymentToken.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/deploymentTokenCreate.d.ts +13 -0
- package/dist/cjs-types/cli/deploymentTokenCreate.d.ts.map +1 -0
- package/dist/cjs-types/cli/deploymentTokenDelete.d.ts +11 -0
- package/dist/cjs-types/cli/deploymentTokenDelete.d.ts.map +1 -0
- package/dist/cjs-types/cli/generatedApi.d.ts +1 -1
- package/dist/cjs-types/cli/generatedApi.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts +1 -0
- package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/usage.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/workos/environmentApi.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/workos/environmentApi.test.d.ts +2 -0
- package/dist/cjs-types/cli/lib/workos/environmentApi.test.d.ts.map +1 -0
- package/dist/cjs-types/index.d.ts +1 -1
- package/dist/cjs-types/react/client.d.ts +52 -0
- package/dist/cjs-types/react/client.d.ts.map +1 -1
- package/dist/cjs-types/react/index.d.ts +2 -2
- package/dist/cjs-types/react/index.d.ts.map +1 -1
- package/dist/cjs-types/react/use_paginated_query.d.ts.map +1 -1
- package/dist/cjs-types/react/use_paginated_query2.d.ts +63 -1
- package/dist/cjs-types/react/use_paginated_query2.d.ts.map +1 -1
- package/dist/cjs-types/server/api.intersect.test.d.ts +2 -0
- package/dist/cjs-types/server/api.intersect.test.d.ts.map +1 -0
- package/dist/cjs-types/server/audit_logging.d.ts +19 -0
- package/dist/cjs-types/server/audit_logging.d.ts.map +1 -0
- package/dist/cjs-types/server/audit_logging.test.d.ts +2 -0
- package/dist/cjs-types/server/audit_logging.test.d.ts.map +1 -0
- package/dist/cjs-types/server/impl/meta_impl.d.ts.map +1 -1
- package/dist/cjs-types/server/impl/registration_impl.d.ts.map +1 -1
- package/dist/cjs-types/server/index.d.ts +2 -2
- package/dist/cjs-types/server/index.d.ts.map +1 -1
- package/dist/cjs-types/server/log.d.ts +2 -0
- package/dist/cjs-types/server/log.d.ts.map +1 -0
- package/dist/cjs-types/server/logVars.d.ts +20 -0
- package/dist/cjs-types/server/logVars.d.ts.map +1 -0
- package/dist/cjs-types/server/meta.d.ts +40 -0
- package/dist/cjs-types/server/meta.d.ts.map +1 -1
- package/dist/cjs-types/server/registration.d.ts +5 -2
- package/dist/cjs-types/server/registration.d.ts.map +1 -1
- package/dist/cli.bundle.cjs +184 -34
- package/dist/cli.bundle.cjs.map +4 -4
- package/dist/esm/cli/codegen_templates/agentsmd.js +8 -2
- package/dist/esm/cli/codegen_templates/agentsmd.js.map +2 -2
- package/dist/esm/cli/codegen_templates/claudemd.js +2 -0
- package/dist/esm/cli/codegen_templates/claudemd.js.map +2 -2
- package/dist/esm/cli/configure.js +0 -8
- package/dist/esm/cli/configure.js.map +2 -2
- package/dist/esm/cli/deployment.js +2 -1
- package/dist/esm/cli/deployment.js.map +2 -2
- package/dist/esm/cli/deploymentToken.js +8 -0
- package/dist/esm/cli/deploymentToken.js.map +7 -0
- package/dist/esm/cli/deploymentTokenCreate.js +91 -0
- package/dist/esm/cli/deploymentTokenCreate.js.map +7 -0
- package/dist/esm/cli/deploymentTokenDelete.js +68 -0
- package/dist/esm/cli/deploymentTokenDelete.js.map +7 -0
- package/dist/esm/cli/envDefault.js +1 -1
- package/dist/esm/cli/envDefault.js.map +1 -1
- package/dist/esm/cli/lib/usage.js +15 -8
- package/dist/esm/cli/lib/usage.js.map +2 -2
- package/dist/esm/cli/lib/workos/environmentApi.js +6 -12
- package/dist/esm/cli/lib/workos/environmentApi.js.map +3 -3
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/react/client.js +38 -41
- package/dist/esm/react/client.js.map +2 -2
- package/dist/esm/react/index.js +4 -1
- package/dist/esm/react/index.js.map +2 -2
- package/dist/esm/react/use_paginated_query.js +5 -46
- package/dist/esm/react/use_paginated_query.js.map +2 -2
- package/dist/esm/react/use_paginated_query2.js.map +2 -2
- package/dist/esm/server/audit_logging.js +44 -0
- package/dist/esm/server/audit_logging.js.map +7 -0
- package/dist/esm/server/impl/meta_impl.js +27 -3
- package/dist/esm/server/impl/meta_impl.js.map +2 -2
- package/dist/esm/server/impl/registration_impl.js +2 -0
- package/dist/esm/server/impl/registration_impl.js.map +2 -2
- package/dist/esm/server/index.js +1 -0
- package/dist/esm/server/index.js.map +2 -2
- package/dist/esm/server/log.js +8 -0
- package/dist/esm/server/log.js.map +7 -0
- package/dist/esm/server/logVars.js +25 -0
- package/dist/esm/server/logVars.js.map +7 -0
- package/dist/esm-types/cli/codegen_templates/agentsmd.d.ts.map +1 -1
- package/dist/esm-types/cli/codegen_templates/claudemd.d.ts.map +1 -1
- package/dist/esm-types/cli/configure.d.ts.map +1 -1
- package/dist/esm-types/cli/deployment.d.ts.map +1 -1
- package/dist/esm-types/cli/deploymentToken.d.ts +3 -0
- package/dist/esm-types/cli/deploymentToken.d.ts.map +1 -0
- package/dist/esm-types/cli/deploymentToken.test.d.ts +2 -0
- package/dist/esm-types/cli/deploymentToken.test.d.ts.map +1 -0
- package/dist/esm-types/cli/deploymentTokenCreate.d.ts +13 -0
- package/dist/esm-types/cli/deploymentTokenCreate.d.ts.map +1 -0
- package/dist/esm-types/cli/deploymentTokenDelete.d.ts +11 -0
- package/dist/esm-types/cli/deploymentTokenDelete.d.ts.map +1 -0
- package/dist/esm-types/cli/generatedApi.d.ts +1 -1
- package/dist/esm-types/cli/generatedApi.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts +1 -0
- package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/usage.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/workos/environmentApi.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/workos/environmentApi.test.d.ts +2 -0
- package/dist/esm-types/cli/lib/workos/environmentApi.test.d.ts.map +1 -0
- package/dist/esm-types/index.d.ts +1 -1
- package/dist/esm-types/react/client.d.ts +52 -0
- package/dist/esm-types/react/client.d.ts.map +1 -1
- package/dist/esm-types/react/index.d.ts +2 -2
- package/dist/esm-types/react/index.d.ts.map +1 -1
- package/dist/esm-types/react/use_paginated_query.d.ts.map +1 -1
- package/dist/esm-types/react/use_paginated_query2.d.ts +63 -1
- package/dist/esm-types/react/use_paginated_query2.d.ts.map +1 -1
- package/dist/esm-types/server/api.intersect.test.d.ts +2 -0
- package/dist/esm-types/server/api.intersect.test.d.ts.map +1 -0
- package/dist/esm-types/server/audit_logging.d.ts +19 -0
- package/dist/esm-types/server/audit_logging.d.ts.map +1 -0
- package/dist/esm-types/server/audit_logging.test.d.ts +2 -0
- package/dist/esm-types/server/audit_logging.test.d.ts.map +1 -0
- package/dist/esm-types/server/impl/meta_impl.d.ts.map +1 -1
- package/dist/esm-types/server/impl/registration_impl.d.ts.map +1 -1
- package/dist/esm-types/server/index.d.ts +2 -2
- package/dist/esm-types/server/index.d.ts.map +1 -1
- package/dist/esm-types/server/log.d.ts +2 -0
- package/dist/esm-types/server/log.d.ts.map +1 -0
- package/dist/esm-types/server/logVars.d.ts +20 -0
- package/dist/esm-types/server/logVars.d.ts.map +1 -0
- package/dist/esm-types/server/meta.d.ts +40 -0
- package/dist/esm-types/server/meta.d.ts.map +1 -1
- package/dist/esm-types/server/registration.d.ts +5 -2
- package/dist/esm-types/server/registration.d.ts.map +1 -1
- package/dist/react.bundle.js +45 -88
- package/dist/react.bundle.js.map +2 -2
- package/package.json +1 -1
- package/src/cli/codegen_templates/agentsmd.ts +8 -2
- package/src/cli/codegen_templates/claudemd.ts +2 -0
- package/src/cli/configure.ts +0 -9
- package/src/cli/deployment.ts +3 -1
- package/src/cli/deploymentToken.test.ts +372 -0
- package/src/cli/deploymentToken.ts +11 -0
- package/src/cli/deploymentTokenCreate.ts +113 -0
- package/src/cli/deploymentTokenDelete.ts +91 -0
- package/src/cli/envDefault.ts +1 -1
- package/src/cli/generatedApi.ts +1 -1
- package/src/cli/lib/generatedFunctionLogsApi.ts +1 -0
- package/src/cli/lib/usage.ts +18 -8
- package/src/cli/lib/workos/environmentApi.test.ts +107 -0
- package/src/cli/lib/workos/environmentApi.ts +12 -19
- package/src/index.ts +1 -1
- package/src/react/client.test.tsx +10 -8
- package/src/react/client.ts +88 -96
- package/src/react/index.ts +6 -1
- package/src/react/use_paginated_query.test.tsx +215 -132
- package/src/react/use_paginated_query.ts +8 -142
- package/src/react/use_paginated_query2.ts +78 -5
- package/src/react/use_query_object_options.test.ts +8 -7
- package/src/react/use_query_result.test.ts +40 -7
- package/src/server/api.intersect.test.ts +109 -0
- package/src/server/audit_logging.test.ts +129 -0
- package/src/server/audit_logging.ts +75 -0
- package/src/server/impl/meta_impl.ts +28 -0
- package/src/server/impl/registration_impl.ts +2 -0
- package/src/server/index.ts +12 -0
- package/src/server/log.ts +16 -0
- package/src/server/logVars.ts +34 -0
- package/src/server/meta.ts +53 -1
- package/src/server/registration.ts +10 -8
package/src/cli/lib/usage.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { chalkStderr } from "chalk";
|
|
2
2
|
import { Context } from "../../bundler/context.js";
|
|
3
|
-
import { logWarning } from "../../bundler/log.js";
|
|
3
|
+
import { logVerbose, logWarning } from "../../bundler/log.js";
|
|
4
4
|
import { teamDashboardUrl } from "./dashboard.js";
|
|
5
5
|
import { fetchTeamAndProject } from "./api.js";
|
|
6
6
|
import { isAnonymousDeployment } from "./deployment.js";
|
|
7
|
-
import {
|
|
7
|
+
import { bigBrainAPIMaybeThrows } from "./utils/utils.js";
|
|
8
8
|
|
|
9
9
|
async function warn(
|
|
10
10
|
ctx: Context,
|
|
@@ -19,7 +19,7 @@ async function warn(
|
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
async function teamUsageState(ctx: Context, teamId: number) {
|
|
22
|
-
const { usageState } = (await
|
|
22
|
+
const { usageState } = (await bigBrainAPIMaybeThrows({
|
|
23
23
|
ctx,
|
|
24
24
|
method: "GET",
|
|
25
25
|
path: "dashboard/teams/" + teamId + "/usage/team_usage_state",
|
|
@@ -31,7 +31,7 @@ async function teamUsageState(ctx: Context, teamId: number) {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
async function teamSpendingLimitsState(ctx: Context, teamId: number) {
|
|
34
|
-
const response = (await
|
|
34
|
+
const response = (await bigBrainAPIMaybeThrows({
|
|
35
35
|
ctx,
|
|
36
36
|
method: "GET",
|
|
37
37
|
path: "dashboard/teams/" + teamId + "/get_spending_limits",
|
|
@@ -59,12 +59,22 @@ export async function usageStateWarning(
|
|
|
59
59
|
) {
|
|
60
60
|
return;
|
|
61
61
|
}
|
|
62
|
+
|
|
62
63
|
const { teamId, team } = await fetchTeamAndProject(ctx, targetDeployment);
|
|
63
64
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
65
|
+
let usageState: Awaited<ReturnType<typeof teamUsageState>>;
|
|
66
|
+
let spendingLimitsState: Awaited<ReturnType<typeof teamSpendingLimitsState>>;
|
|
67
|
+
try {
|
|
68
|
+
[usageState, spendingLimitsState] = await Promise.all([
|
|
69
|
+
teamUsageState(ctx, teamId),
|
|
70
|
+
teamSpendingLimitsState(ctx, teamId),
|
|
71
|
+
]);
|
|
72
|
+
} catch (err) {
|
|
73
|
+
// Non-fatal: usage warnings are advisory, so don't block `convex dev`
|
|
74
|
+
// if these endpoints error.
|
|
75
|
+
logVerbose("Skipping usage state warning:", err);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
68
78
|
if (spendingLimitsState === "Disabled") {
|
|
69
79
|
await warn(ctx, {
|
|
70
80
|
title:
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { test, expect, describe, beforeEach, vi } from "vitest";
|
|
2
|
+
import { Context } from "../../../bundler/context.js";
|
|
3
|
+
import { createCORSOrigin, createRedirectURI } from "./environmentApi.js";
|
|
4
|
+
|
|
5
|
+
const mockFetch = vi.fn();
|
|
6
|
+
global.fetch = mockFetch;
|
|
7
|
+
|
|
8
|
+
const ctx: Context = {
|
|
9
|
+
crash: vi.fn(async (args: { printedMessage: string | null }) => {
|
|
10
|
+
throw new Error(args.printedMessage ?? "crash");
|
|
11
|
+
}),
|
|
12
|
+
} as unknown as Context;
|
|
13
|
+
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
vi.clearAllMocks();
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
describe("createRedirectURI", () => {
|
|
19
|
+
test("returns modified: true on a successful response", async () => {
|
|
20
|
+
mockFetch.mockResolvedValue(new Response(null, { status: 201 }));
|
|
21
|
+
await expect(
|
|
22
|
+
createRedirectURI(ctx, "key", "http://localhost:5173"),
|
|
23
|
+
).resolves.toEqual({ modified: true });
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
test("returns modified: false when the URI already exists", async () => {
|
|
27
|
+
mockFetch.mockResolvedValue(
|
|
28
|
+
new Response(
|
|
29
|
+
`{"message":"Redirect URI 'http://localhost:5173' already exists.","error":"Unprocessable Entity"}`,
|
|
30
|
+
{ status: 422 },
|
|
31
|
+
),
|
|
32
|
+
);
|
|
33
|
+
await expect(
|
|
34
|
+
createRedirectURI(ctx, "key", "http://localhost:5173"),
|
|
35
|
+
).resolves.toEqual({ modified: false });
|
|
36
|
+
expect(ctx.crash).not.toHaveBeenCalled();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test("crashes with the body for a non-duplicate 422", async () => {
|
|
40
|
+
const body = `{"message":"Redirect URI 'test' is invalid.","error":"Unprocessable Entity"}`;
|
|
41
|
+
mockFetch.mockResolvedValue(new Response(body, { status: 422 }));
|
|
42
|
+
await expect(createRedirectURI(ctx, "key", "test")).rejects.toThrow(
|
|
43
|
+
`Failed to create redirect URI: 422 ${body}`,
|
|
44
|
+
);
|
|
45
|
+
expect(ctx.crash).toHaveBeenCalledWith(
|
|
46
|
+
expect.objectContaining({
|
|
47
|
+
exitCode: 1,
|
|
48
|
+
errorType: "fatal",
|
|
49
|
+
printedMessage: `Failed to create redirect URI: 422 ${body}`,
|
|
50
|
+
}),
|
|
51
|
+
);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test("crashes with the body for non-422 errors", async () => {
|
|
55
|
+
const body = `{"message":"Unauthorized"}`;
|
|
56
|
+
mockFetch.mockResolvedValue(new Response(body, { status: 401 }));
|
|
57
|
+
await expect(createRedirectURI(ctx, "key", "http://x")).rejects.toThrow(
|
|
58
|
+
`Failed to create redirect URI: 401 ${body}`,
|
|
59
|
+
);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
describe("createCORSOrigin", () => {
|
|
64
|
+
test("returns modified: true on a successful response", async () => {
|
|
65
|
+
mockFetch.mockResolvedValue(new Response(null, { status: 201 }));
|
|
66
|
+
await expect(
|
|
67
|
+
createCORSOrigin(ctx, "key", "http://localhost:5173"),
|
|
68
|
+
).resolves.toEqual({ modified: true });
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
test("returns modified: false on duplicate_cors_origin", async () => {
|
|
72
|
+
mockFetch.mockResolvedValue(
|
|
73
|
+
new Response(`{"code":"duplicate_cors_origin","message":"..."}`, {
|
|
74
|
+
status: 409,
|
|
75
|
+
}),
|
|
76
|
+
);
|
|
77
|
+
await expect(
|
|
78
|
+
createCORSOrigin(ctx, "key", "http://localhost:5173"),
|
|
79
|
+
).resolves.toEqual({ modified: false });
|
|
80
|
+
expect(ctx.crash).not.toHaveBeenCalled();
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
test("returns modified: false when the origin already exists", async () => {
|
|
84
|
+
mockFetch.mockResolvedValue(
|
|
85
|
+
new Response(`{"message":"CORS origin already exists."}`, {
|
|
86
|
+
status: 409,
|
|
87
|
+
}),
|
|
88
|
+
);
|
|
89
|
+
await expect(
|
|
90
|
+
createCORSOrigin(ctx, "key", "http://localhost:5173"),
|
|
91
|
+
).resolves.toEqual({ modified: false });
|
|
92
|
+
expect(ctx.crash).not.toHaveBeenCalled();
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
test("crashes with the body for a non-duplicate 409", async () => {
|
|
96
|
+
const body = `{"message":"Some other conflict."}`;
|
|
97
|
+
mockFetch.mockResolvedValue(new Response(body, { status: 409 }));
|
|
98
|
+
await expect(createCORSOrigin(ctx, "key", "http://x")).rejects.toThrow(
|
|
99
|
+
`Failed to create CORS origin: 409 ${body}`,
|
|
100
|
+
);
|
|
101
|
+
expect(ctx.crash).toHaveBeenCalledWith(
|
|
102
|
+
expect.objectContaining({
|
|
103
|
+
printedMessage: `Failed to create CORS origin: 409 ${body}`,
|
|
104
|
+
}),
|
|
105
|
+
);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
@@ -35,15 +35,11 @@ export async function createRedirectURI(
|
|
|
35
35
|
);
|
|
36
36
|
|
|
37
37
|
if (!response.ok) {
|
|
38
|
-
if (response.status === 422) {
|
|
39
|
-
const errorText = await response.text();
|
|
40
|
-
if (errorText.includes("already exists")) {
|
|
41
|
-
// This redirect URI already exists.
|
|
42
|
-
return { modified: false };
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
38
|
const errorText = await response.text();
|
|
39
|
+
if (response.status === 422 && errorText.includes("already exists")) {
|
|
40
|
+
// This redirect URI already exists.
|
|
41
|
+
return { modified: false };
|
|
42
|
+
}
|
|
47
43
|
return await ctx.crash({
|
|
48
44
|
exitCode: 1,
|
|
49
45
|
errorType: "fatal",
|
|
@@ -109,18 +105,15 @@ export async function createCORSOrigin(
|
|
|
109
105
|
);
|
|
110
106
|
|
|
111
107
|
if (!response.ok) {
|
|
112
|
-
if (response.status === 409) {
|
|
113
|
-
const errorText = await response.text();
|
|
114
|
-
if (
|
|
115
|
-
errorText.includes("duplicate_cors_origin") ||
|
|
116
|
-
errorText.includes("already exists")
|
|
117
|
-
) {
|
|
118
|
-
// This CORS origin already exists.
|
|
119
|
-
return { modified: false };
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
108
|
const errorText = await response.text();
|
|
109
|
+
if (
|
|
110
|
+
response.status === 409 &&
|
|
111
|
+
(errorText.includes("duplicate_cors_origin") ||
|
|
112
|
+
errorText.includes("already exists"))
|
|
113
|
+
) {
|
|
114
|
+
// This CORS origin already exists.
|
|
115
|
+
return { modified: false };
|
|
116
|
+
}
|
|
124
117
|
return await ctx.crash({
|
|
125
118
|
exitCode: 1,
|
|
126
119
|
errorType: "fatal",
|
package/src/index.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = "1.
|
|
1
|
+
export const version = "1.37.0";
|
|
@@ -4,7 +4,12 @@
|
|
|
4
4
|
import { test, expect, describe, vi } from "vitest";
|
|
5
5
|
import ws from "ws";
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
ConvexReactClient,
|
|
9
|
+
createMutation,
|
|
10
|
+
useQuery,
|
|
11
|
+
useQuery_experimental,
|
|
12
|
+
} from "./client.js";
|
|
8
13
|
import { convexQueryOptions } from "../browser/query_options.js";
|
|
9
14
|
import { ConvexProvider } from "./index.js";
|
|
10
15
|
import React from "react";
|
|
@@ -114,14 +119,14 @@ describe("useQuery", () => {
|
|
|
114
119
|
expect(result.current).toStrictEqual(undefined);
|
|
115
120
|
});
|
|
116
121
|
|
|
117
|
-
test("object form returns success result", () => {
|
|
122
|
+
test("useQuery_experimental object form returns success result", () => {
|
|
118
123
|
const client = createClientWithQuery();
|
|
119
124
|
const wrapper = ({ children }: any) => (
|
|
120
125
|
<ConvexProvider client={client}>{children}</ConvexProvider>
|
|
121
126
|
);
|
|
122
127
|
const { result } = renderHook(
|
|
123
128
|
() =>
|
|
124
|
-
|
|
129
|
+
useQuery_experimental({
|
|
125
130
|
query: anyApi.myQuery.default,
|
|
126
131
|
args: {},
|
|
127
132
|
}),
|
|
@@ -129,27 +134,24 @@ describe("useQuery", () => {
|
|
|
129
134
|
);
|
|
130
135
|
expect(result.current).toStrictEqual({
|
|
131
136
|
data: "queryResult",
|
|
132
|
-
error: undefined,
|
|
133
137
|
status: "success",
|
|
134
138
|
});
|
|
135
139
|
});
|
|
136
140
|
|
|
137
|
-
test("object form returns pending when skipped", () => {
|
|
141
|
+
test("useQuery_experimental object form returns pending when skipped", () => {
|
|
138
142
|
const client = createClientWithQuery();
|
|
139
143
|
const wrapper = ({ children }: any) => (
|
|
140
144
|
<ConvexProvider client={client}>{children}</ConvexProvider>
|
|
141
145
|
);
|
|
142
146
|
const { result } = renderHook(
|
|
143
147
|
() =>
|
|
144
|
-
|
|
148
|
+
useQuery_experimental({
|
|
145
149
|
query: anyApi.myQuery.default,
|
|
146
150
|
args: "skip",
|
|
147
151
|
}),
|
|
148
152
|
{ wrapper },
|
|
149
153
|
);
|
|
150
154
|
expect(result.current).toStrictEqual({
|
|
151
|
-
data: undefined,
|
|
152
|
-
error: undefined,
|
|
153
155
|
status: "pending",
|
|
154
156
|
});
|
|
155
157
|
});
|
package/src/react/client.ts
CHANGED
|
@@ -800,31 +800,22 @@ export type OptionalRestArgsOrSkip<FuncRef extends FunctionReference<any>> =
|
|
|
800
800
|
: [args: FuncRef["_args"] | "skip"];
|
|
801
801
|
|
|
802
802
|
/**
|
|
803
|
-
* Result returned by object-form {@link
|
|
803
|
+
* Result returned by object-form {@link useQuery_experimental}.
|
|
804
804
|
*
|
|
805
|
-
* @
|
|
805
|
+
* @public
|
|
806
806
|
*/
|
|
807
|
-
export type UseQueryResult<QueryResult> =
|
|
808
|
-
| {
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
status: "error";
|
|
817
|
-
}
|
|
818
|
-
| {
|
|
819
|
-
data: undefined;
|
|
820
|
-
error: undefined;
|
|
821
|
-
status: "pending";
|
|
822
|
-
};
|
|
823
|
-
|
|
824
|
-
type UseQueryOptions<Query extends FunctionReference<"query">> = {
|
|
807
|
+
export type UseQueryResult<QueryResult, ThrowOnError extends boolean = false> =
|
|
808
|
+
| { status: "pending" }
|
|
809
|
+
| { status: "success"; data: QueryResult }
|
|
810
|
+
| (ThrowOnError extends true ? never : { status: "error"; error: Error });
|
|
811
|
+
|
|
812
|
+
type UseQueryOptions<
|
|
813
|
+
Query extends FunctionReference<"query">,
|
|
814
|
+
ThrowOnError extends boolean,
|
|
815
|
+
> = {
|
|
825
816
|
query: Query;
|
|
826
817
|
args: FunctionArgs<Query> | "skip";
|
|
827
|
-
throwOnError?:
|
|
818
|
+
throwOnError?: ThrowOnError;
|
|
828
819
|
};
|
|
829
820
|
|
|
830
821
|
/**
|
|
@@ -873,18 +864,50 @@ type UseQueryOptions<Query extends FunctionReference<"query">> = {
|
|
|
873
864
|
export function useQuery<Query extends FunctionReference<"query">>(
|
|
874
865
|
query: Query,
|
|
875
866
|
...args: OptionalRestArgsOrSkip<Query>
|
|
876
|
-
): Query["_returnType"] | undefined
|
|
867
|
+
): Query["_returnType"] | undefined {
|
|
868
|
+
const skip = args[0] === "skip";
|
|
869
|
+
const argsObject = args[0] === "skip" ? {} : parseArgs(args[0]);
|
|
870
|
+
const queryReference =
|
|
871
|
+
typeof query === "string"
|
|
872
|
+
? makeFunctionReference<"query", any, any>(query)
|
|
873
|
+
: query;
|
|
874
|
+
|
|
875
|
+
const queryName = getFunctionName(queryReference);
|
|
876
|
+
|
|
877
|
+
const queries = useMemo(
|
|
878
|
+
() =>
|
|
879
|
+
skip
|
|
880
|
+
? ({} as RequestForQueries)
|
|
881
|
+
: { query: { query: queryReference, args: argsObject } },
|
|
882
|
+
// Stringify args so args that are semantically the same don't trigger a
|
|
883
|
+
// rerender. Saves developers from adding `useMemo` on every args usage.
|
|
884
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
885
|
+
[JSON.stringify(convexToJson(argsObject)), queryName, skip],
|
|
886
|
+
);
|
|
887
|
+
|
|
888
|
+
const results = useQueries(queries);
|
|
889
|
+
const result = results["query"];
|
|
890
|
+
|
|
891
|
+
if (result instanceof Error) {
|
|
892
|
+
throw result;
|
|
893
|
+
}
|
|
894
|
+
return result;
|
|
895
|
+
}
|
|
877
896
|
|
|
878
897
|
/**
|
|
879
898
|
* Load a reactive query within a React component using an options object.
|
|
880
899
|
*
|
|
881
|
-
* This is an
|
|
900
|
+
* This is an experimental form of {@link useQuery} that accepts a single
|
|
882
901
|
* {@link UseQueryOptions} object instead of positional arguments.
|
|
883
|
-
*
|
|
902
|
+
*
|
|
903
|
+
* Consumers are expected to check the returned object `status` field to
|
|
904
|
+
* make proper use of the result. If an error occurs, it will be present
|
|
905
|
+
* in the result object unless `throwOnError` is `true`, in which case
|
|
906
|
+
* the error will be thrown instead.
|
|
884
907
|
*
|
|
885
908
|
* @example
|
|
886
909
|
* ```tsx
|
|
887
|
-
* import { useQuery } from "convex/react";
|
|
910
|
+
* import { useQuery_experimental as useQuery } from "convex/react";
|
|
888
911
|
* import { api } from "../convex/_generated/api";
|
|
889
912
|
*
|
|
890
913
|
* function TaskList() {
|
|
@@ -900,55 +923,35 @@ export function useQuery<Query extends FunctionReference<"query">>(
|
|
|
900
923
|
* @returns the current query state as a {@link UseQueryResult} object.
|
|
901
924
|
*
|
|
902
925
|
* @see https://docs.convex.dev/client/react#fetching-data
|
|
903
|
-
* @
|
|
926
|
+
* @public
|
|
904
927
|
*/
|
|
905
|
-
export function
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
: query;
|
|
930
|
-
if (queryOrOptions.args !== "skip") {
|
|
931
|
-
argsObject = parseArgs(queryOrOptions.args as Record<string, Value>);
|
|
932
|
-
}
|
|
933
|
-
} else {
|
|
934
|
-
const query = queryOrOptions;
|
|
935
|
-
queryReference =
|
|
936
|
-
typeof query === "string"
|
|
937
|
-
? (makeFunctionReference<"query", any, any>(query) as Query)
|
|
938
|
-
: query;
|
|
939
|
-
argsObject = args[0] === "skip" ? {} : parseArgs(args[0] as Query["_args"]);
|
|
940
|
-
}
|
|
941
|
-
|
|
942
|
-
const queryName = queryReference
|
|
943
|
-
? getFunctionName(queryReference)
|
|
944
|
-
: undefined;
|
|
945
|
-
const skip =
|
|
946
|
-
(isObjectOptions && queryOrOptions.args === "skip") ||
|
|
947
|
-
(!isObjectOptions && args[0] === "skip");
|
|
948
|
-
|
|
928
|
+
export function useQuery_experimental<
|
|
929
|
+
Query extends FunctionReference<"query">,
|
|
930
|
+
ThrowOnError extends boolean = false,
|
|
931
|
+
>(
|
|
932
|
+
options: UseQueryOptions<Query, ThrowOnError>,
|
|
933
|
+
): UseQueryResult<Query["_returnType"], ThrowOnError>;
|
|
934
|
+
|
|
935
|
+
export function useQuery_experimental<
|
|
936
|
+
Query extends FunctionReference<"query">,
|
|
937
|
+
ThrowOnError extends boolean = false,
|
|
938
|
+
>(
|
|
939
|
+
options: UseQueryOptions<Query, ThrowOnError>,
|
|
940
|
+
): UseQueryResult<Query["_returnType"], false> {
|
|
941
|
+
const throwOnError = options.throwOnError ?? false;
|
|
942
|
+
const queryReference =
|
|
943
|
+
typeof options.query === "string"
|
|
944
|
+
? (makeFunctionReference<"query", any, any>(options.query) as Query)
|
|
945
|
+
: options.query;
|
|
946
|
+
const skip = options.args === "skip";
|
|
947
|
+
const argsObject = !skip
|
|
948
|
+
? parseArgs(options.args as Record<string, Value>)
|
|
949
|
+
: {};
|
|
950
|
+
|
|
951
|
+
const queryName = getFunctionName(queryReference);
|
|
949
952
|
const queries = useMemo(
|
|
950
953
|
() =>
|
|
951
|
-
skip
|
|
954
|
+
skip
|
|
952
955
|
? ({} as RequestForQueries)
|
|
953
956
|
: { query: { query: queryReference, args: argsObject } },
|
|
954
957
|
// Stringify args so args that are semantically the same don't trigger a
|
|
@@ -960,37 +963,26 @@ export function useQuery<Query extends FunctionReference<"query">>(
|
|
|
960
963
|
const results = useQueries(queries);
|
|
961
964
|
const result = results["query"];
|
|
962
965
|
|
|
963
|
-
if (
|
|
964
|
-
if (
|
|
965
|
-
|
|
966
|
-
throw result;
|
|
967
|
-
}
|
|
968
|
-
return {
|
|
969
|
-
data: undefined,
|
|
970
|
-
error: result,
|
|
971
|
-
status: "error",
|
|
972
|
-
};
|
|
973
|
-
}
|
|
974
|
-
|
|
975
|
-
if (result === undefined) {
|
|
976
|
-
return {
|
|
977
|
-
data: undefined,
|
|
978
|
-
error: undefined,
|
|
979
|
-
status: "pending",
|
|
980
|
-
};
|
|
966
|
+
if (result instanceof Error) {
|
|
967
|
+
if (throwOnError) {
|
|
968
|
+
throw result;
|
|
981
969
|
}
|
|
982
|
-
|
|
983
970
|
return {
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
status: "success",
|
|
971
|
+
error: result,
|
|
972
|
+
status: "error",
|
|
987
973
|
};
|
|
988
974
|
}
|
|
989
975
|
|
|
990
|
-
if (result
|
|
991
|
-
|
|
976
|
+
if (result === undefined) {
|
|
977
|
+
return {
|
|
978
|
+
status: "pending",
|
|
979
|
+
};
|
|
992
980
|
}
|
|
993
|
-
|
|
981
|
+
|
|
982
|
+
return {
|
|
983
|
+
data: result,
|
|
984
|
+
status: "success",
|
|
985
|
+
};
|
|
994
986
|
}
|
|
995
987
|
|
|
996
988
|
/**
|
package/src/react/index.ts
CHANGED
|
@@ -61,7 +61,11 @@
|
|
|
61
61
|
* @module
|
|
62
62
|
*/
|
|
63
63
|
export * from "./use_paginated_query.js";
|
|
64
|
-
export {
|
|
64
|
+
export {
|
|
65
|
+
usePaginatedQuery_experimental,
|
|
66
|
+
type UsePaginatedQueryOptions,
|
|
67
|
+
type UsePaginatedQueryObjectReturnType,
|
|
68
|
+
} from "./use_paginated_query2.js";
|
|
65
69
|
export { usePaginatedQuery } from "./use_paginated_query.js";
|
|
66
70
|
export { useQueries, type RequestForQueries } from "./use_queries.js";
|
|
67
71
|
export type { AuthTokenFetcher } from "../browser/sync/client.js";
|
|
@@ -82,6 +86,7 @@ export {
|
|
|
82
86
|
useConvex,
|
|
83
87
|
ConvexProvider,
|
|
84
88
|
useQuery,
|
|
89
|
+
useQuery_experimental,
|
|
85
90
|
useMutation,
|
|
86
91
|
useAction,
|
|
87
92
|
useConvexConnectionState,
|