@farming-labs/orm-runtime 0.0.20 → 0.0.22

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,181 @@
1
+ // src/index.ts
2
+ import {
3
+ createOrm
4
+ } from "@farming-labs/orm";
5
+
6
+ // src/shared.ts
7
+ import { createManifest, requireDatabaseRuntime } from "@farming-labs/orm";
8
+ function isRecord(value) {
9
+ return !!value && typeof value === "object";
10
+ }
11
+ function hasFunction(value, name) {
12
+ return isRecord(value) && typeof value[name] === "function";
13
+ }
14
+ function resolveRuntime(options) {
15
+ if (options.runtime) {
16
+ return options.runtime;
17
+ }
18
+ if (options.client === void 0) {
19
+ throw new Error(
20
+ 'createDriverFromRuntime() requires either a detected "runtime" or a raw "client".'
21
+ );
22
+ }
23
+ return requireDatabaseRuntime(options.client);
24
+ }
25
+ function resolveDialect(runtime, override) {
26
+ const dialect = override ?? runtime.dialect;
27
+ if (!dialect) {
28
+ throw new Error(
29
+ `Could not determine the database dialect for the detected ${runtime.kind} runtime. Pass a "dialect" option explicitly.`
30
+ );
31
+ }
32
+ return dialect;
33
+ }
34
+ function inferMongooseModels(schema, connection) {
35
+ const manifest = createManifest(schema);
36
+ const registeredModels = Object.values(connection.models ?? {});
37
+ const models = {};
38
+ for (const modelName of Object.keys(schema.models)) {
39
+ const expectedTable = manifest.models[modelName].table;
40
+ const inferredModel = registeredModels.find(
41
+ (candidate) => candidate.collection?.collectionName === expectedTable
42
+ ) ?? connection.models?.[String(modelName)];
43
+ if (!inferredModel) {
44
+ throw new Error(
45
+ `Could not infer a Mongoose model for schema model "${String(modelName)}". Register a model for collection "${expectedTable}" or pass mongoose.models explicitly.`
46
+ );
47
+ }
48
+ models[modelName] = inferredModel;
49
+ }
50
+ return models;
51
+ }
52
+ function resolveMongoDb(runtime, options) {
53
+ if (options.mongo?.db) {
54
+ return options.mongo.db;
55
+ }
56
+ if (runtime.source === "db") {
57
+ return runtime.client;
58
+ }
59
+ const databaseName = options.databaseName;
60
+ if (!databaseName) {
61
+ throw new Error(
62
+ 'MongoClient auto-creation requires a "databaseName" option so the helper can resolve the target database.'
63
+ );
64
+ }
65
+ return runtime.client.db(databaseName);
66
+ }
67
+ function resolveMongoSessionSource(runtime, db, options) {
68
+ if (options.mongo?.startSession) {
69
+ return {
70
+ client: void 0,
71
+ startSession: options.mongo.startSession
72
+ };
73
+ }
74
+ if (runtime.source === "client" && hasFunction(runtime.client, "startSession")) {
75
+ return {
76
+ client: runtime.client,
77
+ startSession: void 0
78
+ };
79
+ }
80
+ const dbClient = isRecord(db) ? db["client"] : void 0;
81
+ if (hasFunction(dbClient, "startSession")) {
82
+ return {
83
+ client: dbClient,
84
+ startSession: void 0
85
+ };
86
+ }
87
+ return {
88
+ client: void 0,
89
+ startSession: void 0
90
+ };
91
+ }
92
+
93
+ // src/index.ts
94
+ async function createSqlDriverFromRuntime(runtime, dialect) {
95
+ const { createMysqlDriver, createPgClientDriver, createPgPoolDriver, createSqliteDriver } = await import("@farming-labs/orm-sql");
96
+ if (dialect === "sqlite") {
97
+ return createSqliteDriver(runtime.client);
98
+ }
99
+ if (dialect === "postgres") {
100
+ if (runtime.source === "pool") {
101
+ return createPgPoolDriver(runtime.client);
102
+ }
103
+ return createPgClientDriver(runtime.client);
104
+ }
105
+ if (runtime.source === "pool") {
106
+ return createMysqlDriver(runtime.client);
107
+ }
108
+ return createMysqlDriver(runtime.client);
109
+ }
110
+ async function createDriverFromRuntime(options) {
111
+ const runtime = resolveRuntime(options);
112
+ switch (runtime.kind) {
113
+ case "prisma": {
114
+ const { createPrismaDriver } = await import("@farming-labs/orm-prisma");
115
+ return createPrismaDriver({
116
+ client: runtime.client,
117
+ models: options.prisma?.models
118
+ });
119
+ }
120
+ case "drizzle": {
121
+ const { createDrizzleDriver } = await import("@farming-labs/orm-drizzle");
122
+ return createDrizzleDriver({
123
+ db: runtime.client,
124
+ client: options.drizzle?.client,
125
+ dialect: resolveDialect(runtime, options.dialect)
126
+ });
127
+ }
128
+ case "kysely": {
129
+ const { createKyselyDriver } = await import("@farming-labs/orm-kysely");
130
+ return createKyselyDriver({
131
+ db: runtime.client,
132
+ dialect: resolveDialect(runtime, options.dialect)
133
+ });
134
+ }
135
+ case "sql":
136
+ return await createSqlDriverFromRuntime(
137
+ runtime,
138
+ resolveDialect(runtime, options.dialect)
139
+ );
140
+ case "mongo": {
141
+ const { createMongoDriver } = await import("@farming-labs/orm-mongo");
142
+ const db = resolveMongoDb(runtime, options);
143
+ const sessionSource = resolveMongoSessionSource(runtime, db, options);
144
+ return createMongoDriver({
145
+ collections: options.mongo?.collections,
146
+ db,
147
+ client: sessionSource.client,
148
+ startSession: sessionSource.startSession,
149
+ transforms: options.mongo?.transforms
150
+ });
151
+ }
152
+ case "mongoose": {
153
+ const { createMongooseDriver } = await import("@farming-labs/orm-mongoose");
154
+ const connection = runtime.client;
155
+ return createMongooseDriver({
156
+ models: options.mongoose?.models ?? inferMongooseModels(options.schema, connection),
157
+ connection,
158
+ startSession: options.mongoose?.startSession,
159
+ transforms: options.mongoose?.transforms
160
+ });
161
+ }
162
+ }
163
+ }
164
+ async function createOrmFromRuntime(options) {
165
+ const driver = await createDriverFromRuntime(options);
166
+ return createOrm({
167
+ schema: options.schema,
168
+ driver
169
+ });
170
+ }
171
+
172
+ export {
173
+ isRecord,
174
+ hasFunction,
175
+ resolveRuntime,
176
+ resolveDialect,
177
+ resolveMongoDb,
178
+ createDriverFromRuntime,
179
+ createOrmFromRuntime
180
+ };
181
+ //# sourceMappingURL=chunk-336GVTN5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/shared.ts"],"sourcesContent":["import {\n createOrm,\n type OrmClient,\n type OrmDriver,\n type SchemaDefinition,\n} from \"@farming-labs/orm\";\nimport type { DrizzleDialect, DrizzleDriverConfig } from \"@farming-labs/orm-drizzle\";\nimport type { KyselyDialect, KyselyDriverConfig } from \"@farming-labs/orm-kysely\";\nimport type { MongoDriverConfig } from \"@farming-labs/orm-mongo\";\nimport type { MongooseDriverConfig } from \"@farming-labs/orm-mongoose\";\nimport type { PrismaDriverConfig } from \"@farming-labs/orm-prisma\";\nimport type {\n MysqlConnectionLike,\n MysqlPoolLike,\n PgClientLike,\n PgPoolLike,\n SqliteDatabaseLike,\n} from \"@farming-labs/orm-sql\";\nimport {\n inferMongooseModels,\n resolveDialect,\n resolveMongoDb,\n resolveMongoSessionSource,\n resolveRuntime,\n type AutoDriverHandle,\n type CreateDriverFromRuntimeOptions,\n type CreateOrmFromRuntimeOptions,\n type MongooseConnectionLike,\n} from \"./shared\";\n\nasync function createSqlDriverFromRuntime<TSchema extends SchemaDefinition<any>>(\n runtime: Awaited<ReturnType<typeof resolveRuntime>>,\n dialect: ReturnType<typeof resolveDialect>,\n) {\n const { createMysqlDriver, createPgClientDriver, createPgPoolDriver, createSqliteDriver } =\n await import(\"@farming-labs/orm-sql\");\n\n if (dialect === \"sqlite\") {\n return createSqliteDriver<TSchema>(runtime.client as SqliteDatabaseLike);\n }\n\n if (dialect === \"postgres\") {\n if (runtime.source === \"pool\") {\n return createPgPoolDriver<TSchema>(runtime.client as PgPoolLike);\n }\n\n return createPgClientDriver<TSchema>(runtime.client as PgClientLike);\n }\n\n if (runtime.source === \"pool\") {\n return createMysqlDriver<TSchema>(runtime.client as MysqlPoolLike);\n }\n\n return createMysqlDriver<TSchema>(runtime.client as MysqlConnectionLike);\n}\n\nexport async function createDriverFromRuntime<\n TSchema extends SchemaDefinition<any>,\n TClient = unknown,\n>(\n options: CreateDriverFromRuntimeOptions<TSchema, TClient>,\n): Promise<OrmDriver<TSchema, AutoDriverHandle<TClient>>> {\n const runtime = resolveRuntime(options);\n\n switch (runtime.kind) {\n case \"prisma\": {\n const { createPrismaDriver } = await import(\"@farming-labs/orm-prisma\");\n return createPrismaDriver<TSchema>({\n client: runtime.client as PrismaDriverConfig<TSchema>[\"client\"],\n models: options.prisma?.models,\n }) as OrmDriver<TSchema, AutoDriverHandle<TClient>>;\n }\n case \"drizzle\": {\n const { createDrizzleDriver } = await import(\"@farming-labs/orm-drizzle\");\n return createDrizzleDriver<TSchema>({\n db: runtime.client as DrizzleDriverConfig<TSchema>[\"db\"],\n client: options.drizzle?.client,\n dialect: resolveDialect(runtime, options.dialect) as DrizzleDialect,\n }) as OrmDriver<TSchema, AutoDriverHandle<TClient>>;\n }\n case \"kysely\": {\n const { createKyselyDriver } = await import(\"@farming-labs/orm-kysely\");\n return createKyselyDriver<TSchema>({\n db: runtime.client as KyselyDriverConfig<TSchema>[\"db\"],\n dialect: resolveDialect(runtime, options.dialect) as KyselyDialect,\n }) as OrmDriver<TSchema, AutoDriverHandle<TClient>>;\n }\n case \"sql\":\n return (await createSqlDriverFromRuntime<TSchema>(\n runtime,\n resolveDialect(runtime, options.dialect),\n )) as OrmDriver<TSchema, AutoDriverHandle<TClient>>;\n case \"mongo\": {\n const { createMongoDriver } = await import(\"@farming-labs/orm-mongo\");\n const db = resolveMongoDb(runtime, options);\n const sessionSource = resolveMongoSessionSource(runtime, db, options);\n\n return createMongoDriver<TSchema>({\n collections: options.mongo?.collections,\n db,\n client: sessionSource.client,\n startSession: sessionSource.startSession,\n transforms: options.mongo?.transforms as MongoDriverConfig<TSchema>[\"transforms\"],\n }) as OrmDriver<TSchema, AutoDriverHandle<TClient>>;\n }\n case \"mongoose\": {\n const { createMongooseDriver } = await import(\"@farming-labs/orm-mongoose\");\n const connection = runtime.client as MongooseConnectionLike;\n\n return createMongooseDriver<TSchema>({\n models: options.mongoose?.models ?? inferMongooseModels(options.schema, connection),\n connection,\n startSession: options.mongoose?.startSession,\n transforms: options.mongoose?.transforms as MongooseDriverConfig<TSchema>[\"transforms\"],\n }) as OrmDriver<TSchema, AutoDriverHandle<TClient>>;\n }\n }\n}\n\nexport async function createOrmFromRuntime<\n TSchema extends SchemaDefinition<any>,\n TClient = unknown,\n>(\n options: CreateOrmFromRuntimeOptions<TSchema, TClient>,\n): Promise<OrmClient<TSchema, AutoDriverHandle<TClient>>> {\n const driver = await createDriverFromRuntime(options);\n return createOrm({\n schema: options.schema,\n driver,\n }) as OrmClient<TSchema, AutoDriverHandle<TClient>>;\n}\n\nexport type {\n AutoDialect,\n AutoDriverHandle,\n CreateDriverFromRuntimeOptions,\n CreateOrmFromRuntimeOptions,\n MongooseConnectionLike,\n} from \"./shared\";\n","import { createManifest, requireDatabaseRuntime } from \"@farming-labs/orm\";\nimport type {\n DetectedDatabaseDialect,\n DetectedDatabaseRuntime,\n ModelName,\n OrmDriverHandle,\n SchemaDefinition,\n} from \"@farming-labs/orm\";\nimport type { DrizzleDialect, DrizzleDriverConfig } from \"@farming-labs/orm-drizzle\";\nimport type {\n MongoCollectionMap,\n MongoDbLike,\n MongoDriverConfig,\n MongoSessionLike,\n MongoSessionSourceLike,\n} from \"@farming-labs/orm-mongo\";\nimport type {\n MongooseFieldTransform,\n MongooseModelLike,\n MongooseSessionLike,\n MongooseSessionSourceLike,\n} from \"@farming-labs/orm-mongoose\";\nimport type { KyselyDialect } from \"@farming-labs/orm-kysely\";\nimport type { PrismaDriverConfig, PrismaDriverHandle } from \"@farming-labs/orm-prisma\";\nimport type { SqlDriverHandle } from \"@farming-labs/orm-sql\";\n\nexport type AutoDialect = DetectedDatabaseDialect;\n\nexport type AutoDriverHandle<TClient = unknown> =\n | PrismaDriverHandle\n | SqlDriverHandle<TClient, AutoDialect>\n | OrmDriverHandle<\"drizzle\", TClient, DrizzleDialect>\n | OrmDriverHandle<\"kysely\", TClient, KyselyDialect>\n | OrmDriverHandle<\"mongo\", unknown>\n | OrmDriverHandle<\"mongoose\", unknown>;\n\nexport type CreateDriverFromRuntimeOptions<\n TSchema extends SchemaDefinition<any>,\n TClient = unknown,\n> = {\n schema: TSchema;\n client?: TClient;\n runtime?: DetectedDatabaseRuntime<TClient>;\n dialect?: AutoDialect;\n databaseName?: string;\n prisma?: Pick<PrismaDriverConfig<TSchema>, \"models\"> & {\n databaseUrl?: string;\n packageRoot?: string;\n };\n drizzle?: Pick<DrizzleDriverConfig<TSchema>, \"client\">;\n mongo?: {\n collections?: MongoCollectionMap<TSchema>;\n db?: MongoDbLike;\n transforms?: MongoDriverConfig<TSchema>[\"transforms\"];\n startSession?: () => Promise<MongoSessionLike>;\n };\n mongoose?: {\n models?: Record<ModelName<TSchema>, MongooseModelLike>;\n transforms?: Partial<Record<string, Partial<Record<string, MongooseFieldTransform>>>>;\n startSession?: () => Promise<MongooseSessionLike>;\n };\n};\n\nexport type CreateOrmFromRuntimeOptions<\n TSchema extends SchemaDefinition<any>,\n TClient = unknown,\n> = CreateDriverFromRuntimeOptions<TSchema, TClient>;\n\nexport type MongooseConnectionLike = MongooseSessionSourceLike & {\n models?: Record<string, MongooseModelLike & { collection?: { collectionName?: string } }>;\n};\n\ntype MongoClientLike = MongoSessionSourceLike & {\n db(name?: string): MongoDbLike;\n};\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\";\n}\n\nexport function hasFunction<TName extends string>(\n value: unknown,\n name: TName,\n): value is Record<TName, (...args: any[]) => unknown> {\n return isRecord(value) && typeof value[name] === \"function\";\n}\n\nexport function resolveRuntime<TClient>(\n options: CreateDriverFromRuntimeOptions<any, TClient>,\n): DetectedDatabaseRuntime<TClient> {\n if (options.runtime) {\n return options.runtime;\n }\n\n if (options.client === undefined) {\n throw new Error(\n 'createDriverFromRuntime() requires either a detected \"runtime\" or a raw \"client\".',\n );\n }\n\n return requireDatabaseRuntime(options.client);\n}\n\nexport function resolveDialect(\n runtime: DetectedDatabaseRuntime<any>,\n override?: AutoDialect,\n): AutoDialect {\n const dialect = override ?? runtime.dialect;\n if (!dialect) {\n throw new Error(\n `Could not determine the database dialect for the detected ${runtime.kind} runtime. Pass a \"dialect\" option explicitly.`,\n );\n }\n return dialect;\n}\n\nexport function inferMongooseModels<TSchema extends SchemaDefinition<any>>(\n schema: TSchema,\n connection: MongooseConnectionLike,\n) {\n const manifest = createManifest(schema);\n const registeredModels = Object.values(connection.models ?? {});\n const models = {} as Record<ModelName<TSchema>, MongooseModelLike>;\n\n for (const modelName of Object.keys(schema.models) as Array<ModelName<TSchema>>) {\n const expectedTable = manifest.models[modelName].table;\n const inferredModel =\n registeredModels.find(\n (candidate) => candidate.collection?.collectionName === expectedTable,\n ) ?? connection.models?.[String(modelName)];\n\n if (!inferredModel) {\n throw new Error(\n `Could not infer a Mongoose model for schema model \"${String(modelName)}\". Register a model for collection \"${expectedTable}\" or pass mongoose.models explicitly.`,\n );\n }\n\n models[modelName] = inferredModel;\n }\n\n return models;\n}\n\nexport function resolveMongoDb(\n runtime: DetectedDatabaseRuntime<any>,\n options: CreateDriverFromRuntimeOptions<any>,\n) {\n if (options.mongo?.db) {\n return options.mongo.db;\n }\n\n if (runtime.source === \"db\") {\n return runtime.client as MongoDbLike;\n }\n\n const databaseName = options.databaseName;\n if (!databaseName) {\n throw new Error(\n 'MongoClient auto-creation requires a \"databaseName\" option so the helper can resolve the target database.',\n );\n }\n\n return (runtime.client as MongoClientLike).db(databaseName);\n}\n\nexport function resolveMongoSessionSource(\n runtime: DetectedDatabaseRuntime<any>,\n db: MongoDbLike,\n options: CreateDriverFromRuntimeOptions<any>,\n) {\n if (options.mongo?.startSession) {\n return {\n client: undefined,\n startSession: options.mongo.startSession,\n };\n }\n\n if (runtime.source === \"client\" && hasFunction(runtime.client, \"startSession\")) {\n return {\n client: runtime.client as MongoSessionSourceLike,\n startSession: undefined,\n };\n }\n\n const dbClient = isRecord(db) ? (db as Record<string, unknown>)[\"client\"] : undefined;\n if (hasFunction(dbClient, \"startSession\")) {\n return {\n client: dbClient as MongoSessionSourceLike,\n startSession: undefined,\n };\n }\n\n return {\n client: undefined,\n startSession: undefined,\n };\n}\n"],"mappings":"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","names":[]}
package/dist/index.cjs CHANGED
@@ -30,33 +30,20 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // src/index.ts
31
31
  var index_exports = {};
