Skip to content

Commit

Permalink
chore(examples): Update convex example (#43741)
Browse files Browse the repository at this point in the history
  • Loading branch information
thomasballinger committed Dec 7, 2022
1 parent 8006dbc commit dbc8334
Show file tree
Hide file tree
Showing 21 changed files with 615 additions and 285 deletions.
20 changes: 3 additions & 17 deletions examples/convex/README.md
Expand Up @@ -20,28 +20,14 @@ yarn create next-app --example convex convex-app
pnpm create next-app --example convex convex-app
```

Log in to Convex,

```bash
npx convex login
```

initialize a new Convex project,

```bash
npx convex init
```

and then run the following two commands in two different terminals:

```bash
npx convex dev
```
Run

```bash
npm run dev
```

to run `next dev` and a Convex file watcher at the same time. This command will log you into Convex, so you'll need to create a Convex account if this is your first project.

Once everything is working, commit your code and deploy it to the cloud with [Vercel](https://vercel.com/new?utm_source=github&utm_medium=readme&utm_campaign=next-example) ([Documentation](https://nextjs.org/docs/deployment)).

Use `npx convex deploy && npm run build` as the build command and set the `CONVEX_DEPLOY_KEY` environmental variable in Vercel ([Documentation](https://docs.convex.dev/getting-started/deployment/hosting/vercel)).
57 changes: 51 additions & 6 deletions examples/convex/convex/README.md
@@ -1,29 +1,74 @@
# Welcome to your Convex functions directory!

Write your Convex functions here.
Write your Convex functions here. See
https://docs.convex.dev/using/writing-convex-functions for more.

A query function looks like:
A query function that takes two arguments looks like:

```typescript
// myQueryFunction.ts
import { query } from './_generated/server'

export default query(async ({ db }) => {
// Load data with `db` here!
export default query(async ({ db }, first: number, second: string) => {
// Validate arguments here.
if (typeof first !== 'number' || first < 0) {
throw new Error('First argument is not a non-negative number.')
}
if (typeof second !== 'string' || second.length > 1000) {
throw new Error('Second argument is not a string of length 1000 or less.')
}

// Query the database as many times as you need here.
// See https://docs.convex.dev/using/database-queries to learn how to write queries.
const documents = await db.query('tablename').collect()

// Write arbitrary JavaScript here: filter, aggregate, build derived data,
// remove non-public properties, or create new objects.
return documents
})
```

Using this query function in a React component looks like:

```typescript
const data = useQuery('myQueryFunction', 10, 'hello')
```

A mutation function looks like:

```typescript
// myMutationFunction.ts
import { mutation } from './_generated/server'

export default mutation(async ({ db }) => {
// Edit data with `db` here!
export default mutation(async ({ db }, first: string, second: string) => {
// Validate arguments here.
if (typeof first !== 'string' || typeof second !== 'string') {
throw new Error('Both arguments must be strings')
}

// Insert or modify documents in the database here.
// Mutations can also read from the database like queries.
const message = { body: first, author: second }
const id = await db.insert('messages', message)

// Optionally, return a value from your mutation.
return await db.get(id)
})
```

Using this mutation function in a React component looks like:

```typescript
const mutation = useMutation('myMutationFunction')
function handleButtonPress() {
// fire and forget, the most common way to use mutations
mutation('Hello!', 'me')
// OR
// use the result once the mutation has completed
mutation('Hello!', 'me').then((result) => console.log(result))
}
```

The Convex CLI is your friend. See everything it can do by running
`npx convex -h` in your project root directory. To learn more, launch the docs
with `npx convex docs`.
28 changes: 28 additions & 0 deletions examples/convex/convex/_generated/api.d.ts
@@ -0,0 +1,28 @@
/* eslint-disable */
/**
* Generated API.
*
* THIS CODE IS AUTOMATICALLY GENERATED.
*
* Generated by convex@0.5.0.
* To regenerate, run `npx convex codegen`.
* @module
*/

import type { ApiFromModules } from "convex/api";
import type * as listMessages from "../listMessages";
import type * as sendMessage from "../sendMessage";

/**
* A type describing your app's public Convex API.
*
* This `API` type includes information about the arguments and return
* types of your app's query and mutation functions.
*
* This type should be used with type-parameterized classes like
* `ConvexReactClient` to create app-specific types.
*/
export type API = ApiFromModules<{
listMessages: typeof listMessages;
sendMessage: typeof sendMessage;
}>;
31 changes: 31 additions & 0 deletions examples/convex/convex/_generated/clientConfig.d.ts
@@ -0,0 +1,31 @@
/* eslint-disable */
/**
* Generated development client configuration.
*
* THIS CODE IS AUTOMATICALLY GENERATED.
*
* Generated by convex@0.5.0.
* To regenerate, run `npx convex codegen`.
* @module
*/

import type { ClientConfiguration } from "convex/browser";

/**
* The DEV Convex client configuration.
*
* This configuration connects your client to your dev Convex deployment
* when `npx convex dev` is running.
*
* To generate the production version, run `npx convex deploy`.
*
* Usage:
*
* ```ts
* import clientConfig from "../convex/_generated/clientConfig";
*
* const convex = new ConvexReactClient(clientConfig);
* ```
*/
declare const clientConfig: ClientConfiguration;
export default clientConfig;
31 changes: 31 additions & 0 deletions examples/convex/convex/_generated/clientConfig.js
@@ -0,0 +1,31 @@
/* eslint-disable */
/**
* Generated development client configuration.
*
* THIS CODE IS AUTOMATICALLY GENERATED.
*
* Generated by convex@0.5.0.
* To regenerate, run `npx convex codegen`.
* @module
*/

/**
* The DEV Convex client configuration.
*
* This configuration connects your client to your dev Convex deployment
* when `npx convex dev` is running.
*
* To generate the production version, run `npx convex deploy`.
*
* Usage:
*
* ```ts
* import clientConfig from "../convex/_generated/clientConfig";
*
* const convex = new ConvexReactClient(clientConfig);
* ```
*/
const clientConfig = {
address: "http://localhost:8187",
};
export default clientConfig;
48 changes: 30 additions & 18 deletions examples/convex/convex/_generated/dataModel.d.ts
Expand Up @@ -4,34 +4,47 @@
*
* THIS CODE IS AUTOMATICALLY GENERATED.
*
* Generated by convex@0.2.0.
* Generated by convex@0.5.0.
* To regenerate, run `npx convex codegen`.
* @module
*/

import { AnyDataModel } from "convex/server";
import { GenericId } from "convex/values";
import type {
DataModelFromSchemaDefinition,
DocumentMapFromSchemaDefinition,
} from "convex/schema";
import type { TableNamesInDataModel } from "convex/server";
import { GenericId, GenericIdConstructor } from "convex/values";
import schema from "../schema";

/**
* No `schema.ts` file found!
*
* This generated code has permissive types like `Document = any` because
* Convex doesn't know your schema. If you'd like more type safety, see
* https://docs.convex.dev/using/schemas for instructions on how to add a
* schema file.
*
* After you write a schema, rerun codegen with `npx convex codegen`.
* The names of all of your Convex tables.
*/
export type TableNames = TableNamesInDataModel<DataModel>;

/**
* The names of all of your Convex tables.
* The type of a document stored in Convex.
*
* @typeParam TableName - A string literal type of the table name (like "users").
*/
export type TableNames = string;
export type Document<TableName extends TableNames> =
DocumentMapFromSchemaDefinition<typeof schema>[TableName];

/**
* The type of a document stored in Convex.
* 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 [Data Modeling](https://docs.convex.dev/using/data-modeling).
*
* Documents can be loaded using `db.get(id)` in query and mutation functions.
*
* **Important**: Use `myId.equals(otherId)` to check for equality.
* Using `===` will not work because two different instances of `Id` can refer
* to the same document.
*
* @typeParam TableName - A string literal type of the table name (like "users").
*/
export type Document = any;
export type Id<TableName extends TableNames> = GenericId<TableName>;

/**
* An identifier for a document in Convex.
Expand All @@ -45,8 +58,7 @@ export type Document = any;
* Using `===` will not work because two different instances of `Id` can refer
* to the same document.
*/
export type Id = GenericId<string>;
export declare const Id: typeof GenericId;
export declare const Id: GenericIdConstructor<TableNames>;

/**
* A type describing your Convex data model.
Expand All @@ -57,4 +69,4 @@ export declare const Id: typeof GenericId;
* This type is used to parameterize methods like `queryGeneric` and
* `mutationGeneric` to make them type-safe.
*/
export type DataModel = AnyDataModel;
export type DataModel = DataModelFromSchemaDefinition<typeof schema>;
2 changes: 1 addition & 1 deletion examples/convex/convex/_generated/dataModel.js
Expand Up @@ -4,7 +4,7 @@
*
* THIS CODE IS AUTOMATICALLY GENERATED.
*
* Generated by convex@0.2.0.
* Generated by convex@0.5.0.
* To regenerate, run `npx convex codegen`.
* @module
*/
Expand Down

0 comments on commit dbc8334

Please sign in to comment.