Skip to main content

Installation

pnpm add @rjdellecese/confect

Usage

  • Create a new Convex deployment with convex dev
1

Define your database schema

Not every Effect Schema is valid for use in Confect. See schema-restrictions for more information about what’s permitted and what’s not.
confect/schema.ts
import {
  defineConfectSchema,
  defineConfectTable,
  GenericId,
} from "@rjdellecese/confect/server";
import { Schema } from "effect";

type Tag = {
  readonly name: string;
  readonly tags: readonly Tag[];
};

const Tag = Schema.Struct({
  name: Schema.String,
  tags: Schema.Array(Schema.suspend((): Schema.Schema<Tag> => Tag)),
});

export const confectSchema = defineConfectSchema({
  notes: defineConfectTable(
    Schema.Struct({
      userId: Schema.optional(GenericId("users")),
      text: Schema.String.pipe(Schema.maxLength(100)),
      tag: Schema.optional(Schema.String),
      author: Schema.optional(
        Schema.Struct({
          role: Schema.Literal("admin", "user"),
          name: Schema.String,
        }),
      ),
      embedding: Schema.optional(Schema.Array(Schema.Number)),
    }),
  )
    .index("by_text", ["text"])
    .index("by_role", ["author.role"])
    .searchIndex("text", {
      searchField: "text",
      filterFields: ["tag"],
    })
    .vectorIndex("embedding", {
      vectorField: "embedding",
      filterFields: ["author.name", "tag"],
      dimensions: 1536,
    }),
  users: defineConfectTable(
    Schema.Struct({
      username: Schema.String,
    }),
  ),
  tags: defineConfectTable(Tag),
});

export default confectSchema.convexSchemaDefinition;
2

Generate your Convex function constructors and types

Two
3

Write some Convex functions!

Three

Example project

See a full, working example project here.