32
32
  __export(index_exports, {
33
- applySchema: () => applySchema,
34
- bootstrapDatabase: () => bootstrapDatabase,
35
33
  createDriverFromRuntime: () => createDriverFromRuntime,
36
- createOrmFromRuntime: () => createOrmFromRuntime,
37
- pushSchema: () => pushSchema
34
+ createOrmFromRuntime: () => createOrmFromRuntime
38
35
  });
39
36
  module.exports = __toCommonJS(index_exports);
40
- var import_node_child_process = require("child_process");
41
- var import_promises = require("fs/promises");
42
- var import_node_os = require("os");
43
- var import_node_path = __toESM(require("path"), 1);
44
- var import_node_util = require("util");
37
+ var import_orm2 = require("@farming-labs/orm");
38
+
39
+ // src/shared.ts
45
40
  var import_orm = require("@farming-labs/orm");
46
- var import_orm_drizzle = require("@farming-labs/orm-drizzle");
47
- var import_orm_kysely = require("@farming-labs/orm-kysely");
48
- var import_orm_mongo = require("@farming-labs/orm-mongo");
49
- var import_orm_mongoose = require("@farming-labs/orm-mongoose");
50
- var import_orm_prisma = require("@farming-labs/orm-prisma");
51
- var import_orm_sql = require("@farming-labs/orm-sql");
52
41
  function isRecord(value) {
53
42
  return !!value && typeof value === "object";
54
43
  }
