@farming-labs/orm-runtime 0.0.19 → 0.0.20

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 CHANGED
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
+ var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
5
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
8
  var __export = (target, all) => {
7
9
  for (var name in all)
@@ -15,15 +17,31 @@ var __copyProps = (to, from, except, desc) => {
15
17
  }
16
18
  return to;
17
19
  };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
18
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
29
 
20
30
  // src/index.ts
21
31
  var index_exports = {};
22
32
  __export(index_exports, {
33
+ applySchema: () => applySchema,
34
+ bootstrapDatabase: () => bootstrapDatabase,
23
35
  createDriverFromRuntime: () => createDriverFromRuntime,
24
- createOrmFromRuntime: () => createOrmFromRuntime
36
+ createOrmFromRuntime: () => createOrmFromRuntime,
37
+ pushSchema: () => pushSchema
25
38
  });
26
39
  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");
27
45
  var import_orm = require("@farming-labs/orm");
28
46
  var import_orm_drizzle = require("@farming-labs/orm-drizzle");
29
47
  var import_orm_kysely = require("@farming-labs/orm-kysely");
@@ -37,6 +55,8 @@ function isRecord(value) {
37
55
  function hasFunction(value, name) {
38
56
  return isRecord(value) && typeof value[name] === "function";
39
57
  }
58
+ var execFileAsync = (0, import_node_util.promisify)(import_node_child_process.execFile);
59
+ var defaultPrismaPackageRoot = process.cwd();
40
60
  function resolveRuntime(options) {
41
61
  if (options.runtime) {
42
62
  return options.runtime;
@@ -57,6 +77,96 @@ function resolveDialect(runtime, override) {
57
77
  }
58
78
  return dialect;
59
79
  }
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
+ }
60
170
  function inferMongooseModels(schema, connection) {
61
171
  const manifest = (0, import_orm.createManifest)(schema);
62
172
  const registeredModels = Object.values(connection.models ?? {});
@@ -75,6 +185,33 @@ function inferMongooseModels(schema, connection) {
75
185
  }
76
186
  return models;
77
187
  }
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
+ }
78
215
  function resolveMongoDb(runtime, options) {
79
216
  if (options.mongo?.db) {
80
217
  return options.mongo.db;
@@ -115,6 +252,184 @@ function resolveMongoSessionSource(runtime, db, options) {
115
252
  startSession: void 0
116
253
  };
117
254
  }
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
+ }
118
433
  function createSqlDriverFromRuntime(runtime, dialect) {
119
434
  if (dialect === "sqlite") {
120
435
  return (0, import_orm_sql.createSqliteDriver)(runtime.client);
@@ -183,9 +498,22 @@ function createOrmFromRuntime(options) {
183
498
  driver
184
499
  });
185
500
  }
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
+ }
186
511
  // Annotate the CommonJS export names for ESM import in node:
187
512
  0 && (module.exports = {
513
+ applySchema,
514
+ bootstrapDatabase,
188
515
  createDriverFromRuntime,
189
- createOrmFromRuntime
516
+ createOrmFromRuntime,
517
+ pushSchema
190
518
  });
