diff --git a/drizzle-orm/.eslintrc.js b/drizzle-orm/.eslintrc.js
new file mode 100644
index 00000000..2061cd22
--- /dev/null
+++ b/drizzle-orm/.eslintrc.js
@@ -0,0 +1,4 @@
+/** @type {import('eslint').Linter.Config} */
+module.exports = {
+ extends: ["@remix-run/eslint-config", "@remix-run/eslint-config/node"],
+};
diff --git a/drizzle-orm/.gitignore b/drizzle-orm/.gitignore
new file mode 100644
index 00000000..c7fb563d
--- /dev/null
+++ b/drizzle-orm/.gitignore
@@ -0,0 +1,7 @@
+node_modules
+
+/.cache
+/build
+/public/build
+.env
+*.db
diff --git a/drizzle-orm/README.md b/drizzle-orm/README.md
new file mode 100644
index 00000000..583c14ec
--- /dev/null
+++ b/drizzle-orm/README.md
@@ -0,0 +1,22 @@
+# Drizzle ORM Example
+
+In this example we will setup Drizzle ORM with Remix.
+
+## Preview
+
+Open this example on [CodeSandbox](https://codesandbox.com):
+
+[](https://codesandbox.io/s/github/remix-run/examples/tree/main/drizzle-orm)
+
+## Example
+
+Relevant files:
+
+- [drizzle](./drizzle) migrations and drizzle-related meta information
+- [app/db.server.ts] setup database client
+- [app/schema.ts] define database schema
+- [package.json] add `generate` script and drizzle dependencies
+
+## Related Links
+
+[Drizzle ORM](https://orm.drizzle.team)
diff --git a/drizzle-orm/app/db.server.ts b/drizzle-orm/app/db.server.ts
new file mode 100644
index 00000000..c97f68ce
--- /dev/null
+++ b/drizzle-orm/app/db.server.ts
@@ -0,0 +1,10 @@
+import Database from "better-sqlite3";
+import { drizzle } from "drizzle-orm/better-sqlite3";
+import { migrate } from "drizzle-orm/better-sqlite3/migrator";
+import * as schema from "./schema";
+
+const sqlite = new Database("sqlite.db");
+
+export const db = drizzle(sqlite, { schema });
+
+migrate(db, { migrationsFolder: "drizzle" });
diff --git a/drizzle-orm/app/root.tsx b/drizzle-orm/app/root.tsx
new file mode 100644
index 00000000..927a0f74
--- /dev/null
+++ b/drizzle-orm/app/root.tsx
@@ -0,0 +1,32 @@
+import type { MetaFunction } from "@remix-run/node";
+import {
+ Links,
+ LiveReload,
+ Meta,
+ Outlet,
+ Scripts,
+ ScrollRestoration,
+} from "@remix-run/react";
+
+export const meta: MetaFunction = () => ({
+ charset: "utf-8",
+ title: "New Remix App",
+ viewport: "width=device-width,initial-scale=1",
+});
+
+export default function App() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/drizzle-orm/app/routes/_index.tsx b/drizzle-orm/app/routes/_index.tsx
new file mode 100644
index 00000000..9751ba80
--- /dev/null
+++ b/drizzle-orm/app/routes/_index.tsx
@@ -0,0 +1,61 @@
+import { type ActionArgs } from "@remix-run/node";
+import { Form, useLoaderData } from "@remix-run/react";
+import { sql } from "drizzle-orm";
+import { db } from "~/db.server";
+import { example } from "~/schema";
+
+export async function action({ request }: ActionArgs) {
+ const formData = await request.formData();
+ const intent = formData.get("intent");
+
+ if (intent === "add") {
+ await db.insert(example).values({});
+ return new Response(null, { status: 201 });
+ }
+
+ if (intent == "reset") {
+ await db.delete(example);
+ return new Response(null, { status: 204 });
+ }
+
+ return new Response(null, { status: 400 });
+}
+
+export async function loader() {
+ const rowsQuery = db.query.example.findMany();
+
+ const lastUpdatedQuery = db
+ .select({ updated: sql`MAX(created_at)` })
+ .from(example)
+ .execute()
+ .then((rows) => rows[0].updated);
+
+ return {
+ rows: await rowsQuery,
+ lastUpdated: await lastUpdatedQuery,
+ };
+}
+
+export default function Index() {
+ const { rows, lastUpdated } = useLoaderData();
+
+ return (
+
+
Welcome to Remix
+
Last Updated: {lastUpdated ?? "--"}
+
+
+ {rows.map((row) => (
+ - {row.id}
+ ))}
+
+
+ );
+}
diff --git a/drizzle-orm/app/schema.ts b/drizzle-orm/app/schema.ts
new file mode 100644
index 00000000..98495e3a
--- /dev/null
+++ b/drizzle-orm/app/schema.ts
@@ -0,0 +1,7 @@
+import { sql } from 'drizzle-orm'
+import { sqliteTable, integer, text } from "drizzle-orm/sqlite-core";
+
+export const example = sqliteTable('example', {
+ id: integer('id').primaryKey(),
+ createdAt: text('created_at').default(sql`CURRENT_TIMESTAMP`),
+})
diff --git a/drizzle-orm/drizzle.config.ts b/drizzle-orm/drizzle.config.ts
new file mode 100644
index 00000000..3ea082b0
--- /dev/null
+++ b/drizzle-orm/drizzle.config.ts
@@ -0,0 +1,6 @@
+import type { Config } from "drizzle-kit";
+
+export default {
+ schema: "./app/schema.ts",
+ out: "./drizzle",
+} satisfies Config;
diff --git a/drizzle-orm/drizzle/0000_mute_groot.sql b/drizzle-orm/drizzle/0000_mute_groot.sql
new file mode 100644
index 00000000..691bc165
--- /dev/null
+++ b/drizzle-orm/drizzle/0000_mute_groot.sql
@@ -0,0 +1,4 @@
+CREATE TABLE `example` (
+ `id` integer PRIMARY KEY NOT NULL,
+ `created_at` text DEFAULT CURRENT_TIMESTAMP
+);
diff --git a/drizzle-orm/drizzle/meta/0000_snapshot.json b/drizzle-orm/drizzle/meta/0000_snapshot.json
new file mode 100644
index 00000000..5fc7695f
--- /dev/null
+++ b/drizzle-orm/drizzle/meta/0000_snapshot.json
@@ -0,0 +1,38 @@
+{
+ "version": "5",
+ "dialect": "sqlite",
+ "id": "0be79972-b6bf-4225-88d7-95a723174903",
+ "prevId": "00000000-0000-0000-0000-000000000000",
+ "tables": {
+ "example": {
+ "name": "example",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "integer",
+ "primaryKey": true,
+ "notNull": true,
+ "autoincrement": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "autoincrement": false,
+ "default": "CURRENT_TIMESTAMP"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ }
+ },
+ "enums": {},
+ "_meta": {
+ "schemas": {},
+ "tables": {},
+ "columns": {}
+ }
+}
\ No newline at end of file
diff --git a/drizzle-orm/drizzle/meta/_journal.json b/drizzle-orm/drizzle/meta/_journal.json
new file mode 100644
index 00000000..4745c3ec
--- /dev/null
+++ b/drizzle-orm/drizzle/meta/_journal.json
@@ -0,0 +1,13 @@
+{
+ "version": "5",
+ "dialect": "sqlite",
+ "entries": [
+ {
+ "idx": 0,
+ "version": "5",
+ "when": 1697441145549,
+ "tag": "0000_mute_groot",
+ "breakpoints": true
+ }
+ ]
+}
\ No newline at end of file
diff --git a/drizzle-orm/package.json b/drizzle-orm/package.json
new file mode 100644
index 00000000..7e9db94c
--- /dev/null
+++ b/drizzle-orm/package.json
@@ -0,0 +1,34 @@
+{
+ "private": true,
+ "sideEffects": false,
+ "scripts": {
+ "build": "remix build",
+ "dev": "remix dev",
+ "generate": "drizzle-kit generate:sqlite",
+ "start": "remix-serve build",
+ "typecheck": "tsc"
+ },
+ "dependencies": {
+ "@remix-run/node": "^1.19.3",
+ "@remix-run/react": "^1.19.3",
+ "@remix-run/serve": "^1.19.3",
+ "better-sqlite3": "^9.0.0",
+ "drizzle-orm": "^0.28.6",
+ "isbot": "^3.6.5",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0"
+ },
+ "devDependencies": {
+ "@remix-run/dev": "^1.19.3",
+ "@remix-run/eslint-config": "^1.19.3",
+ "@types/better-sqlite3": "^7.6.5",
+ "@types/react": "^18.0.25",
+ "@types/react-dom": "^18.0.8",
+ "drizzle-kit": "^0.19.13",
+ "eslint": "^8.27.0",
+ "typescript": "^4.8.4"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+}
diff --git a/drizzle-orm/public/favicon.ico b/drizzle-orm/public/favicon.ico
new file mode 100644
index 00000000..8830cf68
Binary files /dev/null and b/drizzle-orm/public/favicon.ico differ
diff --git a/drizzle-orm/remix.config.js b/drizzle-orm/remix.config.js
new file mode 100644
index 00000000..ca00ba94
--- /dev/null
+++ b/drizzle-orm/remix.config.js
@@ -0,0 +1,11 @@
+/** @type {import('@remix-run/dev').AppConfig} */
+module.exports = {
+ future: {
+ v2_routeConvention: true,
+ },
+ ignoredRouteFiles: ["**/.*"],
+ // appDirectory: "app",
+ // assetsBuildDirectory: "public/build",
+ // publicPath: "/build/",
+ // serverBuildPath: "build/index.js",
+};
diff --git a/drizzle-orm/remix.env.d.ts b/drizzle-orm/remix.env.d.ts
new file mode 100644
index 00000000..dcf8c45e
--- /dev/null
+++ b/drizzle-orm/remix.env.d.ts
@@ -0,0 +1,2 @@
+///
+///
diff --git a/drizzle-orm/sandbox.config.json b/drizzle-orm/sandbox.config.json
new file mode 100644
index 00000000..f92e0250
--- /dev/null
+++ b/drizzle-orm/sandbox.config.json
@@ -0,0 +1,7 @@
+{
+ "hardReloadOnChange": true,
+ "template": "remix",
+ "container": {
+ "port": 3000
+ }
+}
diff --git a/drizzle-orm/tsconfig.json b/drizzle-orm/tsconfig.json
new file mode 100644
index 00000000..20f8a386
--- /dev/null
+++ b/drizzle-orm/tsconfig.json
@@ -0,0 +1,22 @@
+{
+ "include": ["remix.env.d.ts", "**/*.ts", "**/*.tsx"],
+ "compilerOptions": {
+ "lib": ["DOM", "DOM.Iterable", "ES2019"],
+ "isolatedModules": true,
+ "esModuleInterop": true,
+ "jsx": "react-jsx",
+ "moduleResolution": "node",
+ "resolveJsonModule": true,
+ "target": "ES2019",
+ "strict": true,
+ "allowJs": true,
+ "forceConsistentCasingInFileNames": true,
+ "baseUrl": ".",
+ "paths": {
+ "~/*": ["./app/*"]
+ },
+
+ // Remix takes care of building everything in `remix build`.
+ "noEmit": true
+ }
+}