Compare commits

..

5 Commits

Author SHA1 Message Date
7aa6b22c71 test 2026-02-12 21:18:29 +08:00
7c28690eaa test 2026-01-25 19:18:59 +08:00
fea68a736f temp 2026-01-24 21:17:11 +08:00
a83dc1bf23 Merge branch 'main' of https://git.xiongxiao.me/abearxiong/test-convex 2026-01-24 17:02:05 +08:00
ce6bc3e48e temp 2026-01-24 17:01:39 +08:00
19 changed files with 859 additions and 138 deletions

View File

@@ -0,0 +1,46 @@
/* eslint-disable */
/**
* Generated `api` utility.
*
* THIS CODE IS AUTOMATICALLY GENERATED.
*
* To regenerate, run `npx convex dev`.
* @module
*/
import type {
ApiFromModules,
FilterApi,
FunctionReference,
} from "convex/server";
import { anyApi, componentsGeneric } from "convex/server";
const fullApi: ApiFromModules<{}> = anyApi as any;
/**
* A utility for referencing Convex functions in your app's public API.
*
* Usage:
* ```js
* const myFunctionReference = api.myModule.myFunction;
* ```
*/
export const api: FilterApi<
typeof fullApi,
FunctionReference<any, "public">
> = anyApi as any;
/**
* A utility for referencing Convex functions in your app's internal API.
*
* Usage:
* ```js
* const myFunctionReference = internal.myModule.myFunction;
* ```
*/
export const internal: FilterApi<
typeof fullApi,
FunctionReference<any, "internal">
> = anyApi as any;
export const components = componentsGeneric() as unknown as {};

View File

@@ -0,0 +1,25 @@
/* eslint-disable */
/**
* Generated `ComponentApi` utility.
*
* THIS CODE IS AUTOMATICALLY GENERATED.
*
* To regenerate, run `npx convex dev`.
* @module
*/
import type { FunctionReference } from "convex/server";
/**
* A utility for referencing a Convex component's exposed API.
*
* Useful when expecting a parameter like `components.myComponent`.
* Usage:
* ```ts
* async function myFunction(ctx: QueryCtx, component: ComponentApi) {
* return ctx.runQuery(component.someFile.someQuery, { ...args });
* }
* ```
*/
export type ComponentApi<Name extends string | undefined = string | undefined> =
{};

View File

@@ -0,0 +1,60 @@
/* eslint-disable */
/**
* Generated data model types.
*
* THIS CODE IS AUTOMATICALLY GENERATED.
*
* To regenerate, run `npx convex dev`.
* @module
*/
import type {
DataModelFromSchemaDefinition,
DocumentByName,
TableNamesInDataModel,
SystemTableNames,
} from "convex/server";
import type { GenericId } from "convex/values";
import schema from "../schema.js";
/**
* The names of all of your Convex tables.
*/
export type TableNames = TableNamesInDataModel<DataModel>;
/**
* The type of a document stored in Convex.
*
* @typeParam TableName - A string literal type of the table name (like "users").
*/
export type Doc<TableName extends TableNames> = DocumentByName<
DataModel,
TableName
>;
/**
* An identifier for a document in Convex.
*
* Convex documents are uniquely identified by their `Id`, which is accessible
* on the `_id` field. To learn more, see [Document IDs](https://docs.convex.dev/using/document-ids).
*
* Documents can be loaded using `db.get(tableName, id)` in query and mutation functions.
*
* IDs are just strings at runtime, but this type can be used to distinguish them from other
* strings when type checking.
*
* @typeParam TableName - A string literal type of the table name (like "users").
*/
export type Id<TableName extends TableNames | SystemTableNames> =
GenericId<TableName>;
/**
* A type describing your Convex data model.
*
* This type includes information about what tables you have, the type of
* documents stored in those tables, and the indexes defined on them.
*
* This type is used to parameterize methods like `queryGeneric` and
* `mutationGeneric` to make them type-safe.
*/
export type DataModel = DataModelFromSchemaDefinition<typeof schema>;

View File