191
519
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n createManifest,\n createOrm,\n requireDatabaseRuntime,\n type DetectedDatabaseDialect,\n type DetectedDatabaseRuntime,\n type ModelName,\n type OrmClient,\n type OrmDriver,\n type OrmDriverHandle,\n type SchemaDefinition,\n} from \"@farming-labs/orm\";\nimport {\n createDrizzleDriver,\n type DrizzleDialect,\n type DrizzleDriverConfig,\n} from \"@farming-labs/orm-drizzle\";\nimport {\n createKyselyDriver,\n type KyselyDialect,\n type KyselyDriverConfig,\n} from \"@farming-labs/orm-kysely\";\nimport {\n createMongoDriver,\n type MongoCollectionMap,\n type MongoDbLike,\n type MongoDriverConfig,\n type MongoSessionLike,\n type MongoSessionSourceLike,\n} from \"@farming-labs/orm-mongo\";\nimport {\n createMongooseDriver,\n type MongooseDriverConfig,\n type MongooseFieldTransform,\n type MongooseModelLike,\n type MongooseSessionLike,\n type MongooseSessionSourceLike,\n} from \"@farming-labs/orm-mongoose\";\nimport {\n createPrismaDriver,\n type PrismaDriverConfig,\n type PrismaDriverHandle,\n} from \"@farming-labs/orm-prisma\";\nimport {\n createMysqlDriver,\n createPgClientDriver,\n createPgPoolDriver,\n createSqliteDriver,\n type MysqlConnectionLike,\n type MysqlPoolLike,\n type PgClientLike,\n type PgPoolLike,\n type SqlDriverHandle,\n type SqliteDatabaseLike,\n} from \"@farming-labs/orm-sql\";\n\ntype AutoDialect = DetectedDatabaseDialect;\n\ntype 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\ntype CreateDriverFromRuntimeOptions<TSchema extends SchemaDefinition<any>, TClient = unknown> = {\n schema: TSchema;\n client?: TClient;\n runtime?: DetectedDatabaseRuntime<TClient>;\n dialect?: AutoDialect;\n databaseName?: string;\n prisma?: Pick<PrismaDriverConfig<TSchema>, \"models\">;\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\ntype CreateOrmFromRuntimeOptions<\n TSchema extends SchemaDefinition<any>,\n TClient = unknown,\n> = CreateDriverFromRuntimeOptions<TSchema, TClient>;\n\ntype MongooseConnectionLike = MongooseSessionSourceLike & {\n models?: Record<string, MongooseModelLike & { collection?: { collectionName?: string } }>;\n};\n\ntype MongoClientLike = MongoSessionSourceLike & {\n db(name?: string): MongoDbLike;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\";\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction createSqlDriverFromRuntime<TSchema extends SchemaDefinition<any>>(\n runtime: DetectedDatabaseRuntime<any>,\n dialect: AutoDialect,\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 function createDriverFromRuntime<TSchema extends SchemaDefinition<any>, TClient = unknown>(\n options: CreateDriverFromRuntimeOptions<TSchema, TClient>,\n): OrmDriver<TSchema, AutoDriverHandle<TClient>> {\n const runtime = resolveRuntime(options);\n\n switch (runtime.kind) {\n case \"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 case \"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 case \"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 case \"sql\":\n return createSqlDriverFromRuntime<TSchema>(\n runtime,\n resolveDialect(runtime, options.dialect),\n ) as OrmDriver<TSchema, AutoDriverHandle<TClient>>;\n case \"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,\n }) as OrmDriver<TSchema, AutoDriverHandle<TClient>>;\n }\n case \"mongoose\": {\n const connection = runtime.client as MongooseConnectionLike;\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,\n }) as OrmDriver<TSchema, AutoDriverHandle<TClient>>;\n }\n }\n}\n\nexport function createOrmFromRuntime<TSchema extends SchemaDefinition<any>, TClient = unknown>(\n options: CreateOrmFromRuntimeOptions<TSchema, TClient>,\n): OrmClient<TSchema, AutoDriverHandle<TClient>> {\n const driver = createDriverFromRuntime(options);\n return createOrm({\n schema: options.schema,\n driver,\n }) as OrmClient<TSchema, AutoDriverHandle<TClient>>;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { execFile } from \"node:child_process\";\nimport { mkdtemp, rm, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport {\n createManifest,\n createOrm,\n requireDatabaseRuntime,\n type DetectedDatabaseDialect,\n type DetectedDatabaseRuntime,\n type ModelName,\n type OrmClient,\n type OrmDriver,\n type OrmDriverHandle,\n renderPrismaSchema,\n renderSafeSql,\n type SchemaDefinition,\n} from \"@farming-labs/orm\";\nimport {\n createDrizzleDriver,\n type DrizzleDialect,\n type DrizzleDriverConfig,\n} from \"@farming-labs/orm-drizzle\";\nimport {\n createKyselyDriver,\n type KyselyDialect,\n type KyselyDriverConfig,\n} from \"@farming-labs/orm-kysely\";\nimport {\n createMongoDriver,\n type MongoCollectionMap,\n type MongoDbLike,\n type MongoDriverConfig,\n type MongoSessionLike,\n type MongoSessionSourceLike,\n} from \"@farming-labs/orm-mongo\";\nimport {\n createMongooseDriver,\n type MongooseDriverConfig,\n type MongooseFieldTransform,\n type MongooseModelLike,\n type MongooseSessionLike,\n type MongooseSessionSourceLike,\n} from \"@farming-labs/orm-mongoose\";\nimport {\n createPrismaDriver,\n type PrismaDriverConfig,\n type PrismaDriverHandle,\n} from \"@farming-labs/orm-prisma\";\nimport {\n createMysqlDriver,\n createPgClientDriver,\n createPgPoolDriver,\n createSqliteDriver,\n type MysqlConnectionLike,\n type MysqlPoolLike,\n type PgClientLike,\n type PgPoolLike,\n type SqlDriverHandle,\n type SqliteDatabaseLike,\n} from \"@farming-labs/orm-sql\";\n\ntype AutoDialect = DetectedDatabaseDialect;\n\ntype PrismaProvider = \"sqlite\" | \"postgresql\" | \"mysql\";\n\ntype 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\ntype CreateDriverFromRuntimeOptions<TSchema extends SchemaDefinition<any>, TClient = unknown> = {\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\ntype CreateOrmFromRuntimeOptions<\n TSchema extends SchemaDefinition<any>,\n TClient = unknown,\n> = CreateDriverFromRuntimeOptions<TSchema, TClient>;\n\nexport type PushSchemaOptions<\n TSchema extends SchemaDefinition<any>,\n TClient = unknown,\n> = CreateDriverFromRuntimeOptions<TSchema, TClient>;\n\nexport type ApplySchemaOptions<\n TSchema extends SchemaDefinition<any>,\n TClient = unknown,\n> = CreateDriverFromRuntimeOptions<TSchema, TClient>;\n\nexport type BootstrapDatabaseOptions<\n TSchema extends SchemaDefinition<any>,\n TClient = unknown,\n> = CreateOrmFromRuntimeOptions<TSchema, TClient>;\n\ntype MongooseConnectionLike = MongooseSessionSourceLike & {\n models?: Record<string, MongooseModelLike & { collection?: { collectionName?: string } }>;\n};\n\ntype MongoClientLike = MongoSessionSourceLike & {\n db(name?: string): MongoDbLike;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\";\n}\n\nfunction 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\ntype SqlQueryClient = {\n query(sql: string, params?: readonly unknown[]): Promise<unknown> | unknown;\n};\n\ntype SqlExecuteClient = {\n execute(sql: string, params?: readonly unknown[]): Promise<unknown> | unknown;\n};\n\ntype SqliteExecClient = {\n exec(sql: string): Promise<unknown> | unknown;\n};\n\ntype KyselyExecuteClient = {\n executeQuery(query: {\n sql: string;\n parameters: readonly unknown[];\n query: {\n kind: \"RawNode\";\n sqlFragments: readonly string[];\n parameters: readonly unknown[];\n };\n queryId: object;\n }): Promise<unknown>;\n};\n\ntype MongoIndexCollectionLike = {\n createIndex(\n keys: Record<string, 1 | -1>,\n options?: { unique?: boolean; name?: string },\n ): Promise<unknown>;\n};\n\ntype MongoSchemaTargetLike = {\n collection(name: string): MongoIndexCollectionLike;\n createCollection?(name: string): Promise<unknown>;\n};\n\nconst execFileAsync = promisify(execFile);\nconst defaultPrismaPackageRoot = process.cwd();\n\nfunction 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\nfunction 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\nfunction prismaProviderForDialect(dialect: AutoDialect): PrismaProvider {\n switch (dialect) {\n case \"sqlite\":\n return \"sqlite\";\n case \"postgres\":\n return \"postgresql\";\n case \"mysql\":\n return \"mysql\";\n }\n}\n\nfunction withDatabaseEnv(rendered: string) {\n return rendered.replace(/url\\s+=\\s+.+/, `url = env(\"DATABASE_URL\")`);\n}\n\nfunction renderRuntimePrismaSchema(schema: SchemaDefinition<any>, provider: PrismaProvider) {\n return withDatabaseEnv(renderPrismaSchema(schema, { provider }));\n}\n\nfunction splitSqlStatements(sql: string) {\n const statements: string[] = [];\n let current = \"\";\n let quote: \"'\" | '\"' | \"`\" | null = null;\n\n for (let index = 0; index < sql.length; index += 1) {\n const char = sql[index]!;\n const next = sql[index + 1];\n\n current += char;\n\n if (quote === \"'\") {\n if (char === \"'\" && next === \"'\") {\n current += next;\n index += 1;\n continue;\n }\n\n if (char === \"\\\\\" && next === \"'\") {\n current += next;\n index += 1;\n continue;\n }\n\n if (char === \"'\") {\n quote = null;\n }\n\n continue;\n }\n\n if (quote === '\"') {\n if (char === '\"' && next === '\"') {\n current += next;\n index += 1;\n continue;\n }\n\n if (char === '\"') {\n quote = null;\n }\n\n continue;\n }\n\n if (quote === \"`\") {\n if (char === \"`\" && next === \"`\") {\n current += next;\n index += 1;\n continue;\n }\n\n if (char === \"\\\\\" && next === \"`\") {\n current += next;\n index += 1;\n continue;\n }\n\n if (char === \"`\") {\n quote = null;\n }\n\n continue;\n }\n\n if (char === \"'\" || char === '\"' || char === \"`\") {\n quote = char;\n continue;\n }\n\n if (char === \";\") {\n const statement = current.trim();\n if (statement) {\n statements.push(statement);\n }\n current = \"\";\n }\n }\n\n const trailing = current.trim();\n if (trailing) {\n statements.push(trailing.endsWith(\";\") ? trailing : `${trailing};`);\n }\n\n return statements.map((statement) => (statement.endsWith(\";\") ? statement : `${statement};`));\n}\n\nasync function runSqlStatements(\n statements: readonly string[],\n run: (sql: string) => Promise<unknown> | unknown,\n) {\n for (const statement of statements) {\n await run(statement);\n }\n}\n\nfunction 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\nfunction resolvePrismaDatabaseUrl(\n runtime: DetectedDatabaseRuntime<any>,\n options: CreateDriverFromRuntimeOptions<any>,\n): string {\n if (options.prisma?.databaseUrl) {\n return options.prisma.databaseUrl;\n }\n\n const client = runtime.client as Record<string, unknown>;\n const engineConfig = isRecord(client._engineConfig) ? client._engineConfig : undefined;\n\n const overrideDatasources = isRecord(engineConfig?.overrideDatasources)\n ? engineConfig.overrideDatasources\n : undefined;\n for (const datasource of Object.values(overrideDatasources ?? {})) {\n if (!isRecord(datasource)) continue;\n if (typeof datasource.url === \"string\" && datasource.url.length > 0) {\n return datasource.url;\n }\n }\n\n const inlineDatasources = isRecord(engineConfig?.inlineDatasources)\n ? engineConfig.inlineDatasources\n : undefined;\n for (const datasource of Object.values(inlineDatasources ?? {})) {\n if (!isRecord(datasource) || !isRecord(datasource.url)) continue;\n if (typeof datasource.url.value === \"string\" && datasource.url.value.length > 0) {\n return datasource.url.value;\n }\n if (\n typeof datasource.url.fromEnvVar === \"string\" &&\n process.env[datasource.url.fromEnvVar]?.length\n ) {\n return process.env[datasource.url.fromEnvVar]!;\n }\n }\n\n throw new Error(\n 'pushSchema() for a Prisma runtime requires a resolvable database URL. Pass \"prisma.databaseUrl\" when the Prisma client does not expose one.',\n );\n}\n\nfunction 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\nfunction 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\nfunction resolveDrizzleRuntimeClient(\n runtime: DetectedDatabaseRuntime<any>,\n options: CreateDriverFromRuntimeOptions<any>,\n) {\n const runtimeClient =\n options.drizzle?.client ??\n (runtime.client as DrizzleDriverConfig<any>[\"db\"] | undefined)?.$client ??\n undefined;\n\n if (!runtimeClient) {\n throw new Error(\n 'pushSchema() for a Drizzle runtime requires a Drizzle database with a \"$client\" property or an explicit \"drizzle.client\" option.',\n );\n }\n\n return runtimeClient;\n}\n\nfunction asMongoSchemaTarget(value: unknown): MongoSchemaTargetLike {\n if (hasFunction(value, \"collection\")) {\n return value as MongoSchemaTargetLike;\n }\n\n throw new Error(\"Unsupported Mongo schema target. Expected a MongoDB Db or Mongoose connection.\");\n}\n\nfunction isMongoNamespaceExistsError(error: unknown) {\n if (isRecord(error) && error.code === 48) {\n return true;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n return /already exists|NamespaceExists/i.test(message);\n}\n\nfunction isMongoEquivalentIndexError(error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return /Index already exists with a different name/i.test(message);\n}\n\nfunction mongoIndexSpecsForModel(model: ReturnType<typeof createManifest>[\"models\"][string]) {\n const deduped = new Map<string, { keys: Record<string, 1>; unique: boolean; name: string }>();\n\n for (const field of Object.values(model.fields)) {\n if (field.kind === \"id\") {\n if (field.column !== \"_id\") {\n const keys = { [field.column]: 1 } satisfies Record<string, 1>;\n deduped.set(JSON.stringify({ keys, unique: true }), {\n keys,\n unique: true,\n name: `${model.table}_${field.column}_pk_unique`,\n });\n }\n continue;\n }\n\n if (!field.unique) continue;\n const keys = { [field.column]: 1 } satisfies Record<string, 1>;\n deduped.set(JSON.stringify({ keys, unique: true }), {\n keys,\n unique: true,\n name: `${model.table}_${field.column}_unique`,\n });\n }\n\n for (const constraint of [...model.constraints.unique, ...model.constraints.indexes]) {\n const keys = Object.fromEntries(constraint.columns.map((column) => [column, 1])) as Record<\n string,\n 1\n >;\n deduped.set(JSON.stringify({ keys, unique: constraint.unique }), {\n keys,\n unique: constraint.unique,\n name: constraint.name,\n });\n }\n\n return [...deduped.values()];\n}\n\nasync function ensureMongoCollectionsAndIndexes(\n schema: SchemaDefinition<any>,\n target: MongoSchemaTargetLike,\n) {\n const manifest = createManifest(schema);\n\n for (const model of Object.values(manifest.models)) {\n if (typeof target.createCollection === \"function\") {\n try {\n await target.createCollection(model.table);\n } catch (error) {\n if (!isMongoNamespaceExistsError(error)) {\n throw error;\n }\n }\n }\n\n const collection = target.collection(model.table);\n for (const index of mongoIndexSpecsForModel(model)) {\n try {\n await collection.createIndex(index.keys, {\n name: index.name,\n unique: index.unique,\n });\n } catch (error) {\n if (!isMongoEquivalentIndexError(error)) {\n throw error;\n }\n }\n }\n }\n}\n\nasync function applySqlSchemaToClient(client: unknown, dialect: AutoDialect, sql: string) {\n if (dialect === \"sqlite\" && hasFunction(client, \"exec\")) {\n await (client as SqliteExecClient).exec(sql);\n return;\n }\n\n const statements = splitSqlStatements(sql);\n\n if (hasFunction(client, \"query\")) {\n await runSqlStatements(statements, (statement) => (client as SqlQueryClient).query(statement));\n return;\n }\n\n if (hasFunction(client, \"execute\")) {\n await runSqlStatements(statements, (statement) =>\n (client as SqlExecuteClient).execute(statement),\n );\n return;\n }\n\n if (hasFunction(client, \"executeQuery\")) {\n await runSqlStatements(statements, (statement) =>\n (client as KyselyExecuteClient).executeQuery({\n sql: statement,\n parameters: [],\n query: {\n kind: \"RawNode\",\n sqlFragments: [statement],\n parameters: [],\n },\n queryId: {},\n }),\n );\n return;\n }\n\n throw new Error(\n `Could not apply generated ${dialect} schema statements to the provided runtime client.`,\n );\n}\n\nasync function runPrismaDbPush(schemaPath: string, databaseUrl: string, packageRoot: string) {\n await execFileAsync(\n \"pnpm\",\n [\"exec\", \"prisma\", \"db\", \"push\", \"--schema\", schemaPath, \"--skip-generate\"],\n {\n cwd: packageRoot,\n env: {\n ...process.env,\n DATABASE_URL: databaseUrl,\n },\n },\n );\n}\n\nasync function pushPrismaSchema(\n schema: SchemaDefinition<any>,\n runtime: DetectedDatabaseRuntime<any>,\n options: CreateDriverFromRuntimeOptions<any>,\n) {\n const dialect = resolveDialect(runtime, options.dialect);\n const provider = prismaProviderForDialect(dialect);\n const databaseUrl = resolvePrismaDatabaseUrl(runtime, options);\n const packageRoot = options.prisma?.packageRoot ?? defaultPrismaPackageRoot;\n const tempDir = await mkdtemp(path.join(tmpdir(), \"farm-orm-runtime-prisma-\"));\n const schemaPath = path.join(tempDir, \"schema.prisma\");\n\n try {\n await writeFile(schemaPath, renderRuntimePrismaSchema(schema, provider), \"utf8\");\n await runPrismaDbPush(schemaPath, databaseUrl, packageRoot);\n } finally {\n await rm(tempDir, { recursive: true, force: true });\n }\n}\n\nasync function applySchemaInternal<TSchema extends SchemaDefinition<any>, TClient = unknown>(\n options: CreateDriverFromRuntimeOptions<TSchema, TClient>,\n) {\n const runtime = resolveRuntime(options);\n\n if (runtime.kind === \"prisma\") {\n await pushPrismaSchema(options.schema, runtime, options);\n return;\n }\n\n if (runtime.kind === \"mongo\") {\n const db = resolveMongoDb(runtime, options);\n await ensureMongoCollectionsAndIndexes(options.schema, asMongoSchemaTarget(db));\n return;\n }\n\n if (runtime.kind === \"mongoose\") {\n const connection = runtime.client as Record<string, unknown>;\n const db = isRecord(connection.db) ? connection.db : connection;\n await ensureMongoCollectionsAndIndexes(options.schema, asMongoSchemaTarget(db));\n return;\n }\n\n const dialect = resolveDialect(runtime, options.dialect);\n const sql = renderSafeSql(options.schema, { dialect });\n\n if (runtime.kind === \"sql\") {\n await applySqlSchemaToClient(runtime.client, dialect, sql);\n return;\n }\n\n if (runtime.kind === \"drizzle\") {\n await applySqlSchemaToClient(resolveDrizzleRuntimeClient(runtime, options), dialect, sql);\n return;\n }\n\n await applySqlSchemaToClient(runtime.client, dialect, sql);\n}\n\nfunction createSqlDriverFromRuntime<TSchema extends SchemaDefinition<any>>(\n runtime: DetectedDatabaseRuntime<any>,\n dialect: AutoDialect,\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 function createDriverFromRuntime<TSchema extends SchemaDefinition<any>, TClient = unknown>(\n options: CreateDriverFromRuntimeOptions<TSchema, TClient>,\n): OrmDriver<TSchema, AutoDriverHandle<TClient>> {\n const runtime = resolveRuntime(options);\n\n switch (runtime.kind) {\n case \"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 case \"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 case \"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 case \"sql\":\n return createSqlDriverFromRuntime<TSchema>(\n runtime,\n resolveDialect(runtime, options.dialect),\n ) as OrmDriver<TSchema, AutoDriverHandle<TClient>>;\n case \"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,\n }) as OrmDriver<TSchema, AutoDriverHandle<TClient>>;\n }\n case \"mongoose\": {\n const connection = runtime.client as MongooseConnectionLike;\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,\n }) as OrmDriver<TSchema, AutoDriverHandle<TClient>>;\n }\n }\n}\n\nexport function createOrmFromRuntime<TSchema extends SchemaDefinition<any>, TClient = unknown>(\n options: CreateOrmFromRuntimeOptions<TSchema, TClient>,\n): OrmClient<TSchema, AutoDriverHandle<TClient>> {\n const driver = createDriverFromRuntime(options);\n return createOrm({\n schema: options.schema,\n driver,\n }) as OrmClient<TSchema, AutoDriverHandle<TClient>>;\n}\n\nexport async function applySchema<TSchema extends SchemaDefinition<any>, TClient = unknown>(\n options: ApplySchemaOptions<TSchema, TClient>,\n) {\n await applySchemaInternal(options);\n}\n\nexport async function pushSchema<TSchema extends SchemaDefinition<any>, TClient = unknown>(\n options: PushSchemaOptions<TSchema, TClient>,\n) {\n await applySchemaInternal(options);\n}\n\nexport async function bootstrapDatabase<TSchema extends SchemaDefinition<any>, TClient = unknown>(\n options: BootstrapDatabaseOptions<TSchema, TClient>,\n) {\n await pushSchema(options);\n return createOrmFromRuntime(options);\n}\n"],"mappings":"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","names":["keys","path"]}
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { SchemaDefinition, DetectedDatabaseRuntime, DetectedDatabaseDialect, ModelName, OrmDriver, OrmDriverHandle, OrmClient } from '@farming-labs/orm';
1
+ import { SchemaDefinition, DetectedDatabaseRuntime, DetectedDatabaseDialect, ModelName, OrmClient, OrmDriverHandle, OrmDriver } from '@farming-labs/orm';
2
2
  import { DrizzleDriverConfig, DrizzleDialect } from '@farming-labs/orm-drizzle';
