mirror of
https://github.com/linux-odyssey/linux-odyssey.git
synced 2026-11-05 19:20:12 +08:00
feat: init database package
This commit is contained in:
1 parent
4cf79a164c
commit
ba5026fa56
14 files changed
+2375
-12
No files matched your search
@@ -0,0 +1,5 @@
|
||||
# Copy this file to `.env` and replace the placeholder with your real connection string.
|
||||
# Connection string for PostgreSQL.
|
||||
# Requires PostgreSQL >= 15.
|
||||
|
||||
DATABASE_URL="postgresql://user:password@localhost:5432/mydb"
|
||||
@@ -0,0 +1,6 @@
|
||||
src/prisma/contract.json linguist-generated
|
||||
src/prisma/contract.d.ts linguist-generated
|
||||
src/prisma/ops.json linguist-generated
|
||||
src/prisma/migration.json linguist-generated
|
||||
migrations/snapshots/**/contract.json linguist-generated
|
||||
migrations/snapshots/**/contract.d.ts linguist-generated
|
||||
@@ -0,0 +1,36 @@
|
||||
# dependencies (bun install)
|
||||
node_modules
|
||||
|
||||
# output
|
||||
out
|
||||
dist
|
||||
*.tgz
|
||||
|
||||
# code coverage
|
||||
coverage
|
||||
*.lcov
|
||||
|
||||
# logs
|
||||
logs
|
||||
_.log
|
||||
report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json
|
||||
|
||||
# dotenv environment variable files
|
||||
.env
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
.env.local
|
||||
|
||||
# caches
|
||||
.eslintcache
|
||||
.cache
|
||||
*.tsbuildinfo
|
||||
|
||||
# IntelliJ based IDEs
|
||||
.idea
|
||||
|
||||
# Finder (MacOS) folder config
|
||||
.DS_Store
|
||||
node_modules/
|
||||
dist/
|
||||
@@ -0,0 +1,15 @@
|
||||
# @odyssey/database
|
||||
|
||||
To install dependencies:
|
||||
|
||||
```bash
|
||||
bun install
|
||||
```
|
||||
|
||||
To run:
|
||||
|
||||
```bash
|
||||
bun run index.ts
|
||||
```
|
||||
|
||||
This project was created using `bun init` in bun v1.3.14. [Bun](https://bun.com) is a fast all-in-one JavaScript runtime.
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"name": "@odyssey/database",
|
||||
"module": "src/index.ts",
|
||||
"type": "module",
|
||||
"devDependencies": {
|
||||
"@prisma/cli-engine": "0.7.0",
|
||||
"@types/bun": "latest",
|
||||
"@types/node": "^26.6.5",
|
||||
"prisma": "^8.0.0-rc.22"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": "^5"
|
||||
},
|
||||
"scripts": {
|
||||
"contract:emit": "prisma contract emit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@prisma/orm-postgres": "^8.0.0-rc.17",
|
||||
"dotenv": "^18.0.7"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
# Welcome to Prisma ORM!
|
||||
|
||||
Prisma ORM lets you query your database in simple, easy-to-read TypeScript. Define what your data looks like, and Prisma ORM gives you a fully typed client — with autocomplete for every table, column, and relation.
|
||||
|
||||
This project is set up for PostgreSQL. Prisma ORM also supports other databases.
|
||||
|
||||
## Requirements
|
||||
|
||||
- **PostgreSQL 15 or newer.** Older servers are not supported. Run `SELECT version()` against your server to verify.
|
||||
- The CLI never connects to your database without explicit consent. Pass `--probe-db` to `bun prisma orm init` if you want `init` to verify the server version itself.
|
||||
|
||||
## Your data contract
|
||||
|
||||
Your data contract is the heart of your application. It lives at [`src/prisma/contract.prisma`](src/prisma/contract.prisma) and describes your models:
|
||||
|
||||
```prisma
|
||||
model User {
|
||||
id Int @id @default(autoincrement())
|
||||
email String @unique
|
||||
username String?
|
||||
name String?
|
||||
}
|
||||
```
|
||||
|
||||
Every model you define in your contract can be queried from your app. Your editor will autocomplete the query methods and show you what type each model field is:
|
||||
|
||||
```typescript
|
||||
import { db } from './src/prisma/db';
|
||||
|
||||
const user = await db.orm.public.User
|
||||
.where({ email: 'alice@example.com' })
|
||||
.first();
|
||||
|
||||
// Your editor will show the type of user as
|
||||
// { id: number; email: string; username: string | null; name: string | null; createdAt: Date; posts: Post[] } | null
|
||||
```
|
||||
|
||||
Your contract has two companion files in the same directory:
|
||||
|
||||
- **`contract.json`** — this tells your application what models exist, just like `package-lock.json` tells your package manager what dependencies your project has
|
||||
- **`contract.d.ts`** — this powers autocomplete and type checking in your editor
|
||||
|
||||
Commit both files to git. When you change your contract, run `bun prisma contract emit` to update them.
|
||||
|
||||
If you use a framework like Next.js or Vite, the Prisma ORM plugin will do this for you automatically.
|
||||
|
||||
## Configuration
|
||||
|
||||
[`prisma.config.ts`](prisma.config.ts) tells the CLI where your contract lives and how to connect to your database. It loads environment variables from `.env` automatically:
|
||||
|
||||
```typescript
|
||||
import 'dotenv/config';
|
||||
import { definePrismaConfig } from '@prisma/cli-engine';
|
||||
import { defineConfig as ormConfig } from '@prisma/orm-postgres/config';
|
||||
|
||||
export default definePrismaConfig({
|
||||
orm: ormConfig({
|
||||
contract: './src/prisma/contract.prisma',
|
||||
db: {
|
||||
connection: process.env['DATABASE_URL']!,
|
||||
},
|
||||
}),
|
||||
});
|
||||
```
|
||||
|
||||
Notice the `DATABASE_URL` above? It's defined in your [`.env`](./.env) file:
|
||||
|
||||
```env
|
||||
DATABASE_URL="postgresql://user:password@localhost:5432/mydb"
|
||||
```
|
||||
|
||||
You can customize how your environment variables are loaded by changing or removing the `import 'dotenv/config'` line.
|
||||
|
||||
## Quick reference
|
||||
|
||||
### Commands
|
||||
|
||||
```bash
|
||||
bun prisma contract emit # Update contract.json and contract.d.ts
|
||||
bun prisma db init # Create tables in the database
|
||||
bun prisma migration status # Show migration status
|
||||
```
|
||||
|
||||
### Files
|
||||
|
||||
| File | Purpose |
|
||||
|---|---|
|
||||
| [`src/prisma/contract.prisma`](src/prisma/contract.prisma) | Your data contract — define your models here |
|
||||
| [`prisma.config.ts`](prisma.config.ts) | CLI configuration |
|
||||
| [`src/prisma/db.ts`](src/prisma/db.ts) | Database client — `import { db } from './src/prisma/db'` |
|
||||
| `src/prisma/contract.json` | Compiled contract (generated) |
|
||||
| `src/prisma/contract.d.ts` | Contract types (generated) |
|
||||
|
||||
### Workflow
|
||||
|
||||
1. Edit [`src/prisma/contract.prisma`](src/prisma/contract.prisma) to add or change models.
|
||||
2. Run `bun prisma contract emit` to regenerate the contract.
|
||||
3. Query your models — your IDE will autocomplete everything.
|
||||
|
||||
## Monorepo notes (pnpm workspaces)
|
||||
|
||||
If this project lives inside a pnpm workspace, a few things are worth knowing:
|
||||
|
||||
- **Catalogs.** When the workspace's `pnpm-workspace.yaml` defines a `catalogs` entry for `prisma` or `@prisma/orm-postgres`, pnpm uses the catalog version everywhere — `init` does too. If you wanted the published `latest` instead, update or remove the catalog entry, then re-run `pnpm install`.
|
||||
- **`pnpm dlx`.** `pnpm dlx prisma@latest orm init …` works in any directory. Inside a workspace, pnpm still resolves dependencies through the workspace's catalog/overrides rather than the registry; expect the installed Prisma ORM packages to reflect the workspace's catalog rather than `latest`.
|
||||
- **`pnpm` → `npm` fallback.** If `pnpm` ever fails to install Prisma ORM with a `workspace:*` or `catalog:` resolution error (a leak in a published artefact), `init` falls back to `npm install` and surfaces a warning. Once the offending package republishes a clean version you can switch back with `pnpm install`.
|
||||
@@ -0,0 +1,12 @@
|
||||
import 'dotenv/config';
|
||||
import { definePrismaConfig } from '@prisma/cli-engine';
|
||||
import { defineConfig as ormConfig } from '@prisma/orm-postgres/config';
|
||||
|
||||
export default definePrismaConfig({
|
||||
orm: ormConfig({
|
||||
contract: "./src/prisma/contract.prisma",
|
||||
db: {
|
||||
connection: process.env['DATABASE_URL']!,
|
||||
},
|
||||
}),
|
||||
});
|
||||
@@ -0,0 +1 @@
|
||||
console.log('Hello via Bun!')
|
||||
+677
@@ -0,0 +1,677 @@
|
||||
// ⚠️ GENERATED FILE - DO NOT EDIT
|
||||
// This file is automatically generated by 'prisma contract emit'.
|
||||
// To regenerate, run: prisma contract emit
|
||||
import type { CodecTypes as PgTypes } from '@prisma/orm-postgres/target/codec-types';
|
||||
import type { QueryOperationTypes as PgTargetQueryOps } from '@prisma/orm-postgres/target/operation-types';
|
||||
|
||||
import type {
|
||||
ContractWithTypeMaps,
|
||||
RelationKeys,
|
||||
TypeMaps as TypeMapsType,
|
||||
} from '@prisma/orm-postgres/family-contract/types';
|
||||
import type {
|
||||
Contract as ContractType,
|
||||
ExecutionHashBase,
|
||||
NamespaceId,
|
||||
ProfileHashBase,
|
||||
StorageHashBase,
|
||||
} from '@prisma/orm-postgres/contract/types';
|
||||
|
||||
export type StorageHash =
|
||||
StorageHashBase<'a51b4833fdaffe730572670ccc27dd89af7e0726ab3de7f428d21702d687cc15'>;
|
||||
export type ExecutionHash =
|
||||
ExecutionHashBase<'4e88564095b5e0ba7904ffdba3c563ef916d87688c8c483c67055f71a9194f0f'>;
|
||||
export type ProfileHash =
|
||||
ProfileHashBase<'3916f444a8a17ad749191acf9e08dad97d1a327b88c2f1d45d12f240296aa8b2'>;
|
||||
|
||||
export type CodecTypes = PgTypes;
|
||||
export type LaneCodecTypes = CodecTypes;
|
||||
export type QueryOperationTypes = PgTargetQueryOps<CodecTypes>;
|
||||
export type AggregateTypes = {
|
||||
readonly avg: {
|
||||
readonly byCodec: {
|
||||
readonly 'pg/float@1': { readonly output: 'pg/float8@1'; readonly nullable: true };
|
||||
readonly 'pg/float4@1': { readonly output: 'pg/float8@1'; readonly nullable: true };
|
||||
readonly 'pg/float8@1': { readonly output: 'pg/float8@1'; readonly nullable: true };
|
||||
readonly 'pg/int@1': { readonly output: 'pg/float8@1'; readonly nullable: true };
|
||||
readonly 'pg/int2@1': { readonly output: 'pg/float8@1'; readonly nullable: true };
|
||||
readonly 'pg/int4@1': { readonly output: 'pg/float8@1'; readonly nullable: true };
|
||||
readonly 'pg/int8@1': { readonly output: 'pg/float8@1'; readonly nullable: true };
|
||||
readonly 'pg/int8number@1': { readonly output: 'pg/float8@1'; readonly nullable: true };
|
||||
readonly 'pg/interval@1': { readonly output: 'pg/interval@1'; readonly nullable: true };
|
||||
readonly 'pg/numeric@1': { readonly output: 'pg/numeric@1'; readonly nullable: true };
|
||||
readonly 'pg/time-string@1': { readonly output: 'pg/interval@1'; readonly nullable: true };
|
||||
readonly 'pg/time-temporal@1': { readonly output: 'pg/interval@1'; readonly nullable: true };
|
||||
readonly 'pg/unboundedint@1': { readonly output: 'pg/float8@1'; readonly nullable: true };
|
||||
readonly 'sql/float@1': { readonly output: 'pg/float8@1'; readonly nullable: true };
|
||||
readonly 'sql/int@1': { readonly output: 'pg/float8@1'; readonly nullable: true };
|
||||
};
|
||||
};
|
||||
readonly avgDecimal: {
|
||||
readonly byCodec: {
|
||||
readonly 'pg/int@1': { readonly output: 'pg/numeric@1'; readonly nullable: true };
|
||||
readonly 'pg/int2@1': { readonly output: 'pg/numeric@1'; readonly nullable: true };
|
||||
readonly 'pg/int4@1': { readonly output: 'pg/numeric@1'; readonly nullable: true };
|
||||
readonly 'pg/int8@1': { readonly output: 'pg/numeric@1'; readonly nullable: true };
|
||||
readonly 'pg/int8number@1': { readonly output: 'pg/numeric@1'; readonly nullable: true };
|
||||
readonly 'pg/numeric@1': { readonly output: 'pg/numeric@1'; readonly nullable: true };
|
||||
readonly 'pg/unboundedint@1': { readonly output: 'pg/numeric@1'; readonly nullable: true };
|
||||
readonly 'sql/int@1': { readonly output: 'pg/numeric@1'; readonly nullable: true };
|
||||
};
|
||||
};
|
||||
readonly count: {
|
||||
readonly byCodec: {};
|
||||
readonly withoutInput: { readonly output: 'pg/int8number@1'; readonly nullable: false };
|
||||
readonly anyInput: { readonly output: 'pg/int8number@1'; readonly nullable: false };
|
||||
};
|
||||
readonly countBigInt: {
|
||||
readonly byCodec: {};
|
||||
readonly withoutInput: { readonly output: 'pg/int8@1'; readonly nullable: false };
|
||||
readonly anyInput: { readonly output: 'pg/int8@1'; readonly nullable: false };
|
||||
};
|
||||
readonly max: {
|
||||
readonly byCodec: {
|
||||
readonly 'pg/char@1': { readonly output: 'pg/char@1'; readonly nullable: true };
|
||||
readonly 'pg/date-string@1': { readonly output: 'pg/date-string@1'; readonly nullable: true };
|
||||
readonly 'pg/date-temporal@1': {
|
||||
readonly output: 'pg/date-temporal@1';
|
||||
readonly nullable: true;
|
||||
};
|
||||
readonly 'pg/enum@1': { readonly output: 'pg/enum@1'; readonly nullable: true };
|
||||
readonly 'pg/float@1': { readonly output: 'pg/float@1'; readonly nullable: true };
|
||||
readonly 'pg/float4@1': { readonly output: 'pg/float4@1'; readonly nullable: true };
|
||||
readonly 'pg/float8@1': { readonly output: 'pg/float8@1'; readonly nullable: true };
|
||||
readonly 'pg/inet@1': { readonly output: 'pg/inet@1'; readonly nullable: true };
|
||||
readonly 'pg/int@1': { readonly output: 'pg/int@1'; readonly nullable: true };
|
||||
readonly 'pg/int2@1': { readonly output: 'pg/int2@1'; readonly nullable: true };
|
||||
readonly 'pg/int4@1': { readonly output: 'pg/int4@1'; readonly nullable: true };
|
||||
readonly 'pg/int8@1': { readonly output: 'pg/int8@1'; readonly nullable: true };
|
||||
readonly 'pg/int8number@1': { readonly output: 'pg/int8number@1'; readonly nullable: true };
|
||||
readonly 'pg/interval@1': { readonly output: 'pg/interval@1'; readonly nullable: true };
|
||||
readonly 'pg/numeric@1': { readonly output: 'pg/numeric@1'; readonly nullable: true };
|
||||
readonly 'pg/text-array@1': { readonly output: 'pg/text-array@1'; readonly nullable: true };
|
||||
readonly 'pg/text@1': { readonly output: 'pg/text@1'; readonly nullable: true };
|
||||
readonly 'pg/time-string@1': { readonly output: 'pg/time-string@1'; readonly nullable: true };
|
||||
readonly 'pg/time-temporal@1': {
|
||||
readonly output: 'pg/time-temporal@1';
|
||||
readonly nullable: true;
|
||||
};
|
||||
readonly 'pg/timestamp-string@1': {
|
||||
readonly output: 'pg/timestamp-string@1';
|
||||
readonly nullable: true;
|
||||
};
|
||||
readonly 'pg/timestamp-temporal@1': {
|
||||
readonly output: 'pg/timestamp-temporal@1';
|
||||
readonly nullable: true;
|
||||
};
|
||||
readonly 'pg/timestamptz-date@1': {
|
||||
readonly output: 'pg/timestamptz-date@1';
|
||||
readonly nullable: true;
|
||||
};
|
||||
readonly 'pg/timestamptz-string@1': {
|
||||
readonly output: 'pg/timestamptz-string@1';
|
||||
readonly nullable: true;
|
||||
};
|
||||
readonly 'pg/timestamptz-temporal@1': {
|
||||
readonly output: 'pg/timestamptz-temporal@1';
|
||||
readonly nullable: true;
|
||||
};
|
||||
readonly 'pg/timetz@1': { readonly output: 'pg/timetz@1'; readonly nullable: true };
|
||||
readonly 'pg/unboundedint@1': {
|
||||
readonly output: 'pg/unboundedint@1';
|
||||
readonly nullable: true;
|
||||
};
|
||||
readonly 'pg/varchar@1': { readonly output: 'pg/text@1'; readonly nullable: true };
|
||||
readonly 'sql/char@1': { readonly output: 'sql/char@1'; readonly nullable: true };
|
||||
readonly 'sql/float@1': { readonly output: 'sql/float@1'; readonly nullable: true };
|
||||
readonly 'sql/int@1': { readonly output: 'sql/int@1'; readonly nullable: true };
|
||||
readonly 'sql/text@1': { readonly output: 'sql/text@1'; readonly nullable: true };
|
||||
readonly 'sql/varchar@1': { readonly output: 'pg/text@1'; readonly nullable: true };
|
||||
};
|
||||
};
|
||||
readonly min: {
|
||||
readonly byCodec: {
|
||||
readonly 'pg/char@1': { readonly output: 'pg/char@1'; readonly nullable: true };
|
||||
readonly 'pg/date-string@1': { readonly output: 'pg/date-string@1'; readonly nullable: true };
|
||||
readonly 'pg/date-temporal@1': {
|
||||
readonly output: 'pg/date-temporal@1';
|
||||
readonly nullable: true;
|
||||
};
|
||||
readonly 'pg/enum@1': { readonly output: 'pg/enum@1'; readonly nullable: true };
|
||||
readonly 'pg/float@1': { readonly output: 'pg/float@1'; readonly nullable: true };
|
||||
readonly 'pg/float4@1': { readonly output: 'pg/float4@1'; readonly nullable: true };
|
||||
readonly 'pg/float8@1': { readonly output: 'pg/float8@1'; readonly nullable: true };
|
||||
readonly 'pg/inet@1': { readonly output: 'pg/inet@1'; readonly nullable: true };
|
||||
readonly 'pg/int@1': { readonly output: 'pg/int@1'; readonly nullable: true };
|
||||
readonly 'pg/int2@1': { readonly output: 'pg/int2@1'; readonly nullable: true };
|
||||
readonly 'pg/int4@1': { readonly output: 'pg/int4@1'; readonly nullable: true };
|
||||
readonly 'pg/int8@1': { readonly output: 'pg/int8@1'; readonly nullable: true };
|
||||
readonly 'pg/int8number@1': { readonly output: 'pg/int8number@1'; readonly nullable: true };
|
||||
readonly 'pg/interval@1': { readonly output: 'pg/interval@1'; readonly nullable: true };
|
||||
readonly 'pg/numeric@1': { readonly output: 'pg/numeric@1'; readonly nullable: true };
|
||||
readonly 'pg/text-array@1': { readonly output: 'pg/text-array@1'; readonly nullable: true };
|
||||
readonly 'pg/text@1': { readonly output: 'pg/text@1'; readonly nullable: true };
|
||||
readonly 'pg/time-string@1': { readonly output: 'pg/time-string@1'; readonly nullable: true };
|
||||
readonly 'pg/time-temporal@1': {
|
||||
readonly output: 'pg/time-temporal@1';
|
||||
readonly nullable: true;
|
||||
};
|
||||
readonly 'pg/timestamp-string@1': {
|
||||
readonly output: 'pg/timestamp-string@1';
|
||||
readonly nullable: true;
|
||||
};
|
||||
readonly 'pg/timestamp-temporal@1': {
|
||||
readonly output: 'pg/timestamp-temporal@1';
|
||||
readonly nullable: true;
|
||||
};
|
||||
readonly 'pg/timestamptz-date@1': {
|
||||
readonly output: 'pg/timestamptz-date@1';
|
||||
readonly nullable: true;
|
||||
};
|
||||
readonly 'pg/timestamptz-string@1': {
|
||||
readonly output: 'pg/timestamptz-string@1';
|
||||
readonly nullable: true;
|
||||
};
|
||||
readonly 'pg/timestamptz-temporal@1': {
|
||||
readonly output: 'pg/timestamptz-temporal@1';
|
||||
readonly nullable: true;
|
||||
};
|
||||
readonly 'pg/timetz@1': { readonly output: 'pg/timetz@1'; readonly nullable: true };
|
||||
readonly 'pg/unboundedint@1': {
|
||||
readonly output: 'pg/unboundedint@1';
|
||||
readonly nullable: true;
|
||||
};
|
||||
readonly 'pg/varchar@1': { readonly output: 'pg/text@1'; readonly nullable: true };
|
||||
readonly 'sql/char@1': { readonly output: 'sql/char@1'; readonly nullable: true };
|
||||
readonly 'sql/float@1': { readonly output: 'sql/float@1'; readonly nullable: true };
|
||||
readonly 'sql/int@1': { readonly output: 'sql/int@1'; readonly nullable: true };
|
||||
readonly 'sql/text@1': { readonly output: 'sql/text@1'; readonly nullable: true };
|
||||
readonly 'sql/varchar@1': { readonly output: 'pg/text@1'; readonly nullable: true };
|
||||
};
|
||||
};
|
||||
readonly sum: {
|
||||
readonly byCodec: {
|
||||
readonly 'pg/float@1': { readonly output: 'pg/float8@1'; readonly nullable: true };
|
||||
readonly 'pg/float4@1': { readonly output: 'pg/float4@1'; readonly nullable: true };
|
||||
readonly 'pg/float8@1': { readonly output: 'pg/float8@1'; readonly nullable: true };
|
||||
readonly 'pg/int@1': { readonly output: 'pg/int8number@1'; readonly nullable: true };
|
||||
readonly 'pg/int2@1': { readonly output: 'pg/int8number@1'; readonly nullable: true };
|
||||
readonly 'pg/int4@1': { readonly output: 'pg/int8number@1'; readonly nullable: true };
|
||||
readonly 'pg/int8@1': { readonly output: 'pg/int8number@1'; readonly nullable: true };
|
||||
readonly 'pg/int8number@1': { readonly output: 'pg/int8number@1'; readonly nullable: true };
|
||||
readonly 'pg/interval@1': { readonly output: 'pg/interval@1'; readonly nullable: true };
|
||||
readonly 'pg/numeric@1': { readonly output: 'pg/numeric@1'; readonly nullable: true };
|
||||
readonly 'pg/time-string@1': { readonly output: 'pg/interval@1'; readonly nullable: true };
|
||||
readonly 'pg/time-temporal@1': { readonly output: 'pg/interval@1'; readonly nullable: true };
|
||||
readonly 'pg/unboundedint@1': {
|
||||
readonly output: 'pg/unboundedint@1';
|
||||
readonly nullable: true;
|
||||
};
|
||||
readonly 'sql/float@1': { readonly output: 'pg/float8@1'; readonly nullable: true };
|
||||
readonly 'sql/int@1': { readonly output: 'pg/int8number@1'; readonly nullable: true };
|
||||
};
|
||||
};
|
||||
readonly sumBigInt: {
|
||||
readonly byCodec: {
|
||||
readonly 'pg/int@1': { readonly output: 'pg/int8@1'; readonly nullable: true };
|
||||
readonly 'pg/int2@1': { readonly output: 'pg/int8@1'; readonly nullable: true };
|
||||
readonly 'pg/int4@1': { readonly output: 'pg/int8@1'; readonly nullable: true };
|
||||
readonly 'pg/int8@1': { readonly output: 'pg/unboundedint@1'; readonly nullable: true };
|
||||
readonly 'pg/int8number@1': { readonly output: 'pg/unboundedint@1'; readonly nullable: true };
|
||||
readonly 'pg/unboundedint@1': {
|
||||
readonly output: 'pg/unboundedint@1';
|
||||
readonly nullable: true;
|
||||
};
|
||||
readonly 'sql/int@1': { readonly output: 'pg/int8@1'; readonly nullable: true };
|
||||
};
|
||||
};
|
||||
};
|
||||
type DefaultLiteralValue<CodecId extends string, Encoded> = CodecId extends keyof CodecTypes
|
||||
? Encoded extends CodecTypes[CodecId]['json']
|
||||
? Encoded
|
||||
: CodecTypes[CodecId]['json']
|
||||
: Encoded;
|
||||
|
||||
export type FieldOutputTypes = {
|
||||
readonly public: {
|
||||
readonly Post: {
|
||||
readonly authorId: CodecTypes['pg/int4@1']['output'];
|
||||
readonly content: CodecTypes['pg/text@1']['output'] | null;
|
||||
readonly createdAt: CodecTypes['pg/timestamptz-string@1']['output'];
|
||||
readonly id: CodecTypes['pg/int4@1']['output'];
|
||||
readonly title: CodecTypes['pg/text@1']['output'];
|
||||
readonly updatedAt: CodecTypes['pg/timestamptz-string@1']['output'];
|
||||
};
|
||||
readonly User: {
|
||||
readonly createdAt: CodecTypes['pg/timestamptz-string@1']['output'];
|
||||
readonly email: CodecTypes['pg/text@1']['output'];
|
||||
readonly id: CodecTypes['pg/int4@1']['output'];
|
||||
readonly name: CodecTypes['pg/text@1']['output'] | null;
|
||||
readonly updatedAt: CodecTypes['pg/timestamptz-string@1']['output'];
|
||||
readonly username: CodecTypes['pg/text@1']['output'] | null;
|
||||
};
|
||||
};
|
||||
};
|
||||
export type FieldInputTypes = {
|
||||
readonly public: {
|
||||
readonly Post: {
|
||||
readonly authorId: CodecTypes['pg/int4@1']['input'];
|
||||
readonly content: CodecTypes['pg/text@1']['input'] | null;
|
||||
readonly createdAt: CodecTypes['pg/timestamptz-string@1']['input'];
|
||||
readonly id: CodecTypes['pg/int4@1']['input'];
|
||||
readonly title: CodecTypes['pg/text@1']['input'];
|
||||
readonly updatedAt: CodecTypes['pg/timestamptz-string@1']['input'];
|
||||
};
|
||||
readonly User: {
|
||||
readonly createdAt: CodecTypes['pg/timestamptz-string@1']['input'];
|
||||
readonly email: CodecTypes['pg/text@1']['input'];
|
||||
readonly id: CodecTypes['pg/int4@1']['input'];
|
||||
readonly name: CodecTypes['pg/text@1']['input'] | null;
|
||||
readonly updatedAt: CodecTypes['pg/timestamptz-string@1']['input'];
|
||||
readonly username: CodecTypes['pg/text@1']['input'] | null;
|
||||
};
|
||||
};
|
||||
};
|
||||
export type StorageColumnTypes = {
|
||||
readonly public: {
|
||||
readonly Post: {
|
||||
readonly authorId: CodecTypes['pg/int4@1']['output'];
|
||||
readonly content: CodecTypes['pg/text@1']['output'] | null;
|
||||
readonly createdAt: CodecTypes['pg/timestamptz-string@1']['output'];
|
||||
readonly id: CodecTypes['pg/int4@1']['output'];
|
||||
readonly title: CodecTypes['pg/text@1']['output'];
|
||||
readonly updatedAt: CodecTypes['pg/timestamptz-string@1']['output'];
|
||||
};
|
||||
readonly User: {
|
||||
readonly createdAt: CodecTypes['pg/timestamptz-string@1']['output'];
|
||||
readonly email: CodecTypes['pg/text@1']['output'];
|
||||
readonly id: CodecTypes['pg/int4@1']['output'];
|
||||
readonly name: CodecTypes['pg/text@1']['output'] | null;
|
||||
readonly updatedAt: CodecTypes['pg/timestamptz-string@1']['output'];
|
||||
readonly username: CodecTypes['pg/text@1']['output'] | null;
|
||||
};
|
||||
};
|
||||
};
|
||||
export type StorageColumnInputTypes = {
|
||||
readonly public: {
|
||||
readonly Post: {
|
||||
readonly authorId: CodecTypes['pg/int4@1']['input'];
|
||||
readonly content: CodecTypes['pg/text@1']['input'] | null;
|
||||
readonly createdAt: CodecTypes['pg/timestamptz-string@1']['input'];
|
||||
readonly id: CodecTypes['pg/int4@1']['input'];
|
||||
readonly title: CodecTypes['pg/text@1']['input'];
|
||||
readonly updatedAt: CodecTypes['pg/timestamptz-string@1']['input'];
|
||||
};
|
||||
readonly User: {
|
||||
readonly createdAt: CodecTypes['pg/timestamptz-string@1']['input'];
|
||||
readonly email: CodecTypes['pg/text@1']['input'];
|
||||
readonly id: CodecTypes['pg/int4@1']['input'];
|
||||
readonly name: CodecTypes['pg/text@1']['input'] | null;
|
||||
readonly updatedAt: CodecTypes['pg/timestamptz-string@1']['input'];
|
||||
readonly username: CodecTypes['pg/text@1']['input'] | null;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
export namespace Models {
|
||||
export type public_Post = {
|
||||
authorId: CodecTypes['pg/int4@1']['output'];
|
||||
content: CodecTypes['pg/text@1']['output'] | null;
|
||||
createdAt: CodecTypes['pg/timestamptz-string@1']['output'];
|
||||
id: CodecTypes['pg/int4@1']['output'];
|
||||
title: CodecTypes['pg/text@1']['output'];
|
||||
updatedAt: CodecTypes['pg/timestamptz-string@1']['output'];
|
||||
author: public_User;
|
||||
readonly [RelationKeys]?: 'author';
|
||||
};
|
||||
export type public_User = {
|
||||
createdAt: CodecTypes['pg/timestamptz-string@1']['output'];
|
||||
email: CodecTypes['pg/text@1']['output'];
|
||||
id: CodecTypes['pg/int4@1']['output'];
|
||||
name: CodecTypes['pg/text@1']['output'] | null;
|
||||
updatedAt: CodecTypes['pg/timestamptz-string@1']['output'];
|
||||
username: CodecTypes['pg/text@1']['output'] | null;
|
||||
posts: public_Post[];
|
||||
readonly [RelationKeys]?: 'posts';
|
||||
};
|
||||
}
|
||||
|
||||
export declare const models: {
|
||||
public: {
|
||||
Post: Models.public_Post;
|
||||
User: Models.public_User;
|
||||
};
|
||||
};
|
||||
|
||||
export type TypeMaps = TypeMapsType<
|
||||
CodecTypes,
|
||||
QueryOperationTypes,
|
||||
FieldOutputTypes,
|
||||
FieldInputTypes,
|
||||
StorageColumnTypes,
|
||||
StorageColumnInputTypes,
|
||||
AggregateTypes
|
||||
>;
|
||||
|
||||
type ContractBase = Omit<
|
||||
ContractType<{
|
||||
readonly namespaces: {
|
||||
readonly public: {
|
||||
readonly id: 'public';
|
||||
readonly kind: 'postgres-schema';
|
||||
readonly entries: {
|
||||
readonly table: {
|
||||
readonly Post: {
|
||||
columns: {
|
||||
readonly authorId: {
|
||||
readonly dataType: 'pg/int4';
|
||||
readonly codecId: 'pg/int4@1';
|
||||
readonly nullable: false;
|
||||
readonly many: false;
|
||||
};
|
||||
readonly content: {
|
||||
readonly dataType: 'pg/text';
|
||||
readonly codecId: 'pg/text@1';
|
||||
readonly nullable: true;
|
||||
readonly many: false;
|
||||
};
|
||||
readonly createdAt: {
|
||||
readonly dataType: 'pg/timestamptz';
|
||||
readonly codecId: 'pg/timestamptz-string@1';
|
||||
readonly nullable: false;
|
||||
readonly default: { readonly kind: 'function'; readonly expression: 'now()' };
|
||||
readonly many: false;
|
||||
};
|
||||
readonly id: {
|
||||
readonly dataType: 'pg/int4';
|
||||
readonly codecId: 'pg/int4@1';
|
||||
readonly nullable: false;
|
||||
readonly default: {
|
||||
readonly kind: 'function';
|
||||
readonly expression: 'autoincrement()';
|
||||
};
|
||||
readonly many: false;
|
||||
};
|
||||
readonly title: {
|
||||
readonly dataType: 'pg/text';
|
||||
readonly codecId: 'pg/text@1';
|
||||
readonly nullable: false;
|
||||
readonly many: false;
|
||||
};
|
||||
readonly updatedAt: {
|
||||
readonly dataType: 'pg/timestamptz';
|
||||
readonly codecId: 'pg/timestamptz-string@1';
|
||||
readonly nullable: false;
|
||||
readonly many: false;
|
||||
};
|
||||
};
|
||||
primaryKey: { readonly columns: readonly ['id'] };
|
||||
uniques: readonly [];
|
||||
indexes: readonly [
|
||||
{
|
||||
readonly name: 'Post_authorId_idx_e47547ed';
|
||||
readonly prefix: 'Post_authorId_idx';
|
||||
readonly columns: readonly ['authorId'];
|
||||
readonly unique: false;
|
||||
},
|
||||
];
|
||||
foreignKeys: readonly [
|
||||
{
|
||||
readonly source: {
|
||||
readonly namespaceId: 'public' & NamespaceId;
|
||||
readonly tableName: 'Post';
|
||||
readonly columns: readonly ['authorId'];
|
||||
};
|
||||
readonly target: {
|
||||
readonly namespaceId: 'public' & NamespaceId;
|
||||
readonly tableName: 'User';
|
||||
readonly columns: readonly ['id'];
|
||||
};
|
||||
},
|
||||
];
|
||||
};
|
||||
readonly User: {
|
||||
columns: {
|
||||
readonly createdAt: {
|
||||
readonly dataType: 'pg/timestamptz';
|
||||
readonly codecId: 'pg/timestamptz-string@1';
|
||||
readonly nullable: false;
|
||||
readonly default: { readonly kind: 'function'; readonly expression: 'now()' };
|
||||
readonly many: false;
|
||||
};
|
||||
readonly email: {
|
||||
readonly dataType: 'pg/text';
|
||||
readonly codecId: 'pg/text@1';
|
||||
readonly nullable: false;
|
||||
readonly many: false;
|
||||
};
|
||||
readonly id: {
|
||||
readonly dataType: 'pg/int4';
|
||||
readonly codecId: 'pg/int4@1';
|
||||
readonly nullable: false;
|
||||
readonly default: {
|
||||
readonly kind: 'function';
|
||||
readonly expression: 'autoincrement()';
|
||||
};
|
||||
readonly many: false;
|
||||
};
|
||||
readonly name: {
|
||||
readonly dataType: 'pg/text';
|
||||
readonly codecId: 'pg/text@1';
|
||||
readonly nullable: true;
|
||||
readonly many: false;
|
||||
};
|
||||
readonly updatedAt: {
|
||||
readonly dataType: 'pg/timestamptz';
|
||||
readonly codecId: 'pg/timestamptz-string@1';
|
||||
readonly nullable: false;
|
||||
readonly many: false;
|
||||
};
|
||||
readonly username: {
|
||||
readonly dataType: 'pg/text';
|
||||
readonly codecId: 'pg/text@1';
|
||||
readonly nullable: true;
|
||||
readonly many: false;
|
||||
};
|
||||
};
|
||||
primaryKey: { readonly columns: readonly ['id'] };
|
||||
uniques: readonly [{ readonly columns: readonly ['email'] }];
|
||||
indexes: readonly [];
|
||||
foreignKeys: readonly [];
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
readonly storageHash: StorageHash;
|
||||
}>,
|
||||
'roots' | 'domain'
|
||||
> & {
|
||||
readonly target: 'postgres';
|
||||
readonly targetFamily: 'sql';
|
||||
readonly roots: {
|
||||
readonly Post: { readonly namespace: 'public' & NamespaceId; readonly model: 'Post' };
|
||||
readonly User: { readonly namespace: 'public' & NamespaceId; readonly model: 'User' };
|
||||
};
|
||||
readonly domain: {
|
||||
readonly namespaces: {
|
||||
readonly public: {
|
||||
readonly models: {
|
||||
readonly Post: {
|
||||
readonly fields: {
|
||||
readonly authorId: {
|
||||
readonly nullable: false;
|
||||
readonly type: { readonly kind: 'scalar'; readonly codecId: 'pg/int4@1' };
|
||||
};
|
||||
readonly content: {
|
||||
readonly nullable: true;
|
||||
readonly type: { readonly kind: 'scalar'; readonly codecId: 'pg/text@1' };
|
||||
};
|
||||
readonly createdAt: {
|
||||
readonly nullable: false;
|
||||
readonly type: {
|
||||
readonly kind: 'scalar';
|
||||
readonly codecId: 'pg/timestamptz-string@1';
|
||||
};
|
||||
};
|
||||
readonly id: {
|
||||
readonly nullable: false;
|
||||
readonly type: { readonly kind: 'scalar'; readonly codecId: 'pg/int4@1' };
|
||||
};
|
||||
readonly title: {
|
||||
readonly nullable: false;
|
||||
readonly type: { readonly kind: 'scalar'; readonly codecId: 'pg/text@1' };
|
||||
};
|
||||
readonly updatedAt: {
|
||||
readonly nullable: false;
|
||||
readonly type: {
|
||||
readonly kind: 'scalar';
|
||||
readonly codecId: 'pg/timestamptz-string@1';
|
||||
};
|
||||
};
|
||||
};
|
||||
readonly relations: {
|
||||
readonly author: {
|
||||
readonly to: { readonly namespace: 'public' & NamespaceId; readonly model: 'User' };
|
||||
readonly cardinality: 'N:1';
|
||||
readonly nullable: false;
|
||||
readonly on: {
|
||||
readonly localFields: readonly ['authorId'];
|
||||
readonly targetFields: readonly ['id'];
|
||||
};
|
||||
};
|
||||
};
|
||||
readonly storage: {
|
||||
readonly table: 'Post';
|
||||
readonly namespaceId: 'public';
|
||||
readonly fields: {
|
||||
readonly authorId: { readonly column: 'authorId' };
|
||||
readonly content: { readonly column: 'content' };
|
||||
readonly createdAt: { readonly column: 'createdAt' };
|
||||
readonly id: { readonly column: 'id' };
|
||||
readonly title: { readonly column: 'title' };
|
||||
readonly updatedAt: { readonly column: 'updatedAt' };
|
||||
};
|
||||
};
|
||||
};
|
||||
readonly User: {
|
||||
readonly fields: {
|
||||
readonly createdAt: {
|
||||
readonly nullable: false;
|
||||
readonly type: {
|
||||
readonly kind: 'scalar';
|
||||
readonly codecId: 'pg/timestamptz-string@1';
|
||||
};
|
||||
};
|
||||
readonly email: {
|
||||
readonly nullable: false;
|
||||
readonly type: { readonly kind: 'scalar'; readonly codecId: 'pg/text@1' };
|
||||
};
|
||||
readonly id: {
|
||||
readonly nullable: false;
|
||||
readonly type: { readonly kind: 'scalar'; readonly codecId: 'pg/int4@1' };
|
||||
};
|
||||
readonly name: {
|
||||
readonly nullable: true;
|
||||
readonly type: { readonly kind: 'scalar'; readonly codecId: 'pg/text@1' };
|
||||
};
|
||||
readonly updatedAt: {
|
||||
readonly nullable: false;
|
||||
readonly type: {
|
||||
readonly kind: 'scalar';
|
||||
readonly codecId: 'pg/timestamptz-string@1';
|
||||
};
|
||||
};
|
||||
readonly username: {
|
||||
readonly nullable: true;
|
||||
readonly type: { readonly kind: 'scalar'; readonly codecId: 'pg/text@1' };
|
||||
};
|
||||
};
|
||||
readonly relations: {
|
||||
readonly posts: {
|
||||
readonly to: { readonly namespace: 'public' & NamespaceId; readonly model: 'Post' };
|
||||
readonly cardinality: '1:N';
|
||||
readonly on: {
|
||||
readonly localFields: readonly ['id'];
|
||||
readonly targetFields: readonly ['authorId'];
|
||||
};
|
||||
};
|
||||
};
|
||||
readonly storage: {
|
||||
readonly table: 'User';
|
||||
readonly namespaceId: 'public';
|
||||
readonly fields: {
|
||||
readonly createdAt: { readonly column: 'createdAt' };
|
||||
readonly email: { readonly column: 'email' };
|
||||
readonly id: { readonly column: 'id' };
|
||||
readonly name: { readonly column: 'name' };
|
||||
readonly updatedAt: { readonly column: 'updatedAt' };
|
||||
readonly username: { readonly column: 'username' };
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
readonly capabilities: {
|
||||
readonly postgres: {
|
||||
readonly distinctOn: true;
|
||||
readonly forKeyShare: true;
|
||||
readonly forNoKeyUpdate: true;
|
||||
readonly jsonAgg: true;
|
||||
readonly lateral: true;
|
||||
readonly limit: true;
|
||||
readonly orderBy: true;
|
||||
readonly returning: true;
|
||||
};
|
||||
readonly sql: {
|
||||
readonly checkConstraint: true;
|
||||
readonly defaultInInsert: true;
|
||||
readonly enums: true;
|
||||
readonly forShare: true;
|
||||
readonly forUpdate: true;
|
||||
readonly insertOnConflictSkip: true;
|
||||
readonly insertOnConflictWithoutTarget: true;
|
||||
readonly lateral: true;
|
||||
readonly lockNowait: true;
|
||||
readonly lockOf: true;
|
||||
readonly lockSkipLocked: true;
|
||||
readonly returning: true;
|
||||
readonly scalarList: true;
|
||||
};
|
||||
};
|
||||
readonly extensions: {};
|
||||
readonly execution: {
|
||||
readonly executionHash: ExecutionHash;
|
||||
readonly mutations: {
|
||||
readonly defaults: readonly [
|
||||
{
|
||||
readonly onCreate: { readonly id: 'timestampNow'; readonly kind: 'generator' };
|
||||
readonly onUpdate: { readonly id: 'timestampNow'; readonly kind: 'generator' };
|
||||
readonly ref: {
|
||||
readonly entry: 'Post';
|
||||
readonly field: 'updatedAt';
|
||||
readonly namespace: 'public';
|
||||
};
|
||||
},
|
||||
{
|
||||
readonly onCreate: { readonly id: 'timestampNow'; readonly kind: 'generator' };
|
||||
readonly onUpdate: { readonly id: 'timestampNow'; readonly kind: 'generator' };
|
||||
readonly ref: {
|
||||
readonly entry: 'User';
|
||||
readonly field: 'updatedAt';
|
||||
readonly namespace: 'public';
|
||||
};
|
||||
},
|
||||
];
|
||||
};
|
||||
};
|
||||
readonly meta: {};
|
||||
|
||||
readonly profileHash: ProfileHash;
|
||||
};
|
||||
|
||||
export type Contract = ContractWithTypeMaps<ContractBase, TypeMaps>;
|
||||
|
||||
export type Namespaces = Contract['storage']['namespaces'];
|
||||
+418
@@ -0,0 +1,418 @@
|
||||
{
|
||||
"schemaVersion": "1",
|
||||
"targetFamily": "sql",
|
||||
"target": "postgres",
|
||||
"profileHash": "3916f444a8a17ad749191acf9e08dad97d1a327b88c2f1d45d12f240296aa8b2",
|
||||
"roots": {
|
||||
"Post": {
|
||||
"model": "Post",
|
||||
"namespace": "public"
|
||||
},
|
||||
"User": {
|
||||
"model": "User",
|
||||
"namespace": "public"
|
||||
}
|
||||
},
|
||||
"domain": {
|
||||
"namespaces": {
|
||||
"public": {
|
||||
"models": {
|
||||
"Post": {
|
||||
"fields": {
|
||||
"authorId": {
|
||||
"nullable": false,
|
||||
"type": {
|
||||
"codecId": "pg/int4@1",
|
||||
"kind": "scalar"
|
||||
}
|
||||
},
|
||||
"content": {
|
||||
"nullable": true,
|
||||
"type": {
|
||||
"codecId": "pg/text@1",
|
||||
"kind": "scalar"
|
||||
}
|
||||
},
|
||||
"createdAt": {
|
||||
"nullable": false,
|
||||
"type": {
|
||||
"codecId": "pg/timestamptz-string@1",
|
||||
"kind": "scalar"
|
||||
}
|
||||
},
|
||||
"id": {
|
||||
"nullable": false,
|
||||
"type": {
|
||||
"codecId": "pg/int4@1",
|
||||
"kind": "scalar"
|
||||
}
|
||||
},
|
||||
"title": {
|
||||
"nullable": false,
|
||||
"type": {
|
||||
"codecId": "pg/text@1",
|
||||
"kind": "scalar"
|
||||
}
|
||||
},
|
||||
"updatedAt": {
|
||||
"nullable": false,
|
||||
"type": {
|
||||
"codecId": "pg/timestamptz-string@1",
|
||||
"kind": "scalar"
|
||||
}
|
||||
}
|
||||
},
|
||||
"relations": {
|
||||
"author": {
|
||||
"cardinality": "N:1",
|
||||
"nullable": false,
|
||||
"on": {
|
||||
"localFields": [
|
||||
"authorId"
|
||||
],
|
||||
"targetFields": [
|
||||
"id"
|
||||
]
|
||||
},
|
||||
"to": {
|
||||
"model": "User",
|
||||
"namespace": "public"
|
||||
}
|
||||
}
|
||||
},
|
||||
"storage": {
|
||||
"fields": {
|
||||
"authorId": {
|
||||
"column": "authorId"
|
||||
},
|
||||
"content": {
|
||||
"column": "content"
|
||||
},
|
||||
"createdAt": {
|
||||
"column": "createdAt"
|
||||
},
|
||||
"id": {
|
||||
"column": "id"
|
||||
},
|
||||
"title": {
|
||||
"column": "title"
|
||||
},
|
||||
"updatedAt": {
|
||||
"column": "updatedAt"
|
||||
}
|
||||
},
|
||||
"namespaceId": "public",
|
||||
"table": "Post"
|
||||
}
|
||||
},
|
||||
"User": {
|
||||
"fields": {
|
||||
"createdAt": {
|
||||
"nullable": false,
|
||||
"type": {
|
||||
"codecId": "pg/timestamptz-string@1",
|
||||
"kind": "scalar"
|
||||
}
|
||||
},
|
||||
"email": {
|
||||
"nullable": false,
|
||||
"type": {
|
||||
"codecId": "pg/text@1",
|
||||
"kind": "scalar"
|
||||
}
|
||||
},
|
||||
"id": {
|
||||
"nullable": false,
|
||||
"type": {
|
||||
"codecId": "pg/int4@1",
|
||||
"kind": "scalar"
|
||||
}
|
||||
},
|
||||
"name": {
|
||||
"nullable": true,
|
||||
"type": {
|
||||
"codecId": "pg/text@1",
|
||||
"kind": "scalar"
|
||||
}
|
||||
},
|
||||
"updatedAt": {
|
||||
"nullable": false,
|
||||
"type": {
|
||||
"codecId": "pg/timestamptz-string@1",
|
||||
"kind": "scalar"
|
||||
}
|
||||
},
|
||||
"username": {
|
||||
"nullable": true,
|
||||
"type": {
|
||||
"codecId": "pg/text@1",
|
||||
"kind": "scalar"
|
||||
}
|
||||
}
|
||||
},
|
||||
"relations": {
|
||||
"posts": {
|
||||
"cardinality": "1:N",
|
||||
"on": {
|
||||
"localFields": [
|
||||
"id"
|
||||
],
|
||||
"targetFields": [
|
||||
"authorId"
|
||||
]
|
||||
},
|
||||
"to": {
|
||||
"model": "Post",
|
||||
"namespace": "public"
|
||||
}
|
||||
}
|
||||
},
|
||||
"storage": {
|
||||
"fields": {
|
||||
"createdAt": {
|
||||
"column": "createdAt"
|
||||
},
|
||||
"email": {
|
||||
"column": "email"
|
||||
},
|
||||
"id": {
|
||||
"column": "id"
|
||||
},
|
||||
"name": {
|
||||
"column": "name"
|
||||
},
|
||||
"updatedAt": {
|
||||
"column": "updatedAt"
|
||||
},
|
||||
"username": {
|
||||
"column": "username"
|
||||
}
|
||||
},
|
||||
"namespaceId": "public",
|
||||
"table": "User"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"storage": {
|
||||
"namespaces": {
|
||||
"public": {
|
||||
"entries": {
|
||||
"table": {
|
||||
"Post": {
|
||||
"columns": {
|
||||
"authorId": {
|
||||
"codecId": "pg/int4@1",
|
||||
"dataType": "pg/int4",
|
||||
"nullable": false
|
||||
},
|
||||
"content": {
|
||||
"codecId": "pg/text@1",
|
||||
"dataType": "pg/text",
|
||||
"nullable": true
|
||||
},
|
||||
"createdAt": {
|
||||
"codecId": "pg/timestamptz-string@1",
|
||||
"dataType": "pg/timestamptz",
|
||||
"default": {
|
||||
"expression": "now()",
|
||||
"kind": "function"
|
||||
},
|
||||
"nullable": false
|
||||
},
|
||||
"id": {
|
||||
"codecId": "pg/int4@1",
|
||||
"dataType": "pg/int4",
|
||||
"default": {
|
||||
"expression": "autoincrement()",
|
||||
"kind": "function"
|
||||
},
|
||||
"nullable": false
|
||||
},
|
||||
"title": {
|
||||
"codecId": "pg/text@1",
|
||||
"dataType": "pg/text",
|
||||
"nullable": false
|
||||
},
|
||||
"updatedAt": {
|
||||
"codecId": "pg/timestamptz-string@1",
|
||||
"dataType": "pg/timestamptz",
|
||||
"nullable": false
|
||||
}
|
||||
},
|
||||
"foreignKeys": [
|
||||
{
|
||||
"index": {
|
||||
"name": "Post_authorId_idx_e47547ed"
|
||||
},
|
||||
"source": {
|
||||
"columns": [
|
||||
"authorId"
|
||||
],
|
||||
"namespaceId": "public",
|
||||
"tableName": "Post"
|
||||
},
|
||||
"target": {
|
||||
"columns": [
|
||||
"id"
|
||||
],
|
||||
"namespaceId": "public",
|
||||
"tableName": "User"
|
||||
}
|
||||
}
|
||||
],
|
||||
"indexes": [
|
||||
{
|
||||
"columns": [
|
||||
"authorId"
|
||||
],
|
||||
"name": "Post_authorId_idx_e47547ed",
|
||||
"prefix": "Post_authorId_idx",
|
||||
"unique": false
|
||||
}
|
||||
],
|
||||
"primaryKey": {
|
||||
"columns": [
|
||||
"id"
|
||||
]
|
||||
},
|
||||
"uniques": []
|
||||
},
|
||||
"User": {
|
||||
"columns": {
|
||||
"createdAt": {
|
||||
"codecId": "pg/timestamptz-string@1",
|
||||
"dataType": "pg/timestamptz",
|
||||
"default": {
|
||||
"expression": "now()",
|
||||
"kind": "function"
|
||||
},
|
||||
"nullable": false
|
||||
},
|
||||
"email": {
|
||||
"codecId": "pg/text@1",
|
||||
"dataType": "pg/text",
|
||||
"nullable": false
|
||||
},
|
||||
"id": {
|
||||
"codecId": "pg/int4@1",
|
||||
"dataType": "pg/int4",
|
||||
"default": {
|
||||
"expression": "autoincrement()",
|
||||
"kind": "function"
|
||||
},
|
||||
"nullable": false
|
||||
},
|
||||
"name": {
|
||||
"codecId": "pg/text@1",
|
||||
"dataType": "pg/text",
|
||||
"nullable": true
|
||||
},
|
||||
"updatedAt": {
|
||||
"codecId": "pg/timestamptz-string@1",
|
||||
"dataType": "pg/timestamptz",
|
||||
"nullable": false
|
||||
},
|
||||
"username": {
|
||||
"codecId": "pg/text@1",
|
||||
"dataType": "pg/text",
|
||||
"nullable": true
|
||||
}
|
||||
},
|
||||
"foreignKeys": [],
|
||||
"indexes": [],
|
||||
"primaryKey": {
|
||||
"columns": [
|
||||
"id"
|
||||
]
|
||||
},
|
||||
"uniques": [
|
||||
{
|
||||
"columns": [
|
||||
"email"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"id": "public",
|
||||
"kind": "postgres-schema"
|
||||
}
|
||||
},
|
||||
"storageHash": "a51b4833fdaffe730572670ccc27dd89af7e0726ab3de7f428d21702d687cc15"
|
||||
},
|
||||
"execution": {
|
||||
"executionHash": "4e88564095b5e0ba7904ffdba3c563ef916d87688c8c483c67055f71a9194f0f",
|
||||
"mutations": {
|
||||
"defaults": [
|
||||
{
|
||||
"onCreate": {
|
||||
"id": "timestampNow",
|
||||
"kind": "generator"
|
||||
},
|
||||
"onUpdate": {
|
||||
"id": "timestampNow",
|
||||
"kind": "generator"
|
||||
},
|
||||
"ref": {
|
||||
"entry": "Post",
|
||||
"field": "updatedAt",
|
||||
"namespace": "public"
|
||||
}
|
||||
},
|
||||
{
|
||||
"onCreate": {
|
||||
"id": "timestampNow",
|
||||
"kind": "generator"
|
||||
},
|
||||
"onUpdate": {
|
||||
"id": "timestampNow",
|
||||
"kind": "generator"
|
||||
},
|
||||
"ref": {
|
||||
"entry": "User",
|
||||
"field": "updatedAt",
|
||||
"namespace": "public"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"capabilities": {
|
||||
"postgres": {
|
||||
"distinctOn": true,
|
||||
"forKeyShare": true,
|
||||
"forNoKeyUpdate": true,
|
||||
"jsonAgg": true,
|
||||
"lateral": true,
|
||||
"limit": true,
|
||||
"orderBy": true,
|
||||
"returning": true
|
||||
},
|
||||
"sql": {
|
||||
"checkConstraint": true,
|
||||
"defaultInInsert": true,
|
||||
"enums": true,
|
||||
"forShare": true,
|
||||
"forUpdate": true,
|
||||
"insertOnConflictSkip": true,
|
||||
"insertOnConflictWithoutTarget": true,
|
||||
"lateral": true,
|
||||
"lockNowait": true,
|
||||
"lockOf": true,
|
||||
"lockSkipLocked": true,
|
||||
"returning": true,
|
||||
"scalarList": true
|
||||
}
|
||||
},
|
||||
"extensions": {},
|
||||
"meta": {},
|
||||
"_generated": {
|
||||
"warning": "⚠️ GENERATED FILE - DO NOT EDIT",
|
||||
"message": "This file is automatically generated by \"prisma contract emit\".",
|
||||
"regenerate": "To regenerate, run: prisma contract emit"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
// use prisma-8
|
||||
|
||||
model User {
|
||||
id Int @id @default(autoincrement())
|
||||
email String @unique
|
||||
username String?
|
||||
name String?
|
||||
posts Post[]
|
||||
createdAt TimestamptzString @default(now())
|
||||
updatedAt temporal.updatedAtString()
|
||||
}
|
||||
|
||||
model Post {
|
||||
id Int @id @default(autoincrement())
|
||||
title String
|
||||
content String?
|
||||
author User @relation(fields: [authorId], references: [id])
|
||||
authorId Int
|
||||
createdAt TimestamptzString @default(now())
|
||||
updatedAt temporal.updatedAtString()
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
import 'dotenv/config';
|
||||
import postgres from '@prisma/orm-postgres/runtime';
|
||||
import type { Contract } from './contract.d';
|
||||
import contractJson from './contract.json' with { type: 'json' };
|
||||
|
||||
export const db = postgres<Contract>({
|
||||
contractJson,
|
||||
url: process.env['DATABASE_URL']!,
|
||||
});
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
// Environment setup & latest features
|
||||
"lib": ["ESNext"],
|
||||
"target": "ESNext",
|
||||
"module": "preserve",
|
||||
"moduleDetection": "force",
|
||||
"jsx": "react-jsx",
|
||||
"allowJs": true,
|
||||
"types": [
|
||||
"bun",
|
||||
"node"
|
||||
],
|
||||
|
||||
// Bundler mode
|
||||
"moduleResolution": "bundler",
|
||||
"allowImportingTsExtensions": true,
|
||||
"verbatimModuleSyntax": true,
|
||||
"noEmit": true,
|
||||
|
||||
// Best practices
|
||||
"strict": true,
|
||||
"skipLibCheck": true,
|
||||
"noFallthroughCasesInSwitch": true,
|
||||
"noUncheckedIndexedAccess": true,
|
||||
"noImplicitOverride": true,
|
||||
|
||||
// Some stricter flags (disabled by default)
|
||||
"noUnusedLocals": false,
|
||||
"noUnusedParameters": false,
|
||||
"noPropertyAccessFromIndexSignature": false,
|
||||
"resolveJsonModule": true
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user