@@ -0,0 +1,156 @@
/* eslint-disable */
/**
* Generated utilities for implementing server-side Convex query and mutation functions.
*
* THIS CODE IS AUTOMATICALLY GENERATED.
*
* To regenerate, run `npx convex dev`.
* @module
*/
import type {
ActionBuilder,
HttpActionBuilder,
MutationBuilder,
QueryBuilder,
GenericActionCtx,
GenericMutationCtx,
GenericQueryCtx,
GenericDatabaseReader,
GenericDatabaseWriter,
} from "convex/server";
import {
actionGeneric,
httpActionGeneric,
queryGeneric,
mutationGeneric,
internalActionGeneric,
internalMutationGeneric,
internalQueryGeneric,
} from "convex/server";
import type { DataModel } from "./dataModel.js";
/**
* Define a query in this Convex app's public API.
*
* This function will be allowed to read your Convex database and will be accessible from the client.
*
* @param func - The query function. It receives a {@link QueryCtx} as its first argument.
* @returns The wrapped query. Include this as an `export` to name it and make it accessible.
*/
export const query: QueryBuilder<DataModel, "public"> = queryGeneric;
/**
* Define a query that is only accessible from other Convex functions (but not from the client).
*
* This function will be allowed to read from your Convex database. It will not be accessible from the client.
*
* @param func - The query function. It receives a {@link QueryCtx} as its first argument.
* @returns The wrapped query. Include this as an `export` to name it and make it accessible.
*/
export const internalQuery: QueryBuilder<DataModel, "internal"> =
internalQueryGeneric;
/**
* Define a mutation in this Convex app's public API.
*
* This function will be allowed to modify your Convex database and will be accessible from the client.
*
* @param func - The mutation function. It receives a {@link MutationCtx} as its first argument.
* @returns The wrapped mutation. Include this as an `export` to name it and make it accessible.
*/
export const mutation: MutationBuilder<DataModel, "public"> = mutationGeneric;
/**
* Define a mutation that is only accessible from other Convex functions (but not from the client).
*
* This function will be allowed to modify your Convex database. It will not be accessible from the client.
*
* @param func - The mutation function. It receives a {@link MutationCtx} as its first argument.
* @returns The wrapped mutation. Include this as an `export` to name it and make it accessible.
*/
export const internalMutation: MutationBuilder<DataModel, "internal"> =
internalMutationGeneric;
/**
* Define an action in this Convex app's public API.
*
* An action is a function which can execute any JavaScript code, including non-deterministic
* code and code with side-effects, like calling third-party services.
* They can be run in Convex's JavaScript environment or in Node.js using the "use node" directive.
* They can interact with the database indirectly by calling queries and mutations using the {@link ActionCtx}.
*
* @param func - The action. It receives an {@link ActionCtx} as its first argument.
* @returns The wrapped action. Include this as an `export` to name it and make it accessible.
*/
export const action: ActionBuilder<DataModel, "public"> = actionGeneric;
/**
* Define an action that is only accessible from other Convex functions (but not from the client).
*
* @param func - The function. It receives an {@link ActionCtx} as its first argument.
* @returns The wrapped function. Include this as an `export` to name it and make it accessible.
*/
export const internalAction: ActionBuilder<DataModel, "internal"> =
internalActionGeneric;
/**
* Define an HTTP action.
*
* The wrapped function will be used to respond to HTTP requests received
* by a Convex deployment if the requests matches the path and method where
* this action is routed. Be sure to route your httpAction in `convex/http.js`.
*
* @param func - The function. It receives an {@link ActionCtx} as its first argument
* and a Fetch API `Request` object as its second.
* @returns The wrapped function. Import this function from `convex/http.js` and route it to hook it up.
*/
export const httpAction: HttpActionBuilder = httpActionGeneric;
/**
* A set of services for use within Convex query functions.
*
* The query context is passed as the first argument to any Convex query
* function run on the server.
*
* If you're using code generation, use the `QueryCtx` type in `convex/_generated/server.d.ts` instead.
*/
export type QueryCtx = GenericQueryCtx<DataModel>;
/**
* A set of services for use within Convex mutation functions.
*
* The mutation context is passed as the first argument to any Convex mutation
* function run on the server.
*
* If you're using code generation, use the `MutationCtx` type in `convex/_generated/server.d.ts` instead.
*/
export type MutationCtx = GenericMutationCtx<DataModel>;
/**
* A set of services for use within Convex action functions.
*
* The action context is passed as the first argument to any Convex action
* function run on the server.
*/
export type ActionCtx = GenericActionCtx<DataModel>;
/**
* An interface to read from the database within Convex query functions.
*
* The two entry points are {@link DatabaseReader.get}, which fetches a single
* document by its {@link Id}, or {@link DatabaseReader.query}, which starts
* building a query.
*/
export type DatabaseReader = GenericDatabaseReader<DataModel>;
/**
* An interface to read from and write to the database within Convex mutation
* functions.
*
* Convex guarantees that all writes within a single mutation are
* executed atomically, so you never have to worry about partial writes leaving
* your data in an inconsistent state. See [the Convex Guide](https://docs.convex.dev/understanding/convex-fundamentals/functions#atomicity-and-optimistic-concurrency-control)
* for the guarantees Convex provides your functions.
*/
export type DatabaseWriter = GenericDatabaseWriter<DataModel>;