3
3
  import { KyselyDialect } from '@farming-labs/orm-kysely';
4
4
  import { MongoCollectionMap, MongoDbLike, MongoDriverConfig, MongoSessionLike } from '@farming-labs/orm-mongo';
@@ -14,7 +14,10 @@ type CreateDriverFromRuntimeOptions<TSchema extends SchemaDefinition<any>, TClie
14
14
  runtime?: DetectedDatabaseRuntime<TClient>;
15
15
  dialect?: AutoDialect;
16
16
  databaseName?: string;
17
- prisma?: Pick<PrismaDriverConfig<TSchema>, "models">;
17
+ prisma?: Pick<PrismaDriverConfig<TSchema>, "models"> & {
18
+ databaseUrl?: string;
19
+ packageRoot?: string;
20
+ };
18
21
  drizzle?: Pick<DrizzleDriverConfig<TSchema>, "client">;
19
22
  mongo?: {
20
23
  collections?: MongoCollectionMap<TSchema>;
@@ -29,7 +32,13 @@ type CreateDriverFromRuntimeOptions<TSchema extends SchemaDefinition<any>, TClie
29
32
  };
30
33
  };
31
34
  type CreateOrmFromRuntimeOptions<TSchema extends SchemaDefinition<any>, TClient = unknown> = CreateDriverFromRuntimeOptions<TSchema, TClient>;
