@farming-labs/orm 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.
@@ -0,0 +1,254 @@
1
+ type ScalarKind = "id" | "string" | "boolean" | "datetime";
2
+ type FieldReference = `${string}.${string}`;
3
+ type FieldConfig<Kind extends ScalarKind = ScalarKind, Nullable extends boolean = boolean> = {
4
+ kind: Kind;
5
+ nullable: Nullable;
6
+ unique: boolean;
7
+ defaultValue?: unknown;
8
+ generated?: "id" | "now";
9
+ mappedName?: string;
10
+ references?: FieldReference;
11
+ description?: string;
12
+ };
13
+ type AnyFieldBuilder = FieldBuilder<ScalarKind, boolean>;
14
+ declare class FieldBuilder<Kind extends ScalarKind, Nullable extends boolean = false> {
15
+ readonly config: FieldConfig<Kind, Nullable>;
16
+ readonly _tag = "field";
17
+ constructor(config: FieldConfig<Kind, Nullable>);
18
+ unique(): FieldBuilder<Kind, Nullable>;
19
+ nullable(): FieldBuilder<Kind, true>;
20
+ default(value: unknown): FieldBuilder<Kind, Nullable>;
21
+ defaultNow(): FieldBuilder<Kind, Nullable>;
22
+ references(reference: FieldReference): FieldBuilder<Kind, Nullable>;
23
+ map(name: string): FieldBuilder<Kind, Nullable>;
24
+ describe(description: string): FieldBuilder<Kind, Nullable>;
25
+ }
26
+ type ScalarValue<Kind extends ScalarKind> = Kind extends "id" ? string : Kind extends "string" ? string : Kind extends "boolean" ? boolean : Date;
27
+ type FieldOutput<TField> = TField extends FieldBuilder<infer Kind, infer Nullable> ? Nullable extends true ? ScalarValue<Kind> | null : ScalarValue<Kind> : never;
28
+ declare function id(): FieldBuilder<"id", false>;
29
+ declare function string(): FieldBuilder<"string", false>;
30
+ declare function boolean(): FieldBuilder<"boolean", false>;
31
+ declare function datetime(): FieldBuilder<"datetime", false>;
32
+
33
+ type RelationKind = "belongsTo" | "hasOne" | "hasMany" | "manyToMany";
34
+ type RelationDefinition<Target extends string = string, Kind extends RelationKind = RelationKind> = Kind extends "manyToMany" ? {
35
+ kind: Kind;
36
+ target: Target;
37
+ through: string;
38
+ from: string;
39
+ to: string;
40
+ } : {
41
+ kind: Kind;
42
+ target: Target;
43
+ foreignKey: string;
44
+ };
45
+ type AnyRelation = RelationDefinition<string, RelationKind>;
46
+ declare function belongsTo<Target extends string>(target: Target, config: {
47
+ foreignKey: string;
48
+ }): {
49
+ kind: "belongsTo";
50
+ target: Target;
51
+ foreignKey: string;
52
+ };
53
+ declare function hasOne<Target extends string>(target: Target, config: {
54
+ foreignKey: string;
55
+ }): {
56
+ kind: "hasOne";
57
+ target: Target;
58
+ foreignKey: string;
59
+ };
60
+ declare function hasMany<Target extends string>(target: Target, config: {
61
+ foreignKey: string;
62
+ }): {
63
+ kind: "hasMany";
64
+ target: Target;
65
+ foreignKey: string;
66
+ };
67
+ declare function manyToMany<Target extends string>(target: Target, config: {
68
+ through: string;
69
+ from: string;
70
+ to: string;
71
+ }): {
72
+ kind: "manyToMany";
73
+ target: Target;
74
+ through: string;
75
+ from: string;
76
+ to: string;
77
+ };
78
+
79
+ type FieldMap = Record<string, AnyFieldBuilder>;
80
+ type RelationMap = Record<string, AnyRelation>;
81
+ type ModelDefinition<Fields extends FieldMap = FieldMap, Relations extends RelationMap = RelationMap> = {
82
+ readonly _tag: "model";
83
+ readonly table: string;
84
+ readonly fields: Fields;
85
+ readonly relations: Relations;
86
+ readonly description?: string;
87
+ };
88
+ type AnyModelDefinition = ModelDefinition<FieldMap, RelationMap>;
89
+ type SchemaDefinition<Models extends Record<string, AnyModelDefinition> = Record<string, AnyModelDefinition>> = {
90
+ readonly _tag: "schema";
91
+ readonly models: Models;
92
+ };
93
+ declare function model<Fields extends FieldMap, Relations extends RelationMap = {}>(config: {
94
+ table: string;
95
+ fields: Fields;
96
+ relations?: Relations;
97
+ description?: string;
98
+ }): ModelDefinition<Fields, Relations>;
99
+ declare function defineSchema<Models extends Record<string, AnyModelDefinition>>(models: Models): SchemaDefinition<Models>;
100
+ type SchemaModels<TSchema> = TSchema extends SchemaDefinition<infer Models> ? Models : never;
101
+ type ModelName<TSchema> = keyof SchemaModels<TSchema> & string;
102
+ type ModelForName<TSchema, TName extends ModelName<TSchema>> = SchemaModels<TSchema>[TName];
103
+ type ModelFields<TSchema, TName extends ModelName<TSchema>> = ModelForName<TSchema, TName>["fields"];
104
+ type ModelRelations<TSchema, TName extends ModelName<TSchema>> = ModelForName<TSchema, TName>["relations"];
105
+ type ScalarRecord<TSchema, TName extends ModelName<TSchema>> = {
106
+ [K in keyof ModelFields<TSchema, TName> & string]: FieldOutput<ModelFields<TSchema, TName>[K]>;
107
+ };
108
+ type RelationName<TSchema, TName extends ModelName<TSchema>> = keyof ModelRelations<TSchema, TName> & string;
109
+ type RelationForName<TSchema, TName extends ModelName<TSchema>, TRelationName extends RelationName<TSchema, TName>> = ModelRelations<TSchema, TName>[TRelationName];
110
+ type RelationTarget<TSchema, TName extends ModelName<TSchema>, TRelationName extends RelationName<TSchema, TName>> = RelationForName<TSchema, TName, TRelationName> extends RelationDefinition<infer Target, any> ? Extract<Target, ModelName<TSchema>> : never;
111
+
112
+ type Direction = "asc" | "desc";
113
+ type Primitive = string | number | boolean | Date | null;
114
+ type Comparable = string | number | Date;
115
+ type ValueFilter<T> = T extends string ? T | {
116
+ eq?: T;
117
+ contains?: string;
118
+ in?: T[];
119
+ not?: T;
120
+ } : T extends Comparable ? T | {
121
+ eq?: T;
122
+ gt?: T;
123
+ gte?: T;
124
+ lt?: T;
125
+ lte?: T;
126
+ in?: T[];
127
+ not?: T;
128
+ } : T | {
129
+ eq?: T;
130
+ in?: T[];
131
+ not?: T;
132
+ };
133
+ type Where<TRecord extends Record<string, Primitive>> = {
134
+ [K in keyof TRecord]?: ValueFilter<TRecord[K]>;
135
+ } & {
136
+ AND?: Array<Where<TRecord>>;
137
+ OR?: Array<Where<TRecord>>;
138
+ NOT?: Where<TRecord>;
139
+ };
140
+ type RelationQuery<TSchema extends SchemaDefinition<any>, TModelName extends ModelName<TSchema>> = {
141
+ where?: Where<ScalarRecord<TSchema, TModelName>>;
142
+ select?: SelectShape<TSchema, TModelName>;
143
+ orderBy?: Partial<Record<keyof ScalarRecord<TSchema, TModelName> & string, Direction>>;
144
+ take?: number;
145
+ skip?: number;
146
+ };
147
+ type RelationSelectionValue<TSchema extends SchemaDefinition<any>, TModelName extends ModelName<TSchema>, TRelationName extends RelationName<TSchema, TModelName>> = true | RelationQuery<TSchema, RelationTarget<TSchema, TModelName, TRelationName>>;
148
+ type SelectShape<TSchema extends SchemaDefinition<any>, TModelName extends ModelName<TSchema>> = {
149
+ [K in (keyof ScalarRecord<TSchema, TModelName> & string) | RelationName<TSchema, TModelName>]?: K extends RelationName<TSchema, TModelName> ? true | RelationQuery<TSchema, any> : true;
150
+ };
151
+ type IsManyRelation<TRelation> = TRelation extends {
152
+ kind: "hasMany" | "manyToMany";
153
+ } ? true : false;
154
+ type DefaultSelectedRecord<TSchema extends SchemaDefinition<any>, TModelName extends ModelName<TSchema>> = ScalarRecord<TSchema, TModelName>;
155
+ type SelectedScalars<TSchema extends SchemaDefinition<any>, TModelName extends ModelName<TSchema>, TSelect extends SelectShape<TSchema, TModelName>> = {
156
+ [K in keyof TSelect & keyof ScalarRecord<TSchema, TModelName> as TSelect[K] extends true ? K : never]: ScalarRecord<TSchema, TModelName>[K];
157
+ };
158
+ type RelationResult<TSchema extends SchemaDefinition<any>, TModelName extends ModelName<TSchema>, TRelationName extends RelationName<TSchema, TModelName>, TValue extends RelationSelectionValue<TSchema, TModelName, TRelationName>> = TValue extends true ? IsManyRelation<RelationForName<TSchema, TModelName, TRelationName>> extends true ? Array<DefaultSelectedRecord<TSchema, RelationTarget<TSchema, TModelName, TRelationName>>> : DefaultSelectedRecord<TSchema, RelationTarget<TSchema, TModelName, TRelationName>> | null : TValue extends RelationQuery<TSchema, infer Target> ? Target extends ModelName<TSchema> ? IsManyRelation<RelationForName<TSchema, TModelName, TRelationName>> extends true ? Array<SelectedRecord<TSchema, Target, TValue["select"] extends SelectShape<TSchema, Target> ? TValue["select"] : undefined>> : SelectedRecord<TSchema, Target, TValue["select"] extends SelectShape<TSchema, Target> ? TValue["select"] : undefined> | null : never : never;
159
+ type SelectedRelations<TSchema extends SchemaDefinition<any>, TModelName extends ModelName<TSchema>, TSelect extends SelectShape<TSchema, TModelName>> = {
160
+ [K in keyof TSelect & RelationName<TSchema, TModelName>]: RelationResult<TSchema, TModelName, K, Extract<TSelect[K], RelationSelectionValue<TSchema, TModelName, K>>>;
161
+ };
162
+ type SelectedRecord<TSchema extends SchemaDefinition<any>, TModelName extends ModelName<TSchema>, TSelect extends SelectShape<TSchema, TModelName> | undefined> = TSelect extends SelectShape<TSchema, TModelName> ? SelectedScalars<TSchema, TModelName, TSelect> & SelectedRelations<TSchema, TModelName, TSelect> : DefaultSelectedRecord<TSchema, TModelName>;
163
+ type FindManyArgs<TSchema extends SchemaDefinition<any>, TModelName extends ModelName<TSchema>, TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined> = {
164
+ where?: Where<ScalarRecord<TSchema, TModelName>>;
165
+ select?: TSelect;
166
+ orderBy?: Partial<Record<keyof ScalarRecord<TSchema, TModelName> & string, Direction>>;
167
+ take?: number;
168
+ skip?: number;
169
+ };
170
+ type FindFirstArgs<TSchema extends SchemaDefinition<any>, TModelName extends ModelName<TSchema>, TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined> = FindManyArgs<TSchema, TModelName, TSelect>;
171
+ type CreateArgs<TSchema extends SchemaDefinition<any>, TModelName extends ModelName<TSchema>, TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined> = {
172
+ data: Partial<ScalarRecord<TSchema, TModelName>>;
173
+ select?: TSelect;
174
+ };
175
+ type UpdateArgs<TSchema extends SchemaDefinition<any>, TModelName extends ModelName<TSchema>, TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined> = {
176
+ where: Where<ScalarRecord<TSchema, TModelName>>;
177
+ data: Partial<ScalarRecord<TSchema, TModelName>>;
178
+ select?: TSelect;
179
+ };
180
+ type DeleteArgs<TSchema extends SchemaDefinition<any>, TModelName extends ModelName<TSchema>> = {
181
+ where: Where<ScalarRecord<TSchema, TModelName>>;
182
+ };
183
+ interface OrmDriver<TSchema extends SchemaDefinition<any>> {
184
+ findMany<TModelName extends ModelName<TSchema>, TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(schema: TSchema, model: TModelName, args: FindManyArgs<TSchema, TModelName, TSelect>): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>>;
185
+ findFirst<TModelName extends ModelName<TSchema>, TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(schema: TSchema, model: TModelName, args: FindFirstArgs<TSchema, TModelName, TSelect>): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;
186
+ create<TModelName extends ModelName<TSchema>, TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(schema: TSchema, model: TModelName, args: CreateArgs<TSchema, TModelName, TSelect>): Promise<SelectedRecord<TSchema, TModelName, TSelect>>;
187
+ update<TModelName extends ModelName<TSchema>, TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(schema: TSchema, model: TModelName, args: UpdateArgs<TSchema, TModelName, TSelect>): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;
188
+ delete<TModelName extends ModelName<TSchema>>(schema: TSchema, model: TModelName, args: DeleteArgs<TSchema, TModelName>): Promise<number>;
189
+ transaction<TResult>(schema: TSchema, run: (driver: OrmDriver<TSchema>) => Promise<TResult>): Promise<TResult>;
190
+ }
191
+ type ModelClient<TSchema extends SchemaDefinition<any>, TModelName extends ModelName<TSchema>> = {
192
+ findMany<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(args?: FindManyArgs<TSchema, TModelName, TSelect>): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>>;
193
+ findFirst<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(args?: FindFirstArgs<TSchema, TModelName, TSelect>): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;
194
+ create<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(args: CreateArgs<TSchema, TModelName, TSelect>): Promise<SelectedRecord<TSchema, TModelName, TSelect>>;
195
+ update<TSelect extends SelectShape<TSchema, TModelName> | undefined = undefined>(args: UpdateArgs<TSchema, TModelName, TSelect>): Promise<SelectedRecord<TSchema, TModelName, TSelect> | null>;
196
+ delete(args: DeleteArgs<TSchema, TModelName>): Promise<number>;
197
+ };
198
+ type OrmClient<TSchema extends SchemaDefinition<any>> = {
199
+ [K in ModelName<TSchema>]: ModelClient<TSchema, K>;
200
+ } & {
201
+ transaction<TResult>(run: (tx: OrmClient<TSchema>) => Promise<TResult>): Promise<TResult>;
202
+ };
203
+ declare function createOrm<TSchema extends SchemaDefinition<any>>(options: {
204
+ schema: TSchema;
205
+ driver: OrmDriver<TSchema>;
206
+ }): OrmClient<TSchema>;
207
+
208
+ type PrismaGenerationOptions = {
209
+ provider?: "postgresql" | "mysql" | "sqlite";
210
+ datasourceName?: string;
211
+ generatorName?: string;
212
+ };
213
+ type DrizzleGenerationOptions = {
214
+ dialect: "pg" | "mysql" | "sqlite";
215
+ };
216
+ type SqlGenerationOptions = {
217
+ dialect: "postgres" | "mysql" | "sqlite";
218
+ };
219
+ declare function renderPrismaSchema(schema: SchemaDefinition<any>, options?: PrismaGenerationOptions): string;
220
+ declare function renderDrizzleSchema(schema: SchemaDefinition<any>, options: DrizzleGenerationOptions): string;
221
+ declare function renderSafeSql(schema: SchemaDefinition<any>, options: SqlGenerationOptions): string;
222
+ declare function replaceGeneratedBlock(input: {
223
+ current: string;
224
+ label: string;
225
+ content: string;
226
+ }): string;
227
+
228
+ type ManifestField = {
229
+ name: string;
230
+ column: string;
231
+ kind: ScalarKind;
232
+ nullable: boolean;
233
+ unique: boolean;
234
+ generated?: "id" | "now";
235
+ defaultValue?: unknown;
236
+ references?: string;
237
+ description?: string;
238
+ };
239
+ type ManifestModel = {
240
+ name: string;
241
+ table: string;
242
+ description?: string;
243
+ fields: Record<string, ManifestField>;
244
+ relations: Record<string, AnyRelation>;
245
+ };
246
+ type SchemaManifest = {
247
+ models: Record<string, ManifestModel>;
248
+ };
249
+ declare function createManifest<TSchema extends SchemaDefinition<Record<string, AnyModelDefinition>>>(schema: TSchema): SchemaManifest;
250
+
251
+ type MemoryStore<TSchema extends SchemaDefinition<any>> = Partial<Record<ModelName<TSchema>, Array<Record<string, unknown>>>>;
252
+ declare function createMemoryDriver<TSchema extends SchemaDefinition<any>>(seed?: MemoryStore<TSchema>): OrmDriver<TSchema>;
253
+
254
+ export { type AnyFieldBuilder, type AnyModelDefinition, type AnyRelation, type CreateArgs, type DeleteArgs, type DrizzleGenerationOptions, FieldBuilder, type FieldConfig, type FieldMap, type FieldOutput, type FieldReference, type FindFirstArgs, type FindManyArgs, type ManifestField, type ManifestModel, type ModelClient, type ModelDefinition, type ModelFields, type ModelForName, type ModelName, type ModelRelations, type OrmClient, type OrmDriver, type PrismaGenerationOptions, type RelationDefinition, type RelationForName, type RelationKind, type RelationMap, type RelationName, type RelationTarget, type ScalarKind, type ScalarRecord, type ScalarValue, type SchemaDefinition, type SchemaManifest, type SchemaModels, type SelectShape, type SelectedRecord, type SqlGenerationOptions, type UpdateArgs, type Where, belongsTo, boolean, createManifest, createMemoryDriver, createOrm, datetime, defineSchema, hasMany, hasOne, id, manyToMany, model, renderDrizzleSchema, renderPrismaSchema, renderSafeSql, replaceGeneratedBlock, string };