@mariachi/database 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ ColumnBuilder: () => ColumnBuilder,
24
+ Database: () => Database,
25
+ DefaultDatabase: () => DefaultDatabase,
26
+ column: () => column,
27
+ defineTable: () => defineTable,
28
+ tenantsTable: () => tenantsTable,
29
+ usersTable: () => usersTable
30
+ });
31
+ module.exports = __toCommonJS(index_exports);
32
+
33
+ // src/database.ts
34
+ var import_core = require("@mariachi/core");
35
+ var Database = class {
36
+ logger;
37
+ tracer;
38
+ metrics;
39
+ dbClient;
40
+ constructor(config) {
41
+ const container = (0, import_core.getContainer)();
42
+ this.logger = container.resolve(import_core.KEYS.Logger);
43
+ this.tracer = container.has(import_core.KEYS.Tracer) ? container.resolve(import_core.KEYS.Tracer) : void 0;
44
+ this.metrics = container.has(import_core.KEYS.Metrics) ? container.resolve(import_core.KEYS.Metrics) : void 0;
45
+ this.dbClient = config.client;
46
+ }
47
+ async connect() {
48
+ this.logger.info({}, "Connecting to database");
49
+ await this.dbClient.connect();
50
+ }
51
+ async disconnect() {
52
+ this.logger.info({}, "Disconnecting from database");
53
+ await this.dbClient.disconnect();
54
+ }
55
+ async isHealthy() {
56
+ return this.dbClient.isConnected();
57
+ }
58
+ };
59
+ var DefaultDatabase = class extends Database {
60
+ };
61
+
62
+ // src/table.ts
63
+ function camelToSnake(str) {
64
+ return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
65
+ }
66
+ function defineTable(tableName, columns) {
67
+ const resolved = {};
68
+ for (const [key, builder] of Object.entries(columns)) {
69
+ const def = { ...builder._def };
70
+ if (!def.name) {
71
+ def.name = camelToSnake(key);
72
+ }
73
+ resolved[key] = def;
74
+ }
75
+ return { tableName, columns: resolved };
76
+ }
77
+
78
+ // src/column.ts
79
+ var ColumnBuilder = class {
80
+ /** @internal */
81
+ _def;
82
+ constructor(type, name) {
83
+ this._def = {
84
+ type,
85
+ name,
86
+ notNull: false,
87
+ unique: false,
88
+ primaryKey: false
89
+ };
90
+ }
91
+ notNull() {
92
+ this._def.notNull = true;
93
+ return this;
94
+ }
95
+ unique() {
96
+ this._def.unique = true;
97
+ return this;
98
+ }
99
+ primaryKey() {
100
+ this._def.primaryKey = true;
101
+ this._def.notNull = true;
102
+ return this;
103
+ }
104
+ defaultRandom() {
105
+ this._def.default = { kind: "random" };
106
+ return this;
107
+ }
108
+ defaultNow() {
109
+ this._def.default = { kind: "now" };
110
+ return this;
111
+ }
112
+ default(value) {
113
+ this._def.default = { kind: "value", value };
114
+ return this;
115
+ }
116
+ precision(p, s) {
117
+ this._def.precision = p;
118
+ this._def.scale = s;
119
+ return this;
120
+ }
121
+ };
122
+ var column = {
123
+ uuid: (name) => new ColumnBuilder("uuid", name),
124
+ text: (name) => new ColumnBuilder("text", name),
125
+ integer: (name) => new ColumnBuilder("integer", name),
126
+ boolean: (name) => new ColumnBuilder("boolean", name),
127
+ timestamp: (name) => new ColumnBuilder("timestamp", name),
128
+ json: (name) => new ColumnBuilder("json", name),
129
+ numeric: (name) => new ColumnBuilder("numeric", name)
130
+ };
131
+
132
+ // src/schema/users.ts
133
+ var usersTable = defineTable("users", {
134
+ id: column.uuid().primaryKey().defaultRandom(),
135
+ tenantId: column.text().notNull(),
136
+ email: column.text().notNull(),
137
+ name: column.text(),
138
+ createdAt: column.timestamp().notNull().defaultNow(),
139
+ updatedAt: column.timestamp().notNull().defaultNow(),
140
+ deletedAt: column.timestamp()
141
+ });
142
+
143
+ // src/schema/tenants.ts
144
+ var tenantsTable = defineTable("tenants", {
145
+ id: column.uuid().primaryKey().defaultRandom(),
146
+ name: column.text().notNull(),
147
+ slug: column.text().notNull().unique(),
148
+ plan: column.text(),
149
+ createdAt: column.timestamp().notNull().defaultNow(),
150
+ updatedAt: column.timestamp().notNull().defaultNow(),
151
+ deletedAt: column.timestamp()
152
+ });
153
+ // Annotate the CommonJS export names for ESM import in node:
154
+ 0 && (module.exports = {
155
+ ColumnBuilder,
156
+ Database,
157
+ DefaultDatabase,
158
+ column,
159
+ defineTable,
160
+ tenantsTable,
161
+ usersTable
162
+ });
163
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/database.ts","../src/table.ts","../src/column.ts","../src/schema/users.ts","../src/schema/tenants.ts"],"sourcesContent":["export type { DatabaseConfig, DatabaseAdapter, DatabaseClient, Repository, FilterOp, FilterCondition, QueryFilter } from './types';\nexport { Database, DefaultDatabase } from './database';\nexport { defineTable } from './table';\nexport { column, ColumnBuilder } from './column';\nexport type { TableDefinition, ColumnDefinition, ColumnType, InferEntity, ColumnDefault } from './schema';\nexport { usersTable } from './schema/users';\nexport { tenantsTable } from './schema/tenants';\nexport type { UsersRepository, User } from './users-repository';\n","import type { Logger, TracerAdapter, MetricsAdapter } from '@mariachi/core';\nimport { getContainer, KEYS } from '@mariachi/core';\nimport type { Instrumentable, Disposable } from '@mariachi/core';\nimport type { DatabaseAdapter } from './types';\n\nexport abstract class Database implements Instrumentable, Disposable {\n readonly logger: Logger;\n readonly tracer?: TracerAdapter;\n readonly metrics?: MetricsAdapter;\n protected readonly dbClient: DatabaseAdapter;\n\n constructor(config: { client: DatabaseAdapter }) {\n const container = getContainer();\n this.logger = container.resolve<Logger>(KEYS.Logger);\n this.tracer = container.has(KEYS.Tracer) ? container.resolve<TracerAdapter>(KEYS.Tracer) : undefined;\n this.metrics = container.has(KEYS.Metrics) ? container.resolve<MetricsAdapter>(KEYS.Metrics) : undefined;\n this.dbClient = config.client;\n }\n\n async connect(): Promise<void> {\n this.logger.info({}, 'Connecting to database');\n await this.dbClient.connect();\n }\n\n async disconnect(): Promise<void> {\n this.logger.info({}, 'Disconnecting from database');\n await this.dbClient.disconnect();\n }\n\n async isHealthy(): Promise<boolean> {\n return this.dbClient.isConnected();\n }\n}\n\nexport class DefaultDatabase extends Database {}\n","import type { ColumnBuilder } from './column';\nimport type { ColumnDefinition, ColumnType, TableDefinition } from './schema';\n\nfunction camelToSnake(str: string): string {\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n}\n\ntype ResolveColumns<T extends Record<string, ColumnBuilder<any, any>>> = {\n [K in keyof T]: T[K] extends ColumnBuilder<infer TType, infer TNotNull>\n ? ColumnDefinition<TType, TNotNull>\n : ColumnDefinition;\n};\n\nexport function defineTable<T extends Record<string, ColumnBuilder<ColumnType, boolean>>>(\n tableName: string,\n columns: T,\n): TableDefinition<ResolveColumns<T>> {\n const resolved: Record<string, ColumnDefinition> = {};\n for (const [key, builder] of Object.entries(columns)) {\n const def = { ...builder._def };\n if (!def.name) {\n def.name = camelToSnake(key);\n }\n resolved[key] = def;\n }\n return { tableName, columns: resolved } as TableDefinition<ResolveColumns<T>>;\n}\n","import type { ColumnType, ColumnDefinition } from './schema';\n\nexport class ColumnBuilder<\n TType extends ColumnType = ColumnType,\n TNotNull extends boolean = false,\n> {\n /** @internal */\n readonly _def: ColumnDefinition<TType, TNotNull>;\n\n constructor(type: TType, name?: string) {\n this._def = {\n type,\n name,\n notNull: false as TNotNull,\n unique: false,\n primaryKey: false,\n };\n }\n\n notNull(): ColumnBuilder<TType, true> {\n (this._def as any).notNull = true;\n return this as unknown as ColumnBuilder<TType, true>;\n }\n\n unique(): this {\n (this._def as any).unique = true;\n return this;\n }\n\n primaryKey(): ColumnBuilder<TType, true> {\n (this._def as any).primaryKey = true;\n (this._def as any).notNull = true;\n return this as unknown as ColumnBuilder<TType, true>;\n }\n\n defaultRandom(): this {\n (this._def as any).default = { kind: 'random' };\n return this;\n }\n\n defaultNow(): this {\n (this._def as any).default = { kind: 'now' };\n return this;\n }\n\n default(value: unknown): this {\n (this._def as any).default = { kind: 'value', value };\n return this;\n }\n\n precision(p: number, s: number): this {\n (this._def as any).precision = p;\n (this._def as any).scale = s;\n return this;\n }\n}\n\nexport const column = {\n uuid: (name?: string) => new ColumnBuilder('uuid' as const, name),\n text: (name?: string) => new ColumnBuilder('text' as const, name),\n integer: (name?: string) => new ColumnBuilder('integer' as const, name),\n boolean: (name?: string) => new ColumnBuilder('boolean' as const, name),\n timestamp: (name?: string) => new ColumnBuilder('timestamp' as const, name),\n json: (name?: string) => new ColumnBuilder('json' as const, name),\n numeric: (name?: string) => new ColumnBuilder('numeric' as const, name),\n};\n","import { defineTable } from '../table';\nimport { column } from '../column';\n\nexport const usersTable = defineTable('users', {\n id: column.uuid().primaryKey().defaultRandom(),\n tenantId: column.text().notNull(),\n email: column.text().notNull(),\n name: column.text(),\n createdAt: column.timestamp().notNull().defaultNow(),\n updatedAt: column.timestamp().notNull().defaultNow(),\n deletedAt: column.timestamp(),\n});\n","import { defineTable } from '../table';\nimport { column } from '../column';\n\nexport const tenantsTable = defineTable('tenants', {\n id: column.uuid().primaryKey().defaultRandom(),\n name: column.text().notNull(),\n slug: column.text().notNull().unique(),\n plan: column.text(),\n createdAt: column.timestamp().notNull().defaultNow(),\n updatedAt: column.timestamp().notNull().defaultNow(),\n deletedAt: column.timestamp(),\n});\n"],"mappings":"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","names":[]}
@@ -0,0 +1,133 @@
1
+ import { Entity, Context, SortParams, PaginationParams, PaginatedResult, Instrumentable, Disposable, Logger, TracerAdapter, MetricsAdapter } from '@mariachi/core';
2
+
3
+ interface DatabaseConfig {
4
+ adapter: string;
5
+ url: string;
6
+ poolMin?: number;
7
+ poolMax?: number;
8
+ }
9
+ interface DatabaseAdapter {
10
+ connect(): Promise<void>;
11
+ disconnect(): Promise<void>;
12
+ isConnected(): boolean;
13
+ getClient<T = unknown>(): T;
14
+ }
15
+ /** @deprecated Use `DatabaseAdapter` instead. */
16
+ type DatabaseClient = DatabaseAdapter;
17
+ type FilterOp = 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte';
18
+ interface FilterCondition {
19
+ field: string;
20
+ op: FilterOp;
21
+ value: unknown;
22
+ }
23
+ type QueryFilter<T> = Partial<T> | FilterCondition[];
24
+ interface Repository<T extends Entity> {
25
+ findById(ctx: Context, id: string): Promise<T | null>;
26
+ findMany(ctx: Context, filter?: QueryFilter<T>, sort?: SortParams): Promise<T[]>;
27
+ create(ctx: Context, data: Omit<T, 'id'>): Promise<T>;
28
+ update(ctx: Context, id: string, data: Partial<Omit<T, 'id'>>): Promise<T>;
29
+ softDelete(ctx: Context, id: string): Promise<void>;
30
+ hardDelete(ctx: Context, id: string): Promise<void>;
31
+ paginate(ctx: Context, params: PaginationParams, filter?: QueryFilter<T>, sort?: SortParams): Promise<PaginatedResult<T>>;
32
+ count(ctx: Context, filter?: QueryFilter<T>): Promise<number>;
33
+ deleteWhere(ctx: Context, filter: QueryFilter<T>): Promise<number>;
34
+ }
35
+
36
+ declare abstract class Database implements Instrumentable, Disposable {
37
+ readonly logger: Logger;
38
+ readonly tracer?: TracerAdapter;
39
+ readonly metrics?: MetricsAdapter;
40
+ protected readonly dbClient: DatabaseAdapter;
41
+ constructor(config: {
42
+ client: DatabaseAdapter;
43
+ });
44
+ connect(): Promise<void>;
45
+ disconnect(): Promise<void>;
46
+ isHealthy(): Promise<boolean>;
47
+ }
48
+ declare class DefaultDatabase extends Database {
49
+ }
50
+
51
+ type ColumnType = 'uuid' | 'text' | 'integer' | 'boolean' | 'timestamp' | 'json' | 'numeric';
52
+ interface ColumnDefault {
53
+ kind: 'value' | 'random' | 'now';
54
+ value?: unknown;
55
+ }
56
+ interface ColumnDefinition<TType extends ColumnType = ColumnType, TNotNull extends boolean = boolean> {
57
+ type: TType;
58
+ name?: string;
59
+ notNull: TNotNull;
60
+ unique: boolean;
61
+ primaryKey: boolean;
62
+ default?: ColumnDefault;
63
+ precision?: number;
64
+ scale?: number;
65
+ }
66
+ interface TableDefinition<TColumns extends Record<string, ColumnDefinition> = Record<string, ColumnDefinition>> {
67
+ tableName: string;
68
+ columns: TColumns;
69
+ }
70
+ type ColumnTsType<C extends ColumnDefinition> = C['type'] extends 'uuid' ? string : C['type'] extends 'text' ? string : C['type'] extends 'integer' ? number : C['type'] extends 'boolean' ? boolean : C['type'] extends 'timestamp' ? Date : C['type'] extends 'json' ? unknown : C['type'] extends 'numeric' ? string : unknown;
71
+ type NullableColumn<C extends ColumnDefinition, V> = C['notNull'] extends true ? V : V | null;
72
+ /**
73
+ * Infer a TypeScript entity type from a TableDefinition.
74
+ * Not-null columns produce required non-null types;
75
+ * nullable columns produce `T | null`.
76
+ */
77
+ type InferEntity<T extends TableDefinition> = {
78
+ [K in keyof T['columns']]: NullableColumn<T['columns'][K], ColumnTsType<T['columns'][K]>>;
79
+ };
80
+
81
+ declare class ColumnBuilder<TType extends ColumnType = ColumnType, TNotNull extends boolean = false> {
82
+ /** @internal */
83
+ readonly _def: ColumnDefinition<TType, TNotNull>;
84
+ constructor(type: TType, name?: string);
85
+ notNull(): ColumnBuilder<TType, true>;
86
+ unique(): this;
87
+ primaryKey(): ColumnBuilder<TType, true>;
88
+ defaultRandom(): this;
89
+ defaultNow(): this;
90
+ default(value: unknown): this;
91
+ precision(p: number, s: number): this;
92
+ }
93
+ declare const column: {
94
+ uuid: (name?: string) => ColumnBuilder<"uuid", false>;
95
+ text: (name?: string) => ColumnBuilder<"text", false>;
96
+ integer: (name?: string) => ColumnBuilder<"integer", false>;
97
+ boolean: (name?: string) => ColumnBuilder<"boolean", false>;
98
+ timestamp: (name?: string) => ColumnBuilder<"timestamp", false>;
99
+ json: (name?: string) => ColumnBuilder<"json", false>;
100
+ numeric: (name?: string) => ColumnBuilder<"numeric", false>;
101
+ };
102
+
103
+ type ResolveColumns<T extends Record<string, ColumnBuilder<any, any>>> = {
104
+ [K in keyof T]: T[K] extends ColumnBuilder<infer TType, infer TNotNull> ? ColumnDefinition<TType, TNotNull> : ColumnDefinition;
105
+ };
106
+ declare function defineTable<T extends Record<string, ColumnBuilder<ColumnType, boolean>>>(tableName: string, columns: T): TableDefinition<ResolveColumns<T>>;
107
+
108
+ declare const usersTable: TableDefinition<{
109
+ id: ColumnDefinition<"uuid", true>;
110
+ tenantId: ColumnDefinition<"text", true>;
111
+ email: ColumnDefinition<"text", true>;
112
+ name: ColumnDefinition<"text", false>;
113
+ createdAt: ColumnDefinition<"timestamp", true>;
114
+ updatedAt: ColumnDefinition<"timestamp", true>;
115
+ deletedAt: ColumnDefinition<"timestamp", false>;
116
+ }>;
117
+
118
+ declare const tenantsTable: TableDefinition<{
119
+ id: ColumnDefinition<"uuid", true>;
120
+ name: ColumnDefinition<"text", true>;
121
+ slug: ColumnDefinition<"text", true>;
122
+ plan: ColumnDefinition<"text", false>;
123
+ createdAt: ColumnDefinition<"timestamp", true>;
124
+ updatedAt: ColumnDefinition<"timestamp", true>;
125
+ deletedAt: ColumnDefinition<"timestamp", false>;
126
+ }>;
127
+
128
+ type User = InferEntity<typeof usersTable>;
129
+ interface UsersRepository extends Repository<User> {
130
+ findByEmail(ctx: Context, email: string): Promise<User | null>;
131
+ }
132
+
133
+ export { ColumnBuilder, type ColumnDefault, type ColumnDefinition, type ColumnType, Database, type DatabaseAdapter, type DatabaseClient, type DatabaseConfig, DefaultDatabase, type FilterCondition, type FilterOp, type InferEntity, type QueryFilter, type Repository, type TableDefinition, type User, type UsersRepository, column, defineTable, tenantsTable, usersTable };
@@ -0,0 +1,133 @@
1
+ import { Entity, Context, SortParams, PaginationParams, PaginatedResult, Instrumentable, Disposable, Logger, TracerAdapter, MetricsAdapter } from '@mariachi/core';
2
+
3
+ interface DatabaseConfig {
4
+ adapter: string;
5
+ url: string;
6
+ poolMin?: number;
7
+ poolMax?: number;
8
+ }
9
+ interface DatabaseAdapter {
10
+ connect(): Promise<void>;
11
+ disconnect(): Promise<void>;
12
+ isConnected(): boolean;
13
+ getClient<T = unknown>(): T;
14
+ }
15
+ /** @deprecated Use `DatabaseAdapter` instead. */
16
+ type DatabaseClient = DatabaseAdapter;
17
+ type FilterOp = 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte';
18
+ interface FilterCondition {
19
+ field: string;
20
+ op: FilterOp;
21
+ value: unknown;
22
+ }
23
+ type QueryFilter<T> = Partial<T> | FilterCondition[];
24
+ interface Repository<T extends Entity> {
25
+ findById(ctx: Context, id: string): Promise<T | null>;
26
+ findMany(ctx: Context, filter?: QueryFilter<T>, sort?: SortParams): Promise<T[]>;
27
+ create(ctx: Context, data: Omit<T, 'id'>): Promise<T>;
28
+ update(ctx: Context, id: string, data: Partial<Omit<T, 'id'>>): Promise<T>;
29
+ softDelete(ctx: Context, id: string): Promise<void>;
30
+ hardDelete(ctx: Context, id: string): Promise<void>;
31
+ paginate(ctx: Context, params: PaginationParams, filter?: QueryFilter<T>, sort?: SortParams): Promise<PaginatedResult<T>>;
32
+ count(ctx: Context, filter?: QueryFilter<T>): Promise<number>;
33
+ deleteWhere(ctx: Context, filter: QueryFilter<T>): Promise<number>;
34
+ }
35
+
36
+ declare abstract class Database implements Instrumentable, Disposable {
37
+ readonly logger: Logger;
38
+ readonly tracer?: TracerAdapter;
39
+ readonly metrics?: MetricsAdapter;
40
+ protected readonly dbClient: DatabaseAdapter;
41
+ constructor(config: {
42
+ client: DatabaseAdapter;
43
+ });
44
+ connect(): Promise<void>;
45
+ disconnect(): Promise<void>;
46
+ isHealthy(): Promise<boolean>;
47
+ }
48
+ declare class DefaultDatabase extends Database {
49
+ }
50
+
51
+ type ColumnType = 'uuid' | 'text' | 'integer' | 'boolean' | 'timestamp' | 'json' | 'numeric';
52
+ interface ColumnDefault {
53
+ kind: 'value' | 'random' | 'now';
54
+ value?: unknown;
55
+ }
56
+ interface ColumnDefinition<TType extends ColumnType = ColumnType, TNotNull extends boolean = boolean> {
57
+ type: TType;
58
+ name?: string;
59
+ notNull: TNotNull;
60
+ unique: boolean;
61
+ primaryKey: boolean;
62
+ default?: ColumnDefault;
63
+ precision?: number;
64
+ scale?: number;
65
+ }
66
+ interface TableDefinition<TColumns extends Record<string, ColumnDefinition> = Record<string, ColumnDefinition>> {
67
+ tableName: string;
68
+ columns: TColumns;
69
+ }
70
+ type ColumnTsType<C extends ColumnDefinition> = C['type'] extends 'uuid' ? string : C['type'] extends 'text' ? string : C['type'] extends 'integer' ? number : C['type'] extends 'boolean' ? boolean : C['type'] extends 'timestamp' ? Date : C['type'] extends 'json' ? unknown : C['type'] extends 'numeric' ? string : unknown;
71
+ type NullableColumn<C extends ColumnDefinition, V> = C['notNull'] extends true ? V : V | null;
72
+ /**
73
+ * Infer a TypeScript entity type from a TableDefinition.
74
+ * Not-null columns produce required non-null types;
75
+ * nullable columns produce `T | null`.
76
+ */
77
+ type InferEntity<T extends TableDefinition> = {
78
+ [K in keyof T['columns']]: NullableColumn<T['columns'][K], ColumnTsType<T['columns'][K]>>;
79
+ };
80
+
81
+ declare class ColumnBuilder<TType extends ColumnType = ColumnType, TNotNull extends boolean = false> {
82
+ /** @internal */
83
+ readonly _def: ColumnDefinition<TType, TNotNull>;
84
+ constructor(type: TType, name?: string);
85
+ notNull(): ColumnBuilder<TType, true>;
86
+ unique(): this;
87
+ primaryKey(): ColumnBuilder<TType, true>;
88
+ defaultRandom(): this;
89
+ defaultNow(): this;
90
+ default(value: unknown): this;
91
+ precision(p: number, s: number): this;
92
+ }
93
+ declare const column: {
94
+ uuid: (name?: string) => ColumnBuilder<"uuid", false>;
95
+ text: (name?: string) => ColumnBuilder<"text", false>;
96
+ integer: (name?: string) => ColumnBuilder<"integer", false>;
97
+ boolean: (name?: string) => ColumnBuilder<"boolean", false>;
98
+ timestamp: (name?: string) => ColumnBuilder<"timestamp", false>;
99
+ json: (name?: string) => ColumnBuilder<"json", false>;
100
+ numeric: (name?: string) => ColumnBuilder<"numeric", false>;
101
+ };
102
+
103
+ type ResolveColumns<T extends Record<string, ColumnBuilder<any, any>>> = {
104
+ [K in keyof T]: T[K] extends ColumnBuilder<infer TType, infer TNotNull> ? ColumnDefinition<TType, TNotNull> : ColumnDefinition;
105
+ };
106
+ declare function defineTable<T extends Record<string, ColumnBuilder<ColumnType, boolean>>>(tableName: string, columns: T): TableDefinition<ResolveColumns<T>>;
107
+
108
+ declare const usersTable: TableDefinition<{
109
+ id: ColumnDefinition<"uuid", true>;
110
+ tenantId: ColumnDefinition<"text", true>;
111
+ email: ColumnDefinition<"text", true>;
112
+ name: ColumnDefinition<"text", false>;
113
+ createdAt: ColumnDefinition<"timestamp", true>;
114
+ updatedAt: ColumnDefinition<"timestamp", true>;
115
+ deletedAt: ColumnDefinition<"timestamp", false>;
116
+ }>;
117
+
118
+ declare const tenantsTable: TableDefinition<{
119
+ id: ColumnDefinition<"uuid", true>;
120
+ name: ColumnDefinition<"text", true>;
121
+ slug: ColumnDefinition<"text", true>;
122
+ plan: ColumnDefinition<"text", false>;
123
+ createdAt: ColumnDefinition<"timestamp", true>;
124
+ updatedAt: ColumnDefinition<"timestamp", true>;
125
+ deletedAt: ColumnDefinition<"timestamp", false>;
126
+ }>;
127
+
128
+ type User = InferEntity<typeof usersTable>;
129
+ interface UsersRepository extends Repository<User> {
130
+ findByEmail(ctx: Context, email: string): Promise<User | null>;
131
+ }
132
+
133
+ export { ColumnBuilder, type ColumnDefault, type ColumnDefinition, type ColumnType, Database, type DatabaseAdapter, type DatabaseClient, type DatabaseConfig, DefaultDatabase, type FilterCondition, type FilterOp, type InferEntity, type QueryFilter, type Repository, type TableDefinition, type User, type UsersRepository, column, defineTable, tenantsTable, usersTable };
package/dist/index.js ADDED
@@ -0,0 +1,130 @@
1
+ // src/database.ts
2
+ import { getContainer, KEYS } from "@mariachi/core";
3
+ var Database = class {
4
+ logger;
5
+ tracer;
6
+ metrics;
7
+ dbClient;
8
+ constructor(config) {
9
+ const container = getContainer();
10
+ this.logger = container.resolve(KEYS.Logger);
11
+ this.tracer = container.has(KEYS.Tracer) ? container.resolve(KEYS.Tracer) : void 0;
12
+ this.metrics = container.has(KEYS.Metrics) ? container.resolve(KEYS.Metrics) : void 0;
13
+ this.dbClient = config.client;
14
+ }
15
+ async connect() {
16
+ this.logger.info({}, "Connecting to database");
17
+ await this.dbClient.connect();
18
+ }
19
+ async disconnect() {
20
+ this.logger.info({}, "Disconnecting from database");
21
+ await this.dbClient.disconnect();
22
+ }
23
+ async isHealthy() {
24
+ return this.dbClient.isConnected();
25
+ }
26
+ };
27
+ var DefaultDatabase = class extends Database {
28
+ };
29
+
30
+ // src/table.ts
31
+ function camelToSnake(str) {
32
+ return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
33
+ }
34
+ function defineTable(tableName, columns) {
35
+ const resolved = {};
36
+ for (const [key, builder] of Object.entries(columns)) {
37
+ const def = { ...builder._def };
38
+ if (!def.name) {
39
+ def.name = camelToSnake(key);
40
+ }
41
+ resolved[key] = def;
42
+ }
43
+ return { tableName, columns: resolved };
44
+ }
45
+
46
+ // src/column.ts
47
+ var ColumnBuilder = class {
48
+ /** @internal */
49
+ _def;
50
+ constructor(type, name) {
51
+ this._def = {
52
+ type,
53
+ name,
54
+ notNull: false,
55
+ unique: false,
56
+ primaryKey: false
57
+ };
58
+ }
59
+ notNull() {
60
+ this._def.notNull = true;
61
+ return this;
62
+ }
63
+ unique() {
64
+ this._def.unique = true;
65
+ return this;
66
+ }
67
+ primaryKey() {
68
+ this._def.primaryKey = true;
69
+ this._def.notNull = true;
70
+ return this;
71
+ }
72
+ defaultRandom() {
73
+ this._def.default = { kind: "random" };
74
+ return this;
75
+ }
76
+ defaultNow() {
77
+ this._def.default = { kind: "now" };
78
+ return this;
79
+ }
80
+ default(value) {
81
+ this._def.default = { kind: "value", value };
82
+ return this;
83
+ }
84
+ precision(p, s) {
85
+ this._def.precision = p;
86
+ this._def.scale = s;
87
+ return this;
88
+ }
89
+ };
90
+ var column = {
91
+ uuid: (name) => new ColumnBuilder("uuid", name),
92
+ text: (name) => new ColumnBuilder("text", name),
93
+ integer: (name) => new ColumnBuilder("integer", name),
94
+ boolean: (name) => new ColumnBuilder("boolean", name),
95
+ timestamp: (name) => new ColumnBuilder("timestamp", name),
96
+ json: (name) => new ColumnBuilder("json", name),
97
+ numeric: (name) => new ColumnBuilder("numeric", name)
98
+ };
99
+
100
+ // src/schema/users.ts
101
+ var usersTable = defineTable("users", {
102
+ id: column.uuid().primaryKey().defaultRandom(),
103
+ tenantId: column.text().notNull(),
104
+ email: column.text().notNull(),
105
+ name: column.text(),
106
+ createdAt: column.timestamp().notNull().defaultNow(),
107
+ updatedAt: column.timestamp().notNull().defaultNow(),
108
+ deletedAt: column.timestamp()
109
+ });
110
+
111
+ // src/schema/tenants.ts
112
+ var tenantsTable = defineTable("tenants", {
113
+ id: column.uuid().primaryKey().defaultRandom(),
114
+ name: column.text().notNull(),
115
+ slug: column.text().notNull().unique(),
116
+ plan: column.text(),
117
+ createdAt: column.timestamp().notNull().defaultNow(),
118
+ updatedAt: column.timestamp().notNull().defaultNow(),
119
+ deletedAt: column.timestamp()
120
+ });
121
+ export {
122
+ ColumnBuilder,
123
+ Database,
124
+ DefaultDatabase,
125
+ column,
126
+ defineTable,
127
+ tenantsTable,
128
+ usersTable
129
+ };
130
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/database.ts","../src/table.ts","../src/column.ts","../src/schema/users.ts","../src/schema/tenants.ts"],"sourcesContent":["import type { Logger, TracerAdapter, MetricsAdapter } from '@mariachi/core';\nimport { getContainer, KEYS } from '@mariachi/core';\nimport type { Instrumentable, Disposable } from '@mariachi/core';\nimport type { DatabaseAdapter } from './types';\n\nexport abstract class Database implements Instrumentable, Disposable {\n readonly logger: Logger;\n readonly tracer?: TracerAdapter;\n readonly metrics?: MetricsAdapter;\n protected readonly dbClient: DatabaseAdapter;\n\n constructor(config: { client: DatabaseAdapter }) {\n const container = getContainer();\n this.logger = container.resolve<Logger>(KEYS.Logger);\n this.tracer = container.has(KEYS.Tracer) ? container.resolve<TracerAdapter>(KEYS.Tracer) : undefined;\n this.metrics = container.has(KEYS.Metrics) ? container.resolve<MetricsAdapter>(KEYS.Metrics) : undefined;\n this.dbClient = config.client;\n }\n\n async connect(): Promise<void> {\n this.logger.info({}, 'Connecting to database');\n await this.dbClient.connect();\n }\n\n async disconnect(): Promise<void> {\n this.logger.info({}, 'Disconnecting from database');\n await this.dbClient.disconnect();\n }\n\n async isHealthy(): Promise<boolean> {\n return this.dbClient.isConnected();\n }\n}\n\nexport class DefaultDatabase extends Database {}\n","import type { ColumnBuilder } from './column';\nimport type { ColumnDefinition, ColumnType, TableDefinition } from './schema';\n\nfunction camelToSnake(str: string): string {\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n}\n\ntype ResolveColumns<T extends Record<string, ColumnBuilder<any, any>>> = {\n [K in keyof T]: T[K] extends ColumnBuilder<infer TType, infer TNotNull>\n ? ColumnDefinition<TType, TNotNull>\n : ColumnDefinition;\n};\n\nexport function defineTable<T extends Record<string, ColumnBuilder<ColumnType, boolean>>>(\n tableName: string,\n columns: T,\n): TableDefinition<ResolveColumns<T>> {\n const resolved: Record<string, ColumnDefinition> = {};\n for (const [key, builder] of Object.entries(columns)) {\n const def = { ...builder._def };\n if (!def.name) {\n def.name = camelToSnake(key);\n }\n resolved[key] = def;\n }\n return { tableName, columns: resolved } as TableDefinition<ResolveColumns<T>>;\n}\n","import type { ColumnType, ColumnDefinition } from './schema';\n\nexport class ColumnBuilder<\n TType extends ColumnType = ColumnType,\n TNotNull extends boolean = false,\n> {\n /** @internal */\n readonly _def: ColumnDefinition<TType, TNotNull>;\n\n constructor(type: TType, name?: string) {\n this._def = {\n type,\n name,\n notNull: false as TNotNull,\n unique: false,\n primaryKey: false,\n };\n }\n\n notNull(): ColumnBuilder<TType, true> {\n (this._def as any).notNull = true;\n return this as unknown as ColumnBuilder<TType, true>;\n }\n\n unique(): this {\n (this._def as any).unique = true;\n return this;\n }\n\n primaryKey(): ColumnBuilder<TType, true> {\n (this._def as any).primaryKey = true;\n (this._def as any).notNull = true;\n return this as unknown as ColumnBuilder<TType, true>;\n }\n\n defaultRandom(): this {\n (this._def as any).default = { kind: 'random' };\n return this;\n }\n\n defaultNow(): this {\n (this._def as any).default = { kind: 'now' };\n return this;\n }\n\n default(value: unknown): this {\n (this._def as any).default = { kind: 'value', value };\n return this;\n }\n\n precision(p: number, s: number): this {\n (this._def as any).precision = p;\n (this._def as any).scale = s;\n return this;\n }\n}\n\nexport const column = {\n uuid: (name?: string) => new ColumnBuilder('uuid' as const, name),\n text: (name?: string) => new ColumnBuilder('text' as const, name),\n integer: (name?: string) => new ColumnBuilder('integer' as const, name),\n boolean: (name?: string) => new ColumnBuilder('boolean' as const, name),\n timestamp: (name?: string) => new ColumnBuilder('timestamp' as const, name),\n json: (name?: string) => new ColumnBuilder('json' as const, name),\n numeric: (name?: string) => new ColumnBuilder('numeric' as const, name),\n};\n","import { defineTable } from '../table';\nimport { column } from '../column';\n\nexport const usersTable = defineTable('users', {\n id: column.uuid().primaryKey().defaultRandom(),\n tenantId: column.text().notNull(),\n email: column.text().notNull(),\n name: column.text(),\n createdAt: column.timestamp().notNull().defaultNow(),\n updatedAt: column.timestamp().notNull().defaultNow(),\n deletedAt: column.timestamp(),\n});\n","import { defineTable } from '../table';\nimport { column } from '../column';\n\nexport const tenantsTable = defineTable('tenants', {\n id: column.uuid().primaryKey().defaultRandom(),\n name: column.text().notNull(),\n slug: column.text().notNull().unique(),\n plan: column.text(),\n createdAt: column.timestamp().notNull().defaultNow(),\n updatedAt: column.timestamp().notNull().defaultNow(),\n deletedAt: column.timestamp(),\n});\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@mariachi/database",
3
+ "version": "0.0.1",
4
+ "type": "module",
5
+ "exports": {
6
+ ".": {
7
+ "types": "./dist/index.d.ts",
8
+ "import": "./dist/index.js",
9
+ "require": "./dist/index.cjs"
10
+ }
11
+ },
12
+ "main": "./dist/index.cjs",
13
+ "module": "./dist/index.js",
14
+ "types": "./dist/index.d.ts",
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "publishConfig": {
19
+ "access": "public"
20
+ },
21
+ "dependencies": {
22
+ "@mariachi/core": "0.0.1"
23
+ },
24
+ "devDependencies": {
25
+ "typescript": "^5.7",
26
+ "tsup": "^8"
27
+ },
28
+ "scripts": {
29
+ "build": "tsup",
30
+ "dev": "tsup --watch",
31
+ "typecheck": "tsc --noEmit",
32
+ "clean": "rm -rf dist .turbo"
33
+ }
34
+ }