35
+ type PushSchemaOptions<TSchema extends SchemaDefinition<any>, TClient = unknown> = CreateDriverFromRuntimeOptions<TSchema, TClient>;
36
+ type ApplySchemaOptions<TSchema extends SchemaDefinition<any>, TClient = unknown> = CreateDriverFromRuntimeOptions<TSchema, TClient>;
37
+ type BootstrapDatabaseOptions<TSchema extends SchemaDefinition<any>, TClient = unknown> = CreateOrmFromRuntimeOptions<TSchema, TClient>;
32
38
  declare function createDriverFromRuntime<TSchema extends SchemaDefinition<any>, TClient = unknown>(options: CreateDriverFromRuntimeOptions<TSchema, TClient>): OrmDriver<TSchema, AutoDriverHandle<TClient>>;
33
39
  declare function createOrmFromRuntime<TSchema extends SchemaDefinition<any>, TClient = unknown>(options: CreateOrmFromRuntimeOptions<TSchema, TClient>): OrmClient<TSchema, AutoDriverHandle<TClient>>;
40
+ declare function applySchema<TSchema extends SchemaDefinition<any>, TClient = unknown>(options: ApplySchemaOptions<TSchema, TClient>): Promise<void>;
41
+ declare function pushSchema<TSchema extends SchemaDefinition<any>, TClient = unknown>(options: PushSchemaOptions<TSchema, TClient>): Promise<void>;
42
+ declare function bootstrapDatabase<TSchema extends SchemaDefinition<any>, TClient = unknown>(options: BootstrapDatabaseOptions<TSchema, TClient>): Promise<OrmClient<TSchema, AutoDriverHandle<TClient>>>;
34
43
 
35
- export { createDriverFromRuntime, createOrmFromRuntime };
44
+ export { type ApplySchemaOptions, type BootstrapDatabaseOptions, type PushSchemaOptions, applySchema, bootstrapDatabase, createDriverFromRuntime, createOrmFromRuntime, pushSchema };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { SchemaDefinition, DetectedDatabaseRuntime, DetectedDatabaseDialect, ModelName, OrmDriver, OrmDriverHandle, OrmClient } from '@farming-labs/orm';
1
+ import { SchemaDefinition, DetectedDatabaseRuntime, DetectedDatabaseDialect, ModelName, OrmClient, OrmDriverHandle, OrmDriver } from '@farming-labs/orm';
2
2
  import { DrizzleDriverConfig, DrizzleDialect } from '@farming-labs/orm-drizzle';
3
3
  import { KyselyDialect } from '@farming-labs/orm-kysely';
4
4
  import { MongoCollectionMap, MongoDbLike, MongoDriverConfig, MongoSessionLike } from '@farming-labs/orm-mongo';
@@ -14,7 +14,10 @@ type CreateDriverFromRuntimeOptions<TSchema extends SchemaDefinition<any>, TClie
14
14
  runtime?: DetectedDatabaseRuntime<TClient>;
15
15
  dialect?: AutoDialect;
16
16
  databaseName?: string;
17
- prisma?: Pick<PrismaDriverConfig<TSchema>, "models">;
17
+ prisma?: Pick<PrismaDriverConfig<TSchema>, "models"> & {
18
+ databaseUrl?: string;
19
+ packageRoot?: string;
20
+ };
18
21
  drizzle?: Pick<DrizzleDriverConfig<TSchema>, "client">;
19
22
  mongo?: {
20
23
  collections?: MongoCollectionMap<TSchema>;
@@ -29,7 +32,13 @@ type CreateDriverFromRuntimeOptions<TSchema extends SchemaDefinition<any>, TClie
29
32
  };
30
33
  };
31
34
  type CreateOrmFromRuntimeOptions<TSchema extends SchemaDefinition<any>, TClient = unknown> = CreateDriverFromRuntimeOptions<TSchema, TClient>;
35
+ type PushSchemaOptions<TSchema extends SchemaDefinition<any>, TClient = unknown> = CreateDriverFromRuntimeOptions<TSchema, TClient>;
36
+ type ApplySchemaOptions<TSchema extends SchemaDefinition<any>, TClient = unknown> = CreateDriverFromRuntimeOptions<TSchema, TClient>;
37
+ type BootstrapDatabaseOptions<TSchema extends SchemaDefinition<any>, TClient = unknown> = CreateOrmFromRuntimeOptions<TSchema, TClient>;
32
38
  declare function createDriverFromRuntime<TSchema extends SchemaDefinition<any>, TClient = unknown>(options: CreateDriverFromRuntimeOptions<TSchema, TClient>): OrmDriver<TSchema, AutoDriverHandle<TClient>>;
33
39
  declare function createOrmFromRuntime<TSchema extends SchemaDefinition<any>, TClient = unknown>(options: CreateOrmFromRuntimeOptions<TSchema, TClient>): OrmClient<TSchema, AutoDriverHandle<TClient>>;
40
+ declare function applySchema<TSchema extends SchemaDefinition<any>, TClient = unknown>(options: ApplySchemaOptions<TSchema, TClient>): Promise<void>;
41
+ declare function pushSchema<TSchema extends SchemaDefinition<any>, TClient = unknown>(options: PushSchemaOptions<TSchema, TClient>): Promise<void>;
42
+ declare function bootstrapDatabase<TSchema extends SchemaDefinition<any>, TClient = unknown>(options: BootstrapDatabaseOptions<TSchema, TClient>): Promise<OrmClient<TSchema, AutoDriverHandle<TClient>>>;
34
43
 
35
- export { createDriverFromRuntime, createOrmFromRuntime };
44
+ export { type ApplySchemaOptions, type BootstrapDatabaseOptions, type PushSchemaOptions, applySchema, bootstrapDatabase, createDriverFromRuntime, createOrmFromRuntime, pushSchema };
package/dist/index.js CHANGED
@@ -1,8 +1,15 @@
1
1
  // src/index.ts
2
+ import { execFile } from "child_process";
3
+ import { mkdtemp, rm, writeFile } from "fs/promises";
4
+ import { tmpdir } from "os";
5
+ import path from "path";
6
+ import { promisify } from "util";
2
7
  import {
3
8
  createManifest,
4
9
  createOrm,
5
- requireDatabaseRuntime
10
+ requireDatabaseRuntime,
11
+ renderPrismaSchema,
12
+ renderSafeSql
6
13
  } from "@farming-labs/orm";
