UNPKG

alepha

Version:

Easy-to-use modern TypeScript framework for building many kind of applications.

148 lines (138 loc) 4.51 kB
import { $module, type Alepha } from "alepha"; import { AlephaDateTime } from "alepha/datetime"; import type { PgTransaction } from "drizzle-orm/pg-core"; import { DbMigrationMode } from "./modes/DbMigrationMode.ts"; import { $entity } from "./primitives/$entity.ts"; import { $sequence } from "./primitives/$sequence.ts"; import { DrizzleKitProvider } from "./providers/DrizzleKitProvider.ts"; import { BunSqliteProvider } from "./providers/drivers/BunSqliteProvider.ts"; import { CloudflareD1Provider } from "./providers/drivers/CloudflareD1Provider.ts"; import { DatabaseProvider } from "./providers/drivers/DatabaseProvider.ts"; import { NodeSqliteProvider } from "./providers/drivers/NodeSqliteProvider.ts"; import { RepositoryProvider } from "./providers/RepositoryProvider.ts"; import { SequenceProvider } from "./providers/SequenceProvider.ts"; import { databaseEnvSchema } from "./schemas/databaseEnvSchema.ts"; import { PgRelationManager } from "./services/PgRelationManager.ts"; import { QueryManager } from "./services/QueryManager.ts"; import { Repository } from "./services/Repository.ts"; import { SqliteModelBuilder } from "./services/SqliteModelBuilder.ts"; // --------------------------------------------------------------------------------------------------------------------- declare module "alepha" { interface State { "alepha.orm.tx"?: PgTransaction<any>; } interface Hooks { /** * Fires before creating an entity in the repository. */ "repository:create:before": { tableName: string; data: any; }; /** * Fires after creating an entity in the repository. */ "repository:create:after": { tableName: string; data: any; entity: any; }; /** * Fires before updating entities in the repository. */ "repository:update:before": { tableName: string; where: any; data: any; }; /** * Fires after updating entities in the repository. */ "repository:update:after": { tableName: string; where: any; data: any; entities: any[]; }; /** * Fires before deleting entities from the repository. */ "repository:delete:before": { tableName: string; where: any; }; /** * Fires after deleting entities from the repository. */ "repository:delete:after": { tableName: string; where: any; ids: Array<string | number>; }; /** * Fires before reading entities from the repository. */ "repository:read:before": { tableName: string; query: any; }; /** * Fires after reading entities from the repository. */ "repository:read:after": { tableName: string; query: any; entities: any[]; }; } } // --------------------------------------------------------------------------------------------------------------------- export * from "./index.shared-server.ts"; export * from "./modes/DbMigrationMode.ts"; export * from "./providers/drivers/BunSqliteProvider.ts"; export * from "./providers/drivers/NodeSqliteProvider.ts"; export const SqliteProvider = NodeSqliteProvider; // --------------------------------------------------------------------------------------------------------------------- export const AlephaOrm = $module({ name: "alepha.orm", primitives: [$sequence, $entity], imports: [AlephaDateTime], services: [ SqliteModelBuilder, DrizzleKitProvider, RepositoryProvider, SequenceProvider, PgRelationManager, QueryManager, DbMigrationMode, ], // - DatabaseProvider is abstract; one of the driver variants is substituted in via register(). // - Repository is a base class instantiated per-entity via Repository.of(entity). // Both listed for module tagging only — never auto-injected. variants: [ DatabaseProvider, Repository, NodeSqliteProvider, BunSqliteProvider, CloudflareD1Provider, ], register: (alepha: Alepha) => { const env = alepha.parseEnv(databaseEnvSchema); const url = env.DATABASE_URL; const isBun = alepha.isBun(); if (url?.startsWith("d1:")) { alepha.with({ optional: true, provide: DatabaseProvider, use: CloudflareD1Provider, }); } else { // SQLite is the default for core alepha.with({ optional: true, provide: DatabaseProvider, use: isBun ? BunSqliteProvider : NodeSqliteProvider, }); } }, });