forge-sql-orm 1.0.16 → 1.0.18

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.
@@ -1,8 +1,9 @@
1
- import { MikroORM, MemoryCacheAdapter, NullCacheAdapter } from "@mikro-orm/mysql";
2
- export * from "@mikro-orm/mysql";
3
- import { sql } from "@forge/sql";
4
- import moment from "moment";
5
- export * from "@mikro-orm/entity-generator";
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ const mysql = require("@mikro-orm/mysql");
4
+ const sql = require("@forge/sql");
5
+ const moment = require("moment");
6
+ const entityGenerator = require("@mikro-orm/entity-generator");
6
7
  const transformValue = (value) => {
7
8
  switch (value.type) {
8
9
  case "text":
@@ -88,7 +89,7 @@ class ForgeSQLCrudOperations {
88
89
  const query = await this.generateInsertScript(schema, models, updateIfExists);
89
90
  console.debug("INSERT SQL: " + query.sql);
90
91
  console.debug("INSERT VALUES: " + JSON.stringify(query.values));
91
- const sqlStatement = sql.prepare(query.sql);
92
+ const sqlStatement = sql.sql.prepare(query.sql);
92
93
  const updateQueryResponseResult = await sqlStatement.execute();
93
94
  return updateQueryResponseResult.rows.insertId;
94
95
  }
@@ -122,7 +123,7 @@ class ForgeSQLCrudOperations {
122
123
  queryBuilder.andWhere({ [primaryKey.name]: { $eq: id } });
123
124
  const query = queryBuilder.getFormattedQuery();
124
125
  console.debug("DELETE SQL: " + query);
125
- const sqlStatement = sql.prepare(query);
126
+ const sqlStatement = sql.sql.prepare(query);
126
127
  const updateQueryResponseResult = await sqlStatement.execute();
127
128
  return updateQueryResponseResult.rows.affectedRows;
128
129
  }
@@ -191,7 +192,7 @@ class ForgeSQLSelectOperations {
191
192
  */
192
193
  async executeRawSQL(query) {
193
194
  console.debug("Executing raw SQL: " + query);
194
- const sqlStatement = await sql.prepare(query).execute();
195
+ const sqlStatement = await sql.sql.prepare(query).execute();
195
196
  console.debug("Query result: " + JSON.stringify(sqlStatement));
196
197
  return sqlStatement.rows;
197
198
  }
@@ -202,7 +203,7 @@ class ForgeSQLSelectOperations {
202
203
  */
203
204
  async executeRawUpdateSQL(query) {
204
205
  console.debug("Executing update SQL: " + query);
205
- const sqlStatement = sql.prepare(query);
206
+ const sqlStatement = sql.sql.prepare(query);
206
207
  const updateQueryResponseResults = await sqlStatement.execute();
207
208
  return updateQueryResponseResults.rows;
208
209
  }
@@ -219,7 +220,7 @@ class ForgeSQLORMImpl {
219
220
  constructor(entities) {
220
221
  console.debug("Initializing ForgeSQLORM...");
221
222
  try {
222
- this.mikroORM = MikroORM.initSync({
223
+ this.mikroORM = mysql.MikroORM.initSync({
223
224
  dbName: "inmemory",
224
225
  schemaGenerator: {
225
226
  disableForeignKeys: false
@@ -228,11 +229,11 @@ class ForgeSQLORMImpl {
228
229
  warnWhenNoEntities: true
229
230
  },
230
231
  resultCache: {
231
- adapter: NullCacheAdapter
232
+ adapter: mysql.NullCacheAdapter
232
233
  },
233
234
  metadataCache: {
234
235
  enabled: false,
235
- adapter: MemoryCacheAdapter
236
+ adapter: mysql.MemoryCacheAdapter
236
237
  },
237
238
  entities,
238
239
  preferTs: false
@@ -313,9 +314,19 @@ class ForgeSQLORM {
313
314
  return this.ormInstance.createQueryBuilder(entityName, alias, loggerContext);
314
315
  }
315
316
  }
316
- export {
317
- ForgeSQLCrudOperations,
318
- ForgeSQLSelectOperations,
319
- ForgeSQLORM as default
320
- };
321
- //# sourceMappingURL=ForgeSQLORM.mjs.map
317
+ exports.ForgeSQLCrudOperations = ForgeSQLCrudOperations;
318
+ exports.ForgeSQLSelectOperations = ForgeSQLSelectOperations;
319
+ exports.default = ForgeSQLORM;
320
+ Object.keys(mysql).forEach((k) => {
321
+ if (k !== "default" && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
322
+ enumerable: true,
323
+ get: () => mysql[k]
324
+ });
325
+ });
326
+ Object.keys(entityGenerator).forEach((k) => {
327
+ if (k !== "default" && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
328
+ enumerable: true,
329
+ get: () => entityGenerator[k]
330
+ });
331
+ });
332
+ //# sourceMappingURL=ForgeSQLORM.cjs.map
@@ -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":";;;;;AAIa,MAAA,iBAAiB,CAAC,UAGhB;AACb,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AAAA,IACL,KAAK;AACI,aAAA,IAAI,MAAM,KAAK;AAAA,IACxB,KAAK;AACH,aAAO,IAAI,OAAO,MAAM,KAAa,EAAE,OAAO,yBAAyB,CAAC;AAAA,IAC1E,KAAK;AACH,aAAO,IAAI,OAAO,MAAM,KAAa,EAAE,OAAO,YAAY,CAAC;AAAA,IAC7D,KAAK;AACH,aAAO,IAAI,OAAO,MAAM,KAAa,EAAE,OAAO,cAAc,CAAC;AAAA,IAC/D;AACE,aAAO,MAAM;AAAA,EAAA;AAEnB;AACa,MAAA,gBAAgB,CAAC,OAAe,WAAyB;AACpE,SAAO,OAAO,OAAO,MAAM,EAAE,OAAO;AACtC;AClBO,MAAM,uBAA+C;AAAA,EACzC;AAAA,EAEjB,YAAY,oBAAuC;AACjD,SAAK,kBAAkB;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUzB,MAAc,qBACZ,QACA,QACA,gBAKC;AACK,UAAA,iCAA8B,IAAI;AACxC,UAAM,iBAAiF,CAAC;AAEjF,WAAA,QAAQ,CAAC,UAAU;AACxB,YAAM,gBAA8E,CAAC;AACrF,aAAO,KAAK,MAAM,QAAQ,CAAC,MAAM;AACzB,cAAA,aAAa,MAAM,EAAE,IAAI;AAC/B,YAAI,EAAE,SAAS,YAAY,eAAe,QAAW;AACnD,qBAAW,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,IAAI;AACxC,wBAAc,EAAE,WAAW,CAAC,CAAC,IAAI;AAAA,YAC/B,MAAM,EAAE;AAAA,YACR,OAAO;AAAA,UACT;AAAA,QAAA;AAAA,MACF,CACD;AACD,qBAAe,KAAK,aAAa;AAAA,IAAA,CAClC;AAEK,UAAA,SAAS,MAAM,KAAK,UAAU;AACpC,UAAM,SAAS,eAAe;AAAA,MAAQ,CAAC,kBACrC,OAAO;AAAA,QACL,CAAC,MACC,cAAc,CAAC,KAAK;AAAA,UAClB,MAAM;AAAA,UACN,OAAO;AAAA,QAAA;AAAA,MACT;AAAA,IAEN;AAEO,WAAA;AAAA,MACL,KAAK,eAAe,OAAO,KAAK,UAAU,KAAK,OAAO,KAAK,GAAG,CAAC,YAAY,eACxE;AAAA,QACC,CAAC,kBACC,IAAI,OACD;AAAA,UAAI,CAAC,MACJ;AAAA,YACE,cAAc,CAAC,KAAK;AAAA,cAClB,MAAM;AAAA,cACN,OAAO;AAAA,YAAA;AAAA,UACT;AAAA,QACF,EAED,KAAK,GAAG,CAAC;AAAA,MAAA,EAEf;AAAA,QACC;AAAA,MAAA,CACD,IAAI,iBAAiB,2BAA2B,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,KAAK,EAAE;AAAA,MAC5G;AAAA,MACA;AAAA,IACF;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUF,MAAM,OACJ,QACA,QACA,iBAA0B,OACT;AACjB,QAAI,CAAC,UAAU,OAAO,WAAW,EAAU,QAAA;AAE3C,UAAM,QAAQ,MAAM,KAAK,qBAAqB,QAAQ,QAAQ,cAAc;AACpE,YAAA,MAAM,iBAAiB,MAAM,GAAG;AACxC,YAAQ,MAAM,oBAAoB,KAAK,UAAU,MAAM,MAAM,CAAC;AAC9D,UAAM,eAAe,IAAI,QAA6B,MAAM,GAAG;AACzD,UAAA,4BAA4B,MAAM,aAAa,QAAQ;AAC7D,WAAO,0BAA0B,KAAK;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAShC,eAAiC,QAAuD;AACxF,UAAA,cAAc,OAAO,KAAK,MAAM,OAAO,CAAC,MAAM,EAAE,OAAO;AACzD,QAAA,CAAC,YAAY,QAAQ;AACvB,YAAM,IAAI,MAAM,qCAAqC,OAAO,KAAK,SAAS,EAAE;AAAA,IAAA;AAEvE,WAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUT,MAAM,WAA6B,IAAa,QAA0C;AAClF,UAAA,cAAc,KAAK,eAAe,MAAM;AAC1C,QAAA,YAAY,SAAS,GAAG;AACpB,YAAA,IAAI,MAAM,mCAAmC;AAAA,IAAA;AAG/C,UAAA,aAAa,YAAY,CAAC;AAC1B,UAAA,eAAe,KAAK,gBAAgB,mBAAmB,OAAO,KAAK,KAAK,EAAE,OAAO;AAC1E,iBAAA,SAAS,EAAE,CAAC,WAAW,IAAI,GAAG,EAAE,KAAK,GAAG,GAAG;AAElD,UAAA,QAAQ,aAAa,kBAAkB;AACrC,YAAA,MAAM,iBAAiB,KAAK;AAE9B,UAAA,eAAe,IAAI,QAA6B,KAAK;AACrD,UAAA,4BAA4B,MAAM,aAAa,QAAQ;AAC7D,WAAO,0BAA0B,KAAK;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASxC,MAAM,WAA6B,QAAW,QAAwC;AAC9E,UAAA,cAAc,KAAK,eAAe,MAAM;AACxC,UAAA,eAAe,KAAK,gBAAgB,mBAAmB,OAAO,KAAK,KAAK,EAAE,OAAO,MAAM;AAEjF,gBAAA,QAAQ,CAAC,OAAO;AACpB,YAAA,QAAQ,OAAO,GAAG,IAAI;AACxB,UAAA,UAAU,QAAQ,UAAU,QAAW;AACzC,cAAM,IAAI,MAAM,eAAe,GAAG,IAAI,0BAA0B;AAAA,MAAA;AAErD,mBAAA,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,EAAE,KAAK,MAAM,GAAG;AAAA,IAAA,CACpD;AACK,UAAA,QAAQ,aAAa,kBAAkB;AACrC,YAAA,MAAM,iBAAiB,KAAK;AACpC,UAAM,KAAK,gBAAgB,MAAM,EAAE,oBAAoB,KAAK;AAAA,EAAA;AAEhE;AC9JO,MAAM,yBAAsD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjE,MAAM,iBAAmC,OAAe,QAAuC;AAC7F,UAAM,QAAQ,MAAM,KAAK,cAAuB,KAAK;AACrD,QAAI,CAAC,MAAM,OAAQ,QAAO,CAAC;AAEpB,WAAA,MAAM,IAAI,CAAC,MAAM;AACtB,YAAM,WAAW;AACjB,YAAM,WAAoC,CAAC;AAEpC,aAAA,KAAK,MACT,OAAO,CAAC,MAAM,EAAE,SAAS,QAAQ,EACjC,QAAQ,CAAC,MAAM;AACd,cAAM,YAAY,EAAE;AACpB,cAAM,aAAa,EAAE;AACf,cAAA,eAAe,cAAc,MAAM,QAAQ,UAAU,IAAG,WAAW,CAAC,IAAG,EAAE;AAE/E,gBAAQ,EAAE,MAAM;AAAA,UACd,KAAK;AACH,qBAAS,SAAS,IAAI;AAAA,cACpB,SAAS,YAAY;AAAA,cACrB;AAAA,YACF;AACA;AAAA,UACF,KAAK;AACH,qBAAS,SAAS,IAAI,cAAc,SAAS,YAAY,GAAa,YAAY;AAClF;AAAA,UACF,KAAK;AACH,qBAAS,SAAS,IAAI,cAAc,SAAS,YAAY,GAAa,cAAc;AACpF;AAAA,UACF;AACW,qBAAA,SAAS,IAAI,SAAS,YAAY;AAAA,QAAA;AAAA,MAC/C,CACD;AACI,aAAA;AAAA,IAAA,CACR;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQH,MAAM,cAA0C,OAA6B;AACnE,YAAA,MAAM,wBAAwB,KAAK;AAC3C,UAAM,eAAe,MAAM,IAAI,QAAW,KAAK,EAAE,QAAQ;AACzD,YAAQ,MAAM,mBAAmB,KAAK,UAAU,YAAY,CAAC;AAC7D,WAAO,aAAa;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQtB,MAAM,oBAAoB,OAA6C;AAC7D,YAAA,MAAM,2BAA2B,KAAK;AACxC,UAAA,eAAe,IAAI,QAA6B,KAAK;AACrD,UAAA,6BAA6B,MAAM,aAAa,QAAQ;AAC9D,WAAO,2BAA2B;AAAA,EAAA;AAEtC;AC1DA,MAAM,gBAA6C;AAAA,EACjD,OAAe,WAAmC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,YACN,UACA;AACA,YAAQ,MAAM,6BAA6B;AAEvC,QAAA;AACG,WAAA,WAAW,SAAS,SAAS;AAAA,QAChC,QAAQ;AAAA,QACR,iBAAiB;AAAA,UACf,oBAAoB;AAAA,QACtB;AAAA,QACA,WAAW;AAAA,UACT,oBAAoB;AAAA,QACtB;AAAA,QACA,aAAa;AAAA,UACX,SAAS;AAAA,QACX;AAAA,QACA,eAAe;AAAA,UACb,SAAS;AAAA,UACT,SAAS;AAAA,QACX;AAAA,QACA;AAAA,QACA,UAAU;AAAA,MAAA,CACX;AAEI,WAAA,iBAAiB,IAAI,uBAAuB,IAAI;AAChD,WAAA,kBAAkB,IAAI,yBAAyB;AAAA,aAC7C,OAAO;AACN,cAAA,MAAM,sCAAsC,KAAK;AACnD,YAAA;AAAA,IAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQF,OAAO,YACL,UACmB;AACf,QAAA,CAAC,gBAAgB,UAAU;AACb,sBAAA,WAAW,IAAI,gBAAgB,QAAQ;AAAA,IAAA;AAEzD,WAAO,gBAAgB;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOzB,OAAqB;AACnB,WAAO,KAAK;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOd,QAA2B;AACzB,WAAO,KAAK;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUd,mBACE,YACA,OACA,eACiC;AACjC,WAAO,KAAK,SAAS,GAAG,mBAAmB,YAAY,OAAO,QAAW,aAAa;AAAA,EAAA;AAAA,EAGxF,UAA4B;AACnB,WAAA,KAAK,SAAS,GAAG,QAAQ;AAAA,EAAA;AAEpC;AAKA,MAAM,YAAY;AAAA,EACC;AAAA,EAEjB,YAAY,UAAmF;AACxF,SAAA,cAAc,gBAAgB,YAAY,QAAQ;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOzD,OAAqB;AACZ,WAAA,KAAK,YAAY,KAAK;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO/B,QAA2B;AAClB,WAAA,KAAK,YAAY,MAAM;AAAA,EAAA;AAAA,EAGhC,UAA4B;AACnB,WAAA,KAAK,YAAY,QAAQ;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOlC,mBACE,YACA,OACA,eACiC;AACjC,WAAO,KAAK,YAAY,mBAAmB,YAAY,OAAO,aAAa;AAAA,EAAA;AAE/E;"}
1
+ {"version":3,"file":"ForgeSQLORM.cjs","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,9 +1,8 @@
1
- "use strict";
2
- Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
- const mysql = require("@mikro-orm/mysql");
4
- const sql = require("@forge/sql");
5
- const moment = require("moment");
6
- const entityGenerator = require("@mikro-orm/entity-generator");
1
+ import { MikroORM, MemoryCacheAdapter, NullCacheAdapter } from "@mikro-orm/mysql";
2
+ export * from "@mikro-orm/mysql";
3
+ import { sql } from "@forge/sql";
4
+ import moment from "moment";
5
+ export * from "@mikro-orm/entity-generator";
7
6
  const transformValue = (value) => {
8
7
  switch (value.type) {
9
8
  case "text":
@@ -89,7 +88,7 @@ class ForgeSQLCrudOperations {
89
88
  const query = await this.generateInsertScript(schema, models, updateIfExists);
90
89
  console.debug("INSERT SQL: " + query.sql);
91
90
  console.debug("INSERT VALUES: " + JSON.stringify(query.values));
92
- const sqlStatement = sql.sql.prepare(query.sql);
91
+ const sqlStatement = sql.prepare(query.sql);
93
92
  const updateQueryResponseResult = await sqlStatement.execute();
94
93
  return updateQueryResponseResult.rows.insertId;
95
94
  }
@@ -123,7 +122,7 @@ class ForgeSQLCrudOperations {
123
122
  queryBuilder.andWhere({ [primaryKey.name]: { $eq: id } });
124
123
  const query = queryBuilder.getFormattedQuery();
125
124
  console.debug("DELETE SQL: " + query);
126
- const sqlStatement = sql.sql.prepare(query);
125
+ const sqlStatement = sql.prepare(query);
127
126
  const updateQueryResponseResult = await sqlStatement.execute();
128
127
  return updateQueryResponseResult.rows.affectedRows;
129
128
  }
@@ -192,7 +191,7 @@ class ForgeSQLSelectOperations {
192
191
  */
193
192
  async executeRawSQL(query) {
194
193
  console.debug("Executing raw SQL: " + query);
195
- const sqlStatement = await sql.sql.prepare(query).execute();
194
+ const sqlStatement = await sql.prepare(query).execute();
196
195
  console.debug("Query result: " + JSON.stringify(sqlStatement));
197
196
  return sqlStatement.rows;
198
197
  }
@@ -203,7 +202,7 @@ class ForgeSQLSelectOperations {
203
202
  */
204
203
  async executeRawUpdateSQL(query) {
205
204
  console.debug("Executing update SQL: " + query);
206
- const sqlStatement = sql.sql.prepare(query);
205
+ const sqlStatement = sql.prepare(query);
207
206
  const updateQueryResponseResults = await sqlStatement.execute();
208
207
  return updateQueryResponseResults.rows;
209
208
  }
@@ -220,7 +219,7 @@ class ForgeSQLORMImpl {
220
219
  constructor(entities) {
221
220
  console.debug("Initializing ForgeSQLORM...");
222
221
  try {
223
- this.mikroORM = mysql.MikroORM.initSync({
222
+ this.mikroORM = MikroORM.initSync({
224
223
  dbName: "inmemory",
225
224
  schemaGenerator: {
226
225
  disableForeignKeys: false
@@ -229,11 +228,11 @@ class ForgeSQLORMImpl {
229
228
  warnWhenNoEntities: true
230
229
  },
231
230
  resultCache: {
232
- adapter: mysql.NullCacheAdapter
231
+ adapter: NullCacheAdapter
233
232
  },
234
233
  metadataCache: {
235
234
  enabled: false,
236
- adapter: mysql.MemoryCacheAdapter
235
+ adapter: MemoryCacheAdapter
237
236
  },
238
237
  entities,
239
238
  preferTs: false
@@ -314,19 +313,9 @@ class ForgeSQLORM {
314
313
  return this.ormInstance.createQueryBuilder(entityName, alias, loggerContext);
315
314
  }
316
315
  }
317
- exports.ForgeSQLCrudOperations = ForgeSQLCrudOperations;
318
- exports.ForgeSQLSelectOperations = ForgeSQLSelectOperations;
319
- exports.default = ForgeSQLORM;
320
- Object.keys(mysql).forEach((k) => {
321
- if (k !== "default" && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
322
- enumerable: true,
323
- get: () => mysql[k]
324
- });
325
- });
326
- Object.keys(entityGenerator).forEach((k) => {
327
- if (k !== "default" && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
328
- enumerable: true,
329
- get: () => entityGenerator[k]
330
- });
331
- });
316
+ export {
317
+ ForgeSQLCrudOperations,
318
+ ForgeSQLSelectOperations,
319
+ ForgeSQLORM as default
320
+ };
332
321
  //# sourceMappingURL=ForgeSQLORM.js.map
@@ -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 } 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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"}
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "forge-sql-orm",
3
- "version": "1.0.16",
3
+ "version": "1.0.18",
4
+ "type": "module",
4
5
  "description": "Mikro-ORM integration for Forge-SQL in Atlassian Forge applications.",
5
6
  "main": "dist/ForgeSQLORM.js",
6
7
  "module": "dist/ForgeSQLORM.mjs",
@@ -1,14 +1,13 @@
1
1
  #!/usr/bin/env node
2
- const { execSync } = require("child_process");
3
- const path = require("path");
4
- const fs = require("fs");
5
- const os = require("os");
2
+ import { execSync } from "child_process";
3
+ import path from "node:path";
6
4
 
7
- // Get CLI arguments (excluding "node" and script path)
5
+ // Get CLI arguments
8
6
  const args = process.argv.slice(2).join(" ");
9
7
 
10
- // Resolve the path to cli.ts (your TypeScript entry file)
11
- const cliPath = path.resolve(__dirname, "cli.ts");
8
+ // Resolve the path to cli.ts
9
+ const cliPath = path.resolve(new URL(".", import.meta.url), "cli.ts");
10
+
12
11
 
13
12
  // Function to run a command
14
13
  const runCommand = (cmd) => {
@@ -16,6 +15,7 @@ const runCommand = (cmd) => {
16
15
  execSync(cmd, { stdio: "inherit", shell: true });
17
16
  process.exit(0);
18
17
  } catch (e) {
18
+ console.error("⚠️ Command execution failed:", e.message);
19
19
  process.exit(1);
20
20
  }
21
21
  };
@@ -23,7 +23,7 @@ const runCommand = (cmd) => {
23
23
  // **1. Check if `ts-node` is globally installed**
24
24
  const isGlobalTsNodeInstalled = (() => {
25
25
  try {
26
- execSync("ts-node --version", { stdio: "ignore" }); // Check if `ts-node` runs without error
26
+ execSync("ts-node --version", { stdio: "ignore" });
27
27
  return true;
28
28
  } catch {
29
29
  return false;
@@ -32,9 +32,9 @@ const isGlobalTsNodeInstalled = (() => {
32
32
 
33
33
  if (isGlobalTsNodeInstalled) {
34
34
  console.log("✅ Using global ts-node");
35
- runCommand(`node -r ts-node/register ${cliPath} ${args}`);
35
+ runCommand(`node --loader ts-node/esm "${cliPath}" ${args}`);
36
36
  }
37
37
 
38
- // **3. fallback to npx**
38
+ // ** fallback to npx**
39
39
  console.warn("⚠️ Neither global nor local ts-node found, using npx...");
40
- runCommand(`npx node -r ts-node/register ${cliPath} ${args}`);
40
+ runCommand(`npx node --loader ts-node/esm "${cliPath}" ${args}`);