7
14
  import {
8
15
  createDrizzleDriver
@@ -31,6 +38,8 @@ function isRecord(value) {
31
38
  function hasFunction(value, name) {
32
39
  return isRecord(value) && typeof value[name] === "function";
33
40
  }
41
+ var execFileAsync = promisify(execFile);
42
+ var defaultPrismaPackageRoot = process.cwd();
34
43
  function resolveRuntime(options) {
35
44
  if (options.runtime) {
36
45
  return options.runtime;
@@ -51,6 +60,96 @@ function resolveDialect(runtime, override) {
51
60
  }
52
61
  return dialect;
53
62
  }
63
+ function prismaProviderForDialect(dialect) {
64
+ switch (dialect) {
65
+ case "sqlite":
66
+ return "sqlite";
67
+ case "postgres":
68
+ return "postgresql";
69
+ case "mysql":
70
+ return "mysql";
71
+ }
72
+ }
73
+ function withDatabaseEnv(rendered) {
74
+ return rendered.replace(/url\s+=\s+.+/, `url = env("DATABASE_URL")`);
75
+ }
76
+ function renderRuntimePrismaSchema(schema, provider) {
77
+ return withDatabaseEnv(renderPrismaSchema(schema, { provider }));
78
+ }
79
+ function splitSqlStatements(sql) {
80
+ const statements = [];
81
+ let current = "";
82
+ let quote = null;
83
+ for (let index = 0; index < sql.length; index += 1) {
84
+ const char = sql[index];
85
+ const next = sql[index + 1];
86
+ current += char;
87
+ if (quote === "'") {
88
+ if (char === "'" && next === "'") {
89
+ current += next;
90
+ index += 1;
91
+ continue;
92
+ }
93
+ if (char === "\\" && next === "'") {
94
+ current += next;
95
+ index += 1;
96
+ continue;
97
+ }
98
+ if (char === "'") {
99
+ quote = null;
100
+ }
101
+ continue;
102
+ }
103
+ if (quote === '"') {
104
+ if (char === '"' && next === '"') {
105
+ current += next;
106
+ index += 1;
107
+ continue;
108
+ }
109
+ if (char === '"') {
110
+ quote = null;
111
+ }
112
+ continue;
113
+ }
114
+ if (quote === "`") {
115
+ if (char === "`" && next === "`") {
116
+ current += next;
117
+ index += 1;
118
+ continue;
119
+ }
120
+ if (char === "\\" && next === "`") {
121
+ current += next;
122
+ index += 1;
123
+ continue;
124
+ }
125
+ if (char === "`") {
126
+ quote = null;
127
+ }
128
+ continue;
129
+ }
130
+ if (char === "'" || char === '"' || char === "`") {
131
+ quote = char;
132
+ continue;
133
+ }
134
+ if (char === ";") {
135
+ const statement = current.trim();
136
+ if (statement) {
137
+ statements.push(statement);
138
+ }
139
+ current = "";
140
+ }
141
+ }
142
+ const trailing = current.trim();
143
+ if (trailing) {
144
+ statements.push(trailing.endsWith(";") ? trailing : `${trailing};`);
145
+ }
146
+ return statements.map((statement) => statement.endsWith(";") ? statement : `${statement};`);
147
+ }
148
+ async function runSqlStatements(statements, run) {
149
+ for (const statement of statements) {
150
+ await run(statement);
151
+ }
152
+ }
54
153
  function inferMongooseModels(schema, connection) {
55
154
  const manifest = createManifest(schema);
56
155
  const registeredModels = Object.values(connection.models ?? {});
@@ -69,6 +168,33 @@ function inferMongooseModels(schema, connection) {
69
168
  }
70
169
  return models;
71
170
  }
171
+ function resolvePrismaDatabaseUrl(runtime, options) {
172
+ if (options.prisma?.databaseUrl) {
173
+ return options.prisma.databaseUrl;
174
+ }
175
+ const client = runtime.client;
176
+ const engineConfig = isRecord(client._engineConfig) ? client._engineConfig : void 0;
177
+ const overrideDatasources = isRecord(engineConfig?.overrideDatasources) ? engineConfig.overrideDatasources : void 0;
178
+ for (const datasource of Object.values(overrideDatasources ?? {})) {
179
+ if (!isRecord(datasource)) continue;
180
+ if (typeof datasource.url === "string" && datasource.url.length > 0) {
181
+ return datasource.url;
182
+ }
183
+ }
184
+ const inlineDatasources = isRecord(engineConfig?.inlineDatasources) ? engineConfig.inlineDatasources : void 0;
185
+ for (const datasource of Object.values(inlineDatasources ?? {})) {
186
+ if (!isRecord(datasource) || !isRecord(datasource.url)) continue;
187
+ if (typeof datasource.url.value === "string" && datasource.url.value.length > 0) {
188
+ return datasource.url.value;
189
+ }
190
+ if (typeof datasource.url.fromEnvVar === "string" && process.env[datasource.url.fromEnvVar]?.length) {
191
+ return process.env[datasource.url.fromEnvVar];
192
+ }
193
+ }
194
+ throw new Error(
195
+ 'pushSchema() for a Prisma runtime requires a resolvable database URL. Pass "prisma.databaseUrl" when the Prisma client does not expose one.'
196
+ );
197
+ }
72
198
  function resolveMongoDb(runtime, options) {
73
199
  if (options.mongo?.db) {
74
200
  return options.mongo.db;
@@ -109,6 +235,184 @@ function resolveMongoSessionSource(runtime, db, options) {
109
235
  startSession: void 0
110
236
  };
111
237
  }
238
+ function resolveDrizzleRuntimeClient(runtime, options) {
239
+ const runtimeClient = options.drizzle?.client ?? runtime.client?.$client ?? void 0;
240
+ if (!runtimeClient) {
241
+ throw new Error(
242
+ 'pushSchema() for a Drizzle runtime requires a Drizzle database with a "$client" property or an explicit "drizzle.client" option.'
243
+ );
244
+ }
245
+ return runtimeClient;
246
+ }
247
+ function asMongoSchemaTarget(value) {
248
+ if (hasFunction(value, "collection")) {
249
+ return value;
250
+ }
251
+ throw new Error("Unsupported Mongo schema target. Expected a MongoDB Db or Mongoose connection.");
252
+ }
253
+ function isMongoNamespaceExistsError(error) {
254
+ if (isRecord(error) && error.code === 48) {
255
+ return true;
256
+ }
257
+ const message = error instanceof Error ? error.message : String(error);
258
+ return /already exists|NamespaceExists/i.test(message);
259
+ }
260
+ function isMongoEquivalentIndexError(error) {
261
+ const message = error instanceof Error ? error.message : String(error);
262
+ return /Index already exists with a different name/i.test(message);
263
+ }
264
+ function mongoIndexSpecsForModel(model) {
265
+ const deduped = /* @__PURE__ */ new Map();
266
+ for (const field of Object.values(model.fields)) {
267
+ if (field.kind === "id") {
268
+ if (field.column !== "_id") {
269
+ const keys2 = { [field.column]: 1 };
270
+ deduped.set(JSON.stringify({ keys: keys2, unique: true }), {
271
+ keys: keys2,
272
+ unique: true,
273
+ name: `${model.table}_${field.column}_pk_unique`
274
+ });
275
+ }
276
+ continue;
277
+ }
278
+ if (!field.unique) continue;
279
+ const keys = { [field.column]: 1 };
280
+ deduped.set(JSON.stringify({ keys, unique: true }), {
281
+ keys,
282
+ unique: true,
283
+ name: `${model.table}_${field.column}_unique`
284
+ });
285
+ }
286
+ for (const constraint of [...model.constraints.unique, ...model.constraints.indexes]) {
287
+ const keys = Object.fromEntries(constraint.columns.map((column) => [column, 1]));
288
+ deduped.set(JSON.stringify({ keys, unique: constraint.unique }), {
289
+ keys,
290
+ unique: constraint.unique,
291
+ name: constraint.name
292
+ });
293
+ }
294
+ return [...deduped.values()];
295
+ }
296
+ async function ensureMongoCollectionsAndIndexes(schema, target) {
297
+ const manifest = createManifest(schema);
298
+ for (const model of Object.values(manifest.models)) {
299
+ if (typeof target.createCollection === "function") {
300
+ try {
301
+ await target.createCollection(model.table);
302
+ } catch (error) {
303
+ if (!isMongoNamespaceExistsError(error)) {
304
+ throw error;
305
+ }
306
+ }
307
+ }
308
+ const collection = target.collection(model.table);
309
+ for (const index of mongoIndexSpecsForModel(model)) {
310
+ try {
311
+ await collection.createIndex(index.keys, {
312
+ name: index.name,
313
+ unique: index.unique
314
+ });
315
+ } catch (error) {
316
+ if (!isMongoEquivalentIndexError(error)) {
317
+ throw error;
318
+ }
319
+ }
320
+ }
321
+ }
322
+ }
323
+ async function applySqlSchemaToClient(client, dialect, sql) {
324
+ if (dialect === "sqlite" && hasFunction(client, "exec")) {
325
+ await client.exec(sql);
326
+ return;
327
+ }
328
+ const statements = splitSqlStatements(sql);
329
+ if (hasFunction(client, "query")) {
330
+ await runSqlStatements(statements, (statement) => client.query(statement));
331
+ return;
332
+ }
333
+ if (hasFunction(client, "execute")) {
334
+ await runSqlStatements(
335
+ statements,
336
+ (statement) => client.execute(statement)
337
+ );
338
+ return;
339
+ }
340
+ if (hasFunction(client, "executeQuery")) {
341
+ await runSqlStatements(
342
+ statements,
343
+ (statement) => client.executeQuery({
344
+ sql: statement,
345
+ parameters: [],
346
+ query: {
347
+ kind: "RawNode",
348
+ sqlFragments: [statement],
349
+ parameters: []
350
+ },
351
+ queryId: {}
352
+ })
353
+ );
354
+ return;
355
+ }
356
+ throw new Error(
357
+ `Could not apply generated ${dialect} schema statements to the provided runtime client.`
358
+ );
359
+ }
360
+ async function runPrismaDbPush(schemaPath, databaseUrl, packageRoot) {
361
+ await execFileAsync(
362
+ "pnpm",
363
+ ["exec", "prisma", "db", "push", "--schema", schemaPath, "--skip-generate"],
364
+ {
365
+ cwd: packageRoot,
366
+ env: {
367
+ ...process.env,
368
+ DATABASE_URL: databaseUrl
369
+ }
370
+ }
371
+ );
372
+ }
373
+ async function pushPrismaSchema(schema, runtime, options) {
374
+ const dialect = resolveDialect(runtime, options.dialect);
375
+ const provider = prismaProviderForDialect(dialect);
376
+ const databaseUrl = resolvePrismaDatabaseUrl(runtime, options);
377
+ const packageRoot = options.prisma?.packageRoot ?? defaultPrismaPackageRoot;
378
+ const tempDir = await mkdtemp(path.join(tmpdir(), "farm-orm-runtime-prisma-"));
379
+ const schemaPath = path.join(tempDir, "schema.prisma");
380
+ try {
381
+ await writeFile(schemaPath, renderRuntimePrismaSchema(schema, provider), "utf8");
382
+ await runPrismaDbPush(schemaPath, databaseUrl, packageRoot);
383
+ } finally {
384
+ await rm(tempDir, { recursive: true, force: true });
385
+ }
386
+ }
387
+ async function applySchemaInternal(options) {
388
+ const runtime = resolveRuntime(options);
389
+ if (runtime.kind === "prisma") {
390
+ await pushPrismaSchema(options.schema, runtime, options);
391
+ return;
392
+ }
393
+ if (runtime.kind === "mongo") {
394
+ const db = resolveMongoDb(runtime, options);
395
+ await ensureMongoCollectionsAndIndexes(options.schema, asMongoSchemaTarget(db));
396
+ return;
397
+ }
398
+ if (runtime.kind === "mongoose") {
399
+ const connection = runtime.client;
400
+ const db = isRecord(connection.db) ? connection.db : connection;
401
+ await ensureMongoCollectionsAndIndexes(options.schema, asMongoSchemaTarget(db));
402
+ return;
403
+ }
404
+ const dialect = resolveDialect(runtime, options.dialect);
405
+ const sql = renderSafeSql(options.schema, { dialect });
406
+ if (runtime.kind === "sql") {
407
+ await applySqlSchemaToClient(runtime.client, dialect, sql);
408
+ return;
409
+ }
410
+ if (runtime.kind === "drizzle") {
411
+ await applySqlSchemaToClient(resolveDrizzleRuntimeClient(runtime, options), dialect, sql);
412
+ return;
413
+ }
414
+ await applySqlSchemaToClient(runtime.client, dialect, sql);
415
+ }
112
416
  function createSqlDriverFromRuntime(runtime, dialect) {
113
417
  if (dialect === "sqlite") {
114
418
  return createSqliteDriver(runtime.client);
@@ -177,8 +481,21 @@ function createOrmFromRuntime(options) {
177
481
  driver
178
482
  });
179
483
  }
484
+ async function applySchema(options) {
485
+ await applySchemaInternal(options);
486
+ }
487
+ async function pushSchema(options) {
488
+ await applySchemaInternal(options);
489
+ }
490
+ async function bootstrapDatabase(options) {
491
+ await pushSchema(options);
492
+ return createOrmFromRuntime(options);
493
+ }
180
494
  export {
495
+ applySchema,
496
+ bootstrapDatabase,
181
497
  createDriverFromRuntime,
182
- createOrmFromRuntime
498
+ createOrmFromRuntime,
499
+ pushSchema
183
500
  };
184
501
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n createManifest,\n createOrm,\n requireDatabaseRuntime,\n type DetectedDatabaseDialect,\n type DetectedDatabaseRuntime,\n type ModelName,\n type OrmClient,\n type OrmDriver,\n type OrmDriverHandle,\n type SchemaDefinition,\n} from \"@farming-labs/orm\";\nimport {\n createDrizzleDriver,\n type DrizzleDialect,\n type DrizzleDriverConfig,\n} from \"@farming-labs/orm-drizzle\";\nimport {\n createKyselyDriver,\n type KyselyDialect,\n type KyselyDriverConfig,\n} from \"@farming-labs/orm-kysely\";\nimport {\n createMongoDriver,\n type MongoCollectionMap,\n type MongoDbLike,\n type MongoDriverConfig,\n type MongoSessionLike,\n type MongoSessionSourceLike,\n} from \"@farming-labs/orm-mongo\";\nimport {\n createMongooseDriver,\n type MongooseDriverConfig,\n type MongooseFieldTransform,\n type MongooseModelLike,\n type MongooseSessionLike,\n type MongooseSessionSourceLike,\n} from \"@farming-labs/orm-mongoose\";\nimport {\n createPrismaDriver,\n type PrismaDriverConfig,\n type PrismaDriverHandle,\n} from \"@farming-labs/orm-prisma\";\nimport {\n createMysqlDriver,\n createPgClientDriver,\n createPgPoolDriver,\n createSqliteDriver,\n type MysqlConnectionLike,\n type MysqlPoolLike,\n type PgClientLike,\n type PgPoolLike,\n type SqlDriverHandle,\n type SqliteDatabaseLike,\n} from \"@farming-labs/orm-sql\";\n\ntype AutoDialect = DetectedDatabaseDialect;\n\ntype 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\ntype CreateDriverFromRuntimeOptions<TSchema extends SchemaDefinition<any>, TClient = unknown> = {\n schema: TSchema;\n client?: TClient;\n runtime?: DetectedDatabaseRuntime<TClient>;\n dialect?: AutoDialect;\n databaseName?: string;\n prisma?: Pick<PrismaDriverConfig<TSchema>, \"models\">;\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\ntype CreateOrmFromRuntimeOptions<\n TSchema extends SchemaDefinition<any>,\n TClient = unknown,\n> = CreateDriverFromRuntimeOptions<TSchema, TClient>;\n\ntype MongooseConnectionLike = MongooseSessionSourceLike & {\n models?: Record<string, MongooseModelLike & { collection?: { collectionName?: string } }>;\n};\n\ntype MongoClientLike = MongoSessionSourceLike & {\n db(name?: string): MongoDbLike;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\";\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction createSqlDriverFromRuntime<TSchema extends SchemaDefinition<any>>(\n runtime: DetectedDatabaseRuntime<any>,\n dialect: AutoDialect,\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 function createDriverFromRuntime<TSchema extends SchemaDefinition<any>, TClient = unknown>(\n options: CreateDriverFromRuntimeOptions<TSchema, TClient>,\n): OrmDriver<TSchema, AutoDriverHandle<TClient>> {\n const runtime = resolveRuntime(options);\n\n switch (runtime.kind) {\n case \"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 case \"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 case \"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 case \"sql\":\n return createSqlDriverFromRuntime<TSchema>(\n runtime,\n resolveDialect(runtime, options.dialect),\n ) as OrmDriver<TSchema, AutoDriverHandle<TClient>>;\n case \"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,\n }) as OrmDriver<TSchema, AutoDriverHandle<TClient>>;\n }\n case \"mongoose\": {\n const connection = runtime.client as MongooseConnectionLike;\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,\n }) as OrmDriver<TSchema, AutoDriverHandle<TClient>>;\n }\n }\n}\n\nexport function createOrmFromRuntime<TSchema extends SchemaDefinition<any>, TClient = unknown>(\n options: CreateOrmFromRuntimeOptions<TSchema, TClient>,\n): OrmClient<TSchema, AutoDriverHandle<TClient>> {\n const driver = createDriverFromRuntime(options);\n return createOrm({\n schema: options.schema,\n driver,\n }) as OrmClient<TSchema, AutoDriverHandle<TClient>>;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { execFile } from \"node:child_process\";\nimport { mkdtemp, rm, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport {\n createManifest,\n createOrm,\n requireDatabaseRuntime,\n type DetectedDatabaseDialect,\n type DetectedDatabaseRuntime,\n type ModelName,\n type OrmClient,\n type OrmDriver,\n type OrmDriverHandle,\n renderPrismaSchema,\n renderSafeSql,\n type SchemaDefinition,\n} from \"@farming-labs/orm\";\nimport {\n createDrizzleDriver,\n type DrizzleDialect,\n type DrizzleDriverConfig,\n} from \"@farming-labs/orm-drizzle\";\nimport {\n createKyselyDriver,\n type KyselyDialect,\n type KyselyDriverConfig,\n} from \"@farming-labs/orm-kysely\";\nimport {\n createMongoDriver,\n type MongoCollectionMap,\n type MongoDbLike,\n type MongoDriverConfig,\n type MongoSessionLike,\n type MongoSessionSourceLike,\n} from \"@farming-labs/orm-mongo\";\nimport {\n createMongooseDriver,\n type MongooseDriverConfig,\n type MongooseFieldTransform,\n type MongooseModelLike,\n type MongooseSessionLike,\n type MongooseSessionSourceLike,\n} from \"@farming-labs/orm-mongoose\";\nimport {\n createPrismaDriver,\n type PrismaDriverConfig,\n type PrismaDriverHandle,\n} from \"@farming-labs/orm-prisma\";\nimport {\n createMysqlDriver,\n createPgClientDriver,\n createPgPoolDriver,\n createSqliteDriver,\n type MysqlConnectionLike,\n type MysqlPoolLike,\n type PgClientLike,\n type PgPoolLike,\n type SqlDriverHandle,\n type SqliteDatabaseLike,\n} from \"@farming-labs/orm-sql\";\n\ntype AutoDialect = DetectedDatabaseDialect;\n\ntype PrismaProvider = \"sqlite\" | \"postgresql\" | \"mysql\";\n\ntype 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\ntype CreateDriverFromRuntimeOptions<TSchema extends SchemaDefinition<any>, TClient = unknown> = {\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\ntype CreateOrmFromRuntimeOptions<\n TSchema extends SchemaDefinition<any>,\n TClient = unknown,\n> = CreateDriverFromRuntimeOptions<TSchema, TClient>;\n\nexport type PushSchemaOptions<\n TSchema extends SchemaDefinition<any>,\n TClient = unknown,\n> = CreateDriverFromRuntimeOptions<TSchema, TClient>;\n\nexport type ApplySchemaOptions<\n TSchema extends SchemaDefinition<any>,\n TClient = unknown,\n> = CreateDriverFromRuntimeOptions<TSchema, TClient>;\n\nexport type BootstrapDatabaseOptions<\n TSchema extends SchemaDefinition<any>,\n TClient = unknown,\n> = CreateOrmFromRuntimeOptions<TSchema, TClient>;\n\ntype MongooseConnectionLike = MongooseSessionSourceLike & {\n models?: Record<string, MongooseModelLike & { collection?: { collectionName?: string } }>;\n};\n\ntype MongoClientLike = MongoSessionSourceLike & {\n db(name?: string): MongoDbLike;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\";\n}\n\nfunction 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\ntype SqlQueryClient = {\n query(sql: string, params?: readonly unknown[]): Promise<unknown> | unknown;\n};\n\ntype SqlExecuteClient = {\n execute(sql: string, params?: readonly unknown[]): Promise<unknown> | unknown;\n};\n\ntype SqliteExecClient = {\n exec(sql: string): Promise<unknown> | unknown;\n};\n\ntype KyselyExecuteClient = {\n executeQuery(query: {\n sql: string;\n parameters: readonly unknown[];\n query: {\n kind: \"RawNode\";\n sqlFragments: readonly string[];\n parameters: readonly unknown[];\n };\n queryId: object;\n }): Promise<unknown>;\n};\n\ntype MongoIndexCollectionLike = {\n createIndex(\n keys: Record<string, 1 | -1>,\n options?: { unique?: boolean; name?: string },\n ): Promise<unknown>;\n};\n\ntype MongoSchemaTargetLike = {\n collection(name: string): MongoIndexCollectionLike;\n createCollection?(name: string): Promise<unknown>;\n};\n\nconst execFileAsync = promisify(execFile);\nconst defaultPrismaPackageRoot = process.cwd();\n\nfunction 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\nfunction 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\nfunction prismaProviderForDialect(dialect: AutoDialect): PrismaProvider {\n switch (dialect) {\n case \"sqlite\":\n return \"sqlite\";\n case \"postgres\":\n return \"postgresql\";\n case \"mysql\":\n return \"mysql\";\n }\n}\n\nfunction withDatabaseEnv(rendered: string) {\n return rendered.replace(/url\\s+=\\s+.+/, `url = env(\"DATABASE_URL\")`);\n}\n\nfunction renderRuntimePrismaSchema(schema: SchemaDefinition<any>, provider: PrismaProvider) {\n return withDatabaseEnv(renderPrismaSchema(schema, { provider }));\n}\n\nfunction splitSqlStatements(sql: string) {\n const statements: string[] = [];\n let current = \"\";\n let quote: \"'\" | '\"' | \"`\" | null = null;\n\n for (let index = 0; index < sql.length; index += 1) {\n const char = sql[index]!;\n const next = sql[index + 1];\n\n current += char;\n\n if (quote === \"'\") {\n if (char === \"'\" && next === \"'\") {\n current += next;\n index += 1;\n continue;\n }\n\n if (char === \"\\\\\" && next === \"'\") {\n current += next;\n index += 1;\n continue;\n }\n\n if (char === \"'\") {\n quote = null;\n }\n\n continue;\n }\n\n if (quote === '\"') {\n if (char === '\"' && next === '\"') {\n current += next;\n index += 1;\n continue;\n }\n\n if (char === '\"') {\n quote = null;\n }\n\n continue;\n }\n\n if (quote === \"`\") {\n if (char === \"`\" && next === \"`\") {\n current += next;\n index += 1;\n continue;\n }\n\n if (char === \"\\\\\" && next === \"`\") {\n current += next;\n index += 1;\n continue;\n }\n\n if (char === \"`\") {\n quote = null;\n }\n\n continue;\n }\n\n if (char === \"'\" || char === '\"' || char === \"`\") {\n quote = char;\n continue;\n }\n\n if (char === \";\") {\n const statement = current.trim();\n if (statement) {\n statements.push(statement);\n }\n current = \"\";\n }\n }\n\n const trailing = current.trim();\n if (trailing) {\n statements.push(trailing.endsWith(\";\") ? trailing : `${trailing};`);\n }\n\n return statements.map((statement) => (statement.endsWith(\";\") ? statement : `${statement};`));\n}\n\nasync function runSqlStatements(\n statements: readonly string[],\n run: (sql: string) => Promise<unknown> | unknown,\n) {\n for (const statement of statements) {\n await run(statement);\n }\n}\n\nfunction 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\nfunction resolvePrismaDatabaseUrl(\n runtime: DetectedDatabaseRuntime<any>,\n options: CreateDriverFromRuntimeOptions<any>,\n): string {\n if (options.prisma?.databaseUrl) {\n return options.prisma.databaseUrl;\n }\n\n const client = runtime.client as Record<string, unknown>;\n const engineConfig = isRecord(client._engineConfig) ? client._engineConfig : undefined;\n\n const overrideDatasources = isRecord(engineConfig?.overrideDatasources)\n ? engineConfig.overrideDatasources\n : undefined;\n for (const datasource of Object.values(overrideDatasources ?? {})) {\n if (!isRecord(datasource)) continue;\n if (typeof datasource.url === \"string\" && datasource.url.length > 0) {\n return datasource.url;\n }\n }\n\n const inlineDatasources = isRecord(engineConfig?.inlineDatasources)\n ? engineConfig.inlineDatasources\n : undefined;\n for (const datasource of Object.values(inlineDatasources ?? {})) {\n if (!isRecord(datasource) || !isRecord(datasource.url)) continue;\n if (typeof datasource.url.value === \"string\" && datasource.url.value.length > 0) {\n return datasource.url.value;\n }\n if (\n typeof datasource.url.fromEnvVar === \"string\" &&\n process.env[datasource.url.fromEnvVar]?.length\n ) {\n return process.env[datasource.url.fromEnvVar]!;\n }\n }\n\n throw new Error(\n 'pushSchema() for a Prisma runtime requires a resolvable database URL. Pass \"prisma.databaseUrl\" when the Prisma client does not expose one.',\n );\n}\n\nfunction 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\nfunction 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\nfunction resolveDrizzleRuntimeClient(\n runtime: DetectedDatabaseRuntime<any>,\n options: CreateDriverFromRuntimeOptions<any>,\n) {\n const runtimeClient =\n options.drizzle?.client ??\n (runtime.client as DrizzleDriverConfig<any>[\"db\"] | undefined)?.$client ??\n undefined;\n\n if (!runtimeClient) {\n throw new Error(\n 'pushSchema() for a Drizzle runtime requires a Drizzle database with a \"$client\" property or an explicit \"drizzle.client\" option.',\n );\n }\n\n return runtimeClient;\n}\n\nfunction asMongoSchemaTarget(value: unknown): MongoSchemaTargetLike {\n if (hasFunction(value, \"collection\")) {\n return value as MongoSchemaTargetLike;\n }\n\n throw new Error(\"Unsupported Mongo schema target. Expected a MongoDB Db or Mongoose connection.\");\n}\n\nfunction isMongoNamespaceExistsError(error: unknown) {\n if (isRecord(error) && error.code === 48) {\n return true;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n return /already exists|NamespaceExists/i.test(message);\n}\n\nfunction isMongoEquivalentIndexError(error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return /Index already exists with a different name/i.test(message);\n}\n\nfunction mongoIndexSpecsForModel(model: ReturnType<typeof createManifest>[\"models\"][string]) {\n const deduped = new Map<string, { keys: Record<string, 1>; unique: boolean; name: string }>();\n\n for (const field of Object.values(model.fields)) {\n if (field.kind === \"id\") {\n if (field.column !== \"_id\") {\n const keys = { [field.column]: 1 } satisfies Record<string, 1>;\n deduped.set(JSON.stringify({ keys, unique: true }), {\n keys,\n unique: true,\n name: `${model.table}_${field.column}_pk_unique`,\n });\n }\n continue;\n }\n\n if (!field.unique) continue;\n const keys = { [field.column]: 1 } satisfies Record<string, 1>;\n deduped.set(JSON.stringify({ keys, unique: true }), {\n keys,\n unique: true,\n name: `${model.table}_${field.column}_unique`,\n });\n }\n\n for (const constraint of [...model.constraints.unique, ...model.constraints.indexes]) {\n const keys = Object.fromEntries(constraint.columns.map((column) => [column, 1])) as Record<\n string,\n 1\n >;\n deduped.set(JSON.stringify({ keys, unique: constraint.unique }), {\n keys,\n unique: constraint.unique,\n name: constraint.name,\n });\n }\n\n return [...deduped.values()];\n}\n\nasync function ensureMongoCollectionsAndIndexes(\n schema: SchemaDefinition<any>,\n target: MongoSchemaTargetLike,\n) {\n const manifest = createManifest(schema);\n\n for (const model of Object.values(manifest.models)) {\n if (typeof target.createCollection === \"function\") {\n try {\n await target.createCollection(model.table);\n } catch (error) {\n if (!isMongoNamespaceExistsError(error)) {\n throw error;\n }\n }\n }\n\n const collection = target.collection(model.table);\n for (const index of mongoIndexSpecsForModel(model)) {\n try {\n await collection.createIndex(index.keys, {\n name: index.name,\n unique: index.unique,\n });\n } catch (error) {\n if (!isMongoEquivalentIndexError(error)) {\n throw error;\n }\n }\n }\n }\n}\n\nasync function applySqlSchemaToClient(client: unknown, dialect: AutoDialect, sql: string) {\n if (dialect === \"sqlite\" && hasFunction(client, \"exec\")) {\n await (client as SqliteExecClient).exec(sql);\n return;\n }\n\n const statements = splitSqlStatements(sql);\n\n if (hasFunction(client, \"query\")) {\n await runSqlStatements(statements, (statement) => (client as SqlQueryClient).query(statement));\n return;\n }\n\n if (hasFunction(client, \"execute\")) {\n await runSqlStatements(statements, (statement) =>\n (client as SqlExecuteClient).execute(statement),\n );\n return;\n }\n\n if (hasFunction(client, \"executeQuery\")) {\n await runSqlStatements(statements, (statement) =>\n (client as KyselyExecuteClient).executeQuery({\n sql: statement,\n parameters: [],\n query: {\n kind: \"RawNode\",\n sqlFragments: [statement],\n parameters: [],\n },\n queryId: {},\n }),\n );\n return;\n }\n\n throw new Error(\n `Could not apply generated ${dialect} schema statements to the provided runtime client.`,\n );\n}\n\nasync function runPrismaDbPush(schemaPath: string, databaseUrl: string, packageRoot: string) {\n await execFileAsync(\n \"pnpm\",\n [\"exec\", \"prisma\", \"db\", \"push\", \"--schema\", schemaPath, \"--skip-generate\"],\n {\n cwd: packageRoot,\n env: {\n ...process.env,\n DATABASE_URL: databaseUrl,\n },\n },\n );\n}\n\nasync function pushPrismaSchema(\n schema: SchemaDefinition<any>,\n runtime: DetectedDatabaseRuntime<any>,\n options: CreateDriverFromRuntimeOptions<any>,\n) {\n const dialect = resolveDialect(runtime, options.dialect);\n const provider = prismaProviderForDialect(dialect);\n const databaseUrl = resolvePrismaDatabaseUrl(runtime, options);\n const packageRoot = options.prisma?.packageRoot ?? defaultPrismaPackageRoot;\n const tempDir = await mkdtemp(path.join(tmpdir(), \"farm-orm-runtime-prisma-\"));\n const schemaPath = path.join(tempDir, \"schema.prisma\");\n\n try {\n await writeFile(schemaPath, renderRuntimePrismaSchema(schema, provider), \"utf8\");\n await runPrismaDbPush(schemaPath, databaseUrl, packageRoot);\n } finally {\n await rm(tempDir, { recursive: true, force: true });\n }\n}\n\nasync function applySchemaInternal<TSchema extends SchemaDefinition<any>, TClient = unknown>(\n options: CreateDriverFromRuntimeOptions<TSchema, TClient>,\n) {\n const runtime = resolveRuntime(options);\n\n if (runtime.kind === \"prisma\") {\n await pushPrismaSchema(options.schema, runtime, options);\n return;\n }\n\n if (runtime.kind === \"mongo\") {\n const db = resolveMongoDb(runtime, options);\n await ensureMongoCollectionsAndIndexes(options.schema, asMongoSchemaTarget(db));\n return;\n }\n\n if (runtime.kind === \"mongoose\") {\n const connection = runtime.client as Record<string, unknown>;\n const db = isRecord(connection.db) ? connection.db : connection;\n await ensureMongoCollectionsAndIndexes(options.schema, asMongoSchemaTarget(db));\n return;\n }\n\n const dialect = resolveDialect(runtime, options.dialect);\n const sql = renderSafeSql(options.schema, { dialect });\n\n if (runtime.kind === \"sql\") {\n await applySqlSchemaToClient(runtime.client, dialect, sql);\n return;\n }\n\n if (runtime.kind === \"drizzle\") {\n await applySqlSchemaToClient(resolveDrizzleRuntimeClient(runtime, options), dialect, sql);\n return;\n }\n\n await applySqlSchemaToClient(runtime.client, dialect, sql);\n}\n\nfunction createSqlDriverFromRuntime<TSchema extends SchemaDefinition<any>>(\n runtime: DetectedDatabaseRuntime<any>,\n dialect: AutoDialect,\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 function createDriverFromRuntime<TSchema extends SchemaDefinition<any>, TClient = unknown>(\n options: CreateDriverFromRuntimeOptions<TSchema, TClient>,\n): OrmDriver<TSchema, AutoDriverHandle<TClient>> {\n const runtime = resolveRuntime(options);\n\n switch (runtime.kind) {\n case \"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 case \"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 case \"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 case \"sql\":\n return createSqlDriverFromRuntime<TSchema>(\n runtime,\n resolveDialect(runtime, options.dialect),\n ) as OrmDriver<TSchema, AutoDriverHandle<TClient>>;\n case \"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,\n }) as OrmDriver<TSchema, AutoDriverHandle<TClient>>;\n }\n case \"mongoose\": {\n const connection = runtime.client as MongooseConnectionLike;\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,\n }) as OrmDriver<TSchema, AutoDriverHandle<TClient>>;\n }\n }\n}\n\nexport function createOrmFromRuntime<TSchema extends SchemaDefinition<any>, TClient = unknown>(\n options: CreateOrmFromRuntimeOptions<TSchema, TClient>,\n): OrmClient<TSchema, AutoDriverHandle<TClient>> {\n const driver = createDriverFromRuntime(options);\n return createOrm({\n schema: options.schema,\n driver,\n }) as OrmClient<TSchema, AutoDriverHandle<TClient>>;\n}\n\nexport async function applySchema<TSchema extends SchemaDefinition<any>, TClient = unknown>(\n options: ApplySchemaOptions<TSchema, TClient>,\n) {\n await applySchemaInternal(options);\n}\n\nexport async function pushSchema<TSchema extends SchemaDefinition<any>, TClient = unknown>(\n options: PushSchemaOptions<TSchema, TClient>,\n) {\n await applySchemaInternal(options);\n}\n\nexport async function bootstrapDatabase<TSchema extends SchemaDefinition<any>, TClient = unknown>(\n options: BootstrapDatabaseOptions<TSchema, TClient>,\n) {\n await pushSchema(options);\n return createOrmFromRuntime(options);\n}\n"],"mappings":"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","names":["keys"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farming-labs/orm-runtime",
3
- "version": "0.0.19",
3
+ "version": "0.0.20",
4
4
  "files": [
5
5
  "dist"
6
6
  ],
@@ -19,13 +19,13 @@
19
19
  "access": "public"
20
20
  },
21
21
  "dependencies": {
22
- "@farming-labs/orm": "0.0.19",
23
- "@farming-labs/orm-drizzle": "0.0.19",
24
- "@farming-labs/orm-kysely": "0.0.19",
25
- "@farming-labs/orm-mongo": "0.0.19",
26
- "@farming-labs/orm-mongoose": "0.0.19",
27
- "@farming-labs/orm-prisma": "0.0.19",
28
- "@farming-labs/orm-sql": "0.0.19"
22
+ "@farming-labs/orm": "0.0.20",
23
+ "@farming-labs/orm-mongoose": "0.0.20",
24
+ "@farming-labs/orm-kysely": "0.0.20",
25
+ "@farming-labs/orm-drizzle": "0.0.20",
26
+ "@farming-labs/orm-sql": "0.0.20",
27
+ "@farming-labs/orm-mongo": "0.0.20",
28
+ "@farming-labs/orm-prisma": "0.0.20"
29
29
  },
30
30
  "devDependencies": {
31
31
  "tsup": "^8.4.0"