55
44
  function hasFunction(value, name) {
56
45
  return isRecord(value) && typeof value[name] === "function";
57
46
  }
58
- var execFileAsync = (0, import_node_util.promisify)(import_node_child_process.execFile);
59
- var defaultPrismaPackageRoot = process.cwd();
60
47
  function resolveRuntime(options) {
61
48
  if (options.runtime) {
62
49
  return options.runtime;
@@ -77,96 +64,6 @@ function resolveDialect(runtime, override) {
77
64
  }
78
65
  return dialect;
79
66
  }
80
- function prismaProviderForDialect(dialect) {
81
- switch (dialect) {
82
- case "sqlite":
83
- return "sqlite";
84
- case "postgres":
85
- return "postgresql";
86
- case "mysql":
87
- return "mysql";
88
- }
89
- }
90
- function withDatabaseEnv(rendered) {
91
- return rendered.replace(/url\s+=\s+.+/, `url = env("DATABASE_URL")`);
92
- }
93
- function renderRuntimePrismaSchema(schema, provider) {
94
- return withDatabaseEnv((0, import_orm.renderPrismaSchema)(schema, { provider }));
95
- }
96
- function splitSqlStatements(sql) {
97
- const statements = [];
98
- let current = "";
99
- let quote = null;
100
- for (let index = 0; index < sql.length; index += 1) {
101
- const char = sql[index];
102
- const next = sql[index + 1];
103
- current += char;
104
- if (quote === "'") {
105
- if (char === "'" && next === "'") {
106
- current += next;
107
- index += 1;
108
- continue;
109
- }
110
- if (char === "\\" && next === "'") {
111
- current += next;
112
- index += 1;
113
- continue;
114
- }
115
- if (char === "'") {
116
- quote = null;
117
- }
118
- continue;
119
- }
120
- if (quote === '"') {
121
- if (char === '"' && next === '"') {
122
- current += next;
123
- index += 1;
124
- continue;
125
- }
126
- if (char === '"') {
127
- quote = null;
128
- }
129
- continue;
130
- }
131
- if (quote === "`") {
132
- if (char === "`" && next === "`") {
133
- current += next;
134
- index += 1;
135
- continue;
136
- }
137
- if (char === "\\" && next === "`") {
138
- current += next;
139
- index += 1;
140
- continue;
141
- }
142
- if (char === "`") {
143
- quote = null;
144
- }
145
- continue;
146
- }
147
- if (char === "'" || char === '"' || char === "`") {
148
- quote = char;
149
- continue;
150
- }
151
- if (char === ";") {
152
- const statement = current.trim();
153
- if (statement) {
154
- statements.push(statement);
155
- }
156
- current = "";
157
- }
158
- }
159
- const trailing = current.trim();
160
- if (trailing) {
161
- statements.push(trailing.endsWith(";") ? trailing : `${trailing};`);
162
- }
163
- return statements.map((statement) => statement.endsWith(";") ? statement : `${statement};`);
164
- }
165
- async function runSqlStatements(statements, run) {
166
- for (const statement of statements) {
167
- await run(statement);
168
- }
169
- }
170
67
  function inferMongooseModels(schema, connection) {
171
68
  const manifest = (0, import_orm.createManifest)(schema);
172
69
  const registeredModels = Object.values(connection.models ?? {});
@@ -185,33 +82,6 @@ function inferMongooseModels(schema, connection) {
185
82
  }
186
83
  return models;
187
84
  }
188
- function resolvePrismaDatabaseUrl(runtime, options) {
189
- if (options.prisma?.databaseUrl) {
190
- return options.prisma.databaseUrl;
191
- }
192
- const client = runtime.client;
193
- const engineConfig = isRecord(client._engineConfig) ? client._engineConfig : void 0;
194
- const overrideDatasources = isRecord(engineConfig?.overrideDatasources) ? engineConfig.overrideDatasources : void 0;
195
- for (const datasource of Object.values(overrideDatasources ?? {})) {
196
- if (!isRecord(datasource)) continue;
197
- if (typeof datasource.url === "string" && datasource.url.length > 0) {
198
- return datasource.url;
199
- }
200
- }
201
- const inlineDatasources = isRecord(engineConfig?.inlineDatasources) ? engineConfig.inlineDatasources : void 0;
202
- for (const datasource of Object.values(inlineDatasources ?? {})) {
203
- if (!isRecord(datasource) || !isRecord(datasource.url)) continue;
204
- if (typeof datasource.url.value === "string" && datasource.url.value.length > 0) {
205
- return datasource.url.value;
206
- }
207
- if (typeof datasource.url.fromEnvVar === "string" && process.env[datasource.url.fromEnvVar]?.length) {
208
- return process.env[datasource.url.fromEnvVar];
209
- }
210
- }
211
- throw new Error(
212
- 'pushSchema() for a Prisma runtime requires a resolvable database URL. Pass "prisma.databaseUrl" when the Prisma client does not expose one.'
213
- );
214
- }
215
85
  function resolveMongoDb(runtime, options) {
216
86
  if (options.mongo?.db) {
217
87
  return options.mongo.db;
@@ -252,227 +122,59 @@ function resolveMongoSessionSource(runtime, db, options) {
252
122
  startSession: void 0
253
123
  };
254
124
  }
255
- function resolveDrizzleRuntimeClient(runtime, options) {
256
- const runtimeClient = options.drizzle?.client ?? runtime.client?.$client ?? void 0;
257
- if (!runtimeClient) {
258
- throw new Error(
259
- 'pushSchema() for a Drizzle runtime requires a Drizzle database with a "$client" property or an explicit "drizzle.client" option.'
260
- );
261
- }
262
- return runtimeClient;
263
- }
264
- function asMongoSchemaTarget(value) {
265
- if (hasFunction(value, "collection")) {
266
- return value;
267
- }
268
- throw new Error("Unsupported Mongo schema target. Expected a MongoDB Db or Mongoose connection.");
269
- }
270
- function isMongoNamespaceExistsError(error) {
271
- if (isRecord(error) && error.code === 48) {
272
- return true;
273
- }
274
- const message = error instanceof Error ? error.message : String(error);
275
- return /already exists|NamespaceExists/i.test(message);
276
- }
277
- function isMongoEquivalentIndexError(error) {
278
- const message = error instanceof Error ? error.message : String(error);
279
- return /Index already exists with a different name/i.test(message);
280
- }
281
- function mongoIndexSpecsForModel(model) {
282
- const deduped = /* @__PURE__ */ new Map();
283
- for (const field of Object.values(model.fields)) {
284
- if (field.kind === "id") {
285
- if (field.column !== "_id") {
286
- const keys2 = { [field.column]: 1 };
287
- deduped.set(JSON.stringify({ keys: keys2, unique: true }), {
288
- keys: keys2,
289
- unique: true,
290
- name: `${model.table}_${field.column}_pk_unique`
291
- });
292
- }
293
- continue;
294
- }
295
- if (!field.unique) continue;
296
- const keys = { [field.column]: 1 };
297
- deduped.set(JSON.stringify({ keys, unique: true }), {
298
- keys,
299
- unique: true,
300
- name: `${model.table}_${field.column}_unique`
301
- });
302
- }
303
- for (const constraint of [...model.constraints.unique, ...model.constraints.indexes]) {
304
- const keys = Object.fromEntries(constraint.columns.map((column) => [column, 1]));
305
- deduped.set(JSON.stringify({ keys, unique: constraint.unique }), {
306
- keys,
307
- unique: constraint.unique,
308
- name: constraint.name
309
- });
310
- }
311
- return [...deduped.values()];
312
- }
313
- async function ensureMongoCollectionsAndIndexes(schema, target) {
314
- const manifest = (0, import_orm.createManifest)(schema);
315
- for (const model of Object.values(manifest.models)) {
316
- if (typeof target.createCollection === "function") {
317
- try {
318
- await target.createCollection(model.table);
319
- } catch (error) {
320
- if (!isMongoNamespaceExistsError(error)) {
321
- throw error;
322
- }
323
- }
324
- }
325
- const collection = target.collection(model.table);
326
- for (const index of mongoIndexSpecsForModel(model)) {
327
- try {
328
- await collection.createIndex(index.keys, {
329
- name: index.name,
330
- unique: index.unique
331
- });
332
- } catch (error) {
333
- if (!isMongoEquivalentIndexError(error)) {
334
- throw error;
335
- }
336
- }
337
- }
338
- }
339
- }
340
- async function applySqlSchemaToClient(client, dialect, sql) {
341
- if (dialect === "sqlite" && hasFunction(client, "exec")) {
342
- await client.exec(sql);
343
- return;
344
- }
345
- const statements = splitSqlStatements(sql);
346
- if (hasFunction(client, "query")) {
347
- await runSqlStatements(statements, (statement) => client.query(statement));
348
- return;
349
- }
350
- if (hasFunction(client, "execute")) {
351
- await runSqlStatements(
352
- statements,
353
- (statement) => client.execute(statement)
354
- );
355
- return;
356
- }
357
- if (hasFunction(client, "executeQuery")) {
358
- await runSqlStatements(
359
- statements,
360
- (statement) => client.executeQuery({
361
- sql: statement,
362
- parameters: [],
363
- query: {
364
- kind: "RawNode",
365
- sqlFragments: [statement],
366
- parameters: []
367
- },
368
- queryId: {}
369
- })
370
- );
371
- return;
372
- }
373
- throw new Error(
374
- `Could not apply generated ${dialect} schema statements to the provided runtime client.`
375
- );
376
- }
377
- async function runPrismaDbPush(schemaPath, databaseUrl, packageRoot) {
378
- await execFileAsync(
379
- "pnpm",
380
- ["exec", "prisma", "db", "push", "--schema", schemaPath, "--skip-generate"],
381
- {
382
- cwd: packageRoot,
383
- env: {
384
- ...process.env,
385
- DATABASE_URL: databaseUrl
386
- }
387
- }
388
- );
389
- }
390
- async function pushPrismaSchema(schema, runtime, options) {
391
- const dialect = resolveDialect(runtime, options.dialect);
392
- const provider = prismaProviderForDialect(dialect);
393
- const databaseUrl = resolvePrismaDatabaseUrl(runtime, options);
394
- const packageRoot = options.prisma?.packageRoot ?? defaultPrismaPackageRoot;
395
- const tempDir = await (0, import_promises.mkdtemp)(import_node_path.default.join((0, import_node_os.tmpdir)(), "farm-orm-runtime-prisma-"));
396
- const schemaPath = import_node_path.default.join(tempDir, "schema.prisma");
397
- try {
398
- await (0, import_promises.writeFile)(schemaPath, renderRuntimePrismaSchema(schema, provider), "utf8");
399
- await runPrismaDbPush(schemaPath, databaseUrl, packageRoot);
400
- } finally {
401
- await (0, import_promises.rm)(tempDir, { recursive: true, force: true });
402
- }
403
- }
404
- async function applySchemaInternal(options) {
405
- const runtime = resolveRuntime(options);
406
- if (runtime.kind === "prisma") {
407
- await pushPrismaSchema(options.schema, runtime, options);
408
- return;
409
- }
410
- if (runtime.kind === "mongo") {
411
- const db = resolveMongoDb(runtime, options);
412
- await ensureMongoCollectionsAndIndexes(options.schema, asMongoSchemaTarget(db));
413
- return;
414
- }
415
- if (runtime.kind === "mongoose") {
416
- const connection = runtime.client;
417
- const db = isRecord(connection.db) ? connection.db : connection;
418
- await ensureMongoCollectionsAndIndexes(options.schema, asMongoSchemaTarget(db));
419
- return;
420
- }
421
- const dialect = resolveDialect(runtime, options.dialect);
422
- const sql = (0, import_orm.renderSafeSql)(options.schema, { dialect });
423
- if (runtime.kind === "sql") {
424
- await applySqlSchemaToClient(runtime.client, dialect, sql);
425
- return;
426
- }
427
- if (runtime.kind === "drizzle") {
428
- await applySqlSchemaToClient(resolveDrizzleRuntimeClient(runtime, options), dialect, sql);
429
- return;
430
- }
431
- await applySqlSchemaToClient(runtime.client, dialect, sql);
432
- }
433
- function createSqlDriverFromRuntime(runtime, dialect) {
125
+
126
+ // src/index.ts
127
+ async function createSqlDriverFromRuntime(runtime, dialect) {
128
+ const { createMysqlDriver, createPgClientDriver, createPgPoolDriver, createSqliteDriver } = await import("@farming-labs/orm-sql");
434
129
  if (dialect === "sqlite") {
435
- return (0, import_orm_sql.createSqliteDriver)(runtime.client);
130
+ return createSqliteDriver(runtime.client);
436
131
  }
437
132
  if (dialect === "postgres") {
438
133
  if (runtime.source === "pool") {
439
- return (0, import_orm_sql.createPgPoolDriver)(runtime.client);
134
+ return createPgPoolDriver(runtime.client);
440
135
  }
441
- return (0, import_orm_sql.createPgClientDriver)(runtime.client);
136
+ return createPgClientDriver(runtime.client);
442
137
  }
443
138
  if (runtime.source === "pool") {
444
- return (0, import_orm_sql.createMysqlDriver)(runtime.client);
139
+ return createMysqlDriver(runtime.client);
445
140
  }
446
- return (0, import_orm_sql.createMysqlDriver)(runtime.client);
141
+ return createMysqlDriver(runtime.client);
447
142
  }
448
- function createDriverFromRuntime(options) {
143
+ async function createDriverFromRuntime(options) {
449
144
  const runtime = resolveRuntime(options);
450
145
  switch (runtime.kind) {
451
- case "prisma":
452
- return (0, import_orm_prisma.createPrismaDriver)({
146
+ case "prisma": {
147
+ const { createPrismaDriver } = await import("@farming-labs/orm-prisma");
148
+ return createPrismaDriver({
453
149
  client: runtime.client,
454
150
  models: options.prisma?.models
455
151
  });
456
- case "drizzle":
457
- return (0, import_orm_drizzle.createDrizzleDriver)({
152
+ }
153
+ case "drizzle": {
154
+ const { createDrizzleDriver } = await import("@farming-labs/orm-drizzle");
155
+ return createDrizzleDriver({
458
156
  db: runtime.client,
459
157
  client: options.drizzle?.client,
460
158
  dialect: resolveDialect(runtime, options.dialect)
461
159
  });
462
- case "kysely":
463
- return (0, import_orm_kysely.createKyselyDriver)({
160
+ }
161
+ case "kysely": {
162
+ const { createKyselyDriver } = await import("@farming-labs/orm-kysely");
163
+ return createKyselyDriver({
464
164
  db: runtime.client,
465
165
  dialect: resolveDialect(runtime, options.dialect)
466
166
  });
167
+ }
467
168
  case "sql":
468
- return createSqlDriverFromRuntime(
169
+ return await createSqlDriverFromRuntime(
469
170
  runtime,
470
171
  resolveDialect(runtime, options.dialect)
471
172
  );
472
173
  case "mongo": {
174
+ const { createMongoDriver } = await import("@farming-labs/orm-mongo");
473
175
  const db = resolveMongoDb(runtime, options);
474
176
  const sessionSource = resolveMongoSessionSource(runtime, db, options);
475
- return (0, import_orm_mongo.createMongoDriver)({
177
+ return createMongoDriver({
476
178
  collections: options.mongo?.collections,
477
179
  db,
478
180
  client: sessionSource.client,
@@ -481,8 +183,9 @@ function createDriverFromRuntime(options) {
481
183
  });
482
184
  }
483
185
  case "mongoose": {
186
+ const { createMongooseDriver } = await import("@farming-labs/orm-mongoose");
484
187
  const connection = runtime.client;
485
- return (0, import_orm_mongoose.createMongooseDriver)({
188
+ return createMongooseDriver({
486
189
  models: options.mongoose?.models ?? inferMongooseModels(options.schema, connection),
487
190
  connection,
488
191
  startSession: options.mongoose?.startSession,
@@ -491,29 +194,16 @@ function createDriverFromRuntime(options) {
491
194
  }
492
195
  }
493
196
  }
494
- function createOrmFromRuntime(options) {
495
- const driver = createDriverFromRuntime(options);
496
- return (0, import_orm.createOrm)({
197
+ async function createOrmFromRuntime(options) {
198
+ const driver = await createDriverFromRuntime(options);
199
+ return (0, import_orm2.createOrm)({
497
200
  schema: options.schema,
498
201
  driver
499
202
  });
500
203
  }
501
- async function applySchema(options) {
502
- await applySchemaInternal(options);
503
- }
504
- async function pushSchema(options) {
505
- await applySchemaInternal(options);
506
- }
507
- async function bootstrapDatabase(options) {
508
- await pushSchema(options);
509
- return createOrmFromRuntime(options);
510
- }
511
204
  // Annotate the CommonJS export names for ESM import in node:
512
205
  0 && (module.exports = {
513
- applySchema,
514
- bootstrapDatabase,
515
206
  createDriverFromRuntime,
516
- createOrmFromRuntime,
517
- pushSchema
207
+ createOrmFromRuntime
518
208
  });
519
209
  //# sourceMappingURL=index.cjs.map