Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(examples): Update convex example #43741

Merged
merged 2 commits into from Dec 7, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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