@farming-labs/orm-runtime 0.0.19
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 +191 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +35 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.js +184 -0
- package/dist/index.js.map +1 -0
- package/package.json +38 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
createDriverFromRuntime: () => createDriverFromRuntime,
|
|
24
|
+
createOrmFromRuntime: () => createOrmFromRuntime
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(index_exports);
|
|
27
|
+
var import_orm = require("@farming-labs/orm");
|
|
28
|
+
var import_orm_drizzle = require("@farming-labs/orm-drizzle");
|
|
29
|
+
var import_orm_kysely = require("@farming-labs/orm-kysely");
|
|
30
|
+
var import_orm_mongo = require("@farming-labs/orm-mongo");
|
|
31
|
+
var import_orm_mongoose = require("@farming-labs/orm-mongoose");
|
|
32
|
+
var import_orm_prisma = require("@farming-labs/orm-prisma");
|
|
33
|
+
var import_orm_sql = require("@farming-labs/orm-sql");
|
|
34
|
+
function isRecord(value) {
|
|
35
|
+
return !!value && typeof value === "object";
|
|
36
|
+
}
|
|
37
|
+
function hasFunction(value, name) {
|
|
38
|
+
return isRecord(value) && typeof value[name] === "function";
|
|
39
|
+
}
|
|
40
|
+
function resolveRuntime(options) {
|
|
41
|
+
if (options.runtime) {
|
|
42
|
+
return options.runtime;
|
|
43
|
+
}
|
|
44
|
+
if (options.client === void 0) {
|
|
45
|
+
throw new Error(
|
|
46
|
+
'createDriverFromRuntime() requires either a detected "runtime" or a raw "client".'
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
return (0, import_orm.requireDatabaseRuntime)(options.client);
|
|
50
|
+
}
|
|
51
|
+
function resolveDialect(runtime, override) {
|
|
52
|
+
const dialect = override ?? runtime.dialect;
|
|
53
|
+
if (!dialect) {
|
|
54
|
+
throw new Error(
|
|
55
|
+
`Could not determine the database dialect for the detected ${runtime.kind} runtime. Pass a "dialect" option explicitly.`
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
return dialect;
|
|
59
|
+
}
|
|
60
|
+
function inferMongooseModels(schema, connection) {
|
|
61
|
+
const manifest = (0, import_orm.createManifest)(schema);
|
|
62
|
+
const registeredModels = Object.values(connection.models ?? {});
|
|
63
|
+
const models = {};
|
|
64
|
+
for (const modelName of Object.keys(schema.models)) {
|
|
65
|
+
const expectedTable = manifest.models[modelName].table;
|
|
66
|
+
const inferredModel = registeredModels.find(
|
|
67
|
+
(candidate) => candidate.collection?.collectionName === expectedTable
|
|
68
|
+
) ?? connection.models?.[String(modelName)];
|
|
69
|
+
if (!inferredModel) {
|
|
70
|
+
throw new Error(
|
|
71
|
+
`Could not infer a Mongoose model for schema model "${String(modelName)}". Register a model for collection "${expectedTable}" or pass mongoose.models explicitly.`
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
models[modelName] = inferredModel;
|
|
75
|
+
}
|
|
76
|
+
return models;
|
|
77
|
+
}
|
|
78
|
+
function resolveMongoDb(runtime, options) {
|
|
79
|
+
if (options.mongo?.db) {
|
|
80
|
+
return options.mongo.db;
|
|
81
|
+
}
|
|
82
|
+
if (runtime.source === "db") {
|
|
83
|
+
return runtime.client;
|
|
84
|
+
}
|
|
85
|
+
const databaseName = options.databaseName;
|
|
86
|
+
if (!databaseName) {
|
|
87
|
+
throw new Error(
|
|
88
|
+
'MongoClient auto-creation requires a "databaseName" option so the helper can resolve the target database.'
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
return runtime.client.db(databaseName);
|
|
92
|
+
}
|
|
93
|
+
function resolveMongoSessionSource(runtime, db, options) {
|
|
94
|
+
if (options.mongo?.startSession) {
|
|
95
|
+
return {
|
|
96
|
+
client: void 0,
|
|
97
|
+
startSession: options.mongo.startSession
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
if (runtime.source === "client" && hasFunction(runtime.client, "startSession")) {
|
|
101
|
+
return {
|
|
102
|
+
client: runtime.client,
|
|
103
|
+
startSession: void 0
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
const dbClient = isRecord(db) ? db["client"] : void 0;
|
|
107
|
+
if (hasFunction(dbClient, "startSession")) {
|
|
108
|
+
return {
|
|
109
|
+
client: dbClient,
|
|
110
|
+
startSession: void 0
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
client: void 0,
|
|
115
|
+
startSession: void 0
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
function createSqlDriverFromRuntime(runtime, dialect) {
|
|
119
|
+
if (dialect === "sqlite") {
|
|
120
|
+
return (0, import_orm_sql.createSqliteDriver)(runtime.client);
|
|
121
|
+
}
|
|
122
|
+
if (dialect === "postgres") {
|
|
123
|
+
if (runtime.source === "pool") {
|
|
124
|
+
return (0, import_orm_sql.createPgPoolDriver)(runtime.client);
|
|
125
|
+
}
|
|
126
|
+
return (0, import_orm_sql.createPgClientDriver)(runtime.client);
|
|
127
|
+
}
|
|
128
|
+
if (runtime.source === "pool") {
|
|
129
|
+
return (0, import_orm_sql.createMysqlDriver)(runtime.client);
|
|
130
|
+
}
|
|
131
|
+
return (0, import_orm_sql.createMysqlDriver)(runtime.client);
|
|
132
|
+
}
|
|
133
|
+
function createDriverFromRuntime(options) {
|
|
134
|
+
const runtime = resolveRuntime(options);
|
|
135
|
+
switch (runtime.kind) {
|
|
136
|
+
case "prisma":
|
|
137
|
+
return (0, import_orm_prisma.createPrismaDriver)({
|
|
138
|
+
client: runtime.client,
|
|
139
|
+
models: options.prisma?.models
|
|
140
|
+
});
|
|
141
|
+
case "drizzle":
|
|
142
|
+
return (0, import_orm_drizzle.createDrizzleDriver)({
|
|
143
|
+
db: runtime.client,
|
|
144
|
+
client: options.drizzle?.client,
|
|
145
|
+
dialect: resolveDialect(runtime, options.dialect)
|
|
146
|
+
});
|
|
147
|
+
case "kysely":
|
|
148
|
+
return (0, import_orm_kysely.createKyselyDriver)({
|
|
149
|
+
db: runtime.client,
|
|
150
|
+
dialect: resolveDialect(runtime, options.dialect)
|
|
151
|
+
});
|
|
152
|
+
case "sql":
|
|
153
|
+
return createSqlDriverFromRuntime(
|
|
154
|
+
runtime,
|
|
155
|
+
resolveDialect(runtime, options.dialect)
|
|
156
|
+
);
|
|
157
|
+
case "mongo": {
|
|
158
|
+
const db = resolveMongoDb(runtime, options);
|
|
159
|
+
const sessionSource = resolveMongoSessionSource(runtime, db, options);
|
|
160
|
+
return (0, import_orm_mongo.createMongoDriver)({
|
|
161
|
+
collections: options.mongo?.collections,
|
|
162
|
+
db,
|
|
163
|
+
client: sessionSource.client,
|
|
164
|
+
startSession: sessionSource.startSession,
|
|
165
|
+
transforms: options.mongo?.transforms
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
case "mongoose": {
|
|
169
|
+
const connection = runtime.client;
|
|
170
|
+
return (0, import_orm_mongoose.createMongooseDriver)({
|
|
171
|
+
models: options.mongoose?.models ?? inferMongooseModels(options.schema, connection),
|
|
172
|
+
connection,
|
|
173
|
+
startSession: options.mongoose?.startSession,
|
|
174
|
+
transforms: options.mongoose?.transforms
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
function createOrmFromRuntime(options) {
|
|
180
|
+
const driver = createDriverFromRuntime(options);
|
|
181
|
+
return (0, import_orm.createOrm)({
|
|
182
|
+
schema: options.schema,
|
|
183
|
+
driver
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
187
|
+
0 && (module.exports = {
|
|
188
|
+
createDriverFromRuntime,
|
|
189
|
+
createOrmFromRuntime
|
|
190
|
+
});
|
|
191
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +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":[]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { SchemaDefinition, DetectedDatabaseRuntime, DetectedDatabaseDialect, ModelName, OrmDriver, OrmDriverHandle, OrmClient } from '@farming-labs/orm';
|
|
2
|
+
import { DrizzleDriverConfig, DrizzleDialect } from '@farming-labs/orm-drizzle';
|
|
3
|
+
import { KyselyDialect } from '@farming-labs/orm-kysely';
|
|
4
|
+
import { MongoCollectionMap, MongoDbLike, MongoDriverConfig, MongoSessionLike } from '@farming-labs/orm-mongo';
|
|
5
|
+
import { MongooseModelLike, MongooseFieldTransform, MongooseSessionLike } from '@farming-labs/orm-mongoose';
|
|
6
|
+
import { PrismaDriverConfig, PrismaDriverHandle } from '@farming-labs/orm-prisma';
|
|
7
|
+
import { SqlDriverHandle } from '@farming-labs/orm-sql';
|
|
8
|
+
|
|
9
|
+
type AutoDialect = DetectedDatabaseDialect;
|
|
10
|
+
type AutoDriverHandle<TClient = unknown> = PrismaDriverHandle | SqlDriverHandle<TClient, AutoDialect> | OrmDriverHandle<"drizzle", TClient, DrizzleDialect> | OrmDriverHandle<"kysely", TClient, KyselyDialect> | OrmDriverHandle<"mongo", unknown> | OrmDriverHandle<"mongoose", unknown>;
|
|
11
|
+
type CreateDriverFromRuntimeOptions<TSchema extends SchemaDefinition<any>, TClient = unknown> = {
|
|
12
|
+
schema: TSchema;
|
|
13
|
+
client?: TClient;
|
|
14
|
+
runtime?: DetectedDatabaseRuntime<TClient>;
|
|
15
|
+
dialect?: AutoDialect;
|
|
16
|
+
databaseName?: string;
|
|
17
|
+
prisma?: Pick<PrismaDriverConfig<TSchema>, "models">;
|
|
18
|
+
drizzle?: Pick<DrizzleDriverConfig<TSchema>, "client">;
|
|
19
|
+
mongo?: {
|
|
20
|
+
collections?: MongoCollectionMap<TSchema>;
|
|
21
|
+
db?: MongoDbLike;
|
|
22
|
+
transforms?: MongoDriverConfig<TSchema>["transforms"];
|
|
23
|
+
startSession?: () => Promise<MongoSessionLike>;
|
|
24
|
+
};
|
|
25
|
+
mongoose?: {
|
|
26
|
+
models?: Record<ModelName<TSchema>, MongooseModelLike>;
|
|
27
|
+
transforms?: Partial<Record<string, Partial<Record<string, MongooseFieldTransform>>>>;
|
|
28
|
+
startSession?: () => Promise<MongooseSessionLike>;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
type CreateOrmFromRuntimeOptions<TSchema extends SchemaDefinition<any>, TClient = unknown> = CreateDriverFromRuntimeOptions<TSchema, TClient>;
|
|
32
|
+
declare function createDriverFromRuntime<TSchema extends SchemaDefinition<any>, TClient = unknown>(options: CreateDriverFromRuntimeOptions<TSchema, TClient>): OrmDriver<TSchema, AutoDriverHandle<TClient>>;
|
|
33
|
+
declare function createOrmFromRuntime<TSchema extends SchemaDefinition<any>, TClient = unknown>(options: CreateOrmFromRuntimeOptions<TSchema, TClient>): OrmClient<TSchema, AutoDriverHandle<TClient>>;
|
|
34
|
+
|
|
35
|
+
export { createDriverFromRuntime, createOrmFromRuntime };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { SchemaDefinition, DetectedDatabaseRuntime, DetectedDatabaseDialect, ModelName, OrmDriver, OrmDriverHandle, OrmClient } from '@farming-labs/orm';
|
|
2
|
+
import { DrizzleDriverConfig, DrizzleDialect } from '@farming-labs/orm-drizzle';
|
|
3
|
+
import { KyselyDialect } from '@farming-labs/orm-kysely';
|
|
4
|
+
import { MongoCollectionMap, MongoDbLike, MongoDriverConfig, MongoSessionLike } from '@farming-labs/orm-mongo';
|
|
5
|
+
import { MongooseModelLike, MongooseFieldTransform, MongooseSessionLike } from '@farming-labs/orm-mongoose';
|
|
6
|
+
import { PrismaDriverConfig, PrismaDriverHandle } from '@farming-labs/orm-prisma';
|
|
7
|
+
import { SqlDriverHandle } from '@farming-labs/orm-sql';
|
|
8
|
+
|
|
9
|
+
type AutoDialect = DetectedDatabaseDialect;
|
|
10
|
+
type AutoDriverHandle<TClient = unknown> = PrismaDriverHandle | SqlDriverHandle<TClient, AutoDialect> | OrmDriverHandle<"drizzle", TClient, DrizzleDialect> | OrmDriverHandle<"kysely", TClient, KyselyDialect> | OrmDriverHandle<"mongo", unknown> | OrmDriverHandle<"mongoose", unknown>;
|
|
11
|
+
type CreateDriverFromRuntimeOptions<TSchema extends SchemaDefinition<any>, TClient = unknown> = {
|
|
12
|
+
schema: TSchema;
|
|
13
|
+
client?: TClient;
|
|
14
|
+
runtime?: DetectedDatabaseRuntime<TClient>;
|
|
15
|
+
dialect?: AutoDialect;
|
|
16
|
+
databaseName?: string;
|
|
17
|
+
prisma?: Pick<PrismaDriverConfig<TSchema>, "models">;
|
|
18
|
+
drizzle?: Pick<DrizzleDriverConfig<TSchema>, "client">;
|
|
19
|
+
mongo?: {
|
|
20
|
+
collections?: MongoCollectionMap<TSchema>;
|
|
21
|
+
db?: MongoDbLike;
|
|
22
|
+
transforms?: MongoDriverConfig<TSchema>["transforms"];
|
|
23
|
+
startSession?: () => Promise<MongoSessionLike>;
|
|
24
|
+
};
|
|
25
|
+
mongoose?: {
|
|
26
|
+
models?: Record<ModelName<TSchema>, MongooseModelLike>;
|
|
27
|
+
transforms?: Partial<Record<string, Partial<Record<string, MongooseFieldTransform>>>>;
|
|
28
|
+
startSession?: () => Promise<MongooseSessionLike>;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
type CreateOrmFromRuntimeOptions<TSchema extends SchemaDefinition<any>, TClient = unknown> = CreateDriverFromRuntimeOptions<TSchema, TClient>;
|
|
32
|
+
declare function createDriverFromRuntime<TSchema extends SchemaDefinition<any>, TClient = unknown>(options: CreateDriverFromRuntimeOptions<TSchema, TClient>): OrmDriver<TSchema, AutoDriverHandle<TClient>>;
|
|
33
|
+
declare function createOrmFromRuntime<TSchema extends SchemaDefinition<any>, TClient = unknown>(options: CreateOrmFromRuntimeOptions<TSchema, TClient>): OrmClient<TSchema, AutoDriverHandle<TClient>>;
|
|
34
|
+
|
|
35
|
+
export { createDriverFromRuntime, createOrmFromRuntime };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
import {
|
|
3
|
+
createManifest,
|
|
4
|
+
createOrm,
|
|
5
|
+
requireDatabaseRuntime
|
|
6
|
+
} from "@farming-labs/orm";
|
|
7
|
+
import {
|
|
8
|
+
createDrizzleDriver
|
|
9
|
+
} from "@farming-labs/orm-drizzle";
|
|
10
|
+
import {
|
|
11
|
+
createKyselyDriver
|
|
12
|
+
} from "@farming-labs/orm-kysely";
|
|
13
|
+
import {
|
|
14
|
+
createMongoDriver
|
|
15
|
+
} from "@farming-labs/orm-mongo";
|
|
16
|
+
import {
|
|
17
|
+
createMongooseDriver
|
|
18
|
+
} from "@farming-labs/orm-mongoose";
|
|
19
|
+
import {
|
|
20
|
+
createPrismaDriver
|
|
21
|
+
} from "@farming-labs/orm-prisma";
|
|
22
|
+
import {
|
|
23
|
+
createMysqlDriver,
|
|
24
|
+
createPgClientDriver,
|
|
25
|
+
createPgPoolDriver,
|
|
26
|
+
createSqliteDriver
|
|
27
|
+
} from "@farming-labs/orm-sql";
|
|
28
|
+
function isRecord(value) {
|
|
29
|
+
return !!value && typeof value === "object";
|
|
30
|
+
}
|
|
31
|
+
function hasFunction(value, name) {
|
|
32
|
+
return isRecord(value) && typeof value[name] === "function";
|
|
33
|
+
}
|
|
34
|
+
function resolveRuntime(options) {
|
|
35
|
+
if (options.runtime) {
|
|
36
|
+
return options.runtime;
|
|
37
|
+
}
|
|
38
|
+
if (options.client === void 0) {
|
|
39
|
+
throw new Error(
|
|
40
|
+
'createDriverFromRuntime() requires either a detected "runtime" or a raw "client".'
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
return requireDatabaseRuntime(options.client);
|
|
44
|
+
}
|
|
45
|
+
function resolveDialect(runtime, override) {
|
|
46
|
+
const dialect = override ?? runtime.dialect;
|
|
47
|
+
if (!dialect) {
|
|
48
|
+
throw new Error(
|
|
49
|
+
`Could not determine the database dialect for the detected ${runtime.kind} runtime. Pass a "dialect" option explicitly.`
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
return dialect;
|
|
53
|
+
}
|
|
54
|
+
function inferMongooseModels(schema, connection) {
|
|
55
|
+
const manifest = createManifest(schema);
|
|
56
|
+
const registeredModels = Object.values(connection.models ?? {});
|
|
57
|
+
const models = {};
|
|
58
|
+
for (const modelName of Object.keys(schema.models)) {
|
|
59
|
+
const expectedTable = manifest.models[modelName].table;
|
|
60
|
+
const inferredModel = registeredModels.find(
|
|
61
|
+
(candidate) => candidate.collection?.collectionName === expectedTable
|
|
62
|
+
) ?? connection.models?.[String(modelName)];
|
|
63
|
+
if (!inferredModel) {
|
|
64
|
+
throw new Error(
|
|
65
|
+
`Could not infer a Mongoose model for schema model "${String(modelName)}". Register a model for collection "${expectedTable}" or pass mongoose.models explicitly.`
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
models[modelName] = inferredModel;
|
|
69
|
+
}
|
|
70
|
+
return models;
|
|
71
|
+
}
|
|
72
|
+
function resolveMongoDb(runtime, options) {
|
|
73
|
+
if (options.mongo?.db) {
|
|
74
|
+
return options.mongo.db;
|
|
75
|
+
}
|
|
76
|
+
if (runtime.source === "db") {
|
|
77
|
+
return runtime.client;
|
|
78
|
+
}
|
|
79
|
+
const databaseName = options.databaseName;
|
|
80
|
+
if (!databaseName) {
|
|
81
|
+
throw new Error(
|
|
82
|
+
'MongoClient auto-creation requires a "databaseName" option so the helper can resolve the target database.'
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
return runtime.client.db(databaseName);
|
|
86
|
+
}
|
|
87
|
+
function resolveMongoSessionSource(runtime, db, options) {
|
|
88
|
+
if (options.mongo?.startSession) {
|
|
89
|
+
return {
|
|
90
|
+
client: void 0,
|
|
91
|
+
startSession: options.mongo.startSession
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
if (runtime.source === "client" && hasFunction(runtime.client, "startSession")) {
|
|
95
|
+
return {
|
|
96
|
+
client: runtime.client,
|
|
97
|
+
startSession: void 0
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
const dbClient = isRecord(db) ? db["client"] : void 0;
|
|
101
|
+
if (hasFunction(dbClient, "startSession")) {
|
|
102
|
+
return {
|
|
103
|
+
client: dbClient,
|
|
104
|
+
startSession: void 0
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
client: void 0,
|
|
109
|
+
startSession: void 0
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
function createSqlDriverFromRuntime(runtime, dialect) {
|
|
113
|
+
if (dialect === "sqlite") {
|
|
114
|
+
return createSqliteDriver(runtime.client);
|
|
115
|
+
}
|
|
116
|
+
if (dialect === "postgres") {
|
|
117
|
+
if (runtime.source === "pool") {
|
|
118
|
+
return createPgPoolDriver(runtime.client);
|
|
119
|
+
}
|
|
120
|
+
return createPgClientDriver(runtime.client);
|
|
121
|
+
}
|
|
122
|
+
if (runtime.source === "pool") {
|
|
123
|
+
return createMysqlDriver(runtime.client);
|
|
124
|
+
}
|
|
125
|
+
return createMysqlDriver(runtime.client);
|
|
126
|
+
}
|
|
127
|
+
function createDriverFromRuntime(options) {
|
|
128
|
+
const runtime = resolveRuntime(options);
|
|
129
|
+
switch (runtime.kind) {
|
|
130
|
+
case "prisma":
|
|
131
|
+
return createPrismaDriver({
|
|
132
|
+
client: runtime.client,
|
|
133
|
+
models: options.prisma?.models
|
|
134
|
+
});
|
|
135
|
+
case "drizzle":
|
|
136
|
+
return createDrizzleDriver({
|
|
137
|
+
db: runtime.client,
|
|
138
|
+
client: options.drizzle?.client,
|
|
139
|
+
dialect: resolveDialect(runtime, options.dialect)
|
|
140
|
+
});
|
|
141
|
+
case "kysely":
|
|
142
|
+
return createKyselyDriver({
|
|
143
|
+
db: runtime.client,
|
|
144
|
+
dialect: resolveDialect(runtime, options.dialect)
|
|
145
|
+
});
|
|
146
|
+
case "sql":
|
|
147
|
+
return createSqlDriverFromRuntime(
|
|
148
|
+
runtime,
|
|
149
|
+
resolveDialect(runtime, options.dialect)
|
|
150
|
+
);
|
|
151
|
+
case "mongo": {
|
|
152
|
+
const db = resolveMongoDb(runtime, options);
|
|
153
|
+
const sessionSource = resolveMongoSessionSource(runtime, db, options);
|
|
154
|
+
return createMongoDriver({
|
|
155
|
+
collections: options.mongo?.collections,
|
|
156
|
+
db,
|
|
157
|
+
client: sessionSource.client,
|
|
158
|
+
startSession: sessionSource.startSession,
|
|
159
|
+
transforms: options.mongo?.transforms
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
case "mongoose": {
|
|
163
|
+
const connection = runtime.client;
|
|
164
|
+
return createMongooseDriver({
|
|
165
|
+
models: options.mongoose?.models ?? inferMongooseModels(options.schema, connection),
|
|
166
|
+
connection,
|
|
167
|
+
startSession: options.mongoose?.startSession,
|
|
168
|
+
transforms: options.mongoose?.transforms
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
function createOrmFromRuntime(options) {
|
|
174
|
+
const driver = createDriverFromRuntime(options);
|
|
175
|
+
return createOrm({
|
|
176
|
+
schema: options.schema,
|
|
177
|
+
driver
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
export {
|
|
181
|
+
createDriverFromRuntime,
|
|
182
|
+
createOrmFromRuntime
|
|
183
|
+
};
|
|
184
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAQK;AACP;AAAA,EACE;AAAA,OAGK;AACP;AAAA,EACE;AAAA,OAGK;AACP;AAAA,EACE;AAAA,OAMK;AACP;AAAA,EACE;AAAA,OAMK;AACP;AAAA,EACE;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAOK;AA8CP,SAAS,SAAS,OAAkD;AAClE,SAAO,CAAC,CAAC,SAAS,OAAO,UAAU;AACrC;AAEA,SAAS,YACP,OACA,MACqD;AACrD,SAAO,SAAS,KAAK,KAAK,OAAO,MAAM,IAAI,MAAM;AACnD;AAEA,SAAS,eACP,SACkC;AAClC,MAAI,QAAQ,SAAS;AACnB,WAAO,QAAQ;AAAA,EACjB;AAEA,MAAI,QAAQ,WAAW,QAAW;AAChC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,uBAAuB,QAAQ,MAAM;AAC9C;AAEA,SAAS,eACP,SACA,UACa;AACb,QAAM,UAAU,YAAY,QAAQ;AACpC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR,6DAA6D,QAAQ,IAAI;AAAA,IAC3E;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,oBACP,QACA,YACA;AACA,QAAM,WAAW,eAAe,MAAM;AACtC,QAAM,mBAAmB,OAAO,OAAO,WAAW,UAAU,CAAC,CAAC;AAC9D,QAAM,SAAS,CAAC;AAEhB,aAAW,aAAa,OAAO,KAAK,OAAO,MAAM,GAAgC;AAC/E,UAAM,gBAAgB,SAAS,OAAO,SAAS,EAAE;AACjD,UAAM,gBACJ,iBAAiB;AAAA,MACf,CAAC,cAAc,UAAU,YAAY,mBAAmB;AAAA,IAC1D,KAAK,WAAW,SAAS,OAAO,SAAS,CAAC;AAE5C,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI;AAAA,QACR,sDAAsD,OAAO,SAAS,CAAC,uCAAuC,aAAa;AAAA,MAC7H;AAAA,IACF;AAEA,WAAO,SAAS,IAAI;AAAA,EACtB;AAEA,SAAO;AACT;AAEA,SAAS,eACP,SACA,SACA;AACA,MAAI,QAAQ,OAAO,IAAI;AACrB,WAAO,QAAQ,MAAM;AAAA,EACvB;AAEA,MAAI,QAAQ,WAAW,MAAM;AAC3B,WAAO,QAAQ;AAAA,EACjB;AAEA,QAAM,eAAe,QAAQ;AAC7B,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAQ,QAAQ,OAA2B,GAAG,YAAY;AAC5D;AAEA,SAAS,0BACP,SACA,IACA,SACA;AACA,MAAI,QAAQ,OAAO,cAAc;AAC/B,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,cAAc,QAAQ,MAAM;AAAA,IAC9B;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW,YAAY,YAAY,QAAQ,QAAQ,cAAc,GAAG;AAC9E,WAAO;AAAA,MACL,QAAQ,QAAQ;AAAA,MAChB,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,WAAW,SAAS,EAAE,IAAK,GAA+B,QAAQ,IAAI;AAC5E,MAAI,YAAY,UAAU,cAAc,GAAG;AACzC,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,cAAc;AAAA,EAChB;AACF;AAEA,SAAS,2BACP,SACA,SACA;AACA,MAAI,YAAY,UAAU;AACxB,WAAO,mBAA4B,QAAQ,MAA4B;AAAA,EACzE;AAEA,MAAI,YAAY,YAAY;AAC1B,QAAI,QAAQ,WAAW,QAAQ;AAC7B,aAAO,mBAA4B,QAAQ,MAAoB;AAAA,IACjE;AAEA,WAAO,qBAA8B,QAAQ,MAAsB;AAAA,EACrE;AAEA,MAAI,QAAQ,WAAW,QAAQ;AAC7B,WAAO,kBAA2B,QAAQ,MAAuB;AAAA,EACnE;AAEA,SAAO,kBAA2B,QAAQ,MAA6B;AACzE;AAEO,SAAS,wBACd,SAC+C;AAC/C,QAAM,UAAU,eAAe,OAAO;AAEtC,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK;AACH,aAAO,mBAA4B;AAAA,QACjC,QAAQ,QAAQ;AAAA,QAChB,QAAQ,QAAQ,QAAQ;AAAA,MAC1B,CAAC;AAAA,IACH,KAAK;AACH,aAAO,oBAA6B;AAAA,QAClC,IAAI,QAAQ;AAAA,QACZ,QAAQ,QAAQ,SAAS;AAAA,QACzB,SAAS,eAAe,SAAS,QAAQ,OAAO;AAAA,MAClD,CAAC;AAAA,IACH,KAAK;AACH,aAAO,mBAA4B;AAAA,QACjC,IAAI,QAAQ;AAAA,QACZ,SAAS,eAAe,SAAS,QAAQ,OAAO;AAAA,MAClD,CAAC;AAAA,IACH,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA,eAAe,SAAS,QAAQ,OAAO;AAAA,MACzC;AAAA,IACF,KAAK,SAAS;AACZ,YAAM,KAAK,eAAe,SAAS,OAAO;AAC1C,YAAM,gBAAgB,0BAA0B,SAAS,IAAI,OAAO;AAEpE,aAAO,kBAA2B;AAAA,QAChC,aAAa,QAAQ,OAAO;AAAA,QAC5B;AAAA,QACA,QAAQ,cAAc;AAAA,QACtB,cAAc,cAAc;AAAA,QAC5B,YAAY,QAAQ,OAAO;AAAA,MAC7B,CAAC;AAAA,IACH;AAAA,IACA,KAAK,YAAY;AACf,YAAM,aAAa,QAAQ;AAC3B,aAAO,qBAA8B;AAAA,QACnC,QAAQ,QAAQ,UAAU,UAAU,oBAAoB,QAAQ,QAAQ,UAAU;AAAA,QAClF;AAAA,QACA,cAAc,QAAQ,UAAU;AAAA,QAChC,YAAY,QAAQ,UAAU;AAAA,MAChC,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEO,SAAS,qBACd,SAC+C;AAC/C,QAAM,SAAS,wBAAwB,OAAO;AAC9C,SAAO,UAAU;AAAA,IACf,QAAQ,QAAQ;AAAA,IAChB;AAAA,EACF,CAAC;AACH;","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@farming-labs/orm-runtime",
|
|
3
|
+
"version": "0.0.19",
|
|
4
|
+
"files": [
|
|
5
|
+
"dist"
|
|
6
|
+
],
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "./dist/index.cjs",
|
|
9
|
+
"module": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js",
|
|
15
|
+
"require": "./dist/index.cjs"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public"
|
|
20
|
+
},
|
|
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"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"tsup": "^8.4.0"
|
|
32
|
+
},
|
|
33
|
+
"scripts": {
|
|
34
|
+
"build": "tsx ./scripts/build.ts",
|
|
35
|
+
"test": "vitest run --config vitest.local.config.ts",
|
|
36
|
+
"typecheck": "tsc --noEmit"
|
|
37
|
+
}
|
|
38
|
+
}
|