forge-sql-orm 1.0.22 → 1.0.23
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/README.md +12 -6
- package/dist/ForgeSQLORM.js +34 -12
- package/dist/ForgeSQLORM.js.map +1 -1
- package/dist/ForgeSQLORM.mjs +34 -12
- package/dist/ForgeSQLORM.mjs.map +1 -1
- package/dist/core/ForgeSQLCrudOperations.d.ts +3 -2
- package/dist/core/ForgeSQLCrudOperations.d.ts.map +1 -1
- package/dist/core/ForgeSQLORM.d.ts.map +1 -1
- package/dist/core/ForgeSQLQueryBuilder.d.ts +14 -0
- package/dist/core/ForgeSQLQueryBuilder.d.ts.map +1 -1
- package/dist/core/ForgeSQLSelectOperations.d.ts +3 -1
- package/dist/core/ForgeSQLSelectOperations.d.ts.map +1 -1
- package/dist-cli/cli.js +71 -42
- package/dist-cli/cli.js.map +1 -1
- package/dist-cli/cli.mjs +71 -42
- package/dist-cli/cli.mjs.map +1 -1
- package/dist-cli/forgeSqlCLI.js +8 -9
- package/package.json +23 -23
- package/src/core/ForgeSQLCrudOperations.ts +13 -7
- package/src/core/ForgeSQLORM.ts +17 -4
- package/src/core/ForgeSQLQueryBuilder.ts +15 -0
- package/src/core/ForgeSQLSelectOperations.ts +14 -5
- package/dist-cli/tsm/bin.js +0 -18
- package/dist-cli/tsm/config/index.d.ts +0 -22
- package/dist-cli/tsm/config/index.js +0 -1
- package/dist-cli/tsm/license +0 -9
- package/dist-cli/tsm/loader.mjs +0 -1
- package/dist-cli/tsm/package.json +0 -51
- package/dist-cli/tsm/readme.md +0 -62
- package/dist-cli/tsm/require.js +0 -1
- package/dist-cli/tsm/utils.js +0 -1
package/README.md
CHANGED
|
@@ -12,13 +12,18 @@
|
|
|
12
12
|
- ✅ **Automatic migration generation** from MySQL/tidb databases.
|
|
13
13
|
|
|
14
14
|
## Installation
|
|
15
|
+
|
|
15
16
|
Forge-SQL-ORM is designed to work with @forge/sql and requires some additional setup to ensure compatibility within Atlassian Forge.
|
|
16
17
|
|
|
17
18
|
✅ Step 1: Install Dependencies
|
|
19
|
+
|
|
18
20
|
```sh
|
|
19
21
|
npm install forge-sql-orm -S
|
|
20
22
|
npm install @forge/sql -S
|
|
23
|
+
npm i @mikro-orm/entity-generator -D
|
|
24
|
+
npm i mysql -D
|
|
21
25
|
```
|
|
26
|
+
|
|
22
27
|
This will:
|
|
23
28
|
|
|
24
29
|
Install Forge-SQL-ORM (the ORM for @forge/sql).
|
|
@@ -29,20 +34,23 @@ By default, MikroORM and Knex include some features that are not compatible with
|
|
|
29
34
|
To fix this, we need to patch these libraries after installation.
|
|
30
35
|
|
|
31
36
|
Run:
|
|
37
|
+
|
|
32
38
|
```sh
|
|
33
39
|
npm pkg set scripts.postinstall="forge-sql-orm patch:mikroorm"
|
|
34
40
|
```
|
|
41
|
+
|
|
35
42
|
✅ Step 3: Apply the Patch
|
|
36
43
|
After setting up the postinstall script, run:
|
|
44
|
+
|
|
37
45
|
```sh
|
|
38
46
|
npm i
|
|
39
47
|
```
|
|
48
|
+
|
|
40
49
|
This will:
|
|
41
50
|
|
|
42
51
|
Trigger the postinstall hook, which applies the necessary patches to MikroORM and Knex.
|
|
43
52
|
Ensure everything is correctly configured for running inside Forge.
|
|
44
53
|
|
|
45
|
-
|
|
46
54
|
🔧 Why is the Patch Required?
|
|
47
55
|
Atlassian Forge has a restricted execution environment, which does not allow:
|
|
48
56
|
|
|
@@ -51,7 +59,6 @@ Atlassian Forge has a restricted execution environment, which does not allow:
|
|
|
51
59
|
- Unsupported database dialects, such as PostgreSQL or SQLite.
|
|
52
60
|
- The patch removes these unsupported features to ensure full compatibility.
|
|
53
61
|
|
|
54
|
-
|
|
55
62
|
## Step-by-Step Migration Workflow
|
|
56
63
|
|
|
57
64
|
1. **Generate initial entity models from an existing database**
|
|
@@ -107,7 +114,6 @@ Atlassian Forge has a restricted execution environment, which does not allow:
|
|
|
107
114
|
|
|
108
115
|
---
|
|
109
116
|
|
|
110
|
-
|
|
111
117
|
# Connection to ORM
|
|
112
118
|
|
|
113
119
|
```js
|
|
@@ -135,7 +141,7 @@ return await forgeSQL.fetch().executeSchemaSQL(formattedQuery, UsersSchema);
|
|
|
135
141
|
- Raw Fetch Data
|
|
136
142
|
|
|
137
143
|
```js
|
|
138
|
-
const users = await forgeSQL.fetch().executeRawSQL<Users>
|
|
144
|
+
const users = (await forgeSQL.fetch().executeRawSQL) < Users > "SELECT * FROM users";
|
|
139
145
|
```
|
|
140
146
|
|
|
141
147
|
- Complex Query
|
|
@@ -561,7 +567,7 @@ Detect schema changes (new tables, columns, indexes)
|
|
|
561
567
|
- Update index.ts to include new migrations
|
|
562
568
|
|
|
563
569
|
📌 Using the patch:mikroorm Command
|
|
564
|
-
|
|
570
|
+
If needed, you can manually apply the patch at any time using:
|
|
565
571
|
|
|
566
572
|
```sh
|
|
567
573
|
npx forge-sql-orm patch:mikroorm
|
|
@@ -574,7 +580,7 @@ This command:
|
|
|
574
580
|
- Ensures Knex and MikroORM work properly inside Forge.
|
|
575
581
|
|
|
576
582
|
📌 Manual Migration Execution
|
|
577
|
-
|
|
583
|
+
To manually execute migrations in your application:
|
|
578
584
|
|
|
579
585
|
```js
|
|
580
586
|
import migrationRunner from "./src/database/migration";
|
package/dist/ForgeSQLORM.js
CHANGED
|
@@ -24,8 +24,10 @@ const parseDateTime = (value, format) => {
|
|
|
24
24
|
};
|
|
25
25
|
class ForgeSQLCrudOperations {
|
|
26
26
|
forgeOperations;
|
|
27
|
-
|
|
27
|
+
options;
|
|
28
|
+
constructor(forgeSqlOperations, options) {
|
|
28
29
|
this.forgeOperations = forgeSqlOperations;
|
|
30
|
+
this.options = options;
|
|
29
31
|
}
|
|
30
32
|
/**
|
|
31
33
|
* Generates an SQL insert query with values.
|
|
@@ -87,8 +89,9 @@ class ForgeSQLCrudOperations {
|
|
|
87
89
|
async insert(schema, models, updateIfExists = false) {
|
|
88
90
|
if (!models || models.length === 0) return 0;
|
|
89
91
|
const query = await this.generateInsertScript(schema, models, updateIfExists);
|
|
90
|
-
|
|
91
|
-
|
|
92
|
+
if (this.options?.logRawSqlQuery) {
|
|
93
|
+
console.debug("INSERT SQL: " + query.sql);
|
|
94
|
+
}
|
|
92
95
|
const sqlStatement = sql.sql.prepare(query.sql);
|
|
93
96
|
const updateQueryResponseResult = await sqlStatement.execute();
|
|
94
97
|
return updateQueryResponseResult.rows.insertId;
|
|
@@ -122,7 +125,9 @@ class ForgeSQLCrudOperations {
|
|
|
122
125
|
const queryBuilder = this.forgeOperations.createQueryBuilder(schema.meta.class).delete();
|
|
123
126
|
queryBuilder.andWhere({ [primaryKey.name]: { $eq: id } });
|
|
124
127
|
const query = queryBuilder.getFormattedQuery();
|
|
125
|
-
|
|
128
|
+
if (this.options?.logRawSqlQuery) {
|
|
129
|
+
console.debug("DELETE SQL: " + query);
|
|
130
|
+
}
|
|
126
131
|
const sqlStatement = sql.sql.prepare(query);
|
|
127
132
|
const updateQueryResponseResult = await sqlStatement.execute();
|
|
128
133
|
return updateQueryResponseResult.rows.affectedRows;
|
|
@@ -144,11 +149,17 @@ class ForgeSQLCrudOperations {
|
|
|
144
149
|
queryBuilder.andWhere({ [pk.name]: { $eq: value } });
|
|
145
150
|
});
|
|
146
151
|
const query = queryBuilder.getFormattedQuery();
|
|
147
|
-
|
|
152
|
+
if (this.options?.logRawSqlQuery) {
|
|
153
|
+
console.debug("UPDATE SQL: " + query);
|
|
154
|
+
}
|
|
148
155
|
await this.forgeOperations.fetch().executeRawUpdateSQL(query);
|
|
149
156
|
}
|
|
150
157
|
}
|
|
151
158
|
class ForgeSQLSelectOperations {
|
|
159
|
+
options;
|
|
160
|
+
constructor(options) {
|
|
161
|
+
this.options = options;
|
|
162
|
+
}
|
|
152
163
|
/**
|
|
153
164
|
* Executes a schema-based SQL query and maps the result to the entity schema.
|
|
154
165
|
* @param query - The SQL query to execute.
|
|
@@ -191,9 +202,10 @@ class ForgeSQLSelectOperations {
|
|
|
191
202
|
* @returns A list of results as objects.
|
|
192
203
|
*/
|
|
193
204
|
async executeRawSQL(query) {
|
|
194
|
-
|
|
205
|
+
if (this.options.logRawSqlQuery) {
|
|
206
|
+
console.debug("Executing raw SQL: " + query);
|
|
207
|
+
}
|
|
195
208
|
const sqlStatement = await sql.sql.prepare(query).execute();
|
|
196
|
-
console.debug("Query result: " + JSON.stringify(sqlStatement));
|
|
197
209
|
return sqlStatement.rows;
|
|
198
210
|
}
|
|
199
211
|
/**
|
|
@@ -202,7 +214,9 @@ class ForgeSQLSelectOperations {
|
|
|
202
214
|
* @returns The update response containing affected rows.
|
|
203
215
|
*/
|
|
204
216
|
async executeRawUpdateSQL(query) {
|
|
205
|
-
|
|
217
|
+
if (this.options.logRawSqlQuery) {
|
|
218
|
+
console.debug("Executing update SQL: " + query);
|
|
219
|
+
}
|
|
206
220
|
const sqlStatement = sql.sql.prepare(query);
|
|
207
221
|
const updateQueryResponseResults = await sqlStatement.execute();
|
|
208
222
|
return updateQueryResponseResults.rows;
|
|
@@ -216,8 +230,9 @@ class ForgeSQLORMImpl {
|
|
|
216
230
|
/**
|
|
217
231
|
* Private constructor to enforce singleton behavior.
|
|
218
232
|
* @param entities - The list of entities for ORM initialization.
|
|
233
|
+
* @param options - Options for configuring ForgeSQL ORM behavior.
|
|
219
234
|
*/
|
|
220
|
-
constructor(entities) {
|
|
235
|
+
constructor(entities, options) {
|
|
221
236
|
console.debug("Initializing ForgeSQLORM...");
|
|
222
237
|
try {
|
|
223
238
|
this.mikroORM = mysql.MikroORM.initSync({
|
|
@@ -236,10 +251,12 @@ class ForgeSQLORMImpl {
|
|
|
236
251
|
adapter: mysql.MemoryCacheAdapter
|
|
237
252
|
},
|
|
238
253
|
entities,
|
|
239
|
-
preferTs: false
|
|
254
|
+
preferTs: false,
|
|
255
|
+
debug: false
|
|
240
256
|
});
|
|
241
|
-
|
|
242
|
-
this.
|
|
257
|
+
const newOptions = options ?? { logRawSqlQuery: false };
|
|
258
|
+
this.crudOperations = new ForgeSQLCrudOperations(this, newOptions);
|
|
259
|
+
this.fetchOperations = new ForgeSQLSelectOperations(newOptions);
|
|
243
260
|
} catch (error) {
|
|
244
261
|
console.error("ForgeSQLORM initialization failed:", error);
|
|
245
262
|
throw error;
|
|
@@ -280,6 +297,11 @@ class ForgeSQLORMImpl {
|
|
|
280
297
|
createQueryBuilder(entityName, alias, loggerContext) {
|
|
281
298
|
return this.mikroORM.em.createQueryBuilder(entityName, alias, void 0, loggerContext);
|
|
282
299
|
}
|
|
300
|
+
/**
|
|
301
|
+
* Provides access to the underlying Knex instance for executing raw queries and building complex query parts.
|
|
302
|
+
* enabling advanced query customization and performance tuning.
|
|
303
|
+
* @returns The Knex instance, which can be used for query building.
|
|
304
|
+
*/
|
|
283
305
|
getKnex() {
|
|
284
306
|
return this.mikroORM.em.getKnex();
|
|
285
307
|
}
|
package/dist/ForgeSQLORM.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ForgeSQLORM.js","sources":["../src/utils/sqlUtils.ts","../src/core/ForgeSQLCrudOperations.ts","../src/core/ForgeSQLSelectOperations.ts","../src/core/ForgeSQLORM.ts"],"sourcesContent":["import { types } from \"@mikro-orm/core/types\";\nimport moment from \"moment\";\nimport { AnyString } from \"@mikro-orm/core/typings\";\n\nexport const transformValue = (value: {\n type: keyof typeof types | AnyString;\n value: unknown;\n}): unknown => {\n switch (value.type) {\n case \"text\":\n case \"string\":\n return `'${value.value}'`;\n case \"datetime\":\n return `'${moment(value.value as Date).format(\"YYYY-MM-DDTHH:mm:ss.SSS\")}'`;\n case \"date\":\n return `'${moment(value.value as Date).format(\"YYYY-MM-DD\")}'`;\n case \"time\":\n return `'${moment(value.value as Date).format(\"HH:mm:ss.SSS\")}'`;\n default:\n return value.value;\n }\n};\nexport const parseDateTime = (value: string, format: string): Date => {\n return moment(value, format).toDate();\n};\n","import { UpdateQueryResponse, sql } from \"@forge/sql\";\nimport { EntityProperty, EntitySchema } from \"..\";\nimport type { types } from \"@mikro-orm/core/types\";\nimport { transformValue } from \"../utils/sqlUtils\";\nimport { CRUDForgeSQL, ForgeSqlOperation } from \"./ForgeSQLQueryBuilder\";\n\nexport class ForgeSQLCrudOperations implements CRUDForgeSQL {\n private readonly forgeOperations: ForgeSqlOperation;\n\n constructor(forgeSqlOperations: ForgeSqlOperation) {\n this.forgeOperations = forgeSqlOperations;\n }\n\n /**\n * Generates an SQL insert query with values.\n * @param schema - The entity schema.\n * @param models - The list of entities to insert.\n * @param updateIfExists - Whether to update the row if it already exists.\n * @returns An object containing the SQL query, fields, and values.\n */\n private async generateInsertScript<T extends object>(\n schema: EntitySchema<T>,\n models: T[],\n updateIfExists: boolean,\n ): Promise<{\n sql: string;\n fields: string[];\n values: { type: keyof typeof types; value: unknown }[];\n }> {\n const fieldNames: Set<string> = new Set();\n const fieldValueMaps: Record<string, { type: keyof typeof types; value: unknown }>[] = [];\n\n models.forEach((model) => {\n const fieldValueMap: Record<string, { type: keyof typeof types; value: unknown }> = {};\n schema.meta.props.forEach((p) => {\n const modelValue = model[p.name];\n if (p.kind === \"scalar\" && modelValue !== undefined) {\n fieldNames.add(p.fieldNames[0] || p.name);\n fieldValueMap[p.fieldNames[0]] = {\n type: p.type as keyof typeof types,\n value: modelValue,\n };\n }\n });\n fieldValueMaps.push(fieldValueMap);\n });\n\n const fields = Array.from(fieldNames);\n const values = fieldValueMaps.flatMap((fieldValueMap) =>\n fields.map(\n (f) =>\n fieldValueMap[f] || {\n type: \"string\",\n value: null,\n },\n ),\n );\n\n return {\n sql: `INSERT INTO ${schema.meta.collection} (${fields.join(\",\")}) VALUES ${fieldValueMaps\n .map(\n (fieldValueMap) =>\n `(${fields\n .map((f) =>\n transformValue(\n fieldValueMap[f] || {\n type: \"string\",\n value: null,\n },\n ),\n )\n .join(\",\")})`,\n )\n .join(\n \", \",\n )} ${updateIfExists ? `ON DUPLICATE KEY UPDATE ${fields.map((f) => `${f} = VALUES(${f})`).join(\",\")}` : \"\"}`,\n fields,\n values,\n };\n }\n\n /**\n * Inserts records into the database.\n * @param schema - The entity schema.\n * @param models - The list of entities to insert.\n * @param updateIfExists - Whether to update the row if it already exists.\n * @returns The ID of the inserted row.\n */\n async insert<T extends object>(\n schema: EntitySchema<T>,\n models: T[],\n updateIfExists: boolean = false,\n ): Promise<number> {\n if (!models || models.length === 0) return 0;\n\n const query = await this.generateInsertScript(schema, models, updateIfExists);\n console.debug(\"INSERT SQL: \" + query.sql);\n console.debug(\"INSERT VALUES: \" + JSON.stringify(query.values));\n const sqlStatement = sql.prepare<UpdateQueryResponse>(query.sql);\n const updateQueryResponseResult = await sqlStatement.execute();\n return updateQueryResponseResult.rows.insertId;\n }\n\n /**\n * Retrieves the primary keys for the given entity schema.\n * @param schema - The entity schema.\n * @returns An array of primary key properties.\n * @throws If no primary keys are found.\n */\n private getPrimaryKeys<T extends object>(schema: EntitySchema<T>): EntityProperty<T, unknown>[] {\n const primaryKeys = schema.meta.props.filter((p) => p.primary);\n if (!primaryKeys.length) {\n throw new Error(`No primary keys found for schema: ${schema.meta.className}`);\n }\n return primaryKeys;\n }\n\n /**\n * Deletes a record by its ID.\n * @param id - The ID of the record to delete.\n * @param schema - The entity schema.\n * @returns The number of rows affected.\n * @throws If the entity has more than one primary key.\n */\n async deleteById<T extends object>(id: unknown, schema: EntitySchema<T>): Promise<number> {\n const primaryKeys = this.getPrimaryKeys(schema);\n if (primaryKeys.length > 1) {\n throw new Error(\"Only one primary key is supported\");\n }\n\n const primaryKey = primaryKeys[0];\n const queryBuilder = this.forgeOperations.createQueryBuilder(schema.meta.class).delete();\n queryBuilder.andWhere({ [primaryKey.name]: { $eq: id } });\n\n const query = queryBuilder.getFormattedQuery();\n console.debug(\"DELETE SQL: \" + query);\n\n const sqlStatement = sql.prepare<UpdateQueryResponse>(query);\n const updateQueryResponseResult = await sqlStatement.execute();\n return updateQueryResponseResult.rows.affectedRows;\n }\n\n /**\n * Updates a record by its ID.\n * @param entity - The entity with updated values.\n * @param schema - The entity schema.\n * @throws If the primary key value is missing in the entity.\n */\n async updateById<T extends object>(entity: T, schema: EntitySchema<T>): Promise<void> {\n const primaryKeys = this.getPrimaryKeys(schema);\n const queryBuilder = this.forgeOperations.createQueryBuilder(schema.meta.class).update(entity);\n\n primaryKeys.forEach((pk) => {\n const value = entity[pk.name];\n if (value === null || value === undefined) {\n throw new Error(`Primary Key ${pk.name} must exist in the model`);\n }\n queryBuilder.andWhere({ [pk.name]: { $eq: value } });\n });\n const query = queryBuilder.getFormattedQuery();\n console.debug(\"UPDATE SQL: \" + query);\n await this.forgeOperations.fetch().executeRawUpdateSQL(query);\n }\n}\n","import { sql, UpdateQueryResponse } from \"@forge/sql\";\nimport type { EntitySchema } from \"@mikro-orm/core/metadata/EntitySchema\";\nimport { parseDateTime } from \"../utils/sqlUtils\";\nimport { SchemaSqlForgeSql } from \"./ForgeSQLQueryBuilder\";\n\nexport class ForgeSQLSelectOperations implements SchemaSqlForgeSql {\n /**\n * Executes a schema-based SQL query and maps the result to the entity schema.\n * @param query - The SQL query to execute.\n * @param schema - The entity schema defining the structure.\n * @returns A list of mapped entity objects.\n */\n async executeSchemaSQL<T extends object>(query: string, schema: EntitySchema<T>): Promise<T[]> {\n const datas = await this.executeRawSQL<unknown>(query);\n if (!datas.length) return [];\n\n return datas.map((r) => {\n const rawModel = r as Record<string, unknown>;\n const newModel: Record<string, unknown> = {};\n\n schema.meta.props\n .filter((p) => p.kind === \"scalar\")\n .forEach((p) => {\n const fieldName = p.name;\n const fieldNames = p.fieldNames;\n const rawFieldName = fieldNames && Array.isArray(fieldNames)? fieldNames[0]: p.name;\n\n switch (p.type) {\n case \"datetime\":\n newModel[fieldName] = parseDateTime(\n rawModel[rawFieldName] as string,\n \"YYYY-MM-DDTHH:mm:ss.SSS\",\n );\n break;\n case \"date\":\n newModel[fieldName] = parseDateTime(rawModel[rawFieldName] as string, \"YYYY-MM-DD\");\n break;\n case \"time\":\n newModel[fieldName] = parseDateTime(rawModel[rawFieldName] as string, \"HH:mm:ss.SSS\");\n break;\n default:\n newModel[fieldName] = rawModel[rawFieldName];\n }\n });\n return newModel as T;\n });\n }\n\n /**\n * Executes a raw SQL query and returns the results.\n * @param query - The raw SQL query to execute.\n * @returns A list of results as objects.\n */\n async executeRawSQL<T extends object | unknown>(query: string): Promise<T[]> {\n console.debug(\"Executing raw SQL: \" + query);\n const sqlStatement = await sql.prepare<T>(query).execute();\n console.debug(\"Query result: \" + JSON.stringify(sqlStatement));\n return sqlStatement.rows as T[];\n }\n\n /**\n * Executes a raw SQL update query.\n * @param query - The raw SQL update query.\n * @returns The update response containing affected rows.\n */\n async executeRawUpdateSQL(query: string): Promise<UpdateQueryResponse> {\n console.debug(\"Executing update SQL: \" + query);\n const sqlStatement = sql.prepare<UpdateQueryResponse>(query);\n const updateQueryResponseResults = await sqlStatement.execute();\n return updateQueryResponseResults.rows;\n }\n}\n","import type { EntityName, LoggingOptions } from \"@mikro-orm/core\";\nimport type { EntitySchema } from \"@mikro-orm/core/metadata/EntitySchema\";\nimport type { AnyEntity, EntityClass, EntityClassGroup } from \"@mikro-orm/core/typings\";\nimport type { QueryBuilder } from \"@mikro-orm/knex/query\";\nimport { MemoryCacheAdapter, MikroORM, NullCacheAdapter } from \"@mikro-orm/mysql\";\nimport { ForgeSQLCrudOperations } from \"./ForgeSQLCrudOperations\";\nimport { CRUDForgeSQL, ForgeSqlOperation, SchemaSqlForgeSql } from \"./ForgeSQLQueryBuilder\";\nimport { ForgeSQLSelectOperations } from \"./ForgeSQLSelectOperations\";\nimport type { Knex } from \"knex\";\n\n/**\n * Implementation of ForgeSQLORM that interacts with MikroORM.\n */\nclass ForgeSQLORMImpl implements ForgeSqlOperation {\n private static instance: ForgeSQLORMImpl | null = null;\n private readonly mikroORM: MikroORM;\n private readonly crudOperations: CRUDForgeSQL;\n private readonly fetchOperations: SchemaSqlForgeSql;\n\n /**\n * Private constructor to enforce singleton behavior.\n * @param entities - The list of entities for ORM initialization.\n */\n private constructor(\n entities: (EntityClass<AnyEntity> | EntityClassGroup<AnyEntity> | EntitySchema)[],\n ) {\n console.debug(\"Initializing ForgeSQLORM...\");\n\n try {\n this.mikroORM = MikroORM.initSync({\n dbName: \"inmemory\",\n schemaGenerator: {\n disableForeignKeys: false,\n },\n discovery: {\n warnWhenNoEntities: true,\n },\n resultCache: {\n adapter: NullCacheAdapter,\n },\n metadataCache: {\n enabled: false,\n adapter: MemoryCacheAdapter,\n },\n entities: entities,\n preferTs: false,\n });\n\n this.crudOperations = new ForgeSQLCrudOperations(this);\n this.fetchOperations = new ForgeSQLSelectOperations();\n } catch (error) {\n console.error(\"ForgeSQLORM initialization failed:\", error);\n throw error; // Prevents inconsistent state\n }\n }\n\n /**\n * Returns the singleton instance of ForgeSQLORMImpl.\n * @param entities - List of entities (required only on first initialization).\n * @returns The singleton instance of ForgeSQLORMImpl.\n */\n static getInstance(\n entities: (EntityClass<AnyEntity> | EntityClassGroup<AnyEntity> | EntitySchema)[],\n ): ForgeSqlOperation {\n if (!ForgeSQLORMImpl.instance) {\n ForgeSQLORMImpl.instance = new ForgeSQLORMImpl(entities);\n }\n return ForgeSQLORMImpl.instance;\n }\n\n /**\n * Retrieves the CRUD operations instance.\n * @returns CRUD operations.\n */\n crud(): CRUDForgeSQL {\n return this.crudOperations;\n }\n\n /**\n * Retrieves the fetch operations instance.\n * @returns Fetch operations.\n */\n fetch(): SchemaSqlForgeSql {\n return this.fetchOperations;\n }\n\n /**\n * Creates a new query builder for the given entity.\n * @param entityName - The entity name or an existing query builder.\n * @param alias - The alias for the entity.\n * @param loggerContext - Logging options.\n * @returns The query builder instance.\n */\n createQueryBuilder<Entity extends object, RootAlias extends string = never>(\n entityName: EntityName<Entity> | QueryBuilder<Entity>,\n alias?: RootAlias,\n loggerContext?: LoggingOptions,\n ): QueryBuilder<Entity, RootAlias> {\n return this.mikroORM.em.createQueryBuilder(entityName, alias, undefined, loggerContext);\n }\n\n getKnex(): Knex<any, any[]> {\n return this.mikroORM.em.getKnex();\n }\n}\n\n/**\n * Public class that acts as a wrapper around the private ForgeSQLORMImpl.\n */\nclass ForgeSQLORM {\n private readonly ormInstance: ForgeSqlOperation;\n\n constructor(entities: (EntityClass<AnyEntity> | EntityClassGroup<AnyEntity> | EntitySchema)[]) {\n this.ormInstance = ForgeSQLORMImpl.getInstance(entities);\n }\n\n /**\n * Proxies the `crud` method from `ForgeSQLORMImpl`.\n * @returns CRUD operations.\n */\n crud(): CRUDForgeSQL {\n return this.ormInstance.crud();\n }\n\n /**\n * Proxies the `fetch` method from `ForgeSQLORMImpl`.\n * @returns Fetch operations.\n */\n fetch(): SchemaSqlForgeSql {\n return this.ormInstance.fetch();\n }\n\n getKnex(): Knex<any, any[]> {\n return this.ormInstance.getKnex();\n }\n\n /**\n * Proxies the `createQueryBuilder` method from `ForgeSQLORMImpl`.\n * @returns A new query builder instance.\n */\n createQueryBuilder<Entity extends object, RootAlias extends string = never>(\n entityName: EntityName<Entity> | QueryBuilder<Entity>,\n alias?: RootAlias,\n loggerContext?: LoggingOptions,\n ): QueryBuilder<Entity, RootAlias> {\n return this.ormInstance.createQueryBuilder(entityName, alias, loggerContext);\n }\n}\n\nexport default ForgeSQLORM;\n"],"names":["sql","MikroORM","NullCacheAdapter","MemoryCacheAdapter"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ForgeSQLORM.js","sources":["../src/utils/sqlUtils.ts","../src/core/ForgeSQLCrudOperations.ts","../src/core/ForgeSQLSelectOperations.ts","../src/core/ForgeSQLORM.ts"],"sourcesContent":["import { types } from \"@mikro-orm/core/types\";\nimport moment from \"moment\";\nimport { AnyString } from \"@mikro-orm/core/typings\";\n\nexport const transformValue = (value: {\n type: keyof typeof types | AnyString;\n value: unknown;\n}): unknown => {\n switch (value.type) {\n case \"text\":\n case \"string\":\n return `'${value.value}'`;\n case \"datetime\":\n return `'${moment(value.value as Date).format(\"YYYY-MM-DDTHH:mm:ss.SSS\")}'`;\n case \"date\":\n return `'${moment(value.value as Date).format(\"YYYY-MM-DD\")}'`;\n case \"time\":\n return `'${moment(value.value as Date).format(\"HH:mm:ss.SSS\")}'`;\n default:\n return value.value;\n }\n};\nexport const parseDateTime = (value: string, format: string): Date => {\n return moment(value, format).toDate();\n};\n","import { UpdateQueryResponse, sql } from \"@forge/sql\";\nimport { EntityProperty, EntitySchema, ForgeSqlOrmOptions } from \"..\";\nimport type { types } from \"@mikro-orm/core/types\";\nimport { transformValue } from \"../utils/sqlUtils\";\nimport { CRUDForgeSQL, ForgeSqlOperation } from \"./ForgeSQLQueryBuilder\";\n\nexport class ForgeSQLCrudOperations implements CRUDForgeSQL {\n private readonly forgeOperations: ForgeSqlOperation;\n private readonly options: ForgeSqlOrmOptions;\n\n constructor(forgeSqlOperations: ForgeSqlOperation, options: ForgeSqlOrmOptions) {\n this.forgeOperations = forgeSqlOperations;\n this.options = options;\n }\n\n /**\n * Generates an SQL insert query with values.\n * @param schema - The entity schema.\n * @param models - The list of entities to insert.\n * @param updateIfExists - Whether to update the row if it already exists.\n * @returns An object containing the SQL query, fields, and values.\n */\n private async generateInsertScript<T extends object>(\n schema: EntitySchema<T>,\n models: T[],\n updateIfExists: boolean,\n ): Promise<{\n sql: string;\n fields: string[];\n values: { type: keyof typeof types; value: unknown }[];\n }> {\n const fieldNames: Set<string> = new Set();\n const fieldValueMaps: Record<string, { type: keyof typeof types; value: unknown }>[] = [];\n\n models.forEach((model) => {\n const fieldValueMap: Record<string, { type: keyof typeof types; value: unknown }> = {};\n schema.meta.props.forEach((p) => {\n const modelValue = model[p.name];\n if (p.kind === \"scalar\" && modelValue !== undefined) {\n fieldNames.add(p.fieldNames[0] || p.name);\n fieldValueMap[p.fieldNames[0]] = {\n type: p.type as keyof typeof types,\n value: modelValue,\n };\n }\n });\n fieldValueMaps.push(fieldValueMap);\n });\n\n const fields = Array.from(fieldNames);\n const values = fieldValueMaps.flatMap((fieldValueMap) =>\n fields.map(\n (f) =>\n fieldValueMap[f] || {\n type: \"string\",\n value: null,\n },\n ),\n );\n\n return {\n sql: `INSERT INTO ${schema.meta.collection} (${fields.join(\",\")}) VALUES ${fieldValueMaps\n .map(\n (fieldValueMap) =>\n `(${fields\n .map((f) =>\n transformValue(\n fieldValueMap[f] || {\n type: \"string\",\n value: null,\n },\n ),\n )\n .join(\",\")})`,\n )\n .join(\n \", \",\n )} ${updateIfExists ? `ON DUPLICATE KEY UPDATE ${fields.map((f) => `${f} = VALUES(${f})`).join(\",\")}` : \"\"}`,\n fields,\n values,\n };\n }\n\n /**\n * Inserts records into the database.\n * @param schema - The entity schema.\n * @param models - The list of entities to insert.\n * @param updateIfExists - Whether to update the row if it already exists.\n * @returns The ID of the inserted row.\n */\n async insert<T extends object>(\n schema: EntitySchema<T>,\n models: T[],\n updateIfExists: boolean = false,\n ): Promise<number> {\n if (!models || models.length === 0) return 0;\n\n const query = await this.generateInsertScript(schema, models, updateIfExists);\n if (this.options?.logRawSqlQuery) {\n console.debug(\"INSERT SQL: \" + query.sql);\n }\n const sqlStatement = sql.prepare<UpdateQueryResponse>(query.sql);\n const updateQueryResponseResult = await sqlStatement.execute();\n return updateQueryResponseResult.rows.insertId;\n }\n\n /**\n * Retrieves the primary keys for the given entity schema.\n * @param schema - The entity schema.\n * @returns An array of primary key properties.\n * @throws If no primary keys are found.\n */\n private getPrimaryKeys<T extends object>(schema: EntitySchema<T>): EntityProperty<T, unknown>[] {\n const primaryKeys = schema.meta.props.filter((p) => p.primary);\n if (!primaryKeys.length) {\n throw new Error(`No primary keys found for schema: ${schema.meta.className}`);\n }\n return primaryKeys;\n }\n\n /**\n * Deletes a record by its ID.\n * @param id - The ID of the record to delete.\n * @param schema - The entity schema.\n * @returns The number of rows affected.\n * @throws If the entity has more than one primary key.\n */\n async deleteById<T extends object>(id: unknown, schema: EntitySchema<T>): Promise<number> {\n const primaryKeys = this.getPrimaryKeys(schema);\n if (primaryKeys.length > 1) {\n throw new Error(\"Only one primary key is supported\");\n }\n\n const primaryKey = primaryKeys[0];\n const queryBuilder = this.forgeOperations.createQueryBuilder(schema.meta.class).delete();\n queryBuilder.andWhere({ [primaryKey.name]: { $eq: id } });\n\n const query = queryBuilder.getFormattedQuery();\n if (this.options?.logRawSqlQuery) {\n console.debug(\"DELETE SQL: \" + query);\n }\n const sqlStatement = sql.prepare<UpdateQueryResponse>(query);\n const updateQueryResponseResult = await sqlStatement.execute();\n return updateQueryResponseResult.rows.affectedRows;\n }\n\n /**\n * Updates a record by its ID.\n * @param entity - The entity with updated values.\n * @param schema - The entity schema.\n * @throws If the primary key value is missing in the entity.\n */\n async updateById<T extends object>(entity: T, schema: EntitySchema<T>): Promise<void> {\n const primaryKeys = this.getPrimaryKeys(schema);\n const queryBuilder = this.forgeOperations.createQueryBuilder(schema.meta.class).update(entity);\n\n primaryKeys.forEach((pk) => {\n const value = entity[pk.name];\n if (value === null || value === undefined) {\n throw new Error(`Primary Key ${pk.name} must exist in the model`);\n }\n queryBuilder.andWhere({ [pk.name]: { $eq: value } });\n });\n const query = queryBuilder.getFormattedQuery();\n if (this.options?.logRawSqlQuery) {\n console.debug(\"UPDATE SQL: \" + query);\n }\n await this.forgeOperations.fetch().executeRawUpdateSQL(query);\n }\n}\n","import { sql, UpdateQueryResponse } from \"@forge/sql\";\nimport type { EntitySchema } from \"@mikro-orm/core/metadata/EntitySchema\";\nimport { parseDateTime } from \"../utils/sqlUtils\";\nimport { ForgeSqlOrmOptions, SchemaSqlForgeSql } from \"./ForgeSQLQueryBuilder\";\n\nexport class ForgeSQLSelectOperations implements SchemaSqlForgeSql {\n private readonly options: ForgeSqlOrmOptions;\n\n constructor(options: ForgeSqlOrmOptions) {\n this.options = options;\n }\n\n /**\n * Executes a schema-based SQL query and maps the result to the entity schema.\n * @param query - The SQL query to execute.\n * @param schema - The entity schema defining the structure.\n * @returns A list of mapped entity objects.\n */\n async executeSchemaSQL<T extends object>(query: string, schema: EntitySchema<T>): Promise<T[]> {\n const datas = await this.executeRawSQL<unknown>(query);\n if (!datas.length) return [];\n\n return datas.map((r) => {\n const rawModel = r as Record<string, unknown>;\n const newModel: Record<string, unknown> = {};\n\n schema.meta.props\n .filter((p) => p.kind === \"scalar\")\n .forEach((p) => {\n const fieldName = p.name;\n const fieldNames = p.fieldNames;\n const rawFieldName = fieldNames && Array.isArray(fieldNames) ? fieldNames[0] : p.name;\n\n switch (p.type) {\n case \"datetime\":\n newModel[fieldName] = parseDateTime(\n rawModel[rawFieldName] as string,\n \"YYYY-MM-DDTHH:mm:ss.SSS\",\n );\n break;\n case \"date\":\n newModel[fieldName] = parseDateTime(rawModel[rawFieldName] as string, \"YYYY-MM-DD\");\n break;\n case \"time\":\n newModel[fieldName] = parseDateTime(rawModel[rawFieldName] as string, \"HH:mm:ss.SSS\");\n break;\n default:\n newModel[fieldName] = rawModel[rawFieldName];\n }\n });\n return newModel as T;\n });\n }\n\n /**\n * Executes a raw SQL query and returns the results.\n * @param query - The raw SQL query to execute.\n * @returns A list of results as objects.\n */\n async executeRawSQL<T extends object | unknown>(query: string): Promise<T[]> {\n if (this.options.logRawSqlQuery) {\n console.debug(\"Executing raw SQL: \" + query);\n }\n const sqlStatement = await sql.prepare<T>(query).execute();\n return sqlStatement.rows as T[];\n }\n\n /**\n * Executes a raw SQL update query.\n * @param query - The raw SQL update query.\n * @returns The update response containing affected rows.\n */\n async executeRawUpdateSQL(query: string): Promise<UpdateQueryResponse> {\n if (this.options.logRawSqlQuery) {\n console.debug(\"Executing update SQL: \" + query);\n }\n const sqlStatement = sql.prepare<UpdateQueryResponse>(query);\n const updateQueryResponseResults = await sqlStatement.execute();\n return updateQueryResponseResults.rows;\n }\n}\n","import type { EntityName, LoggingOptions } from \"@mikro-orm/core\";\nimport type { EntitySchema } from \"@mikro-orm/core/metadata/EntitySchema\";\nimport type { AnyEntity, EntityClass, EntityClassGroup } from \"@mikro-orm/core/typings\";\nimport type { QueryBuilder } from \"@mikro-orm/knex/query\";\nimport { MemoryCacheAdapter, MikroORM, NullCacheAdapter } from \"@mikro-orm/mysql\";\nimport { ForgeSQLCrudOperations } from \"./ForgeSQLCrudOperations\";\nimport {\n CRUDForgeSQL,\n ForgeSqlOperation,\n ForgeSqlOrmOptions,\n SchemaSqlForgeSql,\n} from \"./ForgeSQLQueryBuilder\";\nimport { ForgeSQLSelectOperations } from \"./ForgeSQLSelectOperations\";\nimport type { Knex } from \"knex\";\n\n/**\n * Implementation of ForgeSQLORM that interacts with MikroORM.\n */\nclass ForgeSQLORMImpl implements ForgeSqlOperation {\n private static instance: ForgeSQLORMImpl | null = null;\n private readonly mikroORM: MikroORM;\n private readonly crudOperations: CRUDForgeSQL;\n private readonly fetchOperations: SchemaSqlForgeSql;\n\n /**\n * Private constructor to enforce singleton behavior.\n * @param entities - The list of entities for ORM initialization.\n * @param options - Options for configuring ForgeSQL ORM behavior.\n */\n private constructor(\n entities: (EntityClass<AnyEntity> | EntityClassGroup<AnyEntity> | EntitySchema)[],\n options?: ForgeSqlOrmOptions,\n ) {\n console.debug(\"Initializing ForgeSQLORM...\");\n\n try {\n this.mikroORM = MikroORM.initSync({\n dbName: \"inmemory\",\n schemaGenerator: {\n disableForeignKeys: false,\n },\n discovery: {\n warnWhenNoEntities: true,\n },\n resultCache: {\n adapter: NullCacheAdapter,\n },\n metadataCache: {\n enabled: false,\n adapter: MemoryCacheAdapter,\n },\n entities: entities,\n preferTs: false,\n debug: false,\n });\n const newOptions: ForgeSqlOrmOptions = options ?? { logRawSqlQuery: false };\n this.crudOperations = new ForgeSQLCrudOperations(this, newOptions);\n this.fetchOperations = new ForgeSQLSelectOperations(newOptions);\n } catch (error) {\n console.error(\"ForgeSQLORM initialization failed:\", error);\n throw error; // Prevents inconsistent state\n }\n }\n\n /**\n * Returns the singleton instance of ForgeSQLORMImpl.\n * @param entities - List of entities (required only on first initialization).\n * @returns The singleton instance of ForgeSQLORMImpl.\n */\n static getInstance(\n entities: (EntityClass<AnyEntity> | EntityClassGroup<AnyEntity> | EntitySchema)[],\n ): ForgeSqlOperation {\n if (!ForgeSQLORMImpl.instance) {\n ForgeSQLORMImpl.instance = new ForgeSQLORMImpl(entities);\n }\n return ForgeSQLORMImpl.instance;\n }\n\n /**\n * Retrieves the CRUD operations instance.\n * @returns CRUD operations.\n */\n crud(): CRUDForgeSQL {\n return this.crudOperations;\n }\n\n /**\n * Retrieves the fetch operations instance.\n * @returns Fetch operations.\n */\n fetch(): SchemaSqlForgeSql {\n return this.fetchOperations;\n }\n\n /**\n * Creates a new query builder for the given entity.\n * @param entityName - The entity name or an existing query builder.\n * @param alias - The alias for the entity.\n * @param loggerContext - Logging options.\n * @returns The query builder instance.\n */\n createQueryBuilder<Entity extends object, RootAlias extends string = never>(\n entityName: EntityName<Entity> | QueryBuilder<Entity>,\n alias?: RootAlias,\n loggerContext?: LoggingOptions,\n ): QueryBuilder<Entity, RootAlias> {\n return this.mikroORM.em.createQueryBuilder(entityName, alias, undefined, loggerContext);\n }\n\n /**\n * Provides access to the underlying Knex instance for executing raw queries and building complex query parts.\n * enabling advanced query customization and performance tuning.\n * @returns The Knex instance, which can be used for query building.\n */\n getKnex(): Knex<any, any[]> {\n return this.mikroORM.em.getKnex();\n }\n}\n\n/**\n * Public class that acts as a wrapper around the private ForgeSQLORMImpl.\n */\nclass ForgeSQLORM {\n private readonly ormInstance: ForgeSqlOperation;\n\n constructor(entities: (EntityClass<AnyEntity> | EntityClassGroup<AnyEntity> | EntitySchema)[]) {\n this.ormInstance = ForgeSQLORMImpl.getInstance(entities);\n }\n\n /**\n * Proxies the `crud` method from `ForgeSQLORMImpl`.\n * @returns CRUD operations.\n */\n crud(): CRUDForgeSQL {\n return this.ormInstance.crud();\n }\n\n /**\n * Proxies the `fetch` method from `ForgeSQLORMImpl`.\n * @returns Fetch operations.\n */\n fetch(): SchemaSqlForgeSql {\n return this.ormInstance.fetch();\n }\n\n getKnex(): Knex<any, any[]> {\n return this.ormInstance.getKnex();\n }\n\n /**\n * Proxies the `createQueryBuilder` method from `ForgeSQLORMImpl`.\n * @returns A new query builder instance.\n */\n createQueryBuilder<Entity extends object, RootAlias extends string = never>(\n entityName: EntityName<Entity> | QueryBuilder<Entity>,\n alias?: RootAlias,\n loggerContext?: LoggingOptions,\n ): QueryBuilder<Entity, RootAlias> {\n return this.ormInstance.createQueryBuilder(entityName, alias, loggerContext);\n }\n}\n\nexport default ForgeSQLORM;\n"],"names":["sql","MikroORM","NullCacheAdapter","MemoryCacheAdapter"],"mappings":"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"}
|
package/dist/ForgeSQLORM.mjs
CHANGED
|
@@ -23,8 +23,10 @@ const parseDateTime = (value, format) => {
|
|
|
23
23
|
};
|
|
24
24
|
class ForgeSQLCrudOperations {
|
|
25
25
|
forgeOperations;
|
|
26
|
-
|
|
26
|
+
options;
|
|
27
|
+
constructor(forgeSqlOperations, options) {
|
|
27
28
|
this.forgeOperations = forgeSqlOperations;
|
|
29
|
+
this.options = options;
|
|
28
30
|
}
|
|
29
31
|
/**
|
|
30
32
|
* Generates an SQL insert query with values.
|
|
@@ -86,8 +88,9 @@ class ForgeSQLCrudOperations {
|
|
|
86
88
|
async insert(schema, models, updateIfExists = false) {
|
|
87
89
|
if (!models || models.length === 0) return 0;
|
|
88
90
|
const query = await this.generateInsertScript(schema, models, updateIfExists);
|
|
89
|
-
|
|
90
|
-
|
|
91
|
+
if (this.options?.logRawSqlQuery) {
|
|
92
|
+
console.debug("INSERT SQL: " + query.sql);
|
|
93
|
+
}
|
|
91
94
|
const sqlStatement = sql.prepare(query.sql);
|
|
92
95
|
const updateQueryResponseResult = await sqlStatement.execute();
|
|
93
96
|
return updateQueryResponseResult.rows.insertId;
|
|
@@ -121,7 +124,9 @@ class ForgeSQLCrudOperations {
|
|
|
121
124
|
const queryBuilder = this.forgeOperations.createQueryBuilder(schema.meta.class).delete();
|
|
122
125
|
queryBuilder.andWhere({ [primaryKey.name]: { $eq: id } });
|
|
123
126
|
const query = queryBuilder.getFormattedQuery();
|
|
124
|
-
|
|
127
|
+
if (this.options?.logRawSqlQuery) {
|
|
128
|
+
console.debug("DELETE SQL: " + query);
|
|
129
|
+
}
|
|
125
130
|
const sqlStatement = sql.prepare(query);
|
|
126
131
|
const updateQueryResponseResult = await sqlStatement.execute();
|
|
127
132
|
return updateQueryResponseResult.rows.affectedRows;
|
|
@@ -143,11 +148,17 @@ class ForgeSQLCrudOperations {
|
|
|
143
148
|
queryBuilder.andWhere({ [pk.name]: { $eq: value } });
|
|
144
149
|
});
|
|
145
150
|
const query = queryBuilder.getFormattedQuery();
|
|
146
|
-
|
|
151
|
+
if (this.options?.logRawSqlQuery) {
|
|
152
|
+
console.debug("UPDATE SQL: " + query);
|
|
153
|
+
}
|
|
147
154
|
await this.forgeOperations.fetch().executeRawUpdateSQL(query);
|
|
148
155
|
}
|
|
149
156
|
}
|
|
150
157
|
class ForgeSQLSelectOperations {
|
|
158
|
+
options;
|
|
159
|
+
constructor(options) {
|
|
160
|
+
this.options = options;
|
|
161
|
+
}
|
|
151
162
|
/**
|
|
152
163
|
* Executes a schema-based SQL query and maps the result to the entity schema.
|
|
153
164
|
* @param query - The SQL query to execute.
|
|
@@ -190,9 +201,10 @@ class ForgeSQLSelectOperations {
|
|
|
190
201
|
* @returns A list of results as objects.
|
|
191
202
|
*/
|
|
192
203
|
async executeRawSQL(query) {
|
|
193
|
-
|
|
204
|
+
if (this.options.logRawSqlQuery) {
|
|
205
|
+
console.debug("Executing raw SQL: " + query);
|
|
206
|
+
}
|
|
194
207
|
const sqlStatement = await sql.prepare(query).execute();
|
|
195
|
-
console.debug("Query result: " + JSON.stringify(sqlStatement));
|
|
196
208
|
return sqlStatement.rows;
|
|
197
209
|
}
|
|
198
210
|
/**
|
|
@@ -201,7 +213,9 @@ class ForgeSQLSelectOperations {
|
|
|
201
213
|
* @returns The update response containing affected rows.
|
|
202
214
|
*/
|
|
203
215
|
async executeRawUpdateSQL(query) {
|
|
204
|
-
|
|
216
|
+
if (this.options.logRawSqlQuery) {
|
|
217
|
+
console.debug("Executing update SQL: " + query);
|
|
218
|
+
}
|
|
205
219
|
const sqlStatement = sql.prepare(query);
|
|
206
220
|
const updateQueryResponseResults = await sqlStatement.execute();
|
|
207
221
|
return updateQueryResponseResults.rows;
|
|
@@ -215,8 +229,9 @@ class ForgeSQLORMImpl {
|
|
|
215
229
|
/**
|
|
216
230
|
* Private constructor to enforce singleton behavior.
|
|
217
231
|
* @param entities - The list of entities for ORM initialization.
|
|
232
|
+
* @param options - Options for configuring ForgeSQL ORM behavior.
|
|
218
233
|
*/
|
|
219
|
-
constructor(entities) {
|
|
234
|
+
constructor(entities, options) {
|
|
220
235
|
console.debug("Initializing ForgeSQLORM...");
|
|
221
236
|
try {
|
|
222
237
|
this.mikroORM = MikroORM.initSync({
|
|
@@ -235,10 +250,12 @@ class ForgeSQLORMImpl {
|
|
|
235
250
|
adapter: MemoryCacheAdapter
|
|
236
251
|
},
|
|
237
252
|
entities,
|
|
238
|
-
preferTs: false
|
|
253
|
+
preferTs: false,
|
|
254
|
+
debug: false
|
|
239
255
|
});
|
|
240
|
-
|
|
241
|
-
this.
|
|
256
|
+
const newOptions = options ?? { logRawSqlQuery: false };
|
|
257
|
+
this.crudOperations = new ForgeSQLCrudOperations(this, newOptions);
|
|
258
|
+
this.fetchOperations = new ForgeSQLSelectOperations(newOptions);
|
|
242
259
|
} catch (error) {
|
|
243
260
|
console.error("ForgeSQLORM initialization failed:", error);
|
|
244
261
|
throw error;
|
|
@@ -279,6 +296,11 @@ class ForgeSQLORMImpl {
|
|
|
279
296
|
createQueryBuilder(entityName, alias, loggerContext) {
|
|
280
297
|
return this.mikroORM.em.createQueryBuilder(entityName, alias, void 0, loggerContext);
|
|
281
298
|
}
|
|
299
|
+
/**
|
|
300
|
+
* Provides access to the underlying Knex instance for executing raw queries and building complex query parts.
|
|
301
|
+
* enabling advanced query customization and performance tuning.
|
|
302
|
+
* @returns The Knex instance, which can be used for query building.
|
|
303
|
+
*/
|
|
282
304
|
getKnex() {
|
|
283
305
|
return this.mikroORM.em.getKnex();
|
|
284
306
|
}
|
package/dist/ForgeSQLORM.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ForgeSQLORM.mjs","sources":["../src/utils/sqlUtils.ts","../src/core/ForgeSQLCrudOperations.ts","../src/core/ForgeSQLSelectOperations.ts","../src/core/ForgeSQLORM.ts"],"sourcesContent":["import { types } from \"@mikro-orm/core/types\";\nimport moment from \"moment\";\nimport { AnyString } from \"@mikro-orm/core/typings\";\n\nexport const transformValue = (value: {\n type: keyof typeof types | AnyString;\n value: unknown;\n}): unknown => {\n switch (value.type) {\n case \"text\":\n case \"string\":\n return `'${value.value}'`;\n case \"datetime\":\n return `'${moment(value.value as Date).format(\"YYYY-MM-DDTHH:mm:ss.SSS\")}'`;\n case \"date\":\n return `'${moment(value.value as Date).format(\"YYYY-MM-DD\")}'`;\n case \"time\":\n return `'${moment(value.value as Date).format(\"HH:mm:ss.SSS\")}'`;\n default:\n return value.value;\n }\n};\nexport const parseDateTime = (value: string, format: string): Date => {\n return moment(value, format).toDate();\n};\n","import { UpdateQueryResponse, sql } from \"@forge/sql\";\nimport { EntityProperty, EntitySchema } from \"..\";\nimport type { types } from \"@mikro-orm/core/types\";\nimport { transformValue } from \"../utils/sqlUtils\";\nimport { CRUDForgeSQL, ForgeSqlOperation } from \"./ForgeSQLQueryBuilder\";\n\nexport class ForgeSQLCrudOperations implements CRUDForgeSQL {\n private readonly forgeOperations: ForgeSqlOperation;\n\n constructor(forgeSqlOperations: ForgeSqlOperation) {\n this.forgeOperations = forgeSqlOperations;\n }\n\n /**\n * Generates an SQL insert query with values.\n * @param schema - The entity schema.\n * @param models - The list of entities to insert.\n * @param updateIfExists - Whether to update the row if it already exists.\n * @returns An object containing the SQL query, fields, and values.\n */\n private async generateInsertScript<T extends object>(\n schema: EntitySchema<T>,\n models: T[],\n updateIfExists: boolean,\n ): Promise<{\n sql: string;\n fields: string[];\n values: { type: keyof typeof types; value: unknown }[];\n }> {\n const fieldNames: Set<string> = new Set();\n const fieldValueMaps: Record<string, { type: keyof typeof types; value: unknown }>[] = [];\n\n models.forEach((model) => {\n const fieldValueMap: Record<string, { type: keyof typeof types; value: unknown }> = {};\n schema.meta.props.forEach((p) => {\n const modelValue = model[p.name];\n if (p.kind === \"scalar\" && modelValue !== undefined) {\n fieldNames.add(p.fieldNames[0] || p.name);\n fieldValueMap[p.fieldNames[0]] = {\n type: p.type as keyof typeof types,\n value: modelValue,\n };\n }\n });\n fieldValueMaps.push(fieldValueMap);\n });\n\n const fields = Array.from(fieldNames);\n const values = fieldValueMaps.flatMap((fieldValueMap) =>\n fields.map(\n (f) =>\n fieldValueMap[f] || {\n type: \"string\",\n value: null,\n },\n ),\n );\n\n return {\n sql: `INSERT INTO ${schema.meta.collection} (${fields.join(\",\")}) VALUES ${fieldValueMaps\n .map(\n (fieldValueMap) =>\n `(${fields\n .map((f) =>\n transformValue(\n fieldValueMap[f] || {\n type: \"string\",\n value: null,\n },\n ),\n )\n .join(\",\")})`,\n )\n .join(\n \", \",\n )} ${updateIfExists ? `ON DUPLICATE KEY UPDATE ${fields.map((f) => `${f} = VALUES(${f})`).join(\",\")}` : \"\"}`,\n fields,\n values,\n };\n }\n\n /**\n * Inserts records into the database.\n * @param schema - The entity schema.\n * @param models - The list of entities to insert.\n * @param updateIfExists - Whether to update the row if it already exists.\n * @returns The ID of the inserted row.\n */\n async insert<T extends object>(\n schema: EntitySchema<T>,\n models: T[],\n updateIfExists: boolean = false,\n ): Promise<number> {\n if (!models || models.length === 0) return 0;\n\n const query = await this.generateInsertScript(schema, models, updateIfExists);\n console.debug(\"INSERT SQL: \" + query.sql);\n console.debug(\"INSERT VALUES: \" + JSON.stringify(query.values));\n const sqlStatement = sql.prepare<UpdateQueryResponse>(query.sql);\n const updateQueryResponseResult = await sqlStatement.execute();\n return updateQueryResponseResult.rows.insertId;\n }\n\n /**\n * Retrieves the primary keys for the given entity schema.\n * @param schema - The entity schema.\n * @returns An array of primary key properties.\n * @throws If no primary keys are found.\n */\n private getPrimaryKeys<T extends object>(schema: EntitySchema<T>): EntityProperty<T, unknown>[] {\n const primaryKeys = schema.meta.props.filter((p) => p.primary);\n if (!primaryKeys.length) {\n throw new Error(`No primary keys found for schema: ${schema.meta.className}`);\n }\n return primaryKeys;\n }\n\n /**\n * Deletes a record by its ID.\n * @param id - The ID of the record to delete.\n * @param schema - The entity schema.\n * @returns The number of rows affected.\n * @throws If the entity has more than one primary key.\n */\n async deleteById<T extends object>(id: unknown, schema: EntitySchema<T>): Promise<number> {\n const primaryKeys = this.getPrimaryKeys(schema);\n if (primaryKeys.length > 1) {\n throw new Error(\"Only one primary key is supported\");\n }\n\n const primaryKey = primaryKeys[0];\n const queryBuilder = this.forgeOperations.createQueryBuilder(schema.meta.class).delete();\n queryBuilder.andWhere({ [primaryKey.name]: { $eq: id } });\n\n const query = queryBuilder.getFormattedQuery();\n console.debug(\"DELETE SQL: \" + query);\n\n const sqlStatement = sql.prepare<UpdateQueryResponse>(query);\n const updateQueryResponseResult = await sqlStatement.execute();\n return updateQueryResponseResult.rows.affectedRows;\n }\n\n /**\n * Updates a record by its ID.\n * @param entity - The entity with updated values.\n * @param schema - The entity schema.\n * @throws If the primary key value is missing in the entity.\n */\n async updateById<T extends object>(entity: T, schema: EntitySchema<T>): Promise<void> {\n const primaryKeys = this.getPrimaryKeys(schema);\n const queryBuilder = this.forgeOperations.createQueryBuilder(schema.meta.class).update(entity);\n\n primaryKeys.forEach((pk) => {\n const value = entity[pk.name];\n if (value === null || value === undefined) {\n throw new Error(`Primary Key ${pk.name} must exist in the model`);\n }\n queryBuilder.andWhere({ [pk.name]: { $eq: value } });\n });\n const query = queryBuilder.getFormattedQuery();\n console.debug(\"UPDATE SQL: \" + query);\n await this.forgeOperations.fetch().executeRawUpdateSQL(query);\n }\n}\n","import { sql, UpdateQueryResponse } from \"@forge/sql\";\nimport type { EntitySchema } from \"@mikro-orm/core/metadata/EntitySchema\";\nimport { parseDateTime } from \"../utils/sqlUtils\";\nimport { SchemaSqlForgeSql } from \"./ForgeSQLQueryBuilder\";\n\nexport class ForgeSQLSelectOperations implements SchemaSqlForgeSql {\n /**\n * Executes a schema-based SQL query and maps the result to the entity schema.\n * @param query - The SQL query to execute.\n * @param schema - The entity schema defining the structure.\n * @returns A list of mapped entity objects.\n */\n async executeSchemaSQL<T extends object>(query: string, schema: EntitySchema<T>): Promise<T[]> {\n const datas = await this.executeRawSQL<unknown>(query);\n if (!datas.length) return [];\n\n return datas.map((r) => {\n const rawModel = r as Record<string, unknown>;\n const newModel: Record<string, unknown> = {};\n\n schema.meta.props\n .filter((p) => p.kind === \"scalar\")\n .forEach((p) => {\n const fieldName = p.name;\n const fieldNames = p.fieldNames;\n const rawFieldName = fieldNames && Array.isArray(fieldNames)? fieldNames[0]: p.name;\n\n switch (p.type) {\n case \"datetime\":\n newModel[fieldName] = parseDateTime(\n rawModel[rawFieldName] as string,\n \"YYYY-MM-DDTHH:mm:ss.SSS\",\n );\n break;\n case \"date\":\n newModel[fieldName] = parseDateTime(rawModel[rawFieldName] as string, \"YYYY-MM-DD\");\n break;\n case \"time\":\n newModel[fieldName] = parseDateTime(rawModel[rawFieldName] as string, \"HH:mm:ss.SSS\");\n break;\n default:\n newModel[fieldName] = rawModel[rawFieldName];\n }\n });\n return newModel as T;\n });\n }\n\n /**\n * Executes a raw SQL query and returns the results.\n * @param query - The raw SQL query to execute.\n * @returns A list of results as objects.\n */\n async executeRawSQL<T extends object | unknown>(query: string): Promise<T[]> {\n console.debug(\"Executing raw SQL: \" + query);\n const sqlStatement = await sql.prepare<T>(query).execute();\n console.debug(\"Query result: \" + JSON.stringify(sqlStatement));\n return sqlStatement.rows as T[];\n }\n\n /**\n * Executes a raw SQL update query.\n * @param query - The raw SQL update query.\n * @returns The update response containing affected rows.\n */\n async executeRawUpdateSQL(query: string): Promise<UpdateQueryResponse> {\n console.debug(\"Executing update SQL: \" + query);\n const sqlStatement = sql.prepare<UpdateQueryResponse>(query);\n const updateQueryResponseResults = await sqlStatement.execute();\n return updateQueryResponseResults.rows;\n }\n}\n","import type { EntityName, LoggingOptions } from \"@mikro-orm/core\";\nimport type { EntitySchema } from \"@mikro-orm/core/metadata/EntitySchema\";\nimport type { AnyEntity, EntityClass, EntityClassGroup } from \"@mikro-orm/core/typings\";\nimport type { QueryBuilder } from \"@mikro-orm/knex/query\";\nimport { MemoryCacheAdapter, MikroORM, NullCacheAdapter } from \"@mikro-orm/mysql\";\nimport { ForgeSQLCrudOperations } from \"./ForgeSQLCrudOperations\";\nimport { CRUDForgeSQL, ForgeSqlOperation, SchemaSqlForgeSql } from \"./ForgeSQLQueryBuilder\";\nimport { ForgeSQLSelectOperations } from \"./ForgeSQLSelectOperations\";\nimport type { Knex } from \"knex\";\n\n/**\n * Implementation of ForgeSQLORM that interacts with MikroORM.\n */\nclass ForgeSQLORMImpl implements ForgeSqlOperation {\n private static instance: ForgeSQLORMImpl | null = null;\n private readonly mikroORM: MikroORM;\n private readonly crudOperations: CRUDForgeSQL;\n private readonly fetchOperations: SchemaSqlForgeSql;\n\n /**\n * Private constructor to enforce singleton behavior.\n * @param entities - The list of entities for ORM initialization.\n */\n private constructor(\n entities: (EntityClass<AnyEntity> | EntityClassGroup<AnyEntity> | EntitySchema)[],\n ) {\n console.debug(\"Initializing ForgeSQLORM...\");\n\n try {\n this.mikroORM = MikroORM.initSync({\n dbName: \"inmemory\",\n schemaGenerator: {\n disableForeignKeys: false,\n },\n discovery: {\n warnWhenNoEntities: true,\n },\n resultCache: {\n adapter: NullCacheAdapter,\n },\n metadataCache: {\n enabled: false,\n adapter: MemoryCacheAdapter,\n },\n entities: entities,\n preferTs: false,\n });\n\n this.crudOperations = new ForgeSQLCrudOperations(this);\n this.fetchOperations = new ForgeSQLSelectOperations();\n } catch (error) {\n console.error(\"ForgeSQLORM initialization failed:\", error);\n throw error; // Prevents inconsistent state\n }\n }\n\n /**\n * Returns the singleton instance of ForgeSQLORMImpl.\n * @param entities - List of entities (required only on first initialization).\n * @returns The singleton instance of ForgeSQLORMImpl.\n */\n static getInstance(\n entities: (EntityClass<AnyEntity> | EntityClassGroup<AnyEntity> | EntitySchema)[],\n ): ForgeSqlOperation {\n if (!ForgeSQLORMImpl.instance) {\n ForgeSQLORMImpl.instance = new ForgeSQLORMImpl(entities);\n }\n return ForgeSQLORMImpl.instance;\n }\n\n /**\n * Retrieves the CRUD operations instance.\n * @returns CRUD operations.\n */\n crud(): CRUDForgeSQL {\n return this.crudOperations;\n }\n\n /**\n * Retrieves the fetch operations instance.\n * @returns Fetch operations.\n */\n fetch(): SchemaSqlForgeSql {\n return this.fetchOperations;\n }\n\n /**\n * Creates a new query builder for the given entity.\n * @param entityName - The entity name or an existing query builder.\n * @param alias - The alias for the entity.\n * @param loggerContext - Logging options.\n * @returns The query builder instance.\n */\n createQueryBuilder<Entity extends object, RootAlias extends string = never>(\n entityName: EntityName<Entity> | QueryBuilder<Entity>,\n alias?: RootAlias,\n loggerContext?: LoggingOptions,\n ): QueryBuilder<Entity, RootAlias> {\n return this.mikroORM.em.createQueryBuilder(entityName, alias, undefined, loggerContext);\n }\n\n getKnex(): Knex<any, any[]> {\n return this.mikroORM.em.getKnex();\n }\n}\n\n/**\n * Public class that acts as a wrapper around the private ForgeSQLORMImpl.\n */\nclass ForgeSQLORM {\n private readonly ormInstance: ForgeSqlOperation;\n\n constructor(entities: (EntityClass<AnyEntity> | EntityClassGroup<AnyEntity> | EntitySchema)[]) {\n this.ormInstance = ForgeSQLORMImpl.getInstance(entities);\n }\n\n /**\n * Proxies the `crud` method from `ForgeSQLORMImpl`.\n * @returns CRUD operations.\n */\n crud(): CRUDForgeSQL {\n return this.ormInstance.crud();\n }\n\n /**\n * Proxies the `fetch` method from `ForgeSQLORMImpl`.\n * @returns Fetch operations.\n */\n fetch(): SchemaSqlForgeSql {\n return this.ormInstance.fetch();\n }\n\n getKnex(): Knex<any, any[]> {\n return this.ormInstance.getKnex();\n }\n\n /**\n * Proxies the `createQueryBuilder` method from `ForgeSQLORMImpl`.\n * @returns A new query builder instance.\n */\n createQueryBuilder<Entity extends object, RootAlias extends string = never>(\n entityName: EntityName<Entity> | QueryBuilder<Entity>,\n alias?: RootAlias,\n loggerContext?: LoggingOptions,\n ): QueryBuilder<Entity, RootAlias> {\n return this.ormInstance.createQueryBuilder(entityName, alias, loggerContext);\n }\n}\n\nexport default ForgeSQLORM;\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ForgeSQLORM.mjs","sources":["../src/utils/sqlUtils.ts","../src/core/ForgeSQLCrudOperations.ts","../src/core/ForgeSQLSelectOperations.ts","../src/core/ForgeSQLORM.ts"],"sourcesContent":["import { types } from \"@mikro-orm/core/types\";\nimport moment from \"moment\";\nimport { AnyString } from \"@mikro-orm/core/typings\";\n\nexport const transformValue = (value: {\n type: keyof typeof types | AnyString;\n value: unknown;\n}): unknown => {\n switch (value.type) {\n case \"text\":\n case \"string\":\n return `'${value.value}'`;\n case \"datetime\":\n return `'${moment(value.value as Date).format(\"YYYY-MM-DDTHH:mm:ss.SSS\")}'`;\n case \"date\":\n return `'${moment(value.value as Date).format(\"YYYY-MM-DD\")}'`;\n case \"time\":\n return `'${moment(value.value as Date).format(\"HH:mm:ss.SSS\")}'`;\n default:\n return value.value;\n }\n};\nexport const parseDateTime = (value: string, format: string): Date => {\n return moment(value, format).toDate();\n};\n","import { UpdateQueryResponse, sql } from \"@forge/sql\";\nimport { EntityProperty, EntitySchema, ForgeSqlOrmOptions } from \"..\";\nimport type { types } from \"@mikro-orm/core/types\";\nimport { transformValue } from \"../utils/sqlUtils\";\nimport { CRUDForgeSQL, ForgeSqlOperation } from \"./ForgeSQLQueryBuilder\";\n\nexport class ForgeSQLCrudOperations implements CRUDForgeSQL {\n private readonly forgeOperations: ForgeSqlOperation;\n private readonly options: ForgeSqlOrmOptions;\n\n constructor(forgeSqlOperations: ForgeSqlOperation, options: ForgeSqlOrmOptions) {\n this.forgeOperations = forgeSqlOperations;\n this.options = options;\n }\n\n /**\n * Generates an SQL insert query with values.\n * @param schema - The entity schema.\n * @param models - The list of entities to insert.\n * @param updateIfExists - Whether to update the row if it already exists.\n * @returns An object containing the SQL query, fields, and values.\n */\n private async generateInsertScript<T extends object>(\n schema: EntitySchema<T>,\n models: T[],\n updateIfExists: boolean,\n ): Promise<{\n sql: string;\n fields: string[];\n values: { type: keyof typeof types; value: unknown }[];\n }> {\n const fieldNames: Set<string> = new Set();\n const fieldValueMaps: Record<string, { type: keyof typeof types; value: unknown }>[] = [];\n\n models.forEach((model) => {\n const fieldValueMap: Record<string, { type: keyof typeof types; value: unknown }> = {};\n schema.meta.props.forEach((p) => {\n const modelValue = model[p.name];\n if (p.kind === \"scalar\" && modelValue !== undefined) {\n fieldNames.add(p.fieldNames[0] || p.name);\n fieldValueMap[p.fieldNames[0]] = {\n type: p.type as keyof typeof types,\n value: modelValue,\n };\n }\n });\n fieldValueMaps.push(fieldValueMap);\n });\n\n const fields = Array.from(fieldNames);\n const values = fieldValueMaps.flatMap((fieldValueMap) =>\n fields.map(\n (f) =>\n fieldValueMap[f] || {\n type: \"string\",\n value: null,\n },\n ),\n );\n\n return {\n sql: `INSERT INTO ${schema.meta.collection} (${fields.join(\",\")}) VALUES ${fieldValueMaps\n .map(\n (fieldValueMap) =>\n `(${fields\n .map((f) =>\n transformValue(\n fieldValueMap[f] || {\n type: \"string\",\n value: null,\n },\n ),\n )\n .join(\",\")})`,\n )\n .join(\n \", \",\n )} ${updateIfExists ? `ON DUPLICATE KEY UPDATE ${fields.map((f) => `${f} = VALUES(${f})`).join(\",\")}` : \"\"}`,\n fields,\n values,\n };\n }\n\n /**\n * Inserts records into the database.\n * @param schema - The entity schema.\n * @param models - The list of entities to insert.\n * @param updateIfExists - Whether to update the row if it already exists.\n * @returns The ID of the inserted row.\n */\n async insert<T extends object>(\n schema: EntitySchema<T>,\n models: T[],\n updateIfExists: boolean = false,\n ): Promise<number> {\n if (!models || models.length === 0) return 0;\n\n const query = await this.generateInsertScript(schema, models, updateIfExists);\n if (this.options?.logRawSqlQuery) {\n console.debug(\"INSERT SQL: \" + query.sql);\n }\n const sqlStatement = sql.prepare<UpdateQueryResponse>(query.sql);\n const updateQueryResponseResult = await sqlStatement.execute();\n return updateQueryResponseResult.rows.insertId;\n }\n\n /**\n * Retrieves the primary keys for the given entity schema.\n * @param schema - The entity schema.\n * @returns An array of primary key properties.\n * @throws If no primary keys are found.\n */\n private getPrimaryKeys<T extends object>(schema: EntitySchema<T>): EntityProperty<T, unknown>[] {\n const primaryKeys = schema.meta.props.filter((p) => p.primary);\n if (!primaryKeys.length) {\n throw new Error(`No primary keys found for schema: ${schema.meta.className}`);\n }\n return primaryKeys;\n }\n\n /**\n * Deletes a record by its ID.\n * @param id - The ID of the record to delete.\n * @param schema - The entity schema.\n * @returns The number of rows affected.\n * @throws If the entity has more than one primary key.\n */\n async deleteById<T extends object>(id: unknown, schema: EntitySchema<T>): Promise<number> {\n const primaryKeys = this.getPrimaryKeys(schema);\n if (primaryKeys.length > 1) {\n throw new Error(\"Only one primary key is supported\");\n }\n\n const primaryKey = primaryKeys[0];\n const queryBuilder = this.forgeOperations.createQueryBuilder(schema.meta.class).delete();\n queryBuilder.andWhere({ [primaryKey.name]: { $eq: id } });\n\n const query = queryBuilder.getFormattedQuery();\n if (this.options?.logRawSqlQuery) {\n console.debug(\"DELETE SQL: \" + query);\n }\n const sqlStatement = sql.prepare<UpdateQueryResponse>(query);\n const updateQueryResponseResult = await sqlStatement.execute();\n return updateQueryResponseResult.rows.affectedRows;\n }\n\n /**\n * Updates a record by its ID.\n * @param entity - The entity with updated values.\n * @param schema - The entity schema.\n * @throws If the primary key value is missing in the entity.\n */\n async updateById<T extends object>(entity: T, schema: EntitySchema<T>): Promise<void> {\n const primaryKeys = this.getPrimaryKeys(schema);\n const queryBuilder = this.forgeOperations.createQueryBuilder(schema.meta.class).update(entity);\n\n primaryKeys.forEach((pk) => {\n const value = entity[pk.name];\n if (value === null || value === undefined) {\n throw new Error(`Primary Key ${pk.name} must exist in the model`);\n }\n queryBuilder.andWhere({ [pk.name]: { $eq: value } });\n });\n const query = queryBuilder.getFormattedQuery();\n if (this.options?.logRawSqlQuery) {\n console.debug(\"UPDATE SQL: \" + query);\n }\n await this.forgeOperations.fetch().executeRawUpdateSQL(query);\n }\n}\n","import { sql, UpdateQueryResponse } from \"@forge/sql\";\nimport type { EntitySchema } from \"@mikro-orm/core/metadata/EntitySchema\";\nimport { parseDateTime } from \"../utils/sqlUtils\";\nimport { ForgeSqlOrmOptions, SchemaSqlForgeSql } from \"./ForgeSQLQueryBuilder\";\n\nexport class ForgeSQLSelectOperations implements SchemaSqlForgeSql {\n private readonly options: ForgeSqlOrmOptions;\n\n constructor(options: ForgeSqlOrmOptions) {\n this.options = options;\n }\n\n /**\n * Executes a schema-based SQL query and maps the result to the entity schema.\n * @param query - The SQL query to execute.\n * @param schema - The entity schema defining the structure.\n * @returns A list of mapped entity objects.\n */\n async executeSchemaSQL<T extends object>(query: string, schema: EntitySchema<T>): Promise<T[]> {\n const datas = await this.executeRawSQL<unknown>(query);\n if (!datas.length) return [];\n\n return datas.map((r) => {\n const rawModel = r as Record<string, unknown>;\n const newModel: Record<string, unknown> = {};\n\n schema.meta.props\n .filter((p) => p.kind === \"scalar\")\n .forEach((p) => {\n const fieldName = p.name;\n const fieldNames = p.fieldNames;\n const rawFieldName = fieldNames && Array.isArray(fieldNames) ? fieldNames[0] : p.name;\n\n switch (p.type) {\n case \"datetime\":\n newModel[fieldName] = parseDateTime(\n rawModel[rawFieldName] as string,\n \"YYYY-MM-DDTHH:mm:ss.SSS\",\n );\n break;\n case \"date\":\n newModel[fieldName] = parseDateTime(rawModel[rawFieldName] as string, \"YYYY-MM-DD\");\n break;\n case \"time\":\n newModel[fieldName] = parseDateTime(rawModel[rawFieldName] as string, \"HH:mm:ss.SSS\");\n break;\n default:\n newModel[fieldName] = rawModel[rawFieldName];\n }\n });\n return newModel as T;\n });\n }\n\n /**\n * Executes a raw SQL query and returns the results.\n * @param query - The raw SQL query to execute.\n * @returns A list of results as objects.\n */\n async executeRawSQL<T extends object | unknown>(query: string): Promise<T[]> {\n if (this.options.logRawSqlQuery) {\n console.debug(\"Executing raw SQL: \" + query);\n }\n const sqlStatement = await sql.prepare<T>(query).execute();\n return sqlStatement.rows as T[];\n }\n\n /**\n * Executes a raw SQL update query.\n * @param query - The raw SQL update query.\n * @returns The update response containing affected rows.\n */\n async executeRawUpdateSQL(query: string): Promise<UpdateQueryResponse> {\n if (this.options.logRawSqlQuery) {\n console.debug(\"Executing update SQL: \" + query);\n }\n const sqlStatement = sql.prepare<UpdateQueryResponse>(query);\n const updateQueryResponseResults = await sqlStatement.execute();\n return updateQueryResponseResults.rows;\n }\n}\n","import type { EntityName, LoggingOptions } from \"@mikro-orm/core\";\nimport type { EntitySchema } from \"@mikro-orm/core/metadata/EntitySchema\";\nimport type { AnyEntity, EntityClass, EntityClassGroup } from \"@mikro-orm/core/typings\";\nimport type { QueryBuilder } from \"@mikro-orm/knex/query\";\nimport { MemoryCacheAdapter, MikroORM, NullCacheAdapter } from \"@mikro-orm/mysql\";\nimport { ForgeSQLCrudOperations } from \"./ForgeSQLCrudOperations\";\nimport {\n CRUDForgeSQL,\n ForgeSqlOperation,\n ForgeSqlOrmOptions,\n SchemaSqlForgeSql,\n} from \"./ForgeSQLQueryBuilder\";\nimport { ForgeSQLSelectOperations } from \"./ForgeSQLSelectOperations\";\nimport type { Knex } from \"knex\";\n\n/**\n * Implementation of ForgeSQLORM that interacts with MikroORM.\n */\nclass ForgeSQLORMImpl implements ForgeSqlOperation {\n private static instance: ForgeSQLORMImpl | null = null;\n private readonly mikroORM: MikroORM;\n private readonly crudOperations: CRUDForgeSQL;\n private readonly fetchOperations: SchemaSqlForgeSql;\n\n /**\n * Private constructor to enforce singleton behavior.\n * @param entities - The list of entities for ORM initialization.\n * @param options - Options for configuring ForgeSQL ORM behavior.\n */\n private constructor(\n entities: (EntityClass<AnyEntity> | EntityClassGroup<AnyEntity> | EntitySchema)[],\n options?: ForgeSqlOrmOptions,\n ) {\n console.debug(\"Initializing ForgeSQLORM...\");\n\n try {\n this.mikroORM = MikroORM.initSync({\n dbName: \"inmemory\",\n schemaGenerator: {\n disableForeignKeys: false,\n },\n discovery: {\n warnWhenNoEntities: true,\n },\n resultCache: {\n adapter: NullCacheAdapter,\n },\n metadataCache: {\n enabled: false,\n adapter: MemoryCacheAdapter,\n },\n entities: entities,\n preferTs: false,\n debug: false,\n });\n const newOptions: ForgeSqlOrmOptions = options ?? { logRawSqlQuery: false };\n this.crudOperations = new ForgeSQLCrudOperations(this, newOptions);\n this.fetchOperations = new ForgeSQLSelectOperations(newOptions);\n } catch (error) {\n console.error(\"ForgeSQLORM initialization failed:\", error);\n throw error; // Prevents inconsistent state\n }\n }\n\n /**\n * Returns the singleton instance of ForgeSQLORMImpl.\n * @param entities - List of entities (required only on first initialization).\n * @returns The singleton instance of ForgeSQLORMImpl.\n */\n static getInstance(\n entities: (EntityClass<AnyEntity> | EntityClassGroup<AnyEntity> | EntitySchema)[],\n ): ForgeSqlOperation {\n if (!ForgeSQLORMImpl.instance) {\n ForgeSQLORMImpl.instance = new ForgeSQLORMImpl(entities);\n }\n return ForgeSQLORMImpl.instance;\n }\n\n /**\n * Retrieves the CRUD operations instance.\n * @returns CRUD operations.\n */\n crud(): CRUDForgeSQL {\n return this.crudOperations;\n }\n\n /**\n * Retrieves the fetch operations instance.\n * @returns Fetch operations.\n */\n fetch(): SchemaSqlForgeSql {\n return this.fetchOperations;\n }\n\n /**\n * Creates a new query builder for the given entity.\n * @param entityName - The entity name or an existing query builder.\n * @param alias - The alias for the entity.\n * @param loggerContext - Logging options.\n * @returns The query builder instance.\n */\n createQueryBuilder<Entity extends object, RootAlias extends string = never>(\n entityName: EntityName<Entity> | QueryBuilder<Entity>,\n alias?: RootAlias,\n loggerContext?: LoggingOptions,\n ): QueryBuilder<Entity, RootAlias> {\n return this.mikroORM.em.createQueryBuilder(entityName, alias, undefined, loggerContext);\n }\n\n /**\n * Provides access to the underlying Knex instance for executing raw queries and building complex query parts.\n * enabling advanced query customization and performance tuning.\n * @returns The Knex instance, which can be used for query building.\n */\n getKnex(): Knex<any, any[]> {\n return this.mikroORM.em.getKnex();\n }\n}\n\n/**\n * Public class that acts as a wrapper around the private ForgeSQLORMImpl.\n */\nclass ForgeSQLORM {\n private readonly ormInstance: ForgeSqlOperation;\n\n constructor(entities: (EntityClass<AnyEntity> | EntityClassGroup<AnyEntity> | EntitySchema)[]) {\n this.ormInstance = ForgeSQLORMImpl.getInstance(entities);\n }\n\n /**\n * Proxies the `crud` method from `ForgeSQLORMImpl`.\n * @returns CRUD operations.\n */\n crud(): CRUDForgeSQL {\n return this.ormInstance.crud();\n }\n\n /**\n * Proxies the `fetch` method from `ForgeSQLORMImpl`.\n * @returns Fetch operations.\n */\n fetch(): SchemaSqlForgeSql {\n return this.ormInstance.fetch();\n }\n\n getKnex(): Knex<any, any[]> {\n return this.ormInstance.getKnex();\n }\n\n /**\n * Proxies the `createQueryBuilder` method from `ForgeSQLORMImpl`.\n * @returns A new query builder instance.\n */\n createQueryBuilder<Entity extends object, RootAlias extends string = never>(\n entityName: EntityName<Entity> | QueryBuilder<Entity>,\n alias?: RootAlias,\n loggerContext?: LoggingOptions,\n ): QueryBuilder<Entity, RootAlias> {\n return this.ormInstance.createQueryBuilder(entityName, alias, loggerContext);\n }\n}\n\nexport default ForgeSQLORM;\n"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { EntitySchema } from "..";
|
|
1
|
+
import { EntitySchema, ForgeSqlOrmOptions } from "..";
|
|
2
2
|
import { CRUDForgeSQL, ForgeSqlOperation } from "./ForgeSQLQueryBuilder";
|
|
3
3
|
export declare class ForgeSQLCrudOperations implements CRUDForgeSQL {
|
|
4
4
|
private readonly forgeOperations;
|
|
5
|
-
|
|
5
|
+
private readonly options;
|
|
6
|
+
constructor(forgeSqlOperations: ForgeSqlOperation, options: ForgeSqlOrmOptions);
|
|
6
7
|
/**
|
|
7
8
|
* Generates an SQL insert query with values.
|
|
8
9
|
* @param schema - The entity schema.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ForgeSQLCrudOperations.d.ts","sourceRoot":"","sources":["../../src/core/ForgeSQLCrudOperations.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,YAAY,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"ForgeSQLCrudOperations.d.ts","sourceRoot":"","sources":["../../src/core/ForgeSQLCrudOperations.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,YAAY,EAAE,kBAAkB,EAAE,MAAM,IAAI,CAAC;AAGtE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEzE,qBAAa,sBAAuB,YAAW,YAAY;IACzD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoB;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;gBAEjC,kBAAkB,EAAE,iBAAiB,EAAE,OAAO,EAAE,kBAAkB;IAK9E;;;;;;OAMG;YACW,oBAAoB;IA6DlC;;;;;;OAMG;IACG,MAAM,CAAC,CAAC,SAAS,MAAM,EAC3B,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,EACvB,MAAM,EAAE,CAAC,EAAE,EACX,cAAc,GAAE,OAAe,GAC9B,OAAO,CAAC,MAAM,CAAC;IAYlB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAQtB;;;;;;OAMG;IACG,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBzF;;;;;OAKG;IACG,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAiBtF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ForgeSQLORM.d.ts","sourceRoot":"","sources":["../../src/core/ForgeSQLORM.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACxF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG1D,OAAO,
|
|
1
|
+
{"version":3,"file":"ForgeSQLORM.d.ts","sourceRoot":"","sources":["../../src/core/ForgeSQLORM.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACxF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG1D,OAAO,EACL,YAAY,EAGZ,iBAAiB,EAClB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AA0GjC;;GAEG;AACH,cAAM,WAAW;IACf,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;gBAEpC,QAAQ,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,gBAAgB,CAAC,SAAS,CAAC,GAAG,YAAY,CAAC,EAAE;IAI7F;;;OAGG;IACH,IAAI,IAAI,YAAY;IAIpB;;;OAGG;IACH,KAAK,IAAI,iBAAiB;IAI1B,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IAI3B;;;OAGG;IACH,kBAAkB,CAAC,MAAM,SAAS,MAAM,EAAE,SAAS,SAAS,MAAM,GAAG,KAAK,EACxE,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,EACrD,KAAK,CAAC,EAAE,SAAS,EACjB,aAAa,CAAC,EAAE,cAAc,GAC7B,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC;CAGnC;AAED,eAAe,WAAW,CAAC"}
|
|
@@ -16,6 +16,15 @@ export interface ForgeSqlOperation extends QueryBuilderForgeSql {
|
|
|
16
16
|
*/
|
|
17
17
|
fetch(): SchemaSqlForgeSql;
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Options for configuring ForgeSQL ORM behavior.
|
|
21
|
+
*/
|
|
22
|
+
export interface ForgeSqlOrmOptions {
|
|
23
|
+
/**
|
|
24
|
+
* Enables logging of raw SQL queries in the Atlassian Forge Developer Console.
|
|
25
|
+
*/
|
|
26
|
+
logRawSqlQuery?: boolean;
|
|
27
|
+
}
|
|
19
28
|
/**
|
|
20
29
|
* Interface for schema-level SQL operations.
|
|
21
30
|
*/
|
|
@@ -78,6 +87,11 @@ export interface QueryBuilderForgeSql {
|
|
|
78
87
|
* @returns The query builder instance.
|
|
79
88
|
*/
|
|
80
89
|
createQueryBuilder<Entity extends object, RootAlias extends string = never>(entityName: EntityName<Entity> | QueryBuilder<Entity>, alias?: RootAlias, loggerContext?: LoggingOptions): QueryBuilder<Entity, RootAlias>;
|
|
90
|
+
/**
|
|
91
|
+
* Provides access to the underlying Knex instance for executing raw queries and building complex query parts.
|
|
92
|
+
* enabling advanced query customization and performance tuning.
|
|
93
|
+
* @returns The Knex instance, which can be used for query building.
|
|
94
|
+
*/
|
|
81
95
|
getKnex(): Knex<any, any[]>;
|
|
82
96
|
}
|
|
83
97
|
//# sourceMappingURL=ForgeSQLQueryBuilder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ForgeSQLQueryBuilder.d.ts","sourceRoot":"","sources":["../../src/core/ForgeSQLQueryBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,oBAAoB;IAC7D;;OAEG;IACH,IAAI,IAAI,YAAY,CAAC;IAErB;;OAEG;IACH,KAAK,IAAI,iBAAiB,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;;OAKG;IACH,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAEzF;;;;OAIG;IACH,aAAa,CAAC,CAAC,SAAS,MAAM,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAEvE;;;;OAIG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CAClE;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;;OAMG;IACH,MAAM,CAAC,CAAC,SAAS,MAAM,EACrB,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,EACvB,MAAM,EAAE,CAAC,EAAE,EACX,cAAc,CAAC,EAAE,OAAO,GACvB,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnB;;;;;OAKG;IACH,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEpF;;;;OAIG;IACH,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjF;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;;OAMG;IACH,kBAAkB,CAAC,MAAM,SAAS,MAAM,EAAE,SAAS,SAAS,MAAM,GAAG,KAAK,EACxE,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,EACrD,KAAK,CAAC,EAAE,SAAS,EACjB,aAAa,CAAC,EAAE,cAAc,GAC7B,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAEnC,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;CAC7B"}
|
|
1
|
+
{"version":3,"file":"ForgeSQLQueryBuilder.d.ts","sourceRoot":"","sources":["../../src/core/ForgeSQLQueryBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,oBAAoB;IAC7D;;OAEG;IACH,IAAI,IAAI,YAAY,CAAC;IAErB;;OAEG;IACH,KAAK,IAAI,iBAAiB,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;;OAKG;IACH,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAEzF;;;;OAIG;IACH,aAAa,CAAC,CAAC,SAAS,MAAM,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAEvE;;;;OAIG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CAClE;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;;OAMG;IACH,MAAM,CAAC,CAAC,SAAS,MAAM,EACrB,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,EACvB,MAAM,EAAE,CAAC,EAAE,EACX,cAAc,CAAC,EAAE,OAAO,GACvB,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnB;;;;;OAKG;IACH,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEpF;;;;OAIG;IACH,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjF;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;;OAMG;IACH,kBAAkB,CAAC,MAAM,SAAS,MAAM,EAAE,SAAS,SAAS,MAAM,GAAG,KAAK,EACxE,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,EACrD,KAAK,CAAC,EAAE,SAAS,EACjB,aAAa,CAAC,EAAE,cAAc,GAC7B,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAEnC;;;;OAIG;IACH,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;CAC7B"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { UpdateQueryResponse } from "@forge/sql";
|
|
2
2
|
import type { EntitySchema } from "@mikro-orm/core/metadata/EntitySchema";
|
|
3
|
-
import { SchemaSqlForgeSql } from "./ForgeSQLQueryBuilder";
|
|
3
|
+
import { ForgeSqlOrmOptions, SchemaSqlForgeSql } from "./ForgeSQLQueryBuilder";
|
|
4
4
|
export declare class ForgeSQLSelectOperations implements SchemaSqlForgeSql {
|
|
5
|
+
private readonly options;
|
|
6
|
+
constructor(options: ForgeSqlOrmOptions);
|
|
5
7
|
/**
|
|
6
8
|
* Executes a schema-based SQL query and maps the result to the entity schema.
|
|
7
9
|
* @param query - The SQL query to execute.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ForgeSQLSelectOperations.d.ts","sourceRoot":"","sources":["../../src/core/ForgeSQLSelectOperations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAE1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"ForgeSQLSelectOperations.d.ts","sourceRoot":"","sources":["../../src/core/ForgeSQLSelectOperations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAE1E,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE/E,qBAAa,wBAAyB,YAAW,iBAAiB;IAChE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;gBAEjC,OAAO,EAAE,kBAAkB;IAIvC;;;;;OAKG;IACG,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAoC9F;;;;OAIG;IACG,aAAa,CAAC,CAAC,SAAS,MAAM,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAQ5E;;;;OAIG;IACG,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAQvE"}
|