View File

@@ -0,0 +1,5 @@
'use node';
import { defineComponent } from "convex/server";
const component = defineComponent("component");
export default component;

9
component/schema.ts Normal file
View File

@@ -0,0 +1,9 @@
import { defineSchema, defineTable } from "convex/server";
import { v } from "convex/values";
// Define a messages table with an index.
export default defineSchema({
// test2: defineTable({
// title: v.string(),
// }),
});

26
component/test2.ts Normal file
View File

@@ -0,0 +1,26 @@
// import { query, mutation, action } from "./_generated/server";
// import { v } from "convex/values";
// export const get = query({
// args: {},
// handler: async (ctx) => {
// const auth = await ctx.auth.getUserIdentity();
// console.log("Query test2 called, auth:", auth);
// if (auth) {
// console.log("Authenticated user ID:", auth.subject);
// }
// return await ctx.db.query("test2").collect();
// },
// });
// export const get2 = query({
// args: {},
// handler: async (ctx) => {
// const auth = await ctx.auth.getUserIdentity();
// console.log("Query test2 called, auth:", auth);
// if (auth) {
// console.log("Authenticated user ID:", auth.subject);
// }
// return await ctx.db.query("test2").collect();
// },
// });

View File

@@ -8,9 +8,7 @@
* @module * @module
*/ */
import type * as abcv from "../abcv.js";
import type * as actions_jwt from "../actions/jwt.js"; import type * as actions_jwt from "../actions/jwt.js";
import type * as actions_redis from "../actions/redis.js";
import type * as http from "../http.js"; import type * as http from "../http.js";
import type { import type {
@@ -20,9 +18,7 @@ import type {
} from "convex/server"; } from "convex/server";
declare const fullApi: ApiFromModules<{ declare const fullApi: ApiFromModules<{
abcv: typeof abcv;
"actions/jwt": typeof actions_jwt; "actions/jwt": typeof actions_jwt;
"actions/redis": typeof actions_redis;
http: typeof http; http: typeof http;
}>; }>;
@@ -52,4 +48,6 @@ export declare const internal: FilterApi<
FunctionReference<any, "internal"> FunctionReference<any, "internal">
>; >;
export declare const components: {}; export declare const components: {
component: {};
};

View File

@@ -1,30 +1,30 @@
import { query, mutation, action } from "./_generated/server"; // import { query, mutation, action } from "./_generated/server";
import { Kevisual } from '@kevisual/ai/browser' // import { Kevisual } from '@kevisual/ai/browser'
import { v } from "convex/values"; // import { v } from "convex/values";
export const get = query({ // export const get = query({
args: {}, // args: {},
handler: async (ctx) => { // handler: async (ctx) => {
const auth = await ctx.auth.getUserIdentity(); // const auth = await ctx.auth.getUserIdentity();
console.log("Query abcv.get called, auth:", auth); // console.log("Query abcv.get called, auth:", auth);
if (auth) { // if (auth) {
console.log("Authenticated user ID:", auth.subject); // console.log("Authenticated user ID:", auth.subject);
} // }
return await ctx.db.query("abcv").collect(); // return await ctx.db.query("abcv").collect();
}, // },
}); // });
export const chat = action({ // export const chat = action({
args: { message: v.string() }, // args: { message: v.string() },
handler: async (ctx, { message }) => { // handler: async (ctx, { message }) => {
const kevisual = new Kevisual({ // const kevisual = new Kevisual({
apiKey: process.env.KEVISUAL_NEW_API_KEY || "", // apiKey: process.env.KEVISUAL_NEW_API_KEY || "",
}); // });
const response = await kevisual.chat({ // const response = await kevisual.chat({
messages: [ // messages: [
{ role: "user", content: message } // { role: "user", content: message }
] // ]
}) // })
return kevisual.responseText; // return kevisual.responseText;
}, // },
}); // });

View File

@@ -1,22 +1,22 @@
'use node'; // 'use node';
import { query, mutation, action } from "../_generated/server"; // import { query, mutation, action } from "../_generated/server";
import { Kevisual } from '@kevisual/ai/browser' // import { Kevisual } from '@kevisual/ai/browser'
import { v } from "convex/values"; // import { v } from "convex/values";
import { Redis } from "ioredis"; // import { Redis } from "ioredis";
const redisClient = new Redis({ // const redisClient = new Redis({
host: process.env.REDIS_HOST, // host: process.env.REDIS_HOST,
password: process.env.REDIS_PASSWORD, // password: process.env.REDIS_PASSWORD,
}); // });
let time: any = null; // let time: any = null;
export const isConnected = action({ // export const isConnected = action({
args: {}, // args: {},
handler: async (ctx) => { // handler: async (ctx) => {
const result = await redisClient.ping(); // const result = await redisClient.ping();
if (time === null) { // if (time === null) {
time = new Date(); // time = new Date();
} // }
console.log("Redis PING at", new Date().toISOString(), "since", time); // console.log("Redis PING at", new Date().toISOString(), "since", time);
return result === "PONG"; // return result === "PONG";
}, // },
}); // });

8
convex/convex.config.ts Normal file
View File

@@ -0,0 +1,8 @@
import { defineApp } from "convex/server";
import myComponent from "../component/convex.config.ts";
const app = defineApp();
// app.use(myComponent);
export default app;

View File

@@ -3,19 +3,23 @@ import { v } from "convex/values";
import { authTables } from "@convex-dev/auth/server"; import { authTables } from "@convex-dev/auth/server";
// Define a messages table with an index. // Define a messages table with an index.
export default defineSchema({ export default defineSchema({
abcv: defineTable({ // abcv: defineTable({
title: v.string(), // title: v.string(),
}), // }),
users: defineTable({ // xiong: defineTable({
id: v.string(), // 外部系统的用户 ID // name: v.string(),
name: v.string(), // title: v.string(),
createdAt: v.string(), // }),
lastLoginAt: v.optional(v.string()), // users: defineTable({
}).index("id", ["id"]), // id: v.string(), // 外部系统的用户 ID
sessions: defineTable({ // name: v.string(),
userId: v.id("users"), // createdAt: v.string(),
createdAt: v.string(), // lastLoginAt: v.optional(v.string()),
expiresAt: v.optional(v.string()), // }).index("id", ["id"]),
token: v.optional(v.string()), // sessions: defineTable({
}).index("token", ["token"]), // userId: v.id("users"),
// createdAt: v.string(),
// expiresAt: v.optional(v.string()),
// token: v.optional(v.string()),
// }).index("token", ["token"]),
}); });

9
convex/wrapper.ts Normal file
View File

@@ -0,0 +1,9 @@
// import { query } from "./_generated/server";
// import { components } from "./_generated/api";
// export const getTest2 = query({
// args: {},
// handler: async (ctx) => {
// return await ctx.runQuery(components.component.test2.get);
// },
// });

8
convex/xiong.ts Normal file
View File

@@ -0,0 +1,8 @@
// import { query, mutation, action } from "./_generated/server";
// export const get = query({
// args: {},
// handler: async (ctx) => {
// return await ctx.db.query("xiong").collect();
// },
// });

View File

@@ -1,70 +1,10 @@
import { ConvexClient, AuthTokenFetcher } from "convex/browser"; import { ConvexClient } from "convex/browser";
import { api } from "./convex/_generated/api.js"; import { api } from "./convex/_generated/api.js";
import * as jose from "jose";
const url = process.env["CONVEX_URL"] const url = process.env["CONVEX_URL"]
const client = new ConvexClient(url!); const client = new ConvexClient(url!);
// 加载测试私钥 // 使用主应用的公共 API
const keys = JSON.parse(await Bun.file("./jwt/privateKey.json").text()); const test2List = await client.query(api.wrapper.getTest2, {});
const privateKey = await jose.importJWK(keys, "RS256");
// 生成 RS256 JWT console.log("Test2 List:", test2List);
const payload = {
iss: "https://convex.kevisual.cn",
sub: "user:8fa2be73c2229e85",
aud: "convex-app",
exp: Math.floor(Date.now() / 1000) + 3600,
name: "Test User AA",
email: "test@example.com",
};
const token = await new jose.SignJWT(payload)
.setProtectedHeader({
"alg": "RS256",
"typ": "JWT",
"kid": "kid-key-1"
})
.setIssuedAt()
.sign(privateKey);
console.log("Generated RS256 token:", token);
const authTokenFetcher: AuthTokenFetcher = async ({ forceRefreshToken }: { forceRefreshToken: boolean }) => {
console.log("AuthTokenFetcher called, forceRefreshToken:", forceRefreshToken);
return token;
}
client.setAuth(authTokenFetcher, (isAuthenticated) => {
console.log("Auth isAuthenticated:", isAuthenticated);
});
// console.log("Auth set up", auth);
await Bun.sleep(1000);
// const auth = client.getAuth();
// console.log("Client auth", auth);
const unsubscribe = client.onUpdate(api.abcv.get, {}, async (tasks) => {
console.log(tasks);
});
const list = await client.query(api.abcv.get, {});
console.log("Initial list:", list);
// for (let i = 0; i < list.length; i++) {
// const a = list[i];
// console.log(`Item ${i}:`, a.title);
// }
// const list = await client.action(api.abcv.chat, { message: "Hello, 1+1=?" });
// console.log("Chat response:", list);
// const redisIsConnected = await client.action(api.actions.redis.isConnected, {});
// console.log("Redis isConnected:", redisIsConnected);
// const sign = await api.auth.signIn({ provider: "convex" })
// const sign = await httpClient.action("/auth", { method: "POST" });
// console.log("Sign in result:", sign);
const res = await fetch("http://convex.kevisual.cn:3211/auth", {
method: "POST",
});
const data = await res.json();
console.log("Custom endpoint response:", data);
await Bun.sleep(1000);
unsubscribe();
await client.close();

View File

@@ -4,17 +4,18 @@
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"dev": "bunx convex dev" "dev": "bunx convex dev",
"convex": "bunx convex dev"
}, },
"keywords": [], "keywords": [],
"author": "abearxiong <xiongxiao@xiongxiao.me> (https://www.xiongxiao.me)", "author": "abearxiong <xiongxiao@xiongxiao.me> (https://www.xiongxiao.me)",
"license": "MIT", "license": "MIT",
"packageManager": "pnpm@10.14.0", "packageManager": "pnpm@10.29.3",
"type": "module", "type": "module",
"private": true, "private": true,
"devDependencies": { "devDependencies": {
"@convex-dev/better-auth": "^0.10.10", "@convex-dev/better-auth": "^0.10.10",
"@kevisual/ai": "^0.0.21", "@kevisual/ai": "^0.0.24",
"@types/bun": "latest", "@types/bun": "latest",
"ioredis": "^5.9.2" "ioredis": "^5.9.2"
}, },
@@ -23,7 +24,7 @@
}, },
"dependencies": { "dependencies": {
"@convex-dev/auth": "^0.0.90", "@convex-dev/auth": "^0.0.90",
"convex": "^1.31.6", "convex": "^1.31.7",
"jose": "^6.1.3" "jose": "^6.1.3"
} }
} }

72
src/test1.ts Normal file
View File

@@ -0,0 +1,72 @@
import { ConvexClient, AuthTokenFetcher } from "convex/browser";
import { api } from "../convex/_generated/api.js";
import * as jose from "jose";
const url = process.env["CONVEX_URL"]
const client = new ConvexClient(url!);
// 加载测试私钥
const keys = JSON.parse(await Bun.file("./jwt/privateKey.json").text());
const privateKey = await jose.importJWK(keys, "RS256");
// 生成 RS256 JWT
const payload = {
iss: "https://convex.kevisual.cn",
sub: "user:8fa2be73c2229e85",
aud: "convex-app",
exp: Math.floor(Date.now() / 1000) + 3600,
name: "Test User AA",
email: "test@example.com",
};
const token = await new jose.SignJWT(payload)
.setProtectedHeader({
"alg": "RS256",
"typ": "JWT",
"kid": "kid-key-1"
})
.setIssuedAt()
.sign(privateKey);
console.log("Generated RS256 token:", token);
const authTokenFetcher: AuthTokenFetcher = async ({ forceRefreshToken }: { forceRefreshToken: boolean }) => {
console.log("AuthTokenFetcher called, forceRefreshToken:", forceRefreshToken);
return token;
}
client.setAuth(authTokenFetcher, (isAuthenticated) => {
console.log("Auth isAuthenticated:", isAuthenticated);
});
// console.log("Auth set up", auth);
await Bun.sleep(1000);
// const auth = client.getAuth();
// console.log("Client auth", auth);
const unsubscribe = client.onUpdate(api.abcv.get, {}, async (tasks) => {
console.log(tasks);
});
const list = await client.query(api.abcv.get, {});
console.log("Initial list:", list);
// for (let i = 0; i < list.length; i++) {
// const a = list[i];
// console.log(`Item ${i}:`, a.title);
// }
// const list = await client.action(api.abcv.chat, { message: "Hello, 1+1=?" });
// console.log("Chat response:", list);
const xiongList = await client.query(api.xiong.get, {});
console.log("Xiong list:", xiongList);
// const redisIsConnected = await client.action(api.actions.redis.isConnected, {});
// console.log("Redis isConnected:", redisIsConnected);
// const sign = await api.auth.signIn({ provider: "convex" })
// const sign = await httpClient.action("/auth", { method: "POST" });
// console.log("Sign in result:", sign);
const res = await fetch("http://convex.kevisual.cn:3211/auth", {
method: "POST",
});
const data = await res.json();
console.log("Custom endpoint response:", data);
await Bun.sleep(1000);
unsubscribe();
await client.close();

