forge-sql-orm 1.0.22 → 1.0.24

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 +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 * @param options - Options for configuring ForgeSQL ORM behavior.\n * @returns The singleton instance of ForgeSQLORMImpl.\n */\n static getInstance(\n entities: (EntityClass<AnyEntity> | EntityClassGroup<AnyEntity> | EntitySchema)[],\n options?: ForgeSqlOrmOptions\n ): ForgeSqlOperation {\n if (!ForgeSQLORMImpl.instance) {\n ForgeSQLORMImpl.instance = new ForgeSQLORMImpl(entities, options);\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 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 options?: ForgeSqlOrmOptions) {\n this.ormInstance = ForgeSQLORMImpl.getInstance(entities, options);\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,EACA;AAAA,EAEjB,YAAY,oBAAuC,SAA6B;AAC9E,SAAK,kBAAkB;AACvB,SAAK,UAAU;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUjB,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;AACxE,QAAA,KAAK,SAAS,gBAAgB;AACxB,cAAA,MAAM,iBAAiB,MAAM,GAAG;AAAA,IAAA;AAE1C,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;AACzC,QAAA,KAAK,SAAS,gBAAgB;AACxB,cAAA,MAAM,iBAAiB,KAAK;AAAA,IAAA;AAEhC,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;AACzC,QAAA,KAAK,SAAS,gBAAgB;AACxB,cAAA,MAAM,iBAAiB,KAAK;AAAA,IAAA;AAEtC,UAAM,KAAK,gBAAgB,MAAM,EAAE,oBAAoB,KAAK;AAAA,EAAA;AAEhE;ACpKO,MAAM,yBAAsD;AAAA,EAChD;AAAA,EAEjB,YAAY,SAA6B;AACvC,SAAK,UAAU;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASjB,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,IAAI,WAAW,CAAC,IAAI,EAAE;AAEjF,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;AACvE,QAAA,KAAK,QAAQ,gBAAgB;AACvB,cAAA,MAAM,wBAAwB,KAAK;AAAA,IAAA;AAE7C,UAAM,eAAe,MAAM,IAAI,QAAW,KAAK,EAAE,QAAQ;AACzD,WAAO,aAAa;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQtB,MAAM,oBAAoB,OAA6C;AACjE,QAAA,KAAK,QAAQ,gBAAgB;AACvB,cAAA,MAAM,2BAA2B,KAAK;AAAA,IAAA;AAE1C,UAAA,eAAe,IAAI,QAA6B,KAAK;AACrD,UAAA,6BAA6B,MAAM,aAAa,QAAQ;AAC9D,WAAO,2BAA2B;AAAA,EAAA;AAEtC;AC9DA,MAAM,gBAA6C;AAAA,EACjD,OAAe,WAAmC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOT,YACN,UACA,SACA;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,QACV,OAAO;AAAA,MAAA,CACR;AACD,YAAM,aAAiC,WAAW,EAAE,gBAAgB,MAAM;AAC1E,WAAK,iBAAiB,IAAI,uBAAuB,MAAM,UAAU;AAC5D,WAAA,kBAAkB,IAAI,yBAAyB,UAAU;AAAA,aACvD,OAAO;AACN,cAAA,MAAM,sCAAsC,KAAK;AACnD,YAAA;AAAA,IAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASF,OAAO,YACL,UACA,SACmB;AACf,QAAA,CAAC,gBAAgB,UAAU;AAC7B,sBAAgB,WAAW,IAAI,gBAAgB,UAAU,OAAO;AAAA,IAAA;AAElE,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;AAAA;AAAA;AAAA;AAAA;AAAA,EAQxF,UAA4B;AACnB,WAAA,KAAK,SAAS,GAAG,QAAQ;AAAA,EAAA;AAEpC;AAKA,MAAM,YAAY;AAAA,EACC;AAAA,EAEjB,YAAY,UACA,SAA8B;AACxC,SAAK,cAAc,gBAAgB,YAAY,UAAU,OAAO;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOlE,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,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
- constructor(forgeSqlOperations: ForgeSqlOperation);
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;AAGlD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEzE,qBAAa,sBAAuB,YAAW,YAAY;IACzD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoB;gBAExC,kBAAkB,EAAE,iBAAiB;IAIjD;;;;;;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;IAWlB;;;;;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;IAkBzF;;;;;OAKG;IACG,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAetF"}
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"}
@@ -2,14 +2,14 @@ import type { EntityName, LoggingOptions } from "@mikro-orm/core";
2
2
  import type { EntitySchema } from "@mikro-orm/core/metadata/EntitySchema";
3
3
  import type { AnyEntity, EntityClass, EntityClassGroup } from "@mikro-orm/core/typings";
4
4
  import type { QueryBuilder } from "@mikro-orm/knex/query";
5
- import { CRUDForgeSQL, SchemaSqlForgeSql } from "./ForgeSQLQueryBuilder";
5
+ import { CRUDForgeSQL, ForgeSqlOrmOptions, SchemaSqlForgeSql } from "./ForgeSQLQueryBuilder";
6
6
  import type { Knex } from "knex";
7
7
  /**
8
8
  * Public class that acts as a wrapper around the private ForgeSQLORMImpl.
9
9
  */
10
10
  declare class ForgeSQLORM {
11
11
  private readonly ormInstance;
12
- constructor(entities: (EntityClass<AnyEntity> | EntityClassGroup<AnyEntity> | EntitySchema)[]);
12
+ constructor(entities: (EntityClass<AnyEntity> | EntityClassGroup<AnyEntity> | EntitySchema)[], options?: ForgeSqlOrmOptions);
13
13
  /**
14
14
  * Proxies the `crud` method from `ForgeSQLORMImpl`.
15
15
  * @returns CRUD operations.
@@ -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,EAAE,YAAY,EAAqB,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE5F,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAkGjC;;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"}
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,EAEZ,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AA4GjC;;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,EACjF,OAAO,CAAC,EAAE,kBAAkB;IAIxC;;;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 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;AAE3D,qBAAa,wBAAyB,YAAW,iBAAiB;IAChE;;;;;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;IAO5E;;;;OAIG;IACG,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAMvE"}
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"}
package/dist-cli/cli.js CHANGED
@@ -296,12 +296,24 @@ const PATCHES = [
296
296
  // 🗑️ Remove unused dialects (mssql, postgres, sqlite) in MikroORM
297
297
  {
298
298
  file: "node_modules/@mikro-orm/knex/MonkeyPatchable.d.ts",
299
- deleteLines: [/^.*mssql.*$/gim, /^.*MsSql.*$/gim, /^\s*Postgres.*$/gm, /^.*Sqlite3.*$/gm, /^.*BetterSqlite3.*$/gim],
299
+ deleteLines: [
300
+ /^.*mssql.*$/gim,
301
+ /^.*MsSql.*$/gim,
302
+ /^\s*Postgres.*$/gm,
303
+ /^.*Sqlite3.*$/gm,
304
+ /^.*BetterSqlite3.*$/gim
305
+ ],
300
306
  description: "Removing unused dialects from MonkeyPatchable.d.ts"
301
307
  },
302
308
  {
303
309
  file: "node_modules/@mikro-orm/knex/MonkeyPatchable.js",
304
- deleteLines: [/^.*mssql.*$/gim, /^.*MsSql.*$/gim, /^.*postgres.*$/gim, /^.*sqlite.*$/gim, /^.*Sqlite.*$/gim],
310
+ deleteLines: [
311
+ /^.*mssql.*$/gim,
312
+ /^.*MsSql.*$/gim,
313
+ /^.*postgres.*$/gim,
314
+ /^.*sqlite.*$/gim,
315
+ /^.*Sqlite.*$/gim
316
+ ],
305
317
  description: "Removing unused dialects from MonkeyPatchable.js"
306
318
  },
307
319
  {
@@ -344,7 +356,10 @@ const PATCHES = [
344
356
  // 🛠️ Patch Knex to remove `Migrator` and `Seeder`
345
357
  {
346
358
  file: "node_modules/knex/lib/knex-builder/make-knex.js",
347
- deleteLines: [/^const \{ Migrator \} = require\('\.\.\/migrations\/migrate\/Migrator'\);$/gm, /^const Seeder = require\('\.\.\/migrations\/seed\/Seeder'\);$/gm],
359
+ deleteLines: [
360
+ /^const \{ Migrator \} = require\('\.\.\/migrations\/migrate\/Migrator'\);$/gm,
361
+ /^const Seeder = require\('\.\.\/migrations\/seed\/Seeder'\);$/gm
362
+ ],
348
363
  description: "Removing `Migrator` and `Seeder` requires from make-knex.js"
349
364
  },
350
365
  {
@@ -368,7 +383,19 @@ const PATCHES = [
368
383
  // },
369
384
  {
370
385
  file: "node_modules/knex/lib/dialects/index.js",
371
- deleteLines: [/^.*mssql.*$/gim, /^.*MsSql.*$/gim, /^.*postgresql.*$/gim, /^.*sqlite.*$/gim, /^.*oracle.*$/gim, /^.*oracledb.*$/gim, /^.*pgnative.*$/gim, /^.*postgres.*$/gim, /^.*redshift.*$/gim, /^.*sqlite3.*$/gim, /^.*cockroachdb.*$/gim],
386
+ deleteLines: [
387
+ /^.*mssql.*$/gim,
388
+ /^.*MsSql.*$/gim,
389
+ /^.*postgresql.*$/gim,
390
+ /^.*sqlite.*$/gim,
391
+ /^.*oracle.*$/gim,
392
+ /^.*oracledb.*$/gim,
393
+ /^.*pgnative.*$/gim,
394
+ /^.*postgres.*$/gim,
395
+ /^.*redshift.*$/gim,
396
+ /^.*sqlite3.*$/gim,
397
+ /^.*cockroachdb.*$/gim
398
+ ],
372
399
  description: "Removing unused dialects from @mikro-orm/knex/dialects/index.js"
373
400
  },
374
401
  {
@@ -400,52 +427,54 @@ const PATCHES = [
400
427
  ];
401
428
  function runPostInstallPatch() {
402
429
  console.log("🔧 Applying MikroORM & Knex patches...");
403
- PATCHES.forEach(({ file, search, replace, deleteLines, deleteFile, deleteFolder, description }) => {
404
- if (file) {
405
- const filePath = path.resolve(file);
406
- if (fs.existsSync(filePath)) {
407
- let content = fs.readFileSync(filePath, "utf8");
408
- let originalContent = content;
409
- if (search && replace) {
410
- if (typeof search === "string" ? content.includes(search) : search.test(content)) {
411
- content = content.replace(search, replace);
412
- console.log(`[PATCHED] ${description}`);
430
+ PATCHES.forEach(
431
+ ({ file, search, replace, deleteLines, deleteFile, deleteFolder, description }) => {
432
+ if (file) {
433
+ const filePath = path.resolve(file);
434
+ if (fs.existsSync(filePath)) {
435
+ let content = fs.readFileSync(filePath, "utf8");
436
+ let originalContent = content;
437
+ if (search && replace) {
438
+ if (typeof search === "string" ? content.includes(search) : search.test(content)) {
439
+ content = content.replace(search, replace);
440
+ console.log(`[PATCHED] ${description}`);
441
+ }
442
+ }
443
+ if (deleteLines) {
444
+ deleteLines.forEach((pattern) => {
445
+ content = content.split("\n").filter((line) => !pattern.test(line)).join("\n");
446
+ });
447
+ if (content !== originalContent) {
448
+ console.log(`[CLEANED] Removed matching lines in ${file}`);
449
+ }
413
450
  }
414
- }
415
- if (deleteLines) {
416
- deleteLines.forEach((pattern) => {
417
- content = content.split("\n").filter((line) => !pattern.test(line)).join("\n");
418
- });
419
451
  if (content !== originalContent) {
420
- console.log(`[CLEANED] Removed matching lines in ${file}`);
452
+ fs.writeFileSync(filePath, content, "utf8");
421
453
  }
454
+ if (content.trim() === "") {
455
+ fs.unlinkSync(filePath);
456
+ console.log(`[REMOVED] ${filePath} (file is now empty)`);
457
+ }
458
+ } else {
459
+ console.warn(`[WARNING] File not found: ${file}`);
422
460
  }
423
- if (content !== originalContent) {
424
- fs.writeFileSync(filePath, content, "utf8");
425
- }
426
- if (content.trim() === "") {
427
- fs.unlinkSync(filePath);
428
- console.log(`[REMOVED] ${filePath} (file is now empty)`);
429
- }
430
- } else {
431
- console.warn(`[WARNING] File not found: ${file}`);
432
461
  }
433
- }
434
- if (deleteFile) {
435
- const deleteFilePath = path.resolve(__dirname, "../", deleteFile);
436
- if (fs.existsSync(deleteFilePath)) {
437
- fs.unlinkSync(deleteFilePath);
438
- console.log(`[DELETED] ${description}`);
462
+ if (deleteFile) {
463
+ const deleteFilePath = path.resolve(__dirname, "../", deleteFile);
464
+ if (fs.existsSync(deleteFilePath)) {
465
+ fs.unlinkSync(deleteFilePath);
466
+ console.log(`[DELETED] ${description}`);
467
+ }
439
468
  }
440
- }
441
- if (deleteFolder) {
442
- const deleteFolderPath = path.resolve(__dirname, "../", deleteFolder);
443
- if (fs.existsSync(deleteFolderPath)) {
444
- fs.rmSync(deleteFolderPath, { recursive: true, force: true });
445
- console.log(`[DELETED] ${description}`);
469
+ if (deleteFolder) {
470
+ const deleteFolderPath = path.resolve(__dirname, "../", deleteFolder);
471
+ if (fs.existsSync(deleteFolderPath)) {
472
+ fs.rmSync(deleteFolderPath, { recursive: true, force: true });
473
+ console.log(`[DELETED] ${description}`);
474
+ }
446
475
  }
447
476
  }
448
- });
477
+ );
449
478
  console.log("🎉 MikroORM & Knex patching completed!");
450
479
  }
451
480
  dotenv.config();
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sources":["../scripts/actions/generate-models.ts","../scripts/actions/migrations-create.ts","../scripts/actions/migrations-update.ts","../scripts/actions/PatchPostinstall.ts","../scripts/cli.ts"],"sourcesContent":["import \"reflect-metadata\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport {defineConfig, MikroORM, MongoNamingStrategy} from \"@mikro-orm/mysql\";\nimport {EntityGenerator} from \"@mikro-orm/entity-generator\";\n\nconst regenerateIndexFile = (outputPath: string) => {\n const entitiesDir = path.resolve(outputPath);\n const indexPath = path.join(entitiesDir, \"index.ts\");\n\n const entityFiles = fs\n .readdirSync(entitiesDir)\n .filter((file) => file.endsWith(\".ts\") && file !== \"index.ts\");\n\n const imports = entityFiles.map((file) => {\n const entityName = path.basename(file, \".ts\");\n return `import { ${entityName} } from \"./${entityName}\";`;\n });\n\n const indexContent = `${imports.join(\"\\n\")}\\n\\nexport default [${entityFiles.map((file) => path.basename(file, \".ts\")).join(\", \")}];\\n`;\n\n fs.writeFileSync(indexPath, indexContent, \"utf8\");\n console.log(`✅ Updated index.ts with ${entityFiles.length} entities.`);\n};\n\nexport const generateModels = async (options: any) => {\n try {\n const ormConfig = defineConfig({\n host: options.host,\n port: options.port,\n user: options.user,\n password: options.password,\n dbName: options.dbName,\n namingStrategy: MongoNamingStrategy,\n discovery: { warnWhenNoEntities: false },\n extensions: [EntityGenerator],\n debug: true,\n }) as Parameters<typeof MikroORM.initSync>[0];\n\n const orm = MikroORM.initSync(ormConfig);\n console.log(`✅ Connected to ${options.dbName} at ${options.host}:${options.port}`);\n\n await orm.entityGenerator.generate({\n entitySchema: true,\n bidirectionalRelations: false,\n identifiedReferences: false,\n forceUndefined: true,\n undefinedDefaults: true,\n useCoreBaseEntity: false,\n onlyPurePivotTables: false,\n outputPurePivotTables: false,\n scalarPropertiesForRelations: \"always\",\n save: true,\n path: options.output,\n });\n\n regenerateIndexFile(options.output);\n\n console.log(`✅ Entities generated at: ${options.output}`);\n process.exit(0);\n } catch (error) {\n console.error(`❌ Error generating entities:`, error);\n process.exit(1);\n }\n};\n","import \"reflect-metadata\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport {MikroORM} from \"@mikro-orm/mysql\";\nimport { execSync } from 'child_process';\nimport { rmSync } from 'fs';\n\n/**\n * Cleans SQL statements by removing unnecessary database options.\n * @param sql - The raw SQL statement.\n * @returns The cleaned SQL statement.\n */\nfunction cleanSQLStatement(sql: string): string {\n return sql.replace(/\\s+default\\s+character\\s+set\\s+utf8mb4\\s+engine\\s*=\\s*InnoDB;?/gi, \"\").trim();\n}\n\n/**\n * Generates a migration file using the provided SQL statements.\n * @param createStatements - Array of SQL statements.\n * @param version - Migration version number.\n * @returns TypeScript migration file content.\n */\nfunction generateMigrationFile(createStatements: string[], version: number): string {\n const versionPrefix = `v${version}_MIGRATION`;\n\n // Clean each SQL statement and generate migration lines with .enqueue()\n const migrationLines = createStatements\n .map(\n (stmt, index) =>\n ` .enqueue(\"${versionPrefix}${index}\", \\\"${cleanSQLStatement(stmt)}\\\")`, // eslint-disable-line no-useless-escape\n )\n .join(\"\\n\");\n\n // Migration template\n return `import { MigrationRunner } from \"@forge/sql/out/migration\";\n\nexport default (migrationRunner: MigrationRunner): MigrationRunner => {\n return migrationRunner\n${migrationLines};\n};`;\n}\n\n/**\n * Saves the generated migration file along with `migrationCount.ts` and `index.ts`.\n * @param migrationCode - The migration code to be written to the file.\n * @param version - Migration version number.\n * @param outputDir - Directory where the migration files will be saved.\n */\nfunction saveMigrationFiles(migrationCode: string, version: number, outputDir: string) {\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n const migrationFilePath = path.join(outputDir, `migrationV${version}.ts`);\n const migrationCountPath = path.join(outputDir, `migrationCount.ts`);\n const indexFilePath = path.join(outputDir, `index.ts`);\n\n // Write the migration file\n fs.writeFileSync(migrationFilePath, migrationCode);\n\n // Write the migration count file\n fs.writeFileSync(migrationCountPath, `export const MIGRATION_VERSION = ${version};`);\n\n // Generate the migration index file\n const indexFileContent = `import { MigrationRunner } from \"@forge/sql/out/migration\";\nimport { MIGRATION_VERSION } from \"./migrationCount\";\n\nexport type MigrationType = (\n migrationRunner: MigrationRunner,\n) => MigrationRunner;\n\nexport default async (\n migrationRunner: MigrationRunner,\n): Promise<MigrationRunner> => {\n for (let i = 1; i <= MIGRATION_VERSION; i++) {\n const migrations = (await import(\\`./migrationV\\${i}\\`)) as {\n default: MigrationType;\n };\n migrations.default(migrationRunner);\n }\n return migrationRunner;\n};`;\n\n fs.writeFileSync(indexFilePath, indexFileContent);\n\n console.log(`✅ Migration file created: ${migrationFilePath}`);\n console.log(`✅ Migration count file updated: ${migrationCountPath}`);\n console.log(`✅ Migration index file created: ${indexFilePath}`);\n}\n\n/**\n * Extracts only the relevant SQL statements for migration.\n * @param schema - The full database schema as SQL.\n * @returns Filtered list of SQL statements.\n */\nconst extractCreateStatements = (schema: string): string[] => {\n const statements = schema.split(\";\").map((s) => s.trim());\n\n return statements.filter(\n (stmt) =>\n stmt.startsWith(\"create table\") ||\n (stmt.startsWith(\"alter table\") && stmt.includes(\"add index\")) ||\n stmt.startsWith(\"primary\"),\n );\n};\n\n/**\n * Dynamically loads `entities` from `index.ts` in the specified directory.\n * @param entitiesPath - Path to the directory containing `index.ts`.\n * @returns Array of entity classes.\n */\nconst loadEntities = async (entitiesPath: string) => {\n try {\n const indexFilePath = path.resolve(path.join(entitiesPath, \"index.ts\"));\n if (!fs.existsSync(indexFilePath)) {\n console.error(`❌ Error: index.ts not found in ${indexFilePath}`);\n process.exit(1);\n }\n\n const { default: entities } = await import(indexFilePath);\n console.log(`✅ Loaded ${entities.length} entities from ${entitiesPath}`);\n return entities;\n } catch (error) {\n console.error(`❌ Error loading index.ts from ${entitiesPath}:`, error);\n process.exit(1);\n }\n};\n\n/**\n * Loads the current migration version from `migrationCount.ts`.\n * @param migrationPath - Path to the migration folder.\n * @returns The latest migration version.\n */\nconst loadMigrationVersion = async (migrationPath: string): Promise<number> => {\n try {\n const migrationCountFilePath = path.resolve(path.join(migrationPath, \"migrationCount.ts\"));\n if (!fs.existsSync(migrationCountFilePath)) {\n return 0;\n }\n\n const { MIGRATION_VERSION } = await import(migrationCountFilePath);\n console.log(`✅ Current migration version: ${MIGRATION_VERSION}`);\n return MIGRATION_VERSION as number;\n } catch (error) {\n console.error(`❌ Error loading migrationCount:`, error);\n process.exit(1);\n }\n};\n\n/**\n * Creates a full database migration.\n * @param options - Database connection settings and output paths.\n */\nexport const createMigration = async (options: any) => {\n try {\n let version = await loadMigrationVersion(options.output);\n\n if (version > 0) {\n console.error(`❌ Error: Migration has already been created.`);\n process.exit(1);\n }\n\n // Start from version 1 if no previous migrations exist\n version = 1;\n\n // Load entities dynamically from index.ts\n const entities = await loadEntities(options.entitiesPath);\n\n // Initialize MikroORM\n const orm = MikroORM.initSync({\n host: options.host,\n port: options.port,\n user: options.user,\n password: options.password,\n dbName: options.dbName,\n entities: entities,\n });\n\n // Generate SQL schema\n const createSchemaSQL = await orm.schema.getCreateSchemaSQL({ wrap: true });\n const statements = extractCreateStatements(createSchemaSQL);\n\n // Generate and save migration files\n const migrationFile = generateMigrationFile(statements, version);\n saveMigrationFiles(migrationFile, version, options.output);\n\n console.log(`✅ Migration successfully created!`);\n process.exit(0);\n } catch (error) {\n console.error(`❌ Error during migration creation:`, error);\n process.exit(1);\n }\n};\n","import \"reflect-metadata\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport {MikroORM} from \"@mikro-orm/mysql\";\n\n/**\n * Cleans SQL statements by removing unnecessary database options.\n * @param sql - The raw SQL statement.\n * @returns The cleaned SQL statement.\n */\nfunction cleanSQLStatement(sql: string): string {\n return sql.replace(/\\s+default\\s+character\\s+set\\s+utf8mb4\\s+engine\\s*=\\s*InnoDB;?/gi, \"\").trim();\n}\n\n/**\n * Generates a migration file using the provided SQL statements.\n * @param createStatements - Array of SQL statements.\n * @param version - Migration version number.\n * @returns TypeScript migration file content.\n */\nfunction generateMigrationFile(createStatements: string[], version: number): string {\n const versionPrefix = `v${version}_MIGRATION`;\n\n // Clean each SQL statement and generate migration lines with .enqueue()\n const migrationLines = createStatements\n .map(\n (stmt, index) =>\n ` .enqueue(\"${versionPrefix}${index}\", \\\"${cleanSQLStatement(stmt)}\\\")`, // eslint-disable-line no-useless-escape\n )\n .join(\"\\n\");\n\n // Migration template\n return `import { MigrationRunner } from \"@forge/sql/out/migration\";\n\nexport default (migrationRunner: MigrationRunner): MigrationRunner => {\n return migrationRunner\n${migrationLines};\n};`;\n}\n\n/**\n * Saves the generated migration file along with `migrationCount.ts` and `index.ts`.\n * @param migrationCode - The migration code to be written to the file.\n * @param version - Migration version number.\n * @param outputDir - Directory where the migration files will be saved.\n */\nfunction saveMigrationFiles(migrationCode: string, version: number, outputDir: string) {\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n const migrationFilePath = path.join(outputDir, `migrationV${version}.ts`);\n const migrationCountPath = path.join(outputDir, `migrationCount.ts`);\n const indexFilePath = path.join(outputDir, `index.ts`);\n\n // Write the migration file\n fs.writeFileSync(migrationFilePath, migrationCode);\n\n // Write the migration count file\n fs.writeFileSync(migrationCountPath, `export const MIGRATION_VERSION = ${version};`);\n\n // Generate the migration index file\n const indexFileContent = `import { MigrationRunner } from \"@forge/sql/out/migration\";\nimport { MIGRATION_VERSION } from \"./migrationCount\";\n\nexport type MigrationType = (\n migrationRunner: MigrationRunner,\n) => MigrationRunner;\n\nexport default async (\n migrationRunner: MigrationRunner,\n): Promise<MigrationRunner> => {\n for (let i = 1; i <= MIGRATION_VERSION; i++) {\n const migrations = (await import(\\`./migrationV\\${i}\\`)) as {\n default: MigrationType;\n };\n migrations.default(migrationRunner);\n }\n return migrationRunner;\n};`;\n\n fs.writeFileSync(indexFilePath, indexFileContent);\n\n console.log(`✅ Migration file created: ${migrationFilePath}`);\n console.log(`✅ Migration count file updated: ${migrationCountPath}`);\n console.log(`✅ Migration index file created: ${indexFilePath}`);\n}\n\n/**\n * Extracts only the relevant SQL statements for migration.\n * @param schema - The full database schema as SQL.\n * @returns Filtered list of SQL statements.\n */\nconst extractCreateStatements = (schema: string): string[] => {\n const statements = schema.split(\";\").map((s) => s.trim());\n\n return statements.filter(\n (stmt) =>\n stmt.startsWith(\"create table\") ||\n (stmt.startsWith(\"alter table\") && stmt.includes(\"add index\")) ||\n (stmt.startsWith(\"alter table\") && stmt.includes(\"add\") && !stmt.includes(\"foreign\")) ||\n (stmt.startsWith(\"alter table\") && stmt.includes(\"modify\") && !stmt.includes(\"foreign\")),\n );\n};\n\n/**\n * Dynamically loads `entities` from `index.ts` in the specified directory.\n * @param entitiesPath - Path to the directory containing `index.ts`.\n * @returns Array of entity classes.\n */\nconst loadEntities = async (entitiesPath: string) => {\n try {\n const indexFilePath = path.resolve(path.join(entitiesPath, \"index.ts\"));\n if (!fs.existsSync(indexFilePath)) {\n console.error(`❌ Error: index.ts not found in ${entitiesPath}`);\n process.exit(1);\n }\n\n const { default: entities } = await import(indexFilePath);\n console.log(`✅ Loaded ${entities.length} entities from ${entitiesPath}`);\n return entities;\n } catch (error) {\n console.error(`❌ Error loading index.ts from ${entitiesPath}:`, error);\n process.exit(1);\n }\n};\n\n/**\n * Loads the current migration version from `migrationCount.ts`.\n * @param migrationPath - Path to the migration folder.\n * @returns The latest migration version.\n */\nconst loadMigrationVersion = async (migrationPath: string): Promise<number> => {\n try {\n const migrationCountFilePath = path.resolve(path.join(migrationPath, \"migrationCount.ts\"));\n if (!fs.existsSync(migrationCountFilePath)) {\n console.warn(\n `⚠️ Warning: migrationCount.ts not found in ${migrationCountFilePath}, assuming no previous migrations.`,\n );\n return 0;\n }\n\n const { MIGRATION_VERSION } = await import(migrationCountFilePath);\n console.log(`✅ Current migration version: ${MIGRATION_VERSION}`);\n return MIGRATION_VERSION as number;\n } catch (error) {\n console.error(`❌ Error loading migrationCount:`, error);\n process.exit(1);\n }\n};\n\n/**\n * Updates an existing database migration by generating schema modifications.\n * @param options - Database connection settings and output paths.\n */\nexport const updateMigration = async (options: any) => {\n try {\n let version = await loadMigrationVersion(options.output);\n\n if (version < 1) {\n console.log(\n `⚠️ Initial migration not found. Run \"npx forge-sql-orm migrations:create\" first.`,\n );\n process.exit(0);\n }\n version += 1;\n\n // Load entities dynamically from index.ts\n const entities = await loadEntities(options.entitiesPath);\n\n // Initialize MikroORM\n const orm = MikroORM.initSync({\n host: options.host,\n port: options.port,\n user: options.user,\n password: options.password,\n dbName: options.dbName,\n entities,\n debug: true,\n });\n\n // Generate SQL schema updates\n const createSchemaSQL = await orm.schema.getUpdateSchemaMigrationSQL({ wrap: true });\n const statements = extractCreateStatements(createSchemaSQL?.down || \"\");\n\n if (statements.length) {\n const migrationFile = generateMigrationFile(statements, version);\n saveMigrationFiles(migrationFile, version, options.output);\n\n console.log(`✅ Migration successfully updated!`);\n process.exit(0);\n } else {\n console.log(`⚠️ No new migration changes detected.`);\n process.exit(0);\n }\n } catch (error) {\n console.error(`❌ Error during migration update:`, error);\n process.exit(1);\n }\n};\n","import fs from \"fs\";\nimport path from \"path\";\n\n/**\n * Automates patches for MikroORM and Knex to fix Webpack issues.\n * - Removes problematic `require()` calls.\n * - Deletes unnecessary files and folders.\n * - Fixes dynamic imports (`import(id)`) in MikroORM.\n */\n\ninterface Patch {\n file?: string; // File to modify (optional)\n search?: RegExp; // Regex pattern to find problematic code\n replace?: string; // Replacement string for problematic code\n deleteLines?: RegExp[]; // List of regex patterns to remove specific lines\n description: string; // Description of the patch\n deleteFile?: string; // Path of the file to delete (optional)\n deleteFolder?: string; // Path of the folder to delete (optional)\n}\n\nconst PATCHES: Patch[] = [\n // 🗑️ Remove unused dialects (mssql, postgres, sqlite) in MikroORM\n {\n file: \"node_modules/@mikro-orm/knex/MonkeyPatchable.d.ts\",\n deleteLines: [/^.*mssql.*$/gim, /^.*MsSql.*$/gim, /^\\s*Postgres.*$/gm, /^.*Sqlite3.*$/gm, /^.*BetterSqlite3.*$/gim],\n description: \"Removing unused dialects from MonkeyPatchable.d.ts\"\n },\n {\n file: \"node_modules/@mikro-orm/knex/MonkeyPatchable.js\",\n deleteLines: [/^.*mssql.*$/gim, /^.*MsSql.*$/gim, /^.*postgres.*$/gim, /^.*sqlite.*$/gim, /^.*Sqlite.*$/gim],\n description: \"Removing unused dialects from MonkeyPatchable.js\"\n },\n {\n file: \"node_modules/@mikro-orm/knex/dialects/index.js\",\n deleteLines: [/^.*mssql.*$/gim, /^.*MsSql.*$/gim, /^.*postgresql.*$/gim, /^.*sqlite.*$/gim],\n description: \"Removing unused dialects from @mikro-orm/knex/dialects/index.js\"\n },\n {\n deleteFolder: \"node_modules/@mikro-orm/knex/dialects/mssql\",\n description: \"Removing mssql dialect from MikroORM\"\n },\n {\n deleteFolder: \"node_modules/@mikro-orm/knex/dialects/postgresql\",\n description: \"Removing postgresql dialect from MikroORM\"\n },\n {\n deleteFolder: \"node_modules/@mikro-orm/knex/dialects/sqlite\",\n description: \"Removing sqlite dialect from MikroORM\"\n },\n\n // 🔄 Fix Webpack `Critical dependency: the request of a dependency is an expression`\n {\n file: \"node_modules/@mikro-orm/core/utils/Configuration.js\",\n search: /dynamicImportProvider:\\s*\\/\\* istanbul ignore next \\*\\/\\s*\\(id\\) => import\\(id\\),/g,\n replace: \"dynamicImportProvider: /* istanbul ignore next */ () => Promise.resolve({}),\",\n description: \"Fixing dynamic imports in MikroORM Configuration\"\n },\n {\n file: \"node_modules/@mikro-orm/core/utils/Utils.js\",\n search: /static dynamicImportProvider = \\(id\\) => import\\(id\\);/g,\n replace: \"static dynamicImportProvider = () => Promise.resolve({});\",\n description: \"Fixing dynamic imports in MikroORM Utils.js\"\n },\n\n // 🛑 Remove deprecated `require.extensions` usage\n {\n file: \"node_modules/@mikro-orm/core/utils/Utils.js\",\n search: /\\s\\|\\|\\s*\\(require\\.extensions\\s*&&\\s*!!require\\.extensions\\['\\.ts'\\]\\);\\s*/g,\n replace: \";\",\n description: \"Removing deprecated `require.extensions` check in MikroORM\"\n },\n\n // 🛠️ Patch Knex to remove `Migrator` and `Seeder`\n {\n file: \"node_modules/knex/lib/knex-builder/make-knex.js\",\n deleteLines: [/^const \\{ Migrator \\} = require\\('\\.\\.\\/migrations\\/migrate\\/Migrator'\\);$/gm, /^const Seeder = require\\('\\.\\.\\/migrations\\/seed\\/Seeder'\\);$/gm],\n description: \"Removing `Migrator` and `Seeder` requires from make-knex.js\"\n },\n {\n file: \"node_modules/knex/lib/knex-builder/make-knex.js\",\n search: /\\sreturn new Migrator\\(this\\);/g,\n replace: \"return null;\",\n description: \"Replacing `return new Migrator(this);` with `return null;`\"\n },\n {\n file: \"node_modules/knex/lib/knex-builder/make-knex.js\",\n search: /\\sreturn new Seeder\\(this\\);/g,\n replace: \"return null;\",\n description: \"Replacing `return new Seeder(this);` with `return null;`\"\n },\n // 🔄 Patch for MikroORM Entity Generator to use 'forge-sql-orm'\n // {\n // file: \"node_modules/@mikro-orm/entity-generator/SourceFile.js\",\n // search: /^.* from '@mikro-orm.*$/gim,\n // replace: \" }).join(', '))} } from 'forge-sql-orm';`);\",\n // description: \"Replacing entity generator imports with 'forge-sql-orm'\"\n // },\n {\n file: \"node_modules/knex/lib/dialects/index.js\",\n deleteLines: [/^.*mssql.*$/gim, /^.*MsSql.*$/gim, /^.*postgresql.*$/gim, /^.*sqlite.*$/gim, /^.*oracle.*$/gim, /^.*oracledb.*$/gim, /^.*pgnative.*$/gim, /^.*postgres.*$/gim, /^.*redshift.*$/gim, /^.*sqlite3.*$/gim, /^.*cockroachdb.*$/gim],\n description: \"Removing unused dialects from @mikro-orm/knex/dialects/index.js\"\n },\n {\n file: \"node_modules/@mikro-orm/core/utils/Utils.js\",\n search: /\\s\\|\\|\\s*\\(require\\.extensions\\s*&&\\s*!!require\\.extensions\\['\\.ts'\\]\\);\\s*/g,\n replace: \";\", // Replaces with semicolon to keep syntax valid\n description: \"Removing deprecated `require.extensions` check from MikroORM\"\n },\n {\n file: \"node_modules/@mikro-orm/core/utils/Utils.js\",\n search: /^.*extensions.*$/gim,\n replace: \"{\", // Replaces with semicolon to keep syntax valid\n description: \"Removing deprecated `require.extensions` check from MikroORM\"\n },\n {\n file: \"node_modules/@mikro-orm/core/utils/Utils.js\",\n search: /^.*package.json.*$/gim,\n replace: \"return 0;\", // Replaces with semicolon to keep syntax valid\n description: \"Removing deprecated `require.extensions` check from MikroORM\"\n },\n {\n file: \"node_modules/@mikro-orm/knex/dialects/mysql/index.js\",\n deleteLines: [/^.*MariaDbKnexDialect.*$/gim],\n description: \"Removing MariaDbKnexDialect\"\n },\n\n];\n\n\n\n\n\n/**\n * Runs the MikroORM & Knex patching logic.\n */\nexport function runPostInstallPatch() {\n console.log(\"🔧 Applying MikroORM & Knex patches...\");\n PATCHES.forEach(({ file, search, replace, deleteLines, deleteFile, deleteFolder, description }) => {\n if (file) {\n const filePath = path.resolve(file);\n if (fs.existsSync(filePath)) {\n let content = fs.readFileSync(filePath, \"utf8\");\n let originalContent = content;\n\n // 🔄 Replace text\n if (search && replace) {\n if (typeof search === \"string\" ? content.includes(search) : search.test(content)) {\n content = content.replace(search, replace);\n console.log(`[PATCHED] ${description}`);\n }\n }\n\n // 🗑️ Remove matching lines\n if (deleteLines) {\n deleteLines.forEach((pattern) => {\n content = content\n .split(\"\\n\")\n .filter((line) => !pattern.test(line))\n .join(\"\\n\");\n });\n if (content !== originalContent) {\n console.log(`[CLEANED] Removed matching lines in ${file}`);\n }\n }\n\n // 💾 Save changes only if file was modified\n if (content !== originalContent) {\n fs.writeFileSync(filePath, content, \"utf8\");\n }\n\n // 🚮 Remove empty files\n if (content.trim() === \"\") {\n fs.unlinkSync(filePath);\n console.log(`[REMOVED] ${filePath} (file is now empty)`);\n }\n } else {\n console.warn(`[WARNING] File not found: ${file}`);\n }\n }\n\n // 🚮 Delete specific files\n if (deleteFile) {\n const deleteFilePath = path.resolve(__dirname, \"../\", deleteFile);\n if (fs.existsSync(deleteFilePath)) {\n fs.unlinkSync(deleteFilePath);\n console.log(`[DELETED] ${description}`);\n }\n }\n\n // 🚮 Delete entire folders\n if (deleteFolder) {\n const deleteFolderPath = path.resolve(__dirname, \"../\", deleteFolder);\n if (fs.existsSync(deleteFolderPath)) {\n fs.rmSync(deleteFolderPath, {recursive: true, force: true});\n console.log(`[DELETED] ${description}`);\n }\n }\n })\n\n console.log(\"🎉 MikroORM & Knex patching completed!\");\n}\n","#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport dotenv from \"dotenv\";\nimport inquirer from \"inquirer\";\nimport { generateModels } from \"./actions/generate-models\";\nimport { createMigration } from \"./actions/migrations-create\";\nimport { updateMigration } from \"./actions/migrations-update\";\nimport {runPostInstallPatch} from \"./actions/PatchPostinstall\";\n\n// 🔄 Load environment variables from `.env` file\ndotenv.config();\n\n/**\n * Prompts the user for missing parameters using Inquirer.js.\n * @param config - The current configuration object.\n * @param defaultOutput - Default output path.\n * @param customAskMissingParams - Optional function for additional prompts.\n * @returns Updated configuration with user input.\n */\nconst askMissingParams = async (\n config: any,\n defaultOutput: string,\n customAskMissingParams?: (cfg: any, questions: unknown[]) => void,\n) => {\n const questions: unknown[] = [];\n\n if (!config.host)\n questions.push({\n type: \"input\",\n name: \"host\",\n message: \"Enter database host:\",\n default: \"localhost\",\n });\n\n if (!config.port)\n questions.push({\n type: \"input\",\n name: \"port\",\n message: \"Enter database port:\",\n default: \"3306\",\n validate: (input: string) => !isNaN(parseInt(input, 10)),\n });\n\n if (!config.user)\n questions.push({\n type: \"input\",\n name: \"user\",\n message: \"Enter database user:\",\n default: \"root\",\n });\n\n if (!config.password)\n questions.push({\n type: \"password\",\n name: \"password\",\n message: \"Enter database password:\",\n mask: \"*\",\n });\n\n if (!config.dbName)\n questions.push({\n type: \"input\",\n name: \"dbName\",\n message: \"Enter database name:\",\n });\n\n if (!config.output)\n questions.push({\n type: \"input\",\n name: \"output\",\n message: \"Enter output path:\",\n default: defaultOutput,\n });\n\n // Allow additional questions from the caller\n if (customAskMissingParams) {\n customAskMissingParams(config, questions);\n }\n\n // If there are missing parameters, prompt the user\n if (questions.length > 0) {\n // @ts-ignore - Ignore TypeScript warning for dynamic question type\n const answers = await inquirer.prompt(questions);\n return { ...config, ...answers, port: parseInt(answers.port, 10) };\n }\n\n return config;\n};\n\n/**\n * Retrieves configuration parameters from command-line arguments and environment variables.\n * If any required parameters are missing, prompts the user for input.\n * @param cmd - The command object containing CLI options.\n * @param defaultOutput - Default output directory.\n * @param customConfig - Optional function for additional configuration parameters.\n * @param customAskMissingParams - Optional function for additional prompts.\n * @returns A fully resolved configuration object.\n */\nconst getConfig = async (\n cmd: any,\n defaultOutput: string,\n customConfig?: () => any,\n customAskMissingParams?: (cfg: any, questions: unknown[]) => void,\n) => {\n let config = {\n host: cmd.host || process.env.FORGE_SQL_ORM_HOST,\n port: cmd.port\n ? parseInt(cmd.port, 10)\n : process.env.FORGE_SQL_ORM_PORT\n ? parseInt(process.env.FORGE_SQL_ORM_PORT, 10)\n : undefined,\n user: cmd.user || process.env.FORGE_SQL_ORM_USER,\n password: cmd.password || process.env.FORGE_SQL_ORM_PASSWORD,\n dbName: cmd.dbName || process.env.FORGE_SQL_ORM_DBNAME,\n output: cmd.output || process.env.FORGE_SQL_ORM_OUTPUT,\n };\n\n // Merge additional configurations if provided\n if (customConfig) {\n config = { ...config, ...customConfig() };\n }\n\n return await askMissingParams(config, defaultOutput, customAskMissingParams);\n};\n\n// 📌 Initialize CLI\nconst program = new Command();\nprogram.version(\"1.0.0\");\n\n// ✅ Command: Generate database models (Entities)\nprogram\n .command(\"generate:model\")\n .description(\"Generate MikroORM models from the database.\")\n .option(\"--host <string>\", \"Database host\")\n .option(\"--port <number>\", \"Database port\")\n .option(\"--user <string>\", \"Database user\")\n .option(\"--password <string>\", \"Database password\")\n .option(\"--dbName <string>\", \"Database name\")\n .option(\"--output <string>\", \"Output path for entities\")\n .action(async (cmd) => {\n const config = await getConfig(cmd, \"./database/entities\");\n await generateModels(config);\n });\n\n// ✅ Command: Create initial database migration\nprogram\n .command(\"migrations:create\")\n .description(\"Generate an initial migration for the entire database.\")\n .option(\"--host <string>\", \"Database host\")\n .option(\"--port <number>\", \"Database port\")\n .option(\"--user <string>\", \"Database user\")\n .option(\"--password <string>\", \"Database password\")\n .option(\"--dbName <string>\", \"Database name\")\n .option(\"--output <string>\", \"Output path for migrations\")\n .option(\"--entitiesPath <string>\", \"Path to the folder containing entities\")\n .action(async (cmd) => {\n const config = await getConfig(\n cmd,\n \"./database/migration\",\n () => ({\n entitiesPath: cmd.entitiesPath || process.env.FORGE_SQL_ORM_ENTITIES_PATH,\n }),\n (cfg, questions: unknown[]) => {\n if (!cfg.entitiesPath)\n questions.push({\n type: \"input\",\n name: \"entitiesPath\",\n message: \"Enter the path to entities:\",\n default: \"./database/entities\",\n });\n },\n );\n await createMigration(config);\n });\n\n// ✅ Command: Update migration for schema changes\nprogram\n .command(\"migrations:update\")\n .description(\"Generate a migration to update the database schema.\")\n .option(\"--host <string>\", \"Database host\")\n .option(\"--port <number>\", \"Database port\")\n .option(\"--user <string>\", \"Database user\")\n .option(\"--password <string>\", \"Database password\")\n .option(\"--dbName <string>\", \"Database name\")\n .option(\"--output <string>\", \"Output path for migrations\")\n .option(\"--entitiesPath <string>\", \"Path to the folder containing entities\")\n .action(async (cmd) => {\n const config = await getConfig(\n cmd,\n \"./database/migration\",\n () => ({\n entitiesPath: cmd.entitiesPath || process.env.FORGE_SQL_ORM_ENTITIES_PATH,\n }),\n (cfg, questions: unknown[]) => {\n if (!cfg.entitiesPath)\n questions.push({\n type: \"input\",\n name: \"entitiesPath\",\n message: \"Enter the path to entities:\",\n default: \"./database/entities\",\n });\n },\n );\n await updateMigration(config);\n });\n\n// Patch MikroORM and Knex\nprogram\n .command(\"patch:mikroorm\")\n .description(\"Patch MikroORM and Knex dependencies to work properly with Forge\")\n .action(async () => {\n console.log(\"Running MikroORM patch...\");\n await runPostInstallPatch();\n await runPostInstallPatch();\n await runPostInstallPatch();\n console.log(\"✅ MikroORM patch applied successfully!\");\n });\n\n// 🔥 Execute CLI\nprogram.parse(process.argv);\n"],"names":["defineConfig","MongoNamingStrategy","EntityGenerator","MikroORM","cleanSQLStatement","generateMigrationFile","saveMigrationFiles","extractCreateStatements","loadEntities","loadMigrationVersion","Command"],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sources":["../scripts/actions/generate-models.ts","../scripts/actions/migrations-create.ts","../scripts/actions/migrations-update.ts","../scripts/actions/PatchPostinstall.ts","../scripts/cli.ts"],"sourcesContent":["import \"reflect-metadata\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { defineConfig, MikroORM, MongoNamingStrategy } from \"@mikro-orm/mysql\";\nimport { EntityGenerator } from \"@mikro-orm/entity-generator\";\n\nconst regenerateIndexFile = (outputPath: string) => {\n const entitiesDir = path.resolve(outputPath);\n const indexPath = path.join(entitiesDir, \"index.ts\");\n\n const entityFiles = fs\n .readdirSync(entitiesDir)\n .filter((file) => file.endsWith(\".ts\") && file !== \"index.ts\");\n\n const imports = entityFiles.map((file) => {\n const entityName = path.basename(file, \".ts\");\n return `import { ${entityName} } from \"./${entityName}\";`;\n });\n\n const indexContent = `${imports.join(\"\\n\")}\\n\\nexport default [${entityFiles.map((file) => path.basename(file, \".ts\")).join(\", \")}];\\n`;\n\n fs.writeFileSync(indexPath, indexContent, \"utf8\");\n console.log(`✅ Updated index.ts with ${entityFiles.length} entities.`);\n};\n\nexport const generateModels = async (options: any) => {\n try {\n const ormConfig = defineConfig({\n host: options.host,\n port: options.port,\n user: options.user,\n password: options.password,\n dbName: options.dbName,\n namingStrategy: MongoNamingStrategy,\n discovery: { warnWhenNoEntities: false },\n extensions: [EntityGenerator],\n debug: true,\n }) as Parameters<typeof MikroORM.initSync>[0];\n\n const orm = MikroORM.initSync(ormConfig);\n console.log(`✅ Connected to ${options.dbName} at ${options.host}:${options.port}`);\n\n await orm.entityGenerator.generate({\n entitySchema: true,\n bidirectionalRelations: false,\n identifiedReferences: false,\n forceUndefined: true,\n undefinedDefaults: true,\n useCoreBaseEntity: false,\n onlyPurePivotTables: false,\n outputPurePivotTables: false,\n scalarPropertiesForRelations: \"always\",\n save: true,\n path: options.output,\n });\n\n regenerateIndexFile(options.output);\n\n console.log(`✅ Entities generated at: ${options.output}`);\n process.exit(0);\n } catch (error) {\n console.error(`❌ Error generating entities:`, error);\n process.exit(1);\n }\n};\n","import \"reflect-metadata\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { MikroORM } from \"@mikro-orm/mysql\";\nimport { execSync } from \"child_process\";\nimport { rmSync } from \"fs\";\n\n/**\n * Cleans SQL statements by removing unnecessary database options.\n * @param sql - The raw SQL statement.\n * @returns The cleaned SQL statement.\n */\nfunction cleanSQLStatement(sql: string): string {\n return sql.replace(/\\s+default\\s+character\\s+set\\s+utf8mb4\\s+engine\\s*=\\s*InnoDB;?/gi, \"\").trim();\n}\n\n/**\n * Generates a migration file using the provided SQL statements.\n * @param createStatements - Array of SQL statements.\n * @param version - Migration version number.\n * @returns TypeScript migration file content.\n */\nfunction generateMigrationFile(createStatements: string[], version: number): string {\n const versionPrefix = `v${version}_MIGRATION`;\n\n // Clean each SQL statement and generate migration lines with .enqueue()\n const migrationLines = createStatements\n .map(\n (stmt, index) =>\n ` .enqueue(\"${versionPrefix}${index}\", \\\"${cleanSQLStatement(stmt)}\\\")`, // eslint-disable-line no-useless-escape\n )\n .join(\"\\n\");\n\n // Migration template\n return `import { MigrationRunner } from \"@forge/sql/out/migration\";\n\nexport default (migrationRunner: MigrationRunner): MigrationRunner => {\n return migrationRunner\n${migrationLines};\n};`;\n}\n\n/**\n * Saves the generated migration file along with `migrationCount.ts` and `index.ts`.\n * @param migrationCode - The migration code to be written to the file.\n * @param version - Migration version number.\n * @param outputDir - Directory where the migration files will be saved.\n */\nfunction saveMigrationFiles(migrationCode: string, version: number, outputDir: string) {\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n const migrationFilePath = path.join(outputDir, `migrationV${version}.ts`);\n const migrationCountPath = path.join(outputDir, `migrationCount.ts`);\n const indexFilePath = path.join(outputDir, `index.ts`);\n\n // Write the migration file\n fs.writeFileSync(migrationFilePath, migrationCode);\n\n // Write the migration count file\n fs.writeFileSync(migrationCountPath, `export const MIGRATION_VERSION = ${version};`);\n\n // Generate the migration index file\n const indexFileContent = `import { MigrationRunner } from \"@forge/sql/out/migration\";\nimport { MIGRATION_VERSION } from \"./migrationCount\";\n\nexport type MigrationType = (\n migrationRunner: MigrationRunner,\n) => MigrationRunner;\n\nexport default async (\n migrationRunner: MigrationRunner,\n): Promise<MigrationRunner> => {\n for (let i = 1; i <= MIGRATION_VERSION; i++) {\n const migrations = (await import(\\`./migrationV\\${i}\\`)) as {\n default: MigrationType;\n };\n migrations.default(migrationRunner);\n }\n return migrationRunner;\n};`;\n\n fs.writeFileSync(indexFilePath, indexFileContent);\n\n console.log(`✅ Migration file created: ${migrationFilePath}`);\n console.log(`✅ Migration count file updated: ${migrationCountPath}`);\n console.log(`✅ Migration index file created: ${indexFilePath}`);\n}\n\n/**\n * Extracts only the relevant SQL statements for migration.\n * @param schema - The full database schema as SQL.\n * @returns Filtered list of SQL statements.\n */\nconst extractCreateStatements = (schema: string): string[] => {\n const statements = schema.split(\";\").map((s) => s.trim());\n\n return statements.filter(\n (stmt) =>\n stmt.startsWith(\"create table\") ||\n (stmt.startsWith(\"alter table\") && stmt.includes(\"add index\")) ||\n stmt.startsWith(\"primary\"),\n );\n};\n\n/**\n * Dynamically loads `entities` from `index.ts` in the specified directory.\n * @param entitiesPath - Path to the directory containing `index.ts`.\n * @returns Array of entity classes.\n */\nconst loadEntities = async (entitiesPath: string) => {\n try {\n const indexFilePath = path.resolve(path.join(entitiesPath, \"index.ts\"));\n if (!fs.existsSync(indexFilePath)) {\n console.error(`❌ Error: index.ts not found in ${indexFilePath}`);\n process.exit(1);\n }\n\n const { default: entities } = await import(indexFilePath);\n console.log(`✅ Loaded ${entities.length} entities from ${entitiesPath}`);\n return entities;\n } catch (error) {\n console.error(`❌ Error loading index.ts from ${entitiesPath}:`, error);\n process.exit(1);\n }\n};\n\n/**\n * Loads the current migration version from `migrationCount.ts`.\n * @param migrationPath - Path to the migration folder.\n * @returns The latest migration version.\n */\nconst loadMigrationVersion = async (migrationPath: string): Promise<number> => {\n try {\n const migrationCountFilePath = path.resolve(path.join(migrationPath, \"migrationCount.ts\"));\n if (!fs.existsSync(migrationCountFilePath)) {\n return 0;\n }\n\n const { MIGRATION_VERSION } = await import(migrationCountFilePath);\n console.log(`✅ Current migration version: ${MIGRATION_VERSION}`);\n return MIGRATION_VERSION as number;\n } catch (error) {\n console.error(`❌ Error loading migrationCount:`, error);\n process.exit(1);\n }\n};\n\n/**\n * Creates a full database migration.\n * @param options - Database connection settings and output paths.\n */\nexport const createMigration = async (options: any) => {\n try {\n let version = await loadMigrationVersion(options.output);\n\n if (version > 0) {\n console.error(`❌ Error: Migration has already been created.`);\n process.exit(1);\n }\n\n // Start from version 1 if no previous migrations exist\n version = 1;\n\n // Load entities dynamically from index.ts\n const entities = await loadEntities(options.entitiesPath);\n\n // Initialize MikroORM\n const orm = MikroORM.initSync({\n host: options.host,\n port: options.port,\n user: options.user,\n password: options.password,\n dbName: options.dbName,\n entities: entities,\n });\n\n // Generate SQL schema\n const createSchemaSQL = await orm.schema.getCreateSchemaSQL({ wrap: true });\n const statements = extractCreateStatements(createSchemaSQL);\n\n // Generate and save migration files\n const migrationFile = generateMigrationFile(statements, version);\n saveMigrationFiles(migrationFile, version, options.output);\n\n console.log(`✅ Migration successfully created!`);\n process.exit(0);\n } catch (error) {\n console.error(`❌ Error during migration creation:`, error);\n process.exit(1);\n }\n};\n","import \"reflect-metadata\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { MikroORM } from \"@mikro-orm/mysql\";\n\n/**\n * Cleans SQL statements by removing unnecessary database options.\n * @param sql - The raw SQL statement.\n * @returns The cleaned SQL statement.\n */\nfunction cleanSQLStatement(sql: string): string {\n return sql.replace(/\\s+default\\s+character\\s+set\\s+utf8mb4\\s+engine\\s*=\\s*InnoDB;?/gi, \"\").trim();\n}\n\n/**\n * Generates a migration file using the provided SQL statements.\n * @param createStatements - Array of SQL statements.\n * @param version - Migration version number.\n * @returns TypeScript migration file content.\n */\nfunction generateMigrationFile(createStatements: string[], version: number): string {\n const versionPrefix = `v${version}_MIGRATION`;\n\n // Clean each SQL statement and generate migration lines with .enqueue()\n const migrationLines = createStatements\n .map(\n (stmt, index) =>\n ` .enqueue(\"${versionPrefix}${index}\", \\\"${cleanSQLStatement(stmt)}\\\")`, // eslint-disable-line no-useless-escape\n )\n .join(\"\\n\");\n\n // Migration template\n return `import { MigrationRunner } from \"@forge/sql/out/migration\";\n\nexport default (migrationRunner: MigrationRunner): MigrationRunner => {\n return migrationRunner\n${migrationLines};\n};`;\n}\n\n/**\n * Saves the generated migration file along with `migrationCount.ts` and `index.ts`.\n * @param migrationCode - The migration code to be written to the file.\n * @param version - Migration version number.\n * @param outputDir - Directory where the migration files will be saved.\n */\nfunction saveMigrationFiles(migrationCode: string, version: number, outputDir: string) {\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n const migrationFilePath = path.join(outputDir, `migrationV${version}.ts`);\n const migrationCountPath = path.join(outputDir, `migrationCount.ts`);\n const indexFilePath = path.join(outputDir, `index.ts`);\n\n // Write the migration file\n fs.writeFileSync(migrationFilePath, migrationCode);\n\n // Write the migration count file\n fs.writeFileSync(migrationCountPath, `export const MIGRATION_VERSION = ${version};`);\n\n // Generate the migration index file\n const indexFileContent = `import { MigrationRunner } from \"@forge/sql/out/migration\";\nimport { MIGRATION_VERSION } from \"./migrationCount\";\n\nexport type MigrationType = (\n migrationRunner: MigrationRunner,\n) => MigrationRunner;\n\nexport default async (\n migrationRunner: MigrationRunner,\n): Promise<MigrationRunner> => {\n for (let i = 1; i <= MIGRATION_VERSION; i++) {\n const migrations = (await import(\\`./migrationV\\${i}\\`)) as {\n default: MigrationType;\n };\n migrations.default(migrationRunner);\n }\n return migrationRunner;\n};`;\n\n fs.writeFileSync(indexFilePath, indexFileContent);\n\n console.log(`✅ Migration file created: ${migrationFilePath}`);\n console.log(`✅ Migration count file updated: ${migrationCountPath}`);\n console.log(`✅ Migration index file created: ${indexFilePath}`);\n}\n\n/**\n * Extracts only the relevant SQL statements for migration.\n * @param schema - The full database schema as SQL.\n * @returns Filtered list of SQL statements.\n */\nconst extractCreateStatements = (schema: string): string[] => {\n const statements = schema.split(\";\").map((s) => s.trim());\n\n return statements.filter(\n (stmt) =>\n stmt.startsWith(\"create table\") ||\n (stmt.startsWith(\"alter table\") && stmt.includes(\"add index\")) ||\n (stmt.startsWith(\"alter table\") && stmt.includes(\"add\") && !stmt.includes(\"foreign\")) ||\n (stmt.startsWith(\"alter table\") && stmt.includes(\"modify\") && !stmt.includes(\"foreign\")),\n );\n};\n\n/**\n * Dynamically loads `entities` from `index.ts` in the specified directory.\n * @param entitiesPath - Path to the directory containing `index.ts`.\n * @returns Array of entity classes.\n */\nconst loadEntities = async (entitiesPath: string) => {\n try {\n const indexFilePath = path.resolve(path.join(entitiesPath, \"index.ts\"));\n if (!fs.existsSync(indexFilePath)) {\n console.error(`❌ Error: index.ts not found in ${entitiesPath}`);\n process.exit(1);\n }\n\n const { default: entities } = await import(indexFilePath);\n console.log(`✅ Loaded ${entities.length} entities from ${entitiesPath}`);\n return entities;\n } catch (error) {\n console.error(`❌ Error loading index.ts from ${entitiesPath}:`, error);\n process.exit(1);\n }\n};\n\n/**\n * Loads the current migration version from `migrationCount.ts`.\n * @param migrationPath - Path to the migration folder.\n * @returns The latest migration version.\n */\nconst loadMigrationVersion = async (migrationPath: string): Promise<number> => {\n try {\n const migrationCountFilePath = path.resolve(path.join(migrationPath, \"migrationCount.ts\"));\n if (!fs.existsSync(migrationCountFilePath)) {\n console.warn(\n `⚠️ Warning: migrationCount.ts not found in ${migrationCountFilePath}, assuming no previous migrations.`,\n );\n return 0;\n }\n\n const { MIGRATION_VERSION } = await import(migrationCountFilePath);\n console.log(`✅ Current migration version: ${MIGRATION_VERSION}`);\n return MIGRATION_VERSION as number;\n } catch (error) {\n console.error(`❌ Error loading migrationCount:`, error);\n process.exit(1);\n }\n};\n\n/**\n * Updates an existing database migration by generating schema modifications.\n * @param options - Database connection settings and output paths.\n */\nexport const updateMigration = async (options: any) => {\n try {\n let version = await loadMigrationVersion(options.output);\n\n if (version < 1) {\n console.log(\n `⚠️ Initial migration not found. Run \"npx forge-sql-orm migrations:create\" first.`,\n );\n process.exit(0);\n }\n version += 1;\n\n // Load entities dynamically from index.ts\n const entities = await loadEntities(options.entitiesPath);\n\n // Initialize MikroORM\n const orm = MikroORM.initSync({\n host: options.host,\n port: options.port,\n user: options.user,\n password: options.password,\n dbName: options.dbName,\n entities,\n debug: true,\n });\n\n // Generate SQL schema updates\n const createSchemaSQL = await orm.schema.getUpdateSchemaMigrationSQL({ wrap: true });\n const statements = extractCreateStatements(createSchemaSQL?.down || \"\");\n\n if (statements.length) {\n const migrationFile = generateMigrationFile(statements, version);\n saveMigrationFiles(migrationFile, version, options.output);\n\n console.log(`✅ Migration successfully updated!`);\n process.exit(0);\n } else {\n console.log(`⚠️ No new migration changes detected.`);\n process.exit(0);\n }\n } catch (error) {\n console.error(`❌ Error during migration update:`, error);\n process.exit(1);\n }\n};\n","import fs from \"fs\";\nimport path from \"path\";\n\n/**\n * Automates patches for MikroORM and Knex to fix Webpack issues.\n * - Removes problematic `require()` calls.\n * - Deletes unnecessary files and folders.\n * - Fixes dynamic imports (`import(id)`) in MikroORM.\n */\n\ninterface Patch {\n file?: string; // File to modify (optional)\n search?: RegExp; // Regex pattern to find problematic code\n replace?: string; // Replacement string for problematic code\n deleteLines?: RegExp[]; // List of regex patterns to remove specific lines\n description: string; // Description of the patch\n deleteFile?: string; // Path of the file to delete (optional)\n deleteFolder?: string; // Path of the folder to delete (optional)\n}\n\nconst PATCHES: Patch[] = [\n // 🗑️ Remove unused dialects (mssql, postgres, sqlite) in MikroORM\n {\n file: \"node_modules/@mikro-orm/knex/MonkeyPatchable.d.ts\",\n deleteLines: [\n /^.*mssql.*$/gim,\n /^.*MsSql.*$/gim,\n /^\\s*Postgres.*$/gm,\n /^.*Sqlite3.*$/gm,\n /^.*BetterSqlite3.*$/gim,\n ],\n description: \"Removing unused dialects from MonkeyPatchable.d.ts\",\n },\n {\n file: \"node_modules/@mikro-orm/knex/MonkeyPatchable.js\",\n deleteLines: [\n /^.*mssql.*$/gim,\n /^.*MsSql.*$/gim,\n /^.*postgres.*$/gim,\n /^.*sqlite.*$/gim,\n /^.*Sqlite.*$/gim,\n ],\n description: \"Removing unused dialects from MonkeyPatchable.js\",\n },\n {\n file: \"node_modules/@mikro-orm/knex/dialects/index.js\",\n deleteLines: [/^.*mssql.*$/gim, /^.*MsSql.*$/gim, /^.*postgresql.*$/gim, /^.*sqlite.*$/gim],\n description: \"Removing unused dialects from @mikro-orm/knex/dialects/index.js\",\n },\n {\n deleteFolder: \"node_modules/@mikro-orm/knex/dialects/mssql\",\n description: \"Removing mssql dialect from MikroORM\",\n },\n {\n deleteFolder: \"node_modules/@mikro-orm/knex/dialects/postgresql\",\n description: \"Removing postgresql dialect from MikroORM\",\n },\n {\n deleteFolder: \"node_modules/@mikro-orm/knex/dialects/sqlite\",\n description: \"Removing sqlite dialect from MikroORM\",\n },\n\n // 🔄 Fix Webpack `Critical dependency: the request of a dependency is an expression`\n {\n file: \"node_modules/@mikro-orm/core/utils/Configuration.js\",\n search: /dynamicImportProvider:\\s*\\/\\* istanbul ignore next \\*\\/\\s*\\(id\\) => import\\(id\\),/g,\n replace: \"dynamicImportProvider: /* istanbul ignore next */ () => Promise.resolve({}),\",\n description: \"Fixing dynamic imports in MikroORM Configuration\",\n },\n {\n file: \"node_modules/@mikro-orm/core/utils/Utils.js\",\n search: /static dynamicImportProvider = \\(id\\) => import\\(id\\);/g,\n replace: \"static dynamicImportProvider = () => Promise.resolve({});\",\n description: \"Fixing dynamic imports in MikroORM Utils.js\",\n },\n\n // 🛑 Remove deprecated `require.extensions` usage\n {\n file: \"node_modules/@mikro-orm/core/utils/Utils.js\",\n search: /\\s\\|\\|\\s*\\(require\\.extensions\\s*&&\\s*!!require\\.extensions\\['\\.ts'\\]\\);\\s*/g,\n replace: \";\",\n description: \"Removing deprecated `require.extensions` check in MikroORM\",\n },\n\n // 🛠️ Patch Knex to remove `Migrator` and `Seeder`\n {\n file: \"node_modules/knex/lib/knex-builder/make-knex.js\",\n deleteLines: [\n /^const \\{ Migrator \\} = require\\('\\.\\.\\/migrations\\/migrate\\/Migrator'\\);$/gm,\n /^const Seeder = require\\('\\.\\.\\/migrations\\/seed\\/Seeder'\\);$/gm,\n ],\n description: \"Removing `Migrator` and `Seeder` requires from make-knex.js\",\n },\n {\n file: \"node_modules/knex/lib/knex-builder/make-knex.js\",\n search: /\\sreturn new Migrator\\(this\\);/g,\n replace: \"return null;\",\n description: \"Replacing `return new Migrator(this);` with `return null;`\",\n },\n {\n file: \"node_modules/knex/lib/knex-builder/make-knex.js\",\n search: /\\sreturn new Seeder\\(this\\);/g,\n replace: \"return null;\",\n description: \"Replacing `return new Seeder(this);` with `return null;`\",\n },\n // 🔄 Patch for MikroORM Entity Generator to use 'forge-sql-orm'\n // {\n // file: \"node_modules/@mikro-orm/entity-generator/SourceFile.js\",\n // search: /^.* from '@mikro-orm.*$/gim,\n // replace: \" }).join(', '))} } from 'forge-sql-orm';`);\",\n // description: \"Replacing entity generator imports with 'forge-sql-orm'\"\n // },\n {\n file: \"node_modules/knex/lib/dialects/index.js\",\n deleteLines: [\n /^.*mssql.*$/gim,\n /^.*MsSql.*$/gim,\n /^.*postgresql.*$/gim,\n /^.*sqlite.*$/gim,\n /^.*oracle.*$/gim,\n /^.*oracledb.*$/gim,\n /^.*pgnative.*$/gim,\n /^.*postgres.*$/gim,\n /^.*redshift.*$/gim,\n /^.*sqlite3.*$/gim,\n /^.*cockroachdb.*$/gim,\n ],\n description: \"Removing unused dialects from @mikro-orm/knex/dialects/index.js\",\n },\n {\n file: \"node_modules/@mikro-orm/core/utils/Utils.js\",\n search: /\\s\\|\\|\\s*\\(require\\.extensions\\s*&&\\s*!!require\\.extensions\\['\\.ts'\\]\\);\\s*/g,\n replace: \";\", // Replaces with semicolon to keep syntax valid\n description: \"Removing deprecated `require.extensions` check from MikroORM\",\n },\n {\n file: \"node_modules/@mikro-orm/core/utils/Utils.js\",\n search: /^.*extensions.*$/gim,\n replace: \"{\", // Replaces with semicolon to keep syntax valid\n description: \"Removing deprecated `require.extensions` check from MikroORM\",\n },\n {\n file: \"node_modules/@mikro-orm/core/utils/Utils.js\",\n search: /^.*package.json.*$/gim,\n replace: \"return 0;\", // Replaces with semicolon to keep syntax valid\n description: \"Removing deprecated `require.extensions` check from MikroORM\",\n },\n {\n file: \"node_modules/@mikro-orm/knex/dialects/mysql/index.js\",\n deleteLines: [/^.*MariaDbKnexDialect.*$/gim],\n description: \"Removing MariaDbKnexDialect\",\n },\n];\n\n/**\n * Runs the MikroORM & Knex patching logic.\n */\nexport function runPostInstallPatch() {\n console.log(\"🔧 Applying MikroORM & Knex patches...\");\n PATCHES.forEach(\n ({ file, search, replace, deleteLines, deleteFile, deleteFolder, description }) => {\n if (file) {\n const filePath = path.resolve(file);\n if (fs.existsSync(filePath)) {\n let content = fs.readFileSync(filePath, \"utf8\");\n let originalContent = content;\n\n // 🔄 Replace text\n if (search && replace) {\n if (typeof search === \"string\" ? content.includes(search) : search.test(content)) {\n content = content.replace(search, replace);\n console.log(`[PATCHED] ${description}`);\n }\n }\n\n // 🗑️ Remove matching lines\n if (deleteLines) {\n deleteLines.forEach((pattern) => {\n content = content\n .split(\"\\n\")\n .filter((line) => !pattern.test(line))\n .join(\"\\n\");\n });\n if (content !== originalContent) {\n console.log(`[CLEANED] Removed matching lines in ${file}`);\n }\n }\n\n // 💾 Save changes only if file was modified\n if (content !== originalContent) {\n fs.writeFileSync(filePath, content, \"utf8\");\n }\n\n // 🚮 Remove empty files\n if (content.trim() === \"\") {\n fs.unlinkSync(filePath);\n console.log(`[REMOVED] ${filePath} (file is now empty)`);\n }\n } else {\n console.warn(`[WARNING] File not found: ${file}`);\n }\n }\n\n // 🚮 Delete specific files\n if (deleteFile) {\n const deleteFilePath = path.resolve(__dirname, \"../\", deleteFile);\n if (fs.existsSync(deleteFilePath)) {\n fs.unlinkSync(deleteFilePath);\n console.log(`[DELETED] ${description}`);\n }\n }\n\n // 🚮 Delete entire folders\n if (deleteFolder) {\n const deleteFolderPath = path.resolve(__dirname, \"../\", deleteFolder);\n if (fs.existsSync(deleteFolderPath)) {\n fs.rmSync(deleteFolderPath, { recursive: true, force: true });\n console.log(`[DELETED] ${description}`);\n }\n }\n },\n );\n\n console.log(\"🎉 MikroORM & Knex patching completed!\");\n}\n","#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport dotenv from \"dotenv\";\nimport inquirer from \"inquirer\";\nimport { generateModels } from \"./actions/generate-models\";\nimport { createMigration } from \"./actions/migrations-create\";\nimport { updateMigration } from \"./actions/migrations-update\";\nimport { runPostInstallPatch } from \"./actions/PatchPostinstall\";\n\n// 🔄 Load environment variables from `.env` file\ndotenv.config();\n\n/**\n * Prompts the user for missing parameters using Inquirer.js.\n * @param config - The current configuration object.\n * @param defaultOutput - Default output path.\n * @param customAskMissingParams - Optional function for additional prompts.\n * @returns Updated configuration with user input.\n */\nconst askMissingParams = async (\n config: any,\n defaultOutput: string,\n customAskMissingParams?: (cfg: any, questions: unknown[]) => void,\n) => {\n const questions: unknown[] = [];\n\n if (!config.host)\n questions.push({\n type: \"input\",\n name: \"host\",\n message: \"Enter database host:\",\n default: \"localhost\",\n });\n\n if (!config.port)\n questions.push({\n type: \"input\",\n name: \"port\",\n message: \"Enter database port:\",\n default: \"3306\",\n validate: (input: string) => !isNaN(parseInt(input, 10)),\n });\n\n if (!config.user)\n questions.push({\n type: \"input\",\n name: \"user\",\n message: \"Enter database user:\",\n default: \"root\",\n });\n\n if (!config.password)\n questions.push({\n type: \"password\",\n name: \"password\",\n message: \"Enter database password:\",\n mask: \"*\",\n });\n\n if (!config.dbName)\n questions.push({\n type: \"input\",\n name: \"dbName\",\n message: \"Enter database name:\",\n });\n\n if (!config.output)\n questions.push({\n type: \"input\",\n name: \"output\",\n message: \"Enter output path:\",\n default: defaultOutput,\n });\n\n // Allow additional questions from the caller\n if (customAskMissingParams) {\n customAskMissingParams(config, questions);\n }\n\n // If there are missing parameters, prompt the user\n if (questions.length > 0) {\n // @ts-ignore - Ignore TypeScript warning for dynamic question type\n const answers = await inquirer.prompt(questions);\n return { ...config, ...answers, port: parseInt(answers.port, 10) };\n }\n\n return config;\n};\n\n/**\n * Retrieves configuration parameters from command-line arguments and environment variables.\n * If any required parameters are missing, prompts the user for input.\n * @param cmd - The command object containing CLI options.\n * @param defaultOutput - Default output directory.\n * @param customConfig - Optional function for additional configuration parameters.\n * @param customAskMissingParams - Optional function for additional prompts.\n * @returns A fully resolved configuration object.\n */\nconst getConfig = async (\n cmd: any,\n defaultOutput: string,\n customConfig?: () => any,\n customAskMissingParams?: (cfg: any, questions: unknown[]) => void,\n) => {\n let config = {\n host: cmd.host || process.env.FORGE_SQL_ORM_HOST,\n port: cmd.port\n ? parseInt(cmd.port, 10)\n : process.env.FORGE_SQL_ORM_PORT\n ? parseInt(process.env.FORGE_SQL_ORM_PORT, 10)\n : undefined,\n user: cmd.user || process.env.FORGE_SQL_ORM_USER,\n password: cmd.password || process.env.FORGE_SQL_ORM_PASSWORD,\n dbName: cmd.dbName || process.env.FORGE_SQL_ORM_DBNAME,\n output: cmd.output || process.env.FORGE_SQL_ORM_OUTPUT,\n };\n\n // Merge additional configurations if provided\n if (customConfig) {\n config = { ...config, ...customConfig() };\n }\n\n return await askMissingParams(config, defaultOutput, customAskMissingParams);\n};\n\n// 📌 Initialize CLI\nconst program = new Command();\nprogram.version(\"1.0.0\");\n\n// ✅ Command: Generate database models (Entities)\nprogram\n .command(\"generate:model\")\n .description(\"Generate MikroORM models from the database.\")\n .option(\"--host <string>\", \"Database host\")\n .option(\"--port <number>\", \"Database port\")\n .option(\"--user <string>\", \"Database user\")\n .option(\"--password <string>\", \"Database password\")\n .option(\"--dbName <string>\", \"Database name\")\n .option(\"--output <string>\", \"Output path for entities\")\n .action(async (cmd) => {\n const config = await getConfig(cmd, \"./database/entities\");\n await generateModels(config);\n });\n\n// ✅ Command: Create initial database migration\nprogram\n .command(\"migrations:create\")\n .description(\"Generate an initial migration for the entire database.\")\n .option(\"--host <string>\", \"Database host\")\n .option(\"--port <number>\", \"Database port\")\n .option(\"--user <string>\", \"Database user\")\n .option(\"--password <string>\", \"Database password\")\n .option(\"--dbName <string>\", \"Database name\")\n .option(\"--output <string>\", \"Output path for migrations\")\n .option(\"--entitiesPath <string>\", \"Path to the folder containing entities\")\n .action(async (cmd) => {\n const config = await getConfig(\n cmd,\n \"./database/migration\",\n () => ({\n entitiesPath: cmd.entitiesPath || process.env.FORGE_SQL_ORM_ENTITIES_PATH,\n }),\n (cfg, questions: unknown[]) => {\n if (!cfg.entitiesPath)\n questions.push({\n type: \"input\",\n name: \"entitiesPath\",\n message: \"Enter the path to entities:\",\n default: \"./database/entities\",\n });\n },\n );\n await createMigration(config);\n });\n\n// ✅ Command: Update migration for schema changes\nprogram\n .command(\"migrations:update\")\n .description(\"Generate a migration to update the database schema.\")\n .option(\"--host <string>\", \"Database host\")\n .option(\"--port <number>\", \"Database port\")\n .option(\"--user <string>\", \"Database user\")\n .option(\"--password <string>\", \"Database password\")\n .option(\"--dbName <string>\", \"Database name\")\n .option(\"--output <string>\", \"Output path for migrations\")\n .option(\"--entitiesPath <string>\", \"Path to the folder containing entities\")\n .action(async (cmd) => {\n const config = await getConfig(\n cmd,\n \"./database/migration\",\n () => ({\n entitiesPath: cmd.entitiesPath || process.env.FORGE_SQL_ORM_ENTITIES_PATH,\n }),\n (cfg, questions: unknown[]) => {\n if (!cfg.entitiesPath)\n questions.push({\n type: \"input\",\n name: \"entitiesPath\",\n message: \"Enter the path to entities:\",\n default: \"./database/entities\",\n });\n },\n );\n await updateMigration(config);\n });\n\n// Patch MikroORM and Knex\nprogram\n .command(\"patch:mikroorm\")\n .description(\"Patch MikroORM and Knex dependencies to work properly with Forge\")\n .action(async () => {\n console.log(\"Running MikroORM patch...\");\n await runPostInstallPatch();\n await runPostInstallPatch();\n await runPostInstallPatch();\n console.log(\"✅ MikroORM patch applied successfully!\");\n });\n\n// 🔥 Execute CLI\nprogram.parse(process.argv);\n"],"names":["defineConfig","MongoNamingStrategy","EntityGenerator","MikroORM","cleanSQLStatement","generateMigrationFile","saveMigrationFiles","extractCreateStatements","loadEntities","loadMigrationVersion","Command"],"mappings":"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"}