Skip to content

Commit 21542ca

Browse files
authored
feat: add convex addon for solid (#186)
1 parent 6a3785f commit 21542ca

File tree

16 files changed

+747
-0
lines changed

16 files changed

+747
-0
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
## Setting up Convex
2+
3+
- Set the `VITE_CONVEX_URL` and `CONVEX_DEPLOYMENT` environment variables in your `.env.local`. (Or run `npx convex init` to set them automatically.)
4+
- Run `npx convex dev` to start the Convex server.
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
This document serves as some special instructions when working with Convex.
2+
3+
# Schemas
4+
5+
When designing the schema please see this page on built in System fields and data types available: https://docs.convex.dev/database/types
6+
7+
Here are some specifics that are often mishandled:
8+
9+
## v (https://docs.convex.dev/api/modules/values#v)
10+
11+
The validator builder.
12+
13+
This builder allows you to build validators for Convex values.
14+
15+
Validators can be used in schema definitions and as input validators for Convex functions.
16+
17+
Type declaration
18+
Name Type
19+
id <TableName>(tableName: TableName) => VId<GenericId<TableName>, "required">
20+
null () => VNull<null, "required">
21+
number () => VFloat64<number, "required">
22+
float64 () => VFloat64<number, "required">
23+
bigint () => VInt64<bigint, "required">
24+
int64 () => VInt64<bigint, "required">
25+
boolean () => VBoolean<boolean, "required">
26+
string () => VString<string, "required">
27+
bytes () => VBytes<ArrayBuffer, "required">
28+
literal <T>(literal: T) => VLiteral<T, "required">
29+
array <T>(element: T) => VArray<T["type"][], T, "required">
30+
object <T>(fields: T) => VObject<Expand<{ [Property in string | number | symbol]?: Exclude<Infer<T[Property]>, undefined> } & { [Property in string | number | symbol]: Infer<T[Property]> }>, T, "required", { [Property in string | number | symbol]: Property | `${Property & string}.${T[Property]["fieldPaths"]}` }[keyof T] & string>
31+
record <Key, Value>(keys: Key, values: Value) => VRecord<Record<Infer<Key>, Value["type"]>, Key, Value, "required", string>
32+
union <T>(...members: T) => VUnion<T[number]["type"], T, "required", T[number]["fieldPaths"]>
33+
any () => VAny<any, "required", string>
34+
optional <T>(value: T) => VOptional<T>
35+
36+
## System fields (https://docs.convex.dev/database/types#system-fields)
37+
38+
Every document in Convex has two automatically-generated system fields:
39+
40+
_id: The document ID of the document.
41+
_creationTime: The time this document was created, in milliseconds since the Unix epoch.
42+
43+
You do not need to add indices as these are added automatically.
44+
45+
## Example Schema
46+
47+
This is an example of a well crafted schema.
48+
49+
```ts
50+
import { defineSchema, defineTable } from "convex/server";
51+
import { v } from "convex/values";
52+
53+
export default defineSchema(
54+
{
55+
users: defineTable({
56+
name: v.string(),
57+
}),
58+
59+
sessions: defineTable({
60+
userId: v.id("users"),
61+
sessionId: v.string(),
62+
}).index("sessionId", ["sessionId"]),
63+
64+
threads: defineTable({
65+
uuid: v.string(),
66+
summary: v.optional(v.string()),
67+
summarizer: v.optional(v.id("_scheduled_functions")),
68+
}).index("uuid", ["uuid"]),
69+
70+
messages: defineTable({
71+
message: v.string(),
72+
threadId: v.id("threads"),
73+
author: v.union(
74+
v.object({
75+
role: v.literal("system"),
76+
}),
77+
v.object({
78+
role: v.literal("assistant"),
79+
context: v.array(v.id("messages")),
80+
model: v.optional(v.string()),
81+
}),
82+
v.object({
83+
role: v.literal("user"),
84+
userId: v.id("users"),
85+
}),
86+
),
87+
})
88+
.index("threadId", ["threadId"]),
89+
},
90+
);
91+
```
92+
93+
Sourced from: https://github.com/PatrickJS/awesome-cursorrules/blob/main/rules/convex-cursorrules-prompt-file/.cursorrules
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Convex configuration, get this URL from your [Dashboard](dashboard.convex.dev)
2+
CONVEX_DEPLOYMENT=
3+
VITE_CONVEX_URL=
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/* eslint-disable */
2+
/**
3+
* Generated `api` utility.
4+
*
5+
* THIS CODE IS AUTOMATICALLY GENERATED.
6+
*
7+
* To regenerate, run `npx convex dev`.
8+
* @module
9+
*/
10+
11+
import type {
12+
ApiFromModules,
13+
FilterApi,
14+
FunctionReference,
15+
} from "convex/server";
16+
import type * as todos from "../todos.js";
17+
18+
/**
19+
* A utility for referencing Convex functions in your app's API.
20+
*
21+
* Usage:
22+
* ```js
23+
* const myFunctionReference = api.myModule.myFunction;
24+
* ```
25+
*/
26+
declare const fullApi: ApiFromModules<{
27+
todos: typeof todos;
28+
}>;
29+
export declare const api: FilterApi<
30+
typeof fullApi,
31+
FunctionReference<any, "public">
32+
>;
33+
export declare const internal: FilterApi<
34+
typeof fullApi,
35+
FunctionReference<any, "internal">
36+
>;
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/* eslint-disable */
2+
/**
3+
* Generated `api` utility.
4+
*
5+
* THIS CODE IS AUTOMATICALLY GENERATED.
6+
*
7+
* To regenerate, run `npx convex dev`.
8+
* @module
9+
*/
10+
11+
import { anyApi } from "convex/server";
12+
13+
/**
14+
* A utility for referencing Convex functions in your app's API.
15+
*
16+
* Usage:
17+
* ```js
18+
* const myFunctionReference = api.myModule.myFunction;
19+
* ```
20+
*/
21+
export const api = anyApi;
22+
export const internal = anyApi;
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/* eslint-disable */
2+
/**
3+
* Generated data model types.
4+
*
5+
* THIS CODE IS AUTOMATICALLY GENERATED.
6+
*
7+
* To regenerate, run `npx convex dev`.
8+
* @module
9+
*/
10+
11+
import type {
12+
DataModelFromSchemaDefinition,
13+
DocumentByName,
14+
TableNamesInDataModel,
15+
SystemTableNames,
16+
} from "convex/server";
17+
import type { GenericId } from "convex/values";
18+
import schema from "../schema.js";
19+
20+
/**
21+
* The names of all of your Convex tables.
22+
*/
23+
export type TableNames = TableNamesInDataModel<DataModel>;
24+
25+
/**
26+
* The type of a document stored in Convex.
27+
*
28+
* @typeParam TableName - A string literal type of the table name (like "users").
29+
*/
30+
export type Doc<TableName extends TableNames> = DocumentByName<
31+
DataModel,
32+
TableName
33+
>;
34+
35+
/**
36+
* An identifier for a document in Convex.
37+
*
38+
* Convex documents are uniquely identified by their `Id`, which is accessible
39+
* on the `_id` field. To learn more, see [Document IDs](https://docs.convex.dev/using/document-ids).
40+
*
41+
* Documents can be loaded using `db.get(id)` in query and mutation functions.
42+
*
43+
* IDs are just strings at runtime, but this type can be used to distinguish them from other
44+
* strings when type checking.
45+
*
46+
* @typeParam TableName - A string literal type of the table name (like "users").
47+
*/
48+
export type Id<TableName extends TableNames | SystemTableNames> =
49+
GenericId<TableName>;
50+
51+
/**
52+
* A type describing your Convex data model.
53+
*
54+
* This type includes information about what tables you have, the type of
55+
* documents stored in those tables, and the indexes defined on them.
56+
*
57+
* This type is used to parameterize methods like `queryGeneric` and
58+
* `mutationGeneric` to make them type-safe.
59+
*/
60+
export type DataModel = DataModelFromSchemaDefinition<typeof schema>;
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
/* eslint-disable */
2+
/**
3+
* Generated utilities for implementing server-side Convex query and mutation functions.
4+
*
5+
* THIS CODE IS AUTOMATICALLY GENERATED.
6+
*
7+
* To regenerate, run `npx convex dev`.
8+
* @module
9+
*/
10+
11+
import {
12+
ActionBuilder,
13+
HttpActionBuilder,
14+
MutationBuilder,
15+
QueryBuilder,
16+
GenericActionCtx,
17+
GenericMutationCtx,
18+
GenericQueryCtx,
19+
GenericDatabaseReader,
20+
GenericDatabaseWriter,
21+
} from "convex/server";
22+
import type { DataModel } from "./dataModel.js";
23+
24+
/**
25+
* Define a query in this Convex app's public API.
26+
*
27+
* This function will be allowed to read your Convex database and will be accessible from the client.
28+
*
29+
* @param func - The query function. It receives a {@link QueryCtx} as its first argument.
30+
* @returns The wrapped query. Include this as an `export` to name it and make it accessible.
31+
*/
32+
export declare const query: QueryBuilder<DataModel, "public">;
33+
34+
/**
35+
* Define a query that is only accessible from other Convex functions (but not from the client).
36+
*
37+
* This function will be allowed to read from your Convex database. It will not be accessible from the client.
38+
*
39+
* @param func - The query function. It receives a {@link QueryCtx} as its first argument.
40+
* @returns The wrapped query. Include this as an `export` to name it and make it accessible.
41+
*/
42+
export declare const internalQuery: QueryBuilder<DataModel, "internal">;
43+
44+
/**
45+
* Define a mutation in this Convex app's public API.
46+
*
47+
* This function will be allowed to modify your Convex database and will be accessible from the client.
48+
*
49+
* @param func - The mutation function. It receives a {@link MutationCtx} as its first argument.
50+
* @returns The wrapped mutation. Include this as an `export` to name it and make it accessible.
51+
*/
52+
export declare const mutation: MutationBuilder<DataModel, "public">;
53+
54+
/**
55+
* Define a mutation that is only accessible from other Convex functions (but not from the client).
56+
*
57+
* This function will be allowed to modify your Convex database. It will not be accessible from the client.
58+
*
59+
* @param func - The mutation function. It receives a {@link MutationCtx} as its first argument.
60+
* @returns The wrapped mutation. Include this as an `export` to name it and make it accessible.
61+
*/
62+
export declare const internalMutation: MutationBuilder<DataModel, "internal">;
63+
64+
/**
65+
* Define an action in this Convex app's public API.
66+
*
67+
* An action is a function which can execute any JavaScript code, including non-deterministic
68+
* code and code with side-effects, like calling third-party services.
69+
* They can be run in Convex's JavaScript environment or in Node.js using the "use node" directive.
70+
* They can interact with the database indirectly by calling queries and mutations using the {@link ActionCtx}.
71+
*
72+
* @param func - The action. It receives an {@link ActionCtx} as its first argument.
73+
* @returns The wrapped action. Include this as an `export` to name it and make it accessible.
74+
*/
75+
export declare const action: ActionBuilder<DataModel, "public">;
76+
77+
/**
78+
* Define an action that is only accessible from other Convex functions (but not from the client).
79+
*
80+
* @param func - The function. It receives an {@link ActionCtx} as its first argument.
81+
* @returns The wrapped function. Include this as an `export` to name it and make it accessible.
82+
*/
83+
export declare const internalAction: ActionBuilder<DataModel, "internal">;
84+
85+
/**
86+
* Define an HTTP action.
87+
*
88+
* This function will be used to respond to HTTP requests received by a Convex
89+
* deployment if the requests matches the path and method where this action
90+
* is routed. Be sure to route your action in `convex/http.js`.
91+
*
92+
* @param func - The function. It receives an {@link ActionCtx} as its first argument.
93+
* @returns The wrapped function. Import this function from `convex/http.js` and route it to hook it up.
94+
*/
95+
export declare const httpAction: HttpActionBuilder;
96+
97+
/**
98+
* A set of services for use within Convex query functions.
99+
*
100+
* The query context is passed as the first argument to any Convex query
101+
* function run on the server.
102+
*
103+
* This differs from the {@link MutationCtx} because all of the services are
104+
* read-only.
105+
*/
106+
export type QueryCtx = GenericQueryCtx<DataModel>;
107+
108+
/**
109+
* A set of services for use within Convex mutation functions.
110+
*
111+
* The mutation context is passed as the first argument to any Convex mutation
112+
* function run on the server.
113+
*/
114+
export type MutationCtx = GenericMutationCtx<DataModel>;
115+
116+
/**
117+
* A set of services for use within Convex action functions.
118+
*
119+
* The action context is passed as the first argument to any Convex action
120+
* function run on the server.
121+
*/
122+
export type ActionCtx = GenericActionCtx<DataModel>;
123+
124+
/**
125+
* An interface to read from the database within Convex query functions.
126+
*
127+
* The two entry points are {@link DatabaseReader.get}, which fetches a single
128+
* document by its {@link Id}, or {@link DatabaseReader.query}, which starts
129+
* building a query.
130+
*/
131+
export type DatabaseReader = GenericDatabaseReader<DataModel>;
132+
133+
/**
134+
* An interface to read from and write to the database within Convex mutation
135+
* functions.
136+
*
137+
* Convex guarantees that all writes within a single mutation are
138+
* executed atomically, so you never have to worry about partial writes leaving
139+
* your data in an inconsistent state. See [the Convex Guide](https://docs.convex.dev/understanding/convex-fundamentals/functions#atomicity-and-optimistic-concurrency-control)
140+
* for the guarantees Convex provides your functions.
141+
*/
142+
export type DatabaseWriter = GenericDatabaseWriter<DataModel>;

0 commit comments

Comments
 (0)