17
test-git/package.json Normal file
View File

@@ -0,0 +1,17 @@
{
"name": "test-git",
"version": "0.0.1",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "abearxiong <xiongxiao@xiongxiao.me> (https://www.xiongxiao.me)",
"license": "MIT",
"packageManager": "pnpm@10.29.3",
"type": "module",
"dependencies": {
"@kevisual/convex":"git+https://cnb.cool/kevisual/convex"
}
}

337
test-git/pnpm-lock.yaml generated Normal file
View File

@@ -0,0 +1,337 @@
lockfileVersion: '9.0'
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
importers:
.:
dependencies:
'@kevisual/convex':
specifier: git+https://cnb.cool/kevisual/convex
version: git+https://cnb.cool/kevisual/convex#7c56a1d7f93a242d7a7b4c57377ca51690b354e8
packages:
'@esbuild/aix-ppc64@0.27.0':
resolution: {integrity: sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [aix]
'@esbuild/android-arm64@0.27.0':
resolution: {integrity: sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [android]
'@esbuild/android-arm@0.27.0':
resolution: {integrity: sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==}
engines: {node: '>=18'}
cpu: [arm]
os: [android]
'@esbuild/android-x64@0.27.0':
resolution: {integrity: sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==}
engines: {node: '>=18'}
cpu: [x64]
os: [android]
'@esbuild/darwin-arm64@0.27.0':
resolution: {integrity: sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [darwin]
'@esbuild/darwin-x64@0.27.0':
resolution: {integrity: sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==}
engines: {node: '>=18'}
cpu: [x64]
os: [darwin]
'@esbuild/freebsd-arm64@0.27.0':
resolution: {integrity: sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [freebsd]
'@esbuild/freebsd-x64@0.27.0':
resolution: {integrity: sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==}
engines: {node: '>=18'}
cpu: [x64]
os: [freebsd]
'@esbuild/linux-arm64@0.27.0':
resolution: {integrity: sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [linux]
'@esbuild/linux-arm@0.27.0':
resolution: {integrity: sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==}
engines: {node: '>=18'}
cpu: [arm]
os: [linux]
'@esbuild/linux-ia32@0.27.0':
resolution: {integrity: sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==}
engines: {node: '>=18'}
cpu: [ia32]
os: [linux]
'@esbuild/linux-loong64@0.27.0':
resolution: {integrity: sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==}
engines: {node: '>=18'}
cpu: [loong64]
os: [linux]
'@esbuild/linux-mips64el@0.27.0':
resolution: {integrity: sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==}
engines: {node: '>=18'}
cpu: [mips64el]
os: [linux]
'@esbuild/linux-ppc64@0.27.0':
resolution: {integrity: sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [linux]
'@esbuild/linux-riscv64@0.27.0':
resolution: {integrity: sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==}
engines: {node: '>=18'}
cpu: [riscv64]
os: [linux]
'@esbuild/linux-s390x@0.27.0':
resolution: {integrity: sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==}
engines: {node: '>=18'}
cpu: [s390x]
os: [linux]
'@esbuild/linux-x64@0.27.0':
resolution: {integrity: sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==}
engines: {node: '>=18'}
cpu: [x64]
os: [linux]
'@esbuild/netbsd-arm64@0.27.0':
resolution: {integrity: sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==}
engines: {node: '>=18'}
cpu: [arm64]
os: [netbsd]
'@esbuild/netbsd-x64@0.27.0':
resolution: {integrity: sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==}
engines: {node: '>=18'}
cpu: [x64]
os: [netbsd]
'@esbuild/openbsd-arm64@0.27.0':
resolution: {integrity: sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openbsd]
'@esbuild/openbsd-x64@0.27.0':
resolution: {integrity: sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==}
engines: {node: '>=18'}
cpu: [x64]
os: [openbsd]
'@esbuild/openharmony-arm64@0.27.0':
resolution: {integrity: sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openharmony]
'@esbuild/sunos-x64@0.27.0':
resolution: {integrity: sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==}
engines: {node: '>=18'}
cpu: [x64]
os: [sunos]
'@esbuild/win32-arm64@0.27.0':
resolution: {integrity: sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [win32]
'@esbuild/win32-ia32@0.27.0':
resolution: {integrity: sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==}
engines: {node: '>=18'}
cpu: [ia32]
os: [win32]
'@esbuild/win32-x64@0.27.0':
resolution: {integrity: sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==}
engines: {node: '>=18'}
cpu: [x64]
os: [win32]
'@kevisual/auth@2.0.3':
resolution: {integrity: sha512-4xpijaIhlCTr/DlJaV/gmkCQeg45EO1yxWpRvUX+1jCdVbuxSR0wZrF0SD9oybnjmKWMKDNPLsXyduFjMGcItA==}
'@kevisual/convex@git+https://cnb.cool/kevisual/convex#7c56a1d7f93a242d7a7b4c57377ca51690b354e8':
resolution: {commit: 7c56a1d7f93a242d7a7b4c57377ca51690b354e8, repo: https://cnb.cool/kevisual/convex, type: git}
version: 0.0.1
convex@1.31.7:
resolution: {integrity: sha512-PtNMe1mAIOvA8Yz100QTOaIdgt2rIuWqencVXrb4McdhxBHZ8IJ1eXTnrgCC9HydyilGT1pOn+KNqT14mqn9fQ==}
engines: {node: '>=18.0.0', npm: '>=7.0.0'}
hasBin: true
peerDependencies:
'@auth0/auth0-react': ^2.0.1
'@clerk/clerk-react': ^4.12.8 || ^5.0.0
react: ^18.0.0 || ^19.0.0-0 || ^19.0.0
peerDependenciesMeta:
'@auth0/auth0-react':
optional: true
'@clerk/clerk-react':
optional: true
react:
optional: true
esbuild@0.27.0:
resolution: {integrity: sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==}
engines: {node: '>=18'}
hasBin: true
jose@6.1.3:
resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==}
prettier@3.8.1:
resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==}
engines: {node: '>=14'}
hasBin: true
snapshots:
'@esbuild/aix-ppc64@0.27.0':
optional: true
'@esbuild/android-arm64@0.27.0':
optional: true
'@esbuild/android-arm@0.27.0':
optional: true
'@esbuild/android-x64@0.27.0':
optional: true
'@esbuild/darwin-arm64@0.27.0':
optional: true
'@esbuild/darwin-x64@0.27.0':
optional: true
'@esbuild/freebsd-arm64@0.27.0':
optional: true
'@esbuild/freebsd-x64@0.27.0':
optional: true
'@esbuild/linux-arm64@0.27.0':
optional: true
'@esbuild/linux-arm@0.27.0':
optional: true
'@esbuild/linux-ia32@0.27.0':
optional: true
'@esbuild/linux-loong64@0.27.0':
optional: true
'@esbuild/linux-mips64el@0.27.0':
optional: true
'@esbuild/linux-ppc64@0.27.0':
optional: true
'@esbuild/linux-riscv64@0.27.0':
optional: true
'@esbuild/linux-s390x@0.27.0':
optional: true
'@esbuild/linux-x64@0.27.0':
optional: true
'@esbuild/netbsd-arm64@0.27.0':
optional: true
'@esbuild/netbsd-x64@0.27.0':
optional: true
'@esbuild/openbsd-arm64@0.27.0':
optional: true
'@esbuild/openbsd-x64@0.27.0':
optional: true
'@esbuild/openharmony-arm64@0.27.0':
optional: true
'@esbuild/sunos-x64@0.27.0':
optional: true
'@esbuild/win32-arm64@0.27.0':
optional: true
'@esbuild/win32-ia32@0.27.0':
optional: true
'@esbuild/win32-x64@0.27.0':
optional: true
'@kevisual/auth@2.0.3': {}
'@kevisual/convex@git+https://cnb.cool/kevisual/convex#7c56a1d7f93a242d7a7b4c57377ca51690b354e8':
dependencies:
'@kevisual/auth': 2.0.3
convex: 1.31.7
jose: 6.1.3
transitivePeerDependencies:
- '@auth0/auth0-react'
- '@clerk/clerk-react'
- react
convex@1.31.7:
dependencies:
esbuild: 0.27.0
prettier: 3.8.1
esbuild@0.27.0:
optionalDependencies:
'@esbuild/aix-ppc64': 0.27.0
'@esbuild/android-arm': 0.27.0
'@esbuild/android-arm64': 0.27.0
'@esbuild/android-x64': 0.27.0
'@esbuild/darwin-arm64': 0.27.0
'@esbuild/darwin-x64': 0.27.0
'@esbuild/freebsd-arm64': 0.27.0
'@esbuild/freebsd-x64': 0.27.0
'@esbuild/linux-arm': 0.27.0
'@esbuild/linux-arm64': 0.27.0
'@esbuild/linux-ia32': 0.27.0
'@esbuild/linux-loong64': 0.27.0
'@esbuild/linux-mips64el': 0.27.0
'@esbuild/linux-ppc64': 0.27.0
'@esbuild/linux-riscv64': 0.27.0
'@esbuild/linux-s390x': 0.27.0
'@esbuild/linux-x64': 0.27.0
'@esbuild/netbsd-arm64': 0.27.0
'@esbuild/netbsd-x64': 0.27.0
'@esbuild/openbsd-arm64': 0.27.0
'@esbuild/openbsd-x64': 0.27.0
'@esbuild/openharmony-arm64': 0.27.0
'@esbuild/sunos-x64': 0.27.0
'@esbuild/win32-arm64': 0.27.0
'@esbuild/win32-ia32': 0.27.0
'@esbuild/win32-x64': 0.27.0
jose@6.1.3: {}
prettier@3.8.1: {}