@exogee/graphweaver-mikroorm 2.19.7 → 2.19.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/database.js CHANGED
@@ -152,7 +152,7 @@ class DatabaseImplementation {
152
152
  },
153
153
  ...params
154
154
  });
155
- import_logger.logger.trace("Creating connection to %s on %s", params.dbName, params.host);
155
+ import_logger.logger.trace({ dbName: params.dbName, host: params.host }, "Creating database connection");
156
156
  await orm.connect();
157
157
  import_logger.logger.trace("Caching connection");
158
158
  this.cachedOrm = orm;
@@ -204,7 +204,7 @@ class DatabaseImplementation {
204
204
  try {
205
205
  result = await callback();
206
206
  } catch (error) {
207
- import_logger.logger.error("Error in transaction", error);
207
+ import_logger.logger.error(error, "Error in transaction");
208
208
  throw error;
209
209
  } finally {
210
210
  delete this.transactionalEm;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/database.ts"],
4
- "sourcesContent": ["import './utils/change-tracker';\n\nimport {\n\tAnyEntity,\n\tConnection,\n\tEntityName,\n\tIDatabaseDriver,\n\tMikroORM,\n\tOptions,\n\tReflectMetadataProvider,\n} from '@mikro-orm/core';\nimport { logger } from '@exogee/logger';\n\nimport type { EntityManager as PgEntityManager, PostgreSqlDriver } from '@mikro-orm/postgresql';\nimport type { EntityManager as MyEntityManager, MySqlDriver } from '@mikro-orm/mysql';\nimport type { EntityManager as SqliteEntityManager, SqliteDriver } from '@mikro-orm/sqlite';\ntype EntityManager =\n\t| PgEntityManager<PostgreSqlDriver>\n\t| MyEntityManager<MySqlDriver>\n\t| SqliteEntityManager<SqliteDriver>;\n\nexport type DatabaseType = 'mssql' | 'mysql' | 'postgresql' | 'sqlite';\n\nexport interface ConnectionOptions {\n\tmikroOrmConfig?: Options | (() => Options | Promise<Options>);\n\tsecretArn?: string;\n\tconnectionManagerId?: string;\n}\n\nexport enum IsolationLevel {\n\tSERIALIZABLE = 'SERIALIZABLE',\n\tREPEATABLE_READ = 'REPEATABLE READ',\n\tREAD_COMMITTED = 'READ COMMITTED',\n\tREAD_UNCOMMITTED = 'READ UNCOMMITTED',\n}\n\nconst NumericIsolationLevels = {\n\t[IsolationLevel.SERIALIZABLE]: 4,\n\t[IsolationLevel.REPEATABLE_READ]: 3,\n\t[IsolationLevel.READ_COMMITTED]: 2,\n\t[IsolationLevel.READ_UNCOMMITTED]: 1,\n};\n\nexport type Database = typeof DatabaseImplementation.prototype;\n\nclass DatabaseImplementation {\n\tprivate cachedOrm?: MikroORM<IDatabaseDriver<Connection>>;\n\tprivate transactionalEm?: EntityManager;\n\tprivate transactionInProgressIsolationLevel?: IsolationLevel;\n\tprivate connectionOptions?: ConnectionOptions;\n\n\tpublic get orm() {\n\t\tif (!this.cachedOrm) {\n\t\t\tconst error = new Error('Tried to get the ORM before it was connected.');\n\t\t\tlogger.error(error);\n\t\t\tthrow error;\n\t\t}\n\n\t\treturn this.cachedOrm;\n\t}\n\n\tpublic get em() {\n\t\treturn this.transactionalEm || (this.orm.em as EntityManager);\n\t}\n\n\tpublic async transactional<T>(\n\t\tcallback: () => Promise<T>,\n\t\tisolationLevel: IsolationLevel = IsolationLevel.READ_COMMITTED\n\t) {\n\t\tlogger.trace('Database::transactional() enter');\n\n\t\tif (\n\t\t\tthis.transactionInProgressIsolationLevel &&\n\t\t\tNumericIsolationLevels[this.transactionInProgressIsolationLevel] <\n\t\t\t\tNumericIsolationLevels[isolationLevel]\n\t\t) {\n\t\t\tconst error = new Error(\n\t\t\t\t`Transaction in progress is ${this.transactionInProgressIsolationLevel} isolation level, but ${isolationLevel} was requested, which is more restrictive. Since we can't upgrade, this is an error.`\n\t\t\t);\n\t\t\tlogger.error(error);\n\t\t\tthrow error;\n\t\t}\n\n\t\tif (this.transactionalEm) {\n\t\t\t// Transaction is already in progress that is isolated enough. Run the callback without starting a new one.\n\t\t\tlogger.trace(\n\t\t\t\t'Transaction already in progress with sufficient isolation, proceeding without new transaction.'\n\t\t\t);\n\n\t\t\treturn callback();\n\t\t} else {\n\t\t\t// Ok, start a new one.\n\t\t\tlogger.trace('Starting transaction');\n\n\t\t\treturn this.em.transactional(async (em) => {\n\t\t\t\tthis.transactionalEm = em;\n\t\t\t\tthis.transactionInProgressIsolationLevel = isolationLevel;\n\n\t\t\t\tconst driver = this.em.getDriver();\n\t\t\t\tif (driver.constructor.name === 'SqliteDriver') {\n\t\t\t\t\tlogger.trace('All transactions in SQLite are SERIALIZABLE');\n\t\t\t\t} else {\n\t\t\t\t\tawait em.execute(`SET SESSION TRANSACTION ISOLATION LEVEL ${isolationLevel}`);\n\t\t\t\t}\n\n\t\t\t\tlet result: T;\n\t\t\t\ttry {\n\t\t\t\t\tresult = await callback();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.error('Error in transaction', error);\n\t\t\t\t\tthrow error;\n\t\t\t\t} finally {\n\t\t\t\t\tdelete this.transactionalEm;\n\t\t\t\t\tdelete this.transactionInProgressIsolationLevel;\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic isolatedTest(test: () => any) {\n\t\treturn async () => {\n\t\t\ttry {\n\t\t\t\tawait this.transactional(async () => {\n\t\t\t\t\tawait test();\n\t\t\t\t\tthrow new Error('Rollback transaction for test');\n\t\t\t\t}, IsolationLevel.SERIALIZABLE);\n\t\t\t} catch (error) {\n\t\t\t\t// Only need to care if this isn't our rollback from above.\n\t\t\t\t// Otherwise just gobble it.\n\t\t\t\tif ((error as Error).message !== 'Rollback transaction for test') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\tpublic get rawConnection() {\n\t\treturn this.em.getDriver().getConnection();\n\t}\n\n\tprivate getEnvironmentOverrides = async (secretArn?: string): Promise<Options> => {\n\t\tlogger.trace('Database::getEnvironmentOverrides() - Enter');\n\t\tconst secret = secretArn ?? process.env.DATABASE_SECRET_ARN;\n\t\tif (secret) {\n\t\t\tconst { SecretsManagerClient, GetSecretValueCommand } = await import(\n\t\t\t\t'@aws-sdk/client-secrets-manager'\n\t\t\t);\n\n\t\t\tif (!SecretsManagerClient || !GetSecretValueCommand) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'SecretsManagerClient or GetSecretValueCommand not found but a secret ARN was provided. Is @aws-sdk/client-secrets-manager available?'\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst client = new SecretsManagerClient({\n\t\t\t\tregion: process.env.AWS_REGION,\n\t\t\t});\n\t\t\tconst command = new GetSecretValueCommand({ SecretId: secret });\n\n\t\t\ttry {\n\t\t\t\tlogger.trace('Fetching secret from Secrets Manager');\n\t\t\t\tconst response = await client.send(command);\n\t\t\t\tconst secret = JSON.parse(response.SecretString as string);\n\t\t\t\tlogger.trace('Secret fetched from Secrets Manager');\n\n\t\t\t\treturn {\n\t\t\t\t\thost: secret.host,\n\t\t\t\t\tport: secret.port,\n\t\t\t\t\tuser: secret.username,\n\t\t\t\t\tpassword: secret.password,\n\t\t\t\t\tdbName: secret.dbname,\n\t\t\t\t\tdriverOptions: {\n\t\t\t\t\t\tconnection: { ssl: true },\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error('Error fetching secret from Secrets Manager');\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tlogger.trace('No secret ARN provided, using environment variables');\n\n\t\treturn {\n\t\t\thost: process.env.DATABASE_HOST,\n\t\t\tport: process.env.DATABASE_PORT ? Number(process.env.DATABASE_PORT) : undefined,\n\t\t\tuser: process.env.DATABASE_USERNAME,\n\t\t\tpassword: process.env.DATABASE_PASSWORD,\n\t\t\tdbName: process.env.DATABASE_NAME,\n\t\t};\n\t};\n\n\tprivate getConnectionInfo = async (connectionOptions?: ConnectionOptions): Promise<Options> => {\n\t\tlogger.trace('Database::getConnectionInfo() - Enter');\n\n\t\t// We have some defaults\n\t\tconst defaults: Options = {\n\t\t\thost: 'localhost',\n\t\t\tport: 5432,\n\t\t\tdbName: 'graphweaver',\n\t\t};\n\n\t\tconst resolvedMikroOrmConfig =\n\t\t\ttypeof connectionOptions?.mikroOrmConfig === 'function'\n\t\t\t\t? await connectionOptions.mikroOrmConfig()\n\t\t\t\t: connectionOptions?.mikroOrmConfig;\n\n\t\t// And finally we can override all of this with environment variables if needed.\n\t\tconst environmentOverrides = await this.getEnvironmentOverrides(connectionOptions?.secretArn);\n\n\t\t// Create a function we can use to filter out undefined values in the object.\n\t\tconst filterUndefined = (obj?: Options) => {\n\t\t\tif (!obj) return {};\n\n\t\t\tfor (const key of Object.keys(obj) as Array<keyof Options>) {\n\t\t\t\tif (obj[key] === undefined) delete obj[key];\n\t\t\t}\n\n\t\t\treturn obj;\n\t\t};\n\n\t\t// Apply each in order so the correct value wins.\n\t\treturn {\n\t\t\t...defaults,\n\t\t\t...filterUndefined(environmentOverrides),\n\t\t\t...filterUndefined(resolvedMikroOrmConfig),\n\t\t};\n\t};\n\n\tpublic getRepository = <T extends AnyEntity<T>>(entityName: EntityName<T>) =>\n\t\tthis.em.getRepository(entityName);\n\n\tpublic connect = async (connectionOptions?: ConnectionOptions) => {\n\t\tlogger.trace('Database::connect() - Enter');\n\t\tthis.connectionOptions = connectionOptions;\n\n\t\tif (this.cachedOrm) {\n\t\t\tlogger.trace('Returning cached ORM');\n\t\t\treturn this.cachedOrm;\n\t\t}\n\n\t\tlogger.trace('Creating new ORM');\n\t\tlogger.trace('Getting connection info');\n\n\t\tconst params = await this.getConnectionInfo(connectionOptions);\n\n\t\tlogger.trace('Initialising ORM');\n\n\t\tlogger.trace(`${params.entities?.length}x entities`);\n\n\t\t// Log the params, obfuscating the password used for the connection if there is one.\n\t\tconst { password, ...rest } = params;\n\t\tlogger.info(\n\t\t\t{ connectionParams: rest },\n\t\t\t'Connecting to database using MikroORM. Note: connectionParams have password removed for security.'\n\t\t);\n\n\t\tconst orm = await MikroORM.init({\n\t\t\tvalidateRequired: false, // Since v5, new entities are validated on runtime (just before executing insert queries), based on the entity metadata\n\t\t\tcontextName: connectionOptions?.connectionManagerId ?? 'default',\n\t\t\timplicitTransactions: false,\n\t\t\tmetadataProvider: ReflectMetadataProvider,\n\t\t\tdiscovery: {\n\t\t\t\tdisableDynamicFileAccess: true,\n\t\t\t\trequireEntitiesArray: false,\n\t\t\t\twarnWhenNoEntities: false,\n\t\t\t},\n\t\t\tallowGlobalContext: true,\n\n\t\t\t// Ensure we only ever create one connection to the database.\n\t\t\tpool: {\n\t\t\t\tmin: 1,\n\t\t\t\tmax: 1,\n\t\t\t},\n\t\t\t...params,\n\t\t});\n\n\t\tlogger.trace('Creating connection to %s on %s', params.dbName, params.host);\n\t\tawait orm.connect();\n\n\t\tlogger.trace('Caching connection');\n\t\tthis.cachedOrm = orm;\n\t\treturn orm;\n\t};\n\n\tpublic close = async () => {\n\t\tlogger.trace('Closing database connection');\n\n\t\tawait this.orm.close(true);\n\t\tdelete this.cachedOrm;\n\t};\n}\n\nclass ConnectionsManager {\n\tprivate connections = new Map<string, DatabaseImplementation>();\n\tprivate connectionPromises = new Map<string, Promise<DatabaseImplementation>>();\n\n\tgetConnections() {\n\t\treturn Array.from(this.connections.values());\n\t}\n\n\tget default(): DatabaseImplementation {\n\t\tconst [defaultConnection] = [...this.connections];\n\t\tif (!defaultConnection)\n\t\t\tthrow new Error(\n\t\t\t\t'Error: No database connections. There should be at least one database connection.'\n\t\t\t);\n\t\tconst [_, databaseConnection] = defaultConnection;\n\t\treturn databaseConnection;\n\t}\n\n\tpublic connect = (id: string, connectionOptions: ConnectionOptions) => {\n\t\tif (this.connections.has(id)) return this.connections.get(id);\n\n\t\tconst connect = new Promise<DatabaseImplementation>((resolve, reject) => {\n\t\t\tconst database = new DatabaseImplementation();\n\t\t\tdatabase\n\t\t\t\t.connect(connectionOptions)\n\t\t\t\t.then(() => {\n\t\t\t\t\tlogger.trace(`Saving database connection with id \"${id}\".`);\n\t\t\t\t\tthis.connections.set(id, database);\n\t\t\t\t\tresolve(database);\n\t\t\t\t})\n\t\t\t\t.catch(reject);\n\t\t});\n\n\t\tthis.connectionPromises.set(id, connect);\n\n\t\treturn connect;\n\t};\n\n\tpublic database(id: string) {\n\t\treturn this.connections.get(id);\n\t}\n\n\tpublic awaitableDatabase(id: string) {\n\t\treturn this.connectionPromises.get(id);\n\t}\n\n\tpublic async close(id: string) {\n\t\tconst database = this.database(id);\n\t\tawait database?.close();\n\t\treturn true;\n\t}\n}\nexport const ConnectionManager = new ConnectionsManager();\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import './utils/change-tracker';\n\nimport {\n\tAnyEntity,\n\tConnection,\n\tEntityName,\n\tIDatabaseDriver,\n\tMikroORM,\n\tOptions,\n\tReflectMetadataProvider,\n} from '@mikro-orm/core';\nimport { logger } from '@exogee/logger';\n\nimport type { EntityManager as PgEntityManager, PostgreSqlDriver } from '@mikro-orm/postgresql';\nimport type { EntityManager as MyEntityManager, MySqlDriver } from '@mikro-orm/mysql';\nimport type { EntityManager as SqliteEntityManager, SqliteDriver } from '@mikro-orm/sqlite';\ntype EntityManager =\n\t| PgEntityManager<PostgreSqlDriver>\n\t| MyEntityManager<MySqlDriver>\n\t| SqliteEntityManager<SqliteDriver>;\n\nexport type DatabaseType = 'mssql' | 'mysql' | 'postgresql' | 'sqlite';\n\nexport interface ConnectionOptions {\n\tmikroOrmConfig?: Options | (() => Options | Promise<Options>);\n\tsecretArn?: string;\n\tconnectionManagerId?: string;\n}\n\nexport enum IsolationLevel {\n\tSERIALIZABLE = 'SERIALIZABLE',\n\tREPEATABLE_READ = 'REPEATABLE READ',\n\tREAD_COMMITTED = 'READ COMMITTED',\n\tREAD_UNCOMMITTED = 'READ UNCOMMITTED',\n}\n\nconst NumericIsolationLevels = {\n\t[IsolationLevel.SERIALIZABLE]: 4,\n\t[IsolationLevel.REPEATABLE_READ]: 3,\n\t[IsolationLevel.READ_COMMITTED]: 2,\n\t[IsolationLevel.READ_UNCOMMITTED]: 1,\n};\n\nexport type Database = typeof DatabaseImplementation.prototype;\n\nclass DatabaseImplementation {\n\tprivate cachedOrm?: MikroORM<IDatabaseDriver<Connection>>;\n\tprivate transactionalEm?: EntityManager;\n\tprivate transactionInProgressIsolationLevel?: IsolationLevel;\n\tprivate connectionOptions?: ConnectionOptions;\n\n\tpublic get orm() {\n\t\tif (!this.cachedOrm) {\n\t\t\tconst error = new Error('Tried to get the ORM before it was connected.');\n\t\t\tlogger.error(error);\n\t\t\tthrow error;\n\t\t}\n\n\t\treturn this.cachedOrm;\n\t}\n\n\tpublic get em() {\n\t\treturn this.transactionalEm || (this.orm.em as EntityManager);\n\t}\n\n\tpublic async transactional<T>(\n\t\tcallback: () => Promise<T>,\n\t\tisolationLevel: IsolationLevel = IsolationLevel.READ_COMMITTED\n\t) {\n\t\tlogger.trace('Database::transactional() enter');\n\n\t\tif (\n\t\t\tthis.transactionInProgressIsolationLevel &&\n\t\t\tNumericIsolationLevels[this.transactionInProgressIsolationLevel] <\n\t\t\t\tNumericIsolationLevels[isolationLevel]\n\t\t) {\n\t\t\tconst error = new Error(\n\t\t\t\t`Transaction in progress is ${this.transactionInProgressIsolationLevel} isolation level, but ${isolationLevel} was requested, which is more restrictive. Since we can't upgrade, this is an error.`\n\t\t\t);\n\t\t\tlogger.error(error);\n\t\t\tthrow error;\n\t\t}\n\n\t\tif (this.transactionalEm) {\n\t\t\t// Transaction is already in progress that is isolated enough. Run the callback without starting a new one.\n\t\t\tlogger.trace(\n\t\t\t\t'Transaction already in progress with sufficient isolation, proceeding without new transaction.'\n\t\t\t);\n\n\t\t\treturn callback();\n\t\t} else {\n\t\t\t// Ok, start a new one.\n\t\t\tlogger.trace('Starting transaction');\n\n\t\t\treturn this.em.transactional(async (em) => {\n\t\t\t\tthis.transactionalEm = em;\n\t\t\t\tthis.transactionInProgressIsolationLevel = isolationLevel;\n\n\t\t\t\tconst driver = this.em.getDriver();\n\t\t\t\tif (driver.constructor.name === 'SqliteDriver') {\n\t\t\t\t\tlogger.trace('All transactions in SQLite are SERIALIZABLE');\n\t\t\t\t} else {\n\t\t\t\t\tawait em.execute(`SET SESSION TRANSACTION ISOLATION LEVEL ${isolationLevel}`);\n\t\t\t\t}\n\n\t\t\t\tlet result: T;\n\t\t\t\ttry {\n\t\t\t\t\tresult = await callback();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.error(error, 'Error in transaction');\n\t\t\t\t\tthrow error;\n\t\t\t\t} finally {\n\t\t\t\t\tdelete this.transactionalEm;\n\t\t\t\t\tdelete this.transactionInProgressIsolationLevel;\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic isolatedTest(test: () => any) {\n\t\treturn async () => {\n\t\t\ttry {\n\t\t\t\tawait this.transactional(async () => {\n\t\t\t\t\tawait test();\n\t\t\t\t\tthrow new Error('Rollback transaction for test');\n\t\t\t\t}, IsolationLevel.SERIALIZABLE);\n\t\t\t} catch (error) {\n\t\t\t\t// Only need to care if this isn't our rollback from above.\n\t\t\t\t// Otherwise just gobble it.\n\t\t\t\tif ((error as Error).message !== 'Rollback transaction for test') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\tpublic get rawConnection() {\n\t\treturn this.em.getDriver().getConnection();\n\t}\n\n\tprivate getEnvironmentOverrides = async (secretArn?: string): Promise<Options> => {\n\t\tlogger.trace('Database::getEnvironmentOverrides() - Enter');\n\t\tconst secret = secretArn ?? process.env.DATABASE_SECRET_ARN;\n\t\tif (secret) {\n\t\t\tconst { SecretsManagerClient, GetSecretValueCommand } = await import(\n\t\t\t\t'@aws-sdk/client-secrets-manager'\n\t\t\t);\n\n\t\t\tif (!SecretsManagerClient || !GetSecretValueCommand) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'SecretsManagerClient or GetSecretValueCommand not found but a secret ARN was provided. Is @aws-sdk/client-secrets-manager available?'\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst client = new SecretsManagerClient({\n\t\t\t\tregion: process.env.AWS_REGION,\n\t\t\t});\n\t\t\tconst command = new GetSecretValueCommand({ SecretId: secret });\n\n\t\t\ttry {\n\t\t\t\tlogger.trace('Fetching secret from Secrets Manager');\n\t\t\t\tconst response = await client.send(command);\n\t\t\t\tconst secret = JSON.parse(response.SecretString as string);\n\t\t\t\tlogger.trace('Secret fetched from Secrets Manager');\n\n\t\t\t\treturn {\n\t\t\t\t\thost: secret.host,\n\t\t\t\t\tport: secret.port,\n\t\t\t\t\tuser: secret.username,\n\t\t\t\t\tpassword: secret.password,\n\t\t\t\t\tdbName: secret.dbname,\n\t\t\t\t\tdriverOptions: {\n\t\t\t\t\t\tconnection: { ssl: true },\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error('Error fetching secret from Secrets Manager');\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tlogger.trace('No secret ARN provided, using environment variables');\n\n\t\treturn {\n\t\t\thost: process.env.DATABASE_HOST,\n\t\t\tport: process.env.DATABASE_PORT ? Number(process.env.DATABASE_PORT) : undefined,\n\t\t\tuser: process.env.DATABASE_USERNAME,\n\t\t\tpassword: process.env.DATABASE_PASSWORD,\n\t\t\tdbName: process.env.DATABASE_NAME,\n\t\t};\n\t};\n\n\tprivate getConnectionInfo = async (connectionOptions?: ConnectionOptions): Promise<Options> => {\n\t\tlogger.trace('Database::getConnectionInfo() - Enter');\n\n\t\t// We have some defaults\n\t\tconst defaults: Options = {\n\t\t\thost: 'localhost',\n\t\t\tport: 5432,\n\t\t\tdbName: 'graphweaver',\n\t\t};\n\n\t\tconst resolvedMikroOrmConfig =\n\t\t\ttypeof connectionOptions?.mikroOrmConfig === 'function'\n\t\t\t\t? await connectionOptions.mikroOrmConfig()\n\t\t\t\t: connectionOptions?.mikroOrmConfig;\n\n\t\t// And finally we can override all of this with environment variables if needed.\n\t\tconst environmentOverrides = await this.getEnvironmentOverrides(connectionOptions?.secretArn);\n\n\t\t// Create a function we can use to filter out undefined values in the object.\n\t\tconst filterUndefined = (obj?: Options) => {\n\t\t\tif (!obj) return {};\n\n\t\t\tfor (const key of Object.keys(obj) as Array<keyof Options>) {\n\t\t\t\tif (obj[key] === undefined) delete obj[key];\n\t\t\t}\n\n\t\t\treturn obj;\n\t\t};\n\n\t\t// Apply each in order so the correct value wins.\n\t\treturn {\n\t\t\t...defaults,\n\t\t\t...filterUndefined(environmentOverrides),\n\t\t\t...filterUndefined(resolvedMikroOrmConfig),\n\t\t};\n\t};\n\n\tpublic getRepository = <T extends AnyEntity<T>>(entityName: EntityName<T>) =>\n\t\tthis.em.getRepository(entityName);\n\n\tpublic connect = async (connectionOptions?: ConnectionOptions) => {\n\t\tlogger.trace('Database::connect() - Enter');\n\t\tthis.connectionOptions = connectionOptions;\n\n\t\tif (this.cachedOrm) {\n\t\t\tlogger.trace('Returning cached ORM');\n\t\t\treturn this.cachedOrm;\n\t\t}\n\n\t\tlogger.trace('Creating new ORM');\n\t\tlogger.trace('Getting connection info');\n\n\t\tconst params = await this.getConnectionInfo(connectionOptions);\n\n\t\tlogger.trace('Initialising ORM');\n\n\t\tlogger.trace(`${params.entities?.length}x entities`);\n\n\t\t// Log the params, obfuscating the password used for the connection if there is one.\n\t\tconst { password, ...rest } = params;\n\t\tlogger.info(\n\t\t\t{ connectionParams: rest },\n\t\t\t'Connecting to database using MikroORM. Note: connectionParams have password removed for security.'\n\t\t);\n\n\t\tconst orm = await MikroORM.init({\n\t\t\tvalidateRequired: false, // Since v5, new entities are validated on runtime (just before executing insert queries), based on the entity metadata\n\t\t\tcontextName: connectionOptions?.connectionManagerId ?? 'default',\n\t\t\timplicitTransactions: false,\n\t\t\tmetadataProvider: ReflectMetadataProvider,\n\t\t\tdiscovery: {\n\t\t\t\tdisableDynamicFileAccess: true,\n\t\t\t\trequireEntitiesArray: false,\n\t\t\t\twarnWhenNoEntities: false,\n\t\t\t},\n\t\t\tallowGlobalContext: true,\n\n\t\t\t// Ensure we only ever create one connection to the database.\n\t\t\tpool: {\n\t\t\t\tmin: 1,\n\t\t\t\tmax: 1,\n\t\t\t},\n\t\t\t...params,\n\t\t});\n\n\t\tlogger.trace({ dbName: params.dbName, host: params.host }, 'Creating database connection');\n\t\tawait orm.connect();\n\n\t\tlogger.trace('Caching connection');\n\t\tthis.cachedOrm = orm;\n\t\treturn orm;\n\t};\n\n\tpublic close = async () => {\n\t\tlogger.trace('Closing database connection');\n\n\t\tawait this.orm.close(true);\n\t\tdelete this.cachedOrm;\n\t};\n}\n\nclass ConnectionsManager {\n\tprivate connections = new Map<string, DatabaseImplementation>();\n\tprivate connectionPromises = new Map<string, Promise<DatabaseImplementation>>();\n\n\tgetConnections() {\n\t\treturn Array.from(this.connections.values());\n\t}\n\n\tget default(): DatabaseImplementation {\n\t\tconst [defaultConnection] = [...this.connections];\n\t\tif (!defaultConnection)\n\t\t\tthrow new Error(\n\t\t\t\t'Error: No database connections. There should be at least one database connection.'\n\t\t\t);\n\t\tconst [_, databaseConnection] = defaultConnection;\n\t\treturn databaseConnection;\n\t}\n\n\tpublic connect = (id: string, connectionOptions: ConnectionOptions) => {\n\t\tif (this.connections.has(id)) return this.connections.get(id);\n\n\t\tconst connect = new Promise<DatabaseImplementation>((resolve, reject) => {\n\t\t\tconst database = new DatabaseImplementation();\n\t\t\tdatabase\n\t\t\t\t.connect(connectionOptions)\n\t\t\t\t.then(() => {\n\t\t\t\t\tlogger.trace(`Saving database connection with id \"${id}\".`);\n\t\t\t\t\tthis.connections.set(id, database);\n\t\t\t\t\tresolve(database);\n\t\t\t\t})\n\t\t\t\t.catch(reject);\n\t\t});\n\n\t\tthis.connectionPromises.set(id, connect);\n\n\t\treturn connect;\n\t};\n\n\tpublic database(id: string) {\n\t\treturn this.connections.get(id);\n\t}\n\n\tpublic awaitableDatabase(id: string) {\n\t\treturn this.connectionPromises.get(id);\n\t}\n\n\tpublic async close(id: string) {\n\t\tconst database = this.database(id);\n\t\tawait database?.close();\n\t\treturn true;\n\t}\n}\nexport const ConnectionManager = new ConnectionsManager();\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAAO;AAEP,kBAQO;AACP,oBAAuB;AAkBhB,IAAK,iBAAL,kBAAKA,oBAAL;AACN,EAAAA,gBAAA,kBAAe;AACf,EAAAA,gBAAA,qBAAkB;AAClB,EAAAA,gBAAA,oBAAiB;AACjB,EAAAA,gBAAA,sBAAmB;AAJR,SAAAA;AAAA,GAAA;AAOZ,MAAM,yBAAyB;AAAA,EAC9B,CAAC,iCAA2B,GAAG;AAAA,EAC/B,CAAC,uCAA8B,GAAG;AAAA,EAClC,CAAC,qCAA6B,GAAG;AAAA,EACjC,CAAC,yCAA+B,GAAG;AACpC;AAIA,MAAM,uBAAuB;AAAA,EAA7B;AAgGC,SAAQ,0BAA0B,OAAO,cAAyC;AACjF,2BAAO,MAAM,6CAA6C;AAC1D,YAAM,SAAS,aAAa,QAAQ,IAAI;AACxC,UAAI,QAAQ;AACX,cAAM,EAAE,sBAAsB,sBAAsB,IAAI,MAAM,OAC7D,iCACD;AAEA,YAAI,CAAC,wBAAwB,CAAC,uBAAuB;AACpD,gBAAM,IAAI;AAAA,YACT;AAAA,UACD;AAAA,QACD;AAEA,cAAM,SAAS,IAAI,qBAAqB;AAAA,UACvC,QAAQ,QAAQ,IAAI;AAAA,QACrB,CAAC;AACD,cAAM,UAAU,IAAI,sBAAsB,EAAE,UAAU,OAAO,CAAC;AAE9D,YAAI;AACH,+BAAO,MAAM,sCAAsC;AACnD,gBAAM,WAAW,MAAM,OAAO,KAAK,OAAO;AAC1C,gBAAMC,UAAS,KAAK,MAAM,SAAS,YAAsB;AACzD,+BAAO,MAAM,qCAAqC;AAElD,iBAAO;AAAA,YACN,MAAMA,QAAO;AAAA,YACb,MAAMA,QAAO;AAAA,YACb,MAAMA,QAAO;AAAA,YACb,UAAUA,QAAO;AAAA,YACjB,QAAQA,QAAO;AAAA,YACf,eAAe;AAAA,cACd,YAAY,EAAE,KAAK,KAAK;AAAA,YACzB;AAAA,UACD;AAAA,QACD,SAAS,OAAO;AACf,+BAAO,MAAM,4CAA4C;AACzD,gBAAM;AAAA,QACP;AAAA,MACD;AAEA,2BAAO,MAAM,qDAAqD;AAElE,aAAO;AAAA,QACN,MAAM,QAAQ,IAAI;AAAA,QAClB,MAAM,QAAQ,IAAI,gBAAgB,OAAO,QAAQ,IAAI,aAAa,IAAI;AAAA,QACtE,MAAM,QAAQ,IAAI;AAAA,QAClB,UAAU,QAAQ,IAAI;AAAA,QACtB,QAAQ,QAAQ,IAAI;AAAA,MACrB;AAAA,IACD;AAEA,SAAQ,oBAAoB,OAAO,sBAA4D;AAC9F,2BAAO,MAAM,uCAAuC;AAGpD,YAAM,WAAoB;AAAA,QACzB,MAAM;AAAA,QACN,MAAM;AAAA,QACN,QAAQ;AAAA,MACT;AAEA,YAAM,yBACL,OAAO,mBAAmB,mBAAmB,aAC1C,MAAM,kBAAkB,eAAe,IACvC,mBAAmB;AAGvB,YAAM,uBAAuB,MAAM,KAAK,wBAAwB,mBAAmB,SAAS;AAG5F,YAAM,kBAAkB,CAAC,QAAkB;AAC1C,YAAI,CAAC,IAAK,QAAO,CAAC;AAElB,mBAAW,OAAO,OAAO,KAAK,GAAG,GAA2B;AAC3D,cAAI,IAAI,GAAG,MAAM,OAAW,QAAO,IAAI,GAAG;AAAA,QAC3C;AAEA,eAAO;AAAA,MACR;AAGA,aAAO;AAAA,QACN,GAAG;AAAA,QACH,GAAG,gBAAgB,oBAAoB;AAAA,QACvC,GAAG,gBAAgB,sBAAsB;AAAA,MAC1C;AAAA,IACD;AAEA,SAAO,gBAAgB,CAAyB,eAC/C,KAAK,GAAG,cAAc,UAAU;AAEjC,SAAO,UAAU,OAAO,sBAA0C;AACjE,2BAAO,MAAM,6BAA6B;AAC1C,WAAK,oBAAoB;AAEzB,UAAI,KAAK,WAAW;AACnB,6BAAO,MAAM,sBAAsB;AACnC,eAAO,KAAK;AAAA,MACb;AAEA,2BAAO,MAAM,kBAAkB;AAC/B,2BAAO,MAAM,yBAAyB;AAEtC,YAAM,SAAS,MAAM,KAAK,kBAAkB,iBAAiB;AAE7D,2BAAO,MAAM,kBAAkB;AAE/B,2BAAO,MAAM,GAAG,OAAO,UAAU,MAAM,YAAY;AAGnD,YAAM,EAAE,UAAU,GAAG,KAAK,IAAI;AAC9B,2BAAO;AAAA,QACN,EAAE,kBAAkB,KAAK;AAAA,QACzB;AAAA,MACD;AAEA,YAAM,MAAM,MAAM,qBAAS,KAAK;AAAA,QAC/B,kBAAkB;AAAA;AAAA,QAClB,aAAa,mBAAmB,uBAAuB;AAAA,QACvD,sBAAsB;AAAA,QACtB,kBAAkB;AAAA,QAClB,WAAW;AAAA,UACV,0BAA0B;AAAA,UAC1B,sBAAsB;AAAA,UACtB,oBAAoB;AAAA,QACrB;AAAA,QACA,oBAAoB;AAAA;AAAA,QAGpB,MAAM;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,QACN;AAAA,QACA,GAAG;AAAA,MACJ,CAAC;AAED,2BAAO,MAAM,EAAE,QAAQ,OAAO,QAAQ,MAAM,OAAO,KAAK,GAAG,8BAA8B;AACzF,YAAM,IAAI,QAAQ;AAElB,2BAAO,MAAM,oBAAoB;AACjC,WAAK,YAAY;AACjB,aAAO;AAAA,IACR;AAEA,SAAO,QAAQ,YAAY;AAC1B,2BAAO,MAAM,6BAA6B;AAE1C,YAAM,KAAK,IAAI,MAAM,IAAI;AACzB,aAAO,KAAK;AAAA,IACb;AAAA;AAAA,EAhPA,IAAW,MAAM;AAChB,QAAI,CAAC,KAAK,WAAW;AACpB,YAAM,QAAQ,IAAI,MAAM,+CAA+C;AACvE,2BAAO,MAAM,KAAK;AAClB,YAAM;AAAA,IACP;AAEA,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,IAAW,KAAK;AACf,WAAO,KAAK,mBAAoB,KAAK,IAAI;AAAA,EAC1C;AAAA,EAEA,MAAa,cACZ,UACA,iBAAiC,uCAChC;AACD,yBAAO,MAAM,iCAAiC;AAE9C,QACC,KAAK,uCACL,uBAAuB,KAAK,mCAAmC,IAC9D,uBAAuB,cAAc,GACrC;AACD,YAAM,QAAQ,IAAI;AAAA,QACjB,8BAA8B,KAAK,mCAAmC,yBAAyB,cAAc;AAAA,MAC9G;AACA,2BAAO,MAAM,KAAK;AAClB,YAAM;AAAA,IACP;AAEA,QAAI,KAAK,iBAAiB;AAEzB,2BAAO;AAAA,QACN;AAAA,MACD;AAEA,aAAO,SAAS;AAAA,IACjB,OAAO;AAEN,2BAAO,MAAM,sBAAsB;AAEnC,aAAO,KAAK,GAAG,cAAc,OAAO,OAAO;AAC1C,aAAK,kBAAkB;AACvB,aAAK,sCAAsC;AAE3C,cAAM,SAAS,KAAK,GAAG,UAAU;AACjC,YAAI,OAAO,YAAY,SAAS,gBAAgB;AAC/C,+BAAO,MAAM,6CAA6C;AAAA,QAC3D,OAAO;AACN,gBAAM,GAAG,QAAQ,2CAA2C,cAAc,EAAE;AAAA,QAC7E;AAEA,YAAI;AACJ,YAAI;AACH,mBAAS,MAAM,SAAS;AAAA,QACzB,SAAS,OAAO;AACf,+BAAO,MAAM,OAAO,sBAAsB;AAC1C,gBAAM;AAAA,QACP,UAAE;AACD,iBAAO,KAAK;AACZ,iBAAO,KAAK;AAAA,QACb;AACA,eAAO;AAAA,MACR,CAAC;AAAA,IACF;AAAA,EACD;AAAA,EAEO,aAAa,MAAiB;AACpC,WAAO,YAAY;AAClB,UAAI;AACH,cAAM,KAAK,cAAc,YAAY;AACpC,gBAAM,KAAK;AACX,gBAAM,IAAI,MAAM,+BAA+B;AAAA,QAChD,GAAG,iCAA2B;AAAA,MAC/B,SAAS,OAAO;AAGf,YAAK,MAAgB,YAAY,iCAAiC;AACjE,gBAAM;AAAA,QACP;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,IAAW,gBAAgB;AAC1B,WAAO,KAAK,GAAG,UAAU,EAAE,cAAc;AAAA,EAC1C;AAyJD;AAEA,MAAM,mBAAmB;AAAA,EAAzB;AACC,SAAQ,cAAc,oBAAI,IAAoC;AAC9D,SAAQ,qBAAqB,oBAAI,IAA6C;AAgB9E,SAAO,UAAU,CAAC,IAAY,sBAAyC;AACtE,UAAI,KAAK,YAAY,IAAI,EAAE,EAAG,QAAO,KAAK,YAAY,IAAI,EAAE;AAE5D,YAAM,UAAU,IAAI,QAAgC,CAAC,SAAS,WAAW;AACxE,cAAM,WAAW,IAAI,uBAAuB;AAC5C,iBACE,QAAQ,iBAAiB,EACzB,KAAK,MAAM;AACX,+BAAO,MAAM,uCAAuC,EAAE,IAAI;AAC1D,eAAK,YAAY,IAAI,IAAI,QAAQ;AACjC,kBAAQ,QAAQ;AAAA,QACjB,CAAC,EACA,MAAM,MAAM;AAAA,MACf,CAAC;AAED,WAAK,mBAAmB,IAAI,IAAI,OAAO;AAEvC,aAAO;AAAA,IACR;AAAA;AAAA,EAhCA,iBAAiB;AAChB,WAAO,MAAM,KAAK,KAAK,YAAY,OAAO,CAAC;AAAA,EAC5C;AAAA,EAEA,IAAI,UAAkC;AACrC,UAAM,CAAC,iBAAiB,IAAI,CAAC,GAAG,KAAK,WAAW;AAChD,QAAI,CAAC;AACJ,YAAM,IAAI;AAAA,QACT;AAAA,MACD;AACD,UAAM,CAAC,GAAG,kBAAkB,IAAI;AAChC,WAAO;AAAA,EACR;AAAA,EAsBO,SAAS,IAAY;AAC3B,WAAO,KAAK,YAAY,IAAI,EAAE;AAAA,EAC/B;AAAA,EAEO,kBAAkB,IAAY;AACpC,WAAO,KAAK,mBAAmB,IAAI,EAAE;AAAA,EACtC;AAAA,EAEA,MAAa,MAAM,IAAY;AAC9B,UAAM,WAAW,KAAK,SAAS,EAAE;AACjC,UAAM,UAAU,MAAM;AACtB,WAAO;AAAA,EACR;AACD;AACO,MAAM,oBAAoB,IAAI,mBAAmB;",
6
6
  "names": ["IsolationLevel", "secret"]
7
7
  }
@@ -35,7 +35,7 @@ var import_logger = require("@exogee/logger");
35
35
  var import_core = require("@mikro-orm/core");
36
36
  var import_graphweaver_server = require("@exogee/graphweaver-server");
37
37
  var import__ = require("..");
38
- var import_errors = require("../utils/errors");
38
+ var import_utils = require("../utils");
39
39
  var import_assign = require("./assign");
40
40
  const objectOperations = /* @__PURE__ */ new Set(["_and", "_or", "_not"]);
41
41
  const mikroObjectOperations = /* @__PURE__ */ new Set(["$and", "$or", "$not"]);
@@ -260,9 +260,10 @@ class MikroBackendProvider {
260
260
  }
261
261
  async find(filter, pagination, entityMetadata, trace) {
262
262
  trace?.span.updateName(`Mikro-Orm - Find ${this.entityType.name}`);
263
- import_logger.logger.trace(`Running find ${this.entityType.name} with filter`, {
264
- filter: JSON.stringify(filter)
265
- });
263
+ import_logger.logger.trace(
264
+ { filter: (0, import_utils.sanitiseFilterForLogging)(filter), entity: this.entityType.name },
265
+ "Running find with filter"
266
+ );
266
267
  const where = (0, import_graphweaver.traceSync)((trace2) => {
267
268
  trace2?.span.updateName("Convert filter to Mikro-Orm format");
268
269
  return filter ? gqlToMikro(JSON.parse(JSON.stringify(filter)), this.getDbType()) : void 0;
@@ -303,7 +304,10 @@ class MikroBackendProvider {
303
304
  }
304
305
  async findOne(filter, entityMetadata, trace) {
305
306
  trace?.span.updateName(`Mikro-Orm - FindOne ${this.entityType.name}`);
306
- import_logger.logger.trace(`Running findOne ${this.entityType.name} with filter ${filter}`);
307
+ import_logger.logger.trace(
308
+ { entity: this.entityType.name, filter: (0, import_utils.sanitiseFilterForLogging)(filter) },
309
+ "Running findOne with filter"
310
+ );
307
311
  const metadata = this.em.getMetadata().get(this.entityType.name);
308
312
  let primaryKeyField = metadata.primaryKeys[0];
309
313
  if (!primaryKeyField && entityMetadata) {
@@ -319,11 +323,20 @@ class MikroBackendProvider {
319
323
  offset: 0,
320
324
  limit: 1
321
325
  });
322
- import_logger.logger.trace(`findOne ${this.entityType.name} result`, { result });
326
+ import_logger.logger.trace({ result, entity: this.entityType.name }, "findOne result");
323
327
  return result;
324
328
  }
325
329
  async findByRelatedId(entity, relatedField, relatedFieldIds, filter, trace) {
326
330
  trace?.span.updateName(`Mikro-Orm - findByRelatedId ${this.entityType.name}`);
331
+ import_logger.logger.trace(
332
+ {
333
+ entity: this.entityType.name,
334
+ relatedField,
335
+ relatedFieldIds,
336
+ filter: (0, import_utils.sanitiseFilterForLogging)(filter)
337
+ },
338
+ "Running findByRelatedId"
339
+ );
327
340
  let queryFilter = { [relatedField]: { $in: relatedFieldIds } };
328
341
  if (filter) {
329
342
  const gqlToMikroFilter = JSON.parse(JSON.stringify([gqlToMikro(filter, this.getDbType())]));
@@ -344,10 +357,14 @@ class MikroBackendProvider {
344
357
  }
345
358
  async updateOne(id, updateArgs, trace) {
346
359
  trace?.span.updateName(`Mikro-Orm - updateOne ${this.entityType.name}`);
347
- import_logger.logger.trace(`Running update ${this.entityType.name} with args`, {
348
- id,
349
- updateArgs: JSON.stringify(updateArgs)
350
- });
360
+ import_logger.logger.trace(
361
+ {
362
+ id,
363
+ updateArgs: (0, import_utils.sanitiseFilterForLogging)(updateArgs),
364
+ entity: this.entityType.name
365
+ },
366
+ "Running update with args"
367
+ );
351
368
  const entity = await this.database.em.findOne(this.entityType, id, {
352
369
  // This is an optimisation so that assign() doesn't have to go fetch everything one at a time.
353
370
  populate: [...this.visitPathForPopulate(this.entityType.name, updateArgs)]
@@ -360,7 +377,7 @@ class MikroBackendProvider {
360
377
  try {
361
378
  await this.database.em.lock(entity, import__.LockMode.OPTIMISTIC, version);
362
379
  } catch (err) {
363
- throw new import_errors.OptimisticLockError(err?.message, { entity });
380
+ throw new import_utils.OptimisticLockError(err?.message, { entity });
364
381
  }
365
382
  }
366
383
  const meta = this.database.em.getMetadata().get(this.entityType.name);
@@ -374,9 +391,10 @@ class MikroBackendProvider {
374
391
  }
375
392
  async updateMany(updateItems, trace) {
376
393
  trace?.span.updateName(`Mikro-Orm - updateMany ${this.entityType.name}`);
377
- import_logger.logger.trace(`Running update many ${this.entityType.name} with args`, {
378
- updateItems: JSON.stringify(updateItems)
379
- });
394
+ import_logger.logger.trace(
395
+ { updateItems: (0, import_utils.sanitiseFilterForLogging)(updateItems), entity: this.entityType.name },
396
+ "Running update many with args"
397
+ );
380
398
  const meta = this.database.em.getMetadata().get(this.entityType.name);
381
399
  const entities = await this.database.transactional(async () => {
382
400
  return Promise.all(
@@ -394,14 +412,15 @@ class MikroBackendProvider {
394
412
  })
395
413
  );
396
414
  });
397
- import_logger.logger.trace(`updated ${this.entityType.name} items `, entities);
415
+ import_logger.logger.trace({ entity: this.entityType.name, entities }, "updated items");
398
416
  return entities;
399
417
  }
400
418
  async createOrUpdateMany(items, trace) {
401
419
  trace?.span.updateName(`Mikro-Orm - createOrUpdateMany ${this.entityType.name}`);
402
- import_logger.logger.trace(`Running create or update many for ${this.entityType.name} with args`, {
403
- items: JSON.stringify(items)
404
- });
420
+ import_logger.logger.trace(
421
+ { items: (0, import_utils.sanitiseFilterForLogging)(items), entity: this.entityType.name },
422
+ "Running create or update many with args"
423
+ );
405
424
  const entities = await this.database.transactional(async () => {
406
425
  return Promise.all(
407
426
  items.map(async (item) => {
@@ -413,34 +432,37 @@ class MikroBackendProvider {
413
432
  ...this.visitPathForPopulate(this.entityType.name, item)
414
433
  ]
415
434
  });
416
- import_logger.logger.trace(`Running update on ${this.entityType.name} with item`, {
417
- item: JSON.stringify(item)
418
- });
435
+ import_logger.logger.trace({ item, entity: this.entityType.name }, "Running update with item");
419
436
  await this.mapAndAssignKeys(entity, this.entityType, item);
420
437
  } else {
421
438
  entity = new this.entityType();
422
439
  await this.mapAndAssignKeys(entity, this.entityType, item);
423
- import_logger.logger.trace(`Running create on ${this.entityType.name} with item`, {
424
- item: JSON.stringify(item)
425
- });
440
+ import_logger.logger.trace({ item, entity: this.entityType.name }, "Running create with item");
426
441
  }
427
442
  this.database.em.persist(entity);
428
443
  return entity;
429
444
  })
430
445
  );
431
446
  });
432
- import_logger.logger.trace(`created or updated ${this.entityType.name} items `, entities);
447
+ import_logger.logger.trace(
448
+ { entity: this.entityType.name, entities: (0, import_utils.sanitiseFilterForLogging)(entities) },
449
+ "created or updated items"
450
+ );
433
451
  return entities;
434
452
  }
435
453
  async createOne(createArgs, trace) {
436
454
  trace?.span.updateName(`Mikro-Orm - createOne ${this.entityType.name}`);
437
- import_logger.logger.trace(`Running create ${this.entityType.name} with args`, {
438
- createArgs: JSON.stringify(createArgs)
439
- });
455
+ import_logger.logger.trace(
456
+ { createArgs: (0, import_utils.sanitiseFilterForLogging)(createArgs), entity: this.entityType.name },
457
+ "Running create with args"
458
+ );
440
459
  const entity = new this.entityType();
441
460
  await this.mapAndAssignKeys(entity, this.entityType, createArgs);
442
461
  await this.database.em.persistAndFlush(entity);
443
- import_logger.logger.trace(`create ${this.entityType.name} result`, entity);
462
+ import_logger.logger.trace(
463
+ { entity: this.entityType.name, result: (0, import_utils.sanitiseFilterForLogging)(entity) },
464
+ "create result"
465
+ );
444
466
  return entity;
445
467
  }
446
468
  async createMany(createItems, trace) {
@@ -451,9 +473,10 @@ class MikroBackendProvider {
451
473
  return this._createMany(createItems);
452
474
  }
453
475
  async _createMany(createItems) {
454
- import_logger.logger.trace(`Running create ${this.entityType.name} with args`, {
455
- createArgs: JSON.stringify(createItems)
456
- });
476
+ import_logger.logger.trace(
477
+ { createItems: (0, import_utils.sanitiseFilterForLogging)(createItems), entity: this.entityType.name },
478
+ "Running create with args"
479
+ );
457
480
  const entities = await this.database.transactional(async () => {
458
481
  return Promise.all(
459
482
  createItems.map(async (item) => {
@@ -464,12 +487,15 @@ class MikroBackendProvider {
464
487
  })
465
488
  );
466
489
  });
467
- import_logger.logger.trace(`created ${this.entityType.name} items `, entities);
490
+ import_logger.logger.trace({ entity: this.entityType.name, entities }, "created items");
468
491
  return entities;
469
492
  }
470
493
  async deleteOne(filter, trace) {
471
494
  trace?.span.updateName(`Mikro-Orm - deleteOne ${this.entityType.name}`);
472
- import_logger.logger.trace(filter, `Running delete ${this.entityType.name} with filter.`);
495
+ import_logger.logger.trace(
496
+ { filter: (0, import_utils.sanitiseFilterForLogging)(filter), entity: this.entityType.name },
497
+ "Running delete with filter."
498
+ );
473
499
  const where = filter ? gqlToMikro(JSON.parse(JSON.stringify(filter)), this.getDbType()) : void 0;
474
500
  const whereWithAppliedExternalIdFields = where && this.applyExternalIdFields(this.entityType, where);
475
501
  const deletedRows = await this.database.em.nativeDelete(
@@ -484,7 +510,10 @@ class MikroBackendProvider {
484
510
  }
485
511
  async deleteMany(filter, trace) {
486
512
  trace?.span.updateName(`Mikro-Orm - deleteMany ${this.entityType.name}`);
487
- import_logger.logger.trace(`Running delete ${this.entityType.name}`);
513
+ import_logger.logger.trace(
514
+ { filter: (0, import_utils.sanitiseFilterForLogging)(filter), entity: this.entityType.name },
515
+ "Running delete"
516
+ );
488
517
  const deletedRows = await this.database.transactional(async () => {
489
518
  const where = filter ? gqlToMikro(JSON.parse(JSON.stringify(filter)), this.getDbType()) : void 0;
490
519
  const whereWithAppliedExternalIdFields = where && this.applyExternalIdFields(this.entityType, where);
@@ -527,9 +556,10 @@ class MikroBackendProvider {
527
556
  }
528
557
  async aggregate(filter, requestedAggregations, trace) {
529
558
  trace?.span.updateName(`Mikro-Orm - aggregate ${this.entityType.name}`);
530
- import_logger.logger.trace(`Running aggregate ${this.entityType.name} with filter`, {
531
- filter: JSON.stringify(filter)
532
- });
559
+ import_logger.logger.trace(
560
+ { filter: (0, import_utils.sanitiseFilterForLogging)(filter), entity: this.entityType.name },
561
+ "Running aggregate with filter"
562
+ );
533
563
  const where = filter ? gqlToMikro(JSON.parse(JSON.stringify(filter)), this.getDbType()) : void 0;
534
564
  const whereWithAppliedExternalIdFields = where ? this.applyExternalIdFields(this.entityType, where) : {};
535
565
  const query = this.em.createQueryBuilder(this.entityType);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/provider/provider.ts"],
4
- "sourcesContent": ["import {\n\tBackendProvider,\n\tPaginationOptions,\n\tSort,\n\tFilter,\n\tBackendProviderConfig,\n\tFieldMetadata,\n\tAggregationResult,\n\tAggregationType,\n\tTraceMethod,\n\tTraceOptions,\n\ttraceSync,\n\ttrace as startTrace,\n\tGraphweaverRequestEvent,\n\tGraphweaverPluginNextFunction,\n\tEntityMetadata,\n\tgraphweaverMetadata,\n} from '@exogee/graphweaver';\nimport { logger } from '@exogee/logger';\nimport {\n\tAutoPath,\n\tLoadStrategy,\n\tPopulateHint,\n\tReference,\n\tRequestContext,\n\tsql,\n} from '@mikro-orm/core';\nimport { pluginManager, apolloPluginManager } from '@exogee/graphweaver-server';\n\nimport {\n\tLockMode,\n\tQueryFlag,\n\tReferenceKind,\n\tConnectionManager,\n\texternalIdFieldMap,\n\tAnyEntity,\n\tIsolationLevel,\n\tConnectionOptions,\n\tconnectToDatabase,\n\tDatabaseType,\n} from '..';\n\nimport { OptimisticLockError } from '../utils/errors';\nimport { assign } from './assign';\n\ntype PostgresError = {\n\tcode: string;\n\troutine: string;\n};\n\nconst objectOperations = new Set(['_and', '_or', '_not']);\nconst mikroObjectOperations = new Set(['$and', '$or', '$not']);\nconst nullBooleanOperations = new Set(['null', 'notnull']);\n\nconst appendPath = (path: string, newPath: string) =>\n\tpath.length ? `${path}.${newPath}` : newPath;\n\nexport const gqlToMikro = (filter: any, databaseType?: DatabaseType): any => {\n\tif (Array.isArray(filter)) {\n\t\treturn filter.map((element) => gqlToMikro(element, databaseType));\n\t} else if (typeof filter === 'object' && filter !== null) {\n\t\tfor (const key of Object.keys(filter)) {\n\t\t\t// A null here is a user-specified value and is valid to filter on\n\t\t\tif (filter[key] === null) continue;\n\n\t\t\tif (objectOperations.has(key)) {\n\t\t\t\t// { _not: '1' } => { $not: '1' }\n\t\t\t\tfilter[key.replace('_', '$')] = gqlToMikro(filter[key], databaseType);\n\t\t\t\tdelete filter[key];\n\t\t\t} else if (typeof filter[key] === 'object' && !Array.isArray(filter[key])) {\n\t\t\t\t// Recurse over nested filters only (arrays are an argument to a filter, not a nested filter)\n\t\t\t\tfilter[key] = gqlToMikro(filter[key], databaseType);\n\t\t\t} else if (key.indexOf('_') >= 0) {\n\t\t\t\tconst [newKey, operator] = key.split('_');\n\t\t\t\tlet newValue;\n\t\t\t\tif (nullBooleanOperations.has(operator) && typeof filter[key] === 'boolean') {\n\t\t\t\t\t// { firstName_null: true } => { firstName: { $eq: null } } or { firstName_null: false } => { firstName: { $ne: null } }\n\t\t\t\t\t// { firstName_notnull: true } => { firstName: { $ne: null } } or { firstName_notnull: false } => { firstName: { $eq: null } }\n\t\t\t\t\tnewValue =\n\t\t\t\t\t\t(filter[key] && operator === 'null') || (!filter[key] && operator === 'notnull')\n\t\t\t\t\t\t\t? { $eq: null }\n\t\t\t\t\t\t\t: { $ne: null };\n\t\t\t\t} else if (operator === 'ilike' && databaseType !== 'postgresql') {\n\t\t\t\t\tlogger.warn(\n\t\t\t\t\t\t`The $ilike operator is not supported by ${databaseType} databases. Operator coerced to $like.`\n\t\t\t\t\t);\n\t\t\t\t\tnewValue = { $like: filter[key] };\n\t\t\t\t} else {\n\t\t\t\t\t// { firstName_in: ['k', 'b'] } => { firstName: { $in: ['k', 'b'] } }\n\t\t\t\t\tnewValue = { [`$${operator}`]: gqlToMikro(filter[key], databaseType) };\n\t\t\t\t\t// They can construct multiple filters for the same key. In that case we need\n\t\t\t\t\t// to append them all into an object.\n\t\t\t\t}\n\n\t\t\t\tif (typeof filter[newKey] !== 'undefined') {\n\t\t\t\t\tif (typeof filter[newKey] !== 'object') {\n\t\t\t\t\t\tif (typeof newValue === 'object' && '$eq' in newValue) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`property ${newKey} on filter is ambiguous. There are two values for this property: ${filter[newKey]} and ${newValue.$eq}`\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfilter[newKey] = { ...{ $eq: filter[newKey] }, ...newValue };\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (newValue && typeof newValue === 'object' && '$eq' in newValue) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`property ${newKey} on filter is ambiguous. There are two values for this property: ${JSON.stringify(\n\t\t\t\t\t\t\t\t\tfilter[newKey]\n\t\t\t\t\t\t\t\t)} and ${JSON.stringify(newValue)}`\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfilter[newKey] = { ...filter[newKey], ...newValue };\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfilter[newKey] = newValue;\n\t\t\t\t}\n\n\t\t\t\tdelete filter[key];\n\t\t\t}\n\t\t}\n\t}\n\treturn filter;\n};\n\nexport interface AdditionalOptions {\n\ttransactionIsolationLevel?: IsolationLevel;\n\tbackendDisplayName?: string;\n}\n\nexport class MikroBackendProvider<D> implements BackendProvider<D> {\n\tprivate _backendId: string;\n\n\tprivate connection: ConnectionOptions;\n\n\tpublic entityType: new () => D;\n\tpublic connectionManagerId?: string;\n\tprivate transactionIsolationLevel!: IsolationLevel;\n\n\t// This is an optional setting that allows you to control how this provider is displayed in the Admin UI.\n\t// If you do not set a value, it will default to 'REST (hostname of baseUrl)'. Entities are grouped by\n\t// their backend's display name, so if you want to group them in a more specific way, this is the way to do it.\n\tpublic readonly backendDisplayName?: string;\n\n\tpublic readonly supportsInFilter = true;\n\n\t// Default backend provider config\n\tpublic readonly backendProviderConfig: BackendProviderConfig = {\n\t\tfilter: true,\n\t\tpagination: false,\n\t\torderBy: false,\n\t\tsupportedAggregationTypes: new Set<AggregationType>([AggregationType.COUNT]),\n\t\tsupportsPseudoCursorPagination: true,\n\t};\n\n\tget backendId() {\n\t\treturn this._backendId;\n\t}\n\n\tprivate get database() {\n\t\t// If we have a connection manager ID then use that else fallback to the Database\n\t\tif (!this.connectionManagerId) return ConnectionManager.default;\n\t\treturn ConnectionManager.database(this.connectionManagerId) || ConnectionManager.default;\n\t}\n\n\t// This is exposed for use in the RLS package\n\tpublic get transactional() {\n\t\treturn this.database.transactional;\n\t}\n\n\tpublic async withTransaction<T>(callback: () => Promise<T>) {\n\t\treturn this.database.transactional<T>(callback, this.transactionIsolationLevel);\n\t}\n\n\t// This is exposed for use in the RLS package\n\tpublic get em() {\n\t\treturn this.database.em;\n\t}\n\n\tpublic constructor(\n\t\tmikroType: new () => D,\n\t\tconnection: ConnectionOptions,\n\t\ttransactionIsolationLevel?: IsolationLevel\n\t);\n\tpublic constructor(\n\t\tmikroType: new () => D,\n\t\tconnection: ConnectionOptions,\n\t\tadditionalOptions?: AdditionalOptions\n\t);\n\tpublic constructor(\n\t\tmikroType: new () => D,\n\t\tconnection: ConnectionOptions,\n\t\toptionsOrIsolationLevel: AdditionalOptions | IsolationLevel = {\n\t\t\ttransactionIsolationLevel: IsolationLevel.REPEATABLE_READ,\n\t\t}\n\t) {\n\t\tconst options =\n\t\t\ttypeof optionsOrIsolationLevel === 'object'\n\t\t\t\t? optionsOrIsolationLevel\n\t\t\t\t: {\n\t\t\t\t\t\ttransactionIsolationLevel: optionsOrIsolationLevel,\n\t\t\t\t\t};\n\n\t\tthis.entityType = mikroType;\n\t\tthis.connectionManagerId = connection.connectionManagerId;\n\t\tthis._backendId = `mikro-orm-${connection.connectionManagerId || ''}`;\n\t\tthis.transactionIsolationLevel =\n\t\t\toptions.transactionIsolationLevel ?? IsolationLevel.REPEATABLE_READ;\n\t\tthis.backendDisplayName = options.backendDisplayName;\n\t\tthis.connection = connection;\n\t\tthis.addRequestContext();\n\t\tthis.connectToDatabase();\n\t}\n\tprivate getDbType(): DatabaseType {\n\t\tconst driver = this.em.getDriver().constructor.name;\n\t\t// This used to import the actual drivers, but since they're optional it makes more sense\n\t\t// to just use the strings.\n\t\tswitch (driver) {\n\t\t\tcase 'MsSqlDriver':\n\t\t\t\treturn 'mssql';\n\t\t\tcase 'MySqlDriver':\n\t\t\t\treturn 'mysql';\n\t\t\tcase 'PostgreSqlDriver':\n\t\t\t\treturn 'postgresql';\n\t\t\tcase 'SqliteDriver':\n\t\t\t\treturn 'sqlite';\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`This driver (${driver}) is not supported!`);\n\t\t}\n\t}\n\n\tprivate connectToDatabase = async () => {\n\t\tconst connectionManagerId = this.connectionManagerId;\n\t\tif (!connectionManagerId) {\n\t\t\tthrow new Error('Expected connectionManagerId to be defined when calling addRequestContext.');\n\t\t}\n\n\t\tapolloPluginManager.addPlugin(connectionManagerId, connectToDatabase(this.connection));\n\t};\n\n\tprivate addRequestContext = () => {\n\t\tconst connectionManagerId = this.connectionManagerId;\n\t\tif (!connectionManagerId) {\n\t\t\tthrow new Error('Expected connectionManagerId to be defined when calling addRequestContext.');\n\t\t}\n\n\t\tconst connectionPlugin = {\n\t\t\tname: connectionManagerId,\n\t\t\tevent: GraphweaverRequestEvent.OnRequest,\n\t\t\tnext: async (_: GraphweaverRequestEvent, _next: GraphweaverPluginNextFunction) => {\n\t\t\t\tlogger.trace(`Graphweaver OnRequest plugin called`);\n\n\t\t\t\tconst connection = await ConnectionManager.awaitableDatabase(connectionManagerId);\n\n\t\t\t\tif (!connection) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`No database connection found for connectionManagerId: ${connectionManagerId} after waiting for connection. This should not happen.`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn RequestContext.create(connection.orm.em, _next, {});\n\t\t\t},\n\t\t};\n\t\tpluginManager.addPlugin(connectionPlugin);\n\t};\n\n\tprivate mapAndAssignKeys = (result: D, entityType: new () => D, inputArgs: Partial<D>) => {\n\t\t// Clean the input and remove any GraphQL classes from the object\n\t\tconst assignmentObj = this.applyExternalIdFields(entityType, inputArgs);\n\t\treturn assign(result, assignmentObj, undefined, undefined, this.database.em);\n\t};\n\n\tprivate applyExternalIdFields = (target: AnyEntity | string, values: any) => {\n\t\tconst targetName = typeof target === 'string' ? target : target.name;\n\t\tconst map = externalIdFieldMap.get(targetName);\n\n\t\tconst mapFieldNames = (partialFilterObj: any) => {\n\t\t\tfor (const [from, to] of Object.entries(map || {})) {\n\t\t\t\tif (partialFilterObj[from]) {\n\t\t\t\t\tconst keys = Object.keys(partialFilterObj[from]);\n\t\t\t\t\tif (keys.length > 1) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Expected precisely 1 key in queryObj.${from} on ${target}, got ${JSON.stringify(\n\t\t\t\t\t\t\t\tpartialFilterObj[from],\n\t\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\t\t4\n\t\t\t\t\t\t\t)}`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tpartialFilterObj[to] = partialFilterObj[from][keys[0]];\n\t\t\t\t\tdelete partialFilterObj[from];\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Check for and/or/etc at the root level and handle correctly\n\t\tfor (const rootLevelKey of Object.keys(values)) {\n\t\t\tif (mikroObjectOperations.has(rootLevelKey)) {\n\t\t\t\tif (Array.isArray(values[rootLevelKey])) {\n\t\t\t\t\tfor (const field of values[rootLevelKey]) {\n\t\t\t\t\t\tmapFieldNames(field);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tmapFieldNames(values[rootLevelKey]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Map the rest of the field names as well\n\t\tmapFieldNames(values);\n\n\t\t// Traverse the nested entities\n\t\tconst { properties } = this.database.em.getMetadata().get(targetName);\n\t\tObject.values(properties)\n\t\t\t.filter((property) => typeof property.entity !== 'undefined' && values[property.name])\n\t\t\t.forEach((property) => {\n\t\t\t\tif (Array.isArray(values[property.name])) {\n\t\t\t\t\tvalues[property.name].forEach((value: any) =>\n\t\t\t\t\t\tthis.applyExternalIdFields(property.type, value)\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tvalues[property.name] = this.applyExternalIdFields(property.type, values[property.name]);\n\t\t\t\t}\n\t\t\t});\n\n\t\treturn values;\n\t};\n\n\t// Check if we have any keys that are a collection of entities\n\tpublic visitPathForPopulate = (entityName: string, updateArgBranch: any, populateBranch = '') => {\n\t\tconst { properties } = this.database.em.getMetadata().get(entityName);\n\t\tconst collectedPaths = populateBranch ? new Set<string>([populateBranch]) : new Set<string>([]);\n\n\t\tfor (const [key, value] of Object.entries(updateArgBranch ?? {})) {\n\t\t\tif (\n\t\t\t\t// If it's a relationship, go ahead and and '.' it in, recurse.\n\t\t\t\tproperties[key]?.kind === ReferenceKind.ONE_TO_ONE ||\n\t\t\t\tproperties[key]?.kind === ReferenceKind.ONE_TO_MANY ||\n\t\t\t\tproperties[key]?.kind === ReferenceKind.MANY_TO_ONE ||\n\t\t\t\tproperties[key]?.kind === ReferenceKind.MANY_TO_MANY\n\t\t\t) {\n\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\t// In the case where the array is empty we also need to make sure we load the collection.\n\t\t\t\t\tcollectedPaths.add(appendPath(populateBranch, key));\n\n\t\t\t\t\tfor (const entry of value) {\n\t\t\t\t\t\t// Recurse\n\t\t\t\t\t\tconst newPaths = this.visitPathForPopulate(\n\t\t\t\t\t\t\tproperties[key].type,\n\t\t\t\t\t\t\tentry,\n\t\t\t\t\t\t\tappendPath(populateBranch, key)\n\t\t\t\t\t\t);\n\t\t\t\t\t\tnewPaths.forEach((path) => collectedPaths.add(path));\n\t\t\t\t\t}\n\t\t\t\t} else if (typeof value === 'object') {\n\t\t\t\t\t// Recurse\n\t\t\t\t\tconst newPaths = this.visitPathForPopulate(\n\t\t\t\t\t\tproperties[key].type,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\tappendPath(populateBranch, key)\n\t\t\t\t\t);\n\t\t\t\t\tnewPaths.forEach((path) => collectedPaths.add(path));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn collectedPaths;\n\t};\n\n\t@TraceMethod()\n\tpublic async find(\n\t\tfilter: Filter<D>,\n\t\tpagination?: PaginationOptions,\n\t\tentityMetadata?: EntityMetadata,\n\t\ttrace?: TraceOptions\n\t): Promise<D[]> {\n\t\t// If we have a span, update the name\n\t\ttrace?.span.updateName(`Mikro-Orm - Find ${this.entityType.name}`);\n\n\t\tlogger.trace(`Running find ${this.entityType.name} with filter`, {\n\t\t\tfilter: JSON.stringify(filter),\n\t\t});\n\n\t\t// Strip custom types out of the equation.\n\t\t// This query only works if we JSON.parse(JSON.stringify(filter)):\n\t\tconst where = traceSync((trace?: TraceOptions) => {\n\t\t\ttrace?.span.updateName('Convert filter to Mikro-Orm format');\n\t\t\treturn filter ? gqlToMikro(JSON.parse(JSON.stringify(filter)), this.getDbType()) : undefined;\n\t\t})();\n\n\t\t// Convert from: { account: {id: '6' }}\n\t\t// to { accountId: '6' }\n\t\t// This conversion only works on root level objects\n\t\tconst whereWithAppliedExternalIdFields = where\n\t\t\t? this.applyExternalIdFields(this.entityType, where)\n\t\t\t: {};\n\n\t\t// Regions need some fancy handling with Query Builder. Process the where further\n\t\t// and return a Query Builder instance.\n\t\tconst query = this.em.createQueryBuilder(this.entityType);\n\t\tif (Object.keys(whereWithAppliedExternalIdFields).length > 0) {\n\t\t\tquery.andWhere(whereWithAppliedExternalIdFields);\n\t\t}\n\n\t\t// If we have specified a limit, offset or order then update the query\n\t\tif (pagination?.limit) query.limit(pagination.limit);\n\t\tif (pagination?.offset) query.offset(pagination.offset);\n\t\tif (pagination?.orderBy) query.orderBy({ ...pagination.orderBy });\n\n\t\t// Certain query filters can result in duplicate records once all joins are resolved\n\t\t// These duplicates can be discarded as related entities are returned to the\n\t\t// API consumer via field resolvers\n\t\tquery.setFlag(QueryFlag.DISTINCT);\n\n\t\t// 1:1 relations that aren't on the owning side need to get populated so the references get set.\n\t\t// This method is protected, but we need to use it from here, hence the `as any`.\n\t\tconst driver = this.database.em.getDriver();\n\t\tconst meta = this.database.em.getMetadata().get(this.entityType.name);\n\t\tquery.populate((driver as any).autoJoinOneToOneOwner(meta, []));\n\n\t\ttry {\n\t\t\tconst result = await startTrace(async (trace?: TraceOptions) => {\n\t\t\t\ttrace?.span.updateName('Mikro-Orm - Fetch Data');\n\t\t\t\treturn query.getResult();\n\t\t\t})();\n\n\t\t\tlogger.trace(`find ${this.entityType.name} result: ${result.length} rows`);\n\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tlogger.error(`find ${this.entityType.name} error: ${JSON.stringify(err)}`);\n\n\t\t\tif ((err as PostgresError)?.routine === 'InitializeSessionUserId') {\n\t\t\t\t// Throw if the user credentials are incorrect\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Database connection failed, please check you are using the correct user credentials for the database.'\n\t\t\t\t);\n\t\t\t} else if ((err as PostgresError)?.code === 'ECONNREFUSED') {\n\t\t\t\t// Throw if the database address or port is incorrect\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Database connection failed, please check you are using the correct address and port for the database.'\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t}\n\t}\n\n\t@TraceMethod()\n\tpublic async findOne(\n\t\tfilter: Filter<D>,\n\t\tentityMetadata?: EntityMetadata,\n\t\ttrace?: TraceOptions\n\t): Promise<D | null> {\n\t\ttrace?.span.updateName(`Mikro-Orm - FindOne ${this.entityType.name}`);\n\t\tlogger.trace(`Running findOne ${this.entityType.name} with filter ${filter}`);\n\n\t\tconst metadata = this.em.getMetadata().get(this.entityType.name);\n\t\tlet primaryKeyField = metadata.primaryKeys[0];\n\n\t\tif (!primaryKeyField && entityMetadata) {\n\t\t\t// When using virtual entities, MikroORM will have no primary keys.\n\t\t\t// In this scenario we actually know what the primary key is from\n\t\t\t// the GraphQL metadata, so we can go ahead and use it.\n\t\t\tprimaryKeyField = graphweaverMetadata.primaryKeyFieldForEntity(entityMetadata);\n\t\t}\n\n\t\tif (!primaryKeyField || metadata.primaryKeys.length > 1) {\n\t\t\tthrow new Error(\n\t\t\t\t`Entity ${this.entityType.name} has ${metadata.primaryKeys.length} primary keys. We only support entities with a single primary key at this stage.`\n\t\t\t);\n\t\t}\n\n\t\tconst [result] = await this.find(filter, {\n\t\t\torderBy: { [primaryKeyField]: Sort.DESC },\n\t\t\toffset: 0,\n\t\t\tlimit: 1,\n\t\t});\n\n\t\tlogger.trace(`findOne ${this.entityType.name} result`, { result });\n\n\t\treturn result;\n\t}\n\n\t@TraceMethod()\n\tpublic async findByRelatedId(\n\t\tentity: any,\n\t\trelatedField: string,\n\t\trelatedFieldIds: string[],\n\t\tfilter?: any,\n\t\ttrace?: TraceOptions\n\t): Promise<D[]> {\n\t\ttrace?.span.updateName(`Mikro-Orm - findByRelatedId ${this.entityType.name}`);\n\n\t\t// Any is the actual type from MikroORM, sorry folks.\n\t\tlet queryFilter: any = { [relatedField]: { $in: relatedFieldIds } };\n\n\t\tif (filter) {\n\t\t\t// JSON.parse(JSON.stringify()) is needed. See https://exogee.atlassian.net/browse/EXOGW-419\n\t\t\tconst gqlToMikroFilter = JSON.parse(JSON.stringify([gqlToMikro(filter, this.getDbType())]));\n\t\t\t// Since the user has supplied a filter, we need to and it in.\n\t\t\tqueryFilter = { $and: [queryFilter, ...gqlToMikroFilter] };\n\t\t}\n\n\t\tconst populate = [relatedField as AutoPath<typeof entity, PopulateHint>];\n\t\tconst result = await this.database.em.find(entity, queryFilter, {\n\t\t\t// We only need one result per entity.\n\t\t\tflags: [QueryFlag.DISTINCT],\n\n\t\t\t// We do want to populate the relation, however, see below.\n\t\t\tpopulate,\n\n\t\t\t// We'd love to use the default joined loading strategy, but it doesn't work with the populateWhere option.\n\t\t\tstrategy: LoadStrategy.SELECT_IN,\n\n\t\t\t// This tells MikroORM we only need to load the related entities if they match the filter specified above.\n\t\t\tpopulateWhere: PopulateHint.INFER,\n\t\t});\n\n\t\treturn result as D[];\n\t}\n\n\t@TraceMethod()\n\tpublic async updateOne(\n\t\tid: string | number,\n\t\tupdateArgs: Partial<D & { version?: number }>,\n\t\ttrace?: TraceOptions\n\t): Promise<D> {\n\t\ttrace?.span.updateName(`Mikro-Orm - updateOne ${this.entityType.name}`);\n\n\t\tlogger.trace(`Running update ${this.entityType.name} with args`, {\n\t\t\tid,\n\t\t\tupdateArgs: JSON.stringify(updateArgs),\n\t\t});\n\n\t\tconst entity = await this.database.em.findOne(this.entityType, id, {\n\t\t\t// This is an optimisation so that assign() doesn't have to go fetch everything one at a time.\n\t\t\tpopulate: [...this.visitPathForPopulate(this.entityType.name, updateArgs)] as `${string}.`[],\n\t\t});\n\n\t\tif (entity === null) {\n\t\t\tthrow new Error(`Unable to locate ${this.entityType.name} with ID: '${id}' for updating.`);\n\t\t}\n\n\t\tconst { version, ...updateArgsWithoutVersion } = updateArgs;\n\n\t\t// If a version has been sent, let's check it\n\t\tif (version) {\n\t\t\ttry {\n\t\t\t\tawait this.database.em.lock(entity, LockMode.OPTIMISTIC, version);\n\t\t\t} catch (err) {\n\t\t\t\tthrow new OptimisticLockError((err as Error)?.message, { entity });\n\t\t\t}\n\t\t}\n\n\t\t// For an update we also want to go ahead and remove the primary key if it's autoincremented, as\n\t\t// users should not be able to change the primary key. There are also scenarios like\n\t\t// GENERATED ALWAYS AS IDENTITY where even supplying the primary key in the update query will\n\t\t// cause an error.\n\t\tconst meta = this.database.em.getMetadata().get(this.entityType.name);\n\t\tfor (const key of meta.primaryKeys) {\n\t\t\tif (meta.properties[key].autoincrement) delete (updateArgsWithoutVersion as any)[key];\n\t\t}\n\n\t\tawait this.mapAndAssignKeys(entity, this.entityType, updateArgsWithoutVersion as Partial<D>);\n\t\tawait this.database.em.persistAndFlush(entity);\n\n\t\tlogger.trace(`update ${this.entityType.name} entity`, entity);\n\n\t\treturn entity;\n\t}\n\n\t@TraceMethod()\n\tpublic async updateMany(\n\t\tupdateItems: (Partial<D> & { id: string })[],\n\t\ttrace?: TraceOptions\n\t): Promise<D[]> {\n\t\ttrace?.span.updateName(`Mikro-Orm - updateMany ${this.entityType.name}`);\n\t\tlogger.trace(`Running update many ${this.entityType.name} with args`, {\n\t\t\tupdateItems: JSON.stringify(updateItems),\n\t\t});\n\n\t\tconst meta = this.database.em.getMetadata().get(this.entityType.name);\n\n\t\tconst entities = await this.database.transactional<D[]>(async () => {\n\t\t\treturn Promise.all<D>(\n\t\t\t\tupdateItems.map(async (item) => {\n\t\t\t\t\tif (!item?.id) throw new Error('You must pass an ID for this entity to update it.');\n\n\t\t\t\t\t// Find the entity in the database\n\t\t\t\t\tconst entity = await this.database.em.findOneOrFail(this.entityType, item.id, {\n\t\t\t\t\t\tpopulate: [...this.visitPathForPopulate(this.entityType.name, item)] as `${string}.`[],\n\t\t\t\t\t});\n\n\t\t\t\t\t// For an update we also want to go ahead and remove the primary key if it's autoincremented, as\n\t\t\t\t\t// users should not be able to change the primary key. There are also scenarios like\n\t\t\t\t\t// GENERATED ALWAYS AS IDENTITY where even supplying the primary key in the update query will\n\t\t\t\t\t// cause an error.\n\t\t\t\t\tfor (const key of meta.primaryKeys) {\n\t\t\t\t\t\tif (meta.properties[key].autoincrement) delete (item as any)[key];\n\t\t\t\t\t}\n\n\t\t\t\t\tawait this.mapAndAssignKeys(entity, this.entityType, item);\n\t\t\t\t\tthis.database.em.persist(entity);\n\t\t\t\t\treturn entity;\n\t\t\t\t})\n\t\t\t);\n\t\t});\n\n\t\tlogger.trace(`updated ${this.entityType.name} items `, entities);\n\n\t\treturn entities;\n\t}\n\n\t@TraceMethod()\n\tpublic async createOrUpdateMany(items: Partial<D>[], trace?: TraceOptions): Promise<D[]> {\n\t\ttrace?.span.updateName(`Mikro-Orm - createOrUpdateMany ${this.entityType.name}`);\n\t\tlogger.trace(`Running create or update many for ${this.entityType.name} with args`, {\n\t\t\titems: JSON.stringify(items),\n\t\t});\n\t\tconst entities = await this.database.transactional<D[]>(async () => {\n\t\t\treturn Promise.all<D>(\n\t\t\t\titems.map(async (item) => {\n\t\t\t\t\tlet entity;\n\t\t\t\t\tconst { id } = item as any;\n\t\t\t\t\tif (id) {\n\t\t\t\t\t\tentity = await this.database.em.findOneOrFail(this.entityType, id, {\n\t\t\t\t\t\t\tpopulate: [\n\t\t\t\t\t\t\t\t...this.visitPathForPopulate(this.entityType.name, item),\n\t\t\t\t\t\t\t] as `${string}.`[],\n\t\t\t\t\t\t});\n\t\t\t\t\t\tlogger.trace(`Running update on ${this.entityType.name} with item`, {\n\t\t\t\t\t\t\titem: JSON.stringify(item),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tawait this.mapAndAssignKeys(entity, this.entityType, item);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tentity = new this.entityType();\n\t\t\t\t\t\tawait this.mapAndAssignKeys(entity, this.entityType, item);\n\t\t\t\t\t\tlogger.trace(`Running create on ${this.entityType.name} with item`, {\n\t\t\t\t\t\t\titem: JSON.stringify(item),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tthis.database.em.persist(entity);\n\t\t\t\t\treturn entity;\n\t\t\t\t})\n\t\t\t);\n\t\t});\n\n\t\tlogger.trace(`created or updated ${this.entityType.name} items `, entities);\n\n\t\treturn entities;\n\t}\n\n\t@TraceMethod()\n\tpublic async createOne(createArgs: Partial<D>, trace?: TraceOptions): Promise<D> {\n\t\ttrace?.span.updateName(`Mikro-Orm - createOne ${this.entityType.name}`);\n\t\tlogger.trace(`Running create ${this.entityType.name} with args`, {\n\t\t\tcreateArgs: JSON.stringify(createArgs),\n\t\t});\n\n\t\tconst entity = new this.entityType();\n\t\tawait this.mapAndAssignKeys(entity, this.entityType, createArgs);\n\t\tawait this.database.em.persistAndFlush(entity as Partial<D>);\n\n\t\tlogger.trace(`create ${this.entityType.name} result`, entity);\n\n\t\treturn entity;\n\t}\n\n\t@TraceMethod()\n\tpublic async createMany(createItems: Partial<D>[], trace?: TraceOptions): Promise<D[]> {\n\t\ttrace?.span.updateName(`Mikro-Orm - createMany ${this.entityType.name}`);\n\t\treturn this._createMany(createItems);\n\t}\n\n\tpublic async createTraces(createItems: Partial<D>[]): Promise<D[]> {\n\t\treturn this._createMany(createItems);\n\t}\n\n\tprivate async _createMany(createItems: Partial<D>[]) {\n\t\tlogger.trace(`Running create ${this.entityType.name} with args`, {\n\t\t\tcreateArgs: JSON.stringify(createItems),\n\t\t});\n\n\t\tconst entities = await this.database.transactional<D[]>(async () => {\n\t\t\treturn Promise.all<D>(\n\t\t\t\tcreateItems.map(async (item) => {\n\t\t\t\t\tconst entity = new this.entityType();\n\t\t\t\t\tawait this.mapAndAssignKeys(entity, this.entityType, item);\n\t\t\t\t\tthis.database.em.persist(entity as Partial<D>);\n\t\t\t\t\treturn entity;\n\t\t\t\t})\n\t\t\t);\n\t\t});\n\n\t\tlogger.trace(`created ${this.entityType.name} items `, entities);\n\n\t\treturn entities;\n\t}\n\n\t@TraceMethod()\n\tpublic async deleteOne(filter: Filter<D>, trace?: TraceOptions): Promise<boolean> {\n\t\ttrace?.span.updateName(`Mikro-Orm - deleteOne ${this.entityType.name}`);\n\t\tlogger.trace(filter, `Running delete ${this.entityType.name} with filter.`);\n\t\tconst where = filter\n\t\t\t? gqlToMikro(JSON.parse(JSON.stringify(filter)), this.getDbType())\n\t\t\t: undefined;\n\t\tconst whereWithAppliedExternalIdFields =\n\t\t\twhere && this.applyExternalIdFields(this.entityType, where);\n\n\t\tconst deletedRows = await this.database.em.nativeDelete(\n\t\t\tthis.entityType,\n\t\t\twhereWithAppliedExternalIdFields\n\t\t);\n\n\t\tif (deletedRows > 1) {\n\t\t\tthrow new Error('Multiple deleted rows');\n\t\t}\n\n\t\tlogger.trace(`delete ${this.entityType.name} result: deleted ${deletedRows} row(s)`);\n\n\t\treturn deletedRows === 1;\n\t}\n\n\t@TraceMethod()\n\tpublic async deleteMany(filter: Filter<D>, trace?: TraceOptions): Promise<boolean> {\n\t\ttrace?.span.updateName(`Mikro-Orm - deleteMany ${this.entityType.name}`);\n\t\tlogger.trace(`Running delete ${this.entityType.name}`);\n\n\t\tconst deletedRows = await this.database.transactional<number>(async () => {\n\t\t\tconst where = filter\n\t\t\t\t? gqlToMikro(JSON.parse(JSON.stringify(filter)), this.getDbType())\n\t\t\t\t: undefined;\n\t\t\tconst whereWithAppliedExternalIdFields =\n\t\t\t\twhere && this.applyExternalIdFields(this.entityType, where);\n\n\t\t\tconst toDelete = await this.database.em.count(\n\t\t\t\tthis.entityType,\n\t\t\t\twhereWithAppliedExternalIdFields\n\t\t\t);\n\t\t\tconst deletedCount = await this.database.em.nativeDelete(\n\t\t\t\tthis.entityType,\n\t\t\t\twhereWithAppliedExternalIdFields\n\t\t\t);\n\n\t\t\tif (deletedCount !== toDelete) {\n\t\t\t\tthrow new Error('We did not delete any rows, rolling back.');\n\t\t\t}\n\n\t\t\treturn deletedCount;\n\t\t});\n\n\t\tlogger.trace(`delete ${this.entityType.name} result: deleted ${deletedRows} row(s)`);\n\n\t\treturn true;\n\t}\n\n\tpublic foreignKeyForRelationshipField?(field: FieldMetadata, dataEntity: D) {\n\t\tconst value = dataEntity[field.name as keyof D];\n\n\t\tif (Reference.isReference(value)) {\n\t\t\tconst { properties } = this.database.em.getMetadata().get(this.entityType);\n\t\t\tconst property = properties[field.name];\n\t\t\tconst [primaryKey] = property.targetMeta?.primaryKeys ?? [];\n\t\t\tif (!primaryKey) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Could not determine primary key for ${field.name} on ${this.entityType.name}`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst foreignKey = (value.unwrap() as any)[primaryKey];\n\t\t\tif (foreignKey === undefined || foreignKey === null) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Could not read foreign key from reference: ${value.unwrap()} with primary key name ${primaryKey}`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn foreignKey;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t@TraceMethod()\n\tpublic async aggregate(\n\t\tfilter: Filter<D>,\n\t\trequestedAggregations: Set<AggregationType>,\n\t\ttrace?: TraceOptions\n\t): Promise<AggregationResult> {\n\t\ttrace?.span.updateName(`Mikro-Orm - aggregate ${this.entityType.name}`);\n\t\tlogger.trace(`Running aggregate ${this.entityType.name} with filter`, {\n\t\t\tfilter: JSON.stringify(filter),\n\t\t});\n\n\t\t// Strip custom types out of the equation.\n\t\t// This query only works if we JSON.parse(JSON.stringify(filter)):\n\t\t//\n\t\t// query {\n\t\t// drivers (filter: { region: { name: \"North Shore\" }}) {\n\t\t// id\n\t\t// }\n\t\t// }\n\t\tconst where = filter\n\t\t\t? gqlToMikro(JSON.parse(JSON.stringify(filter)), this.getDbType())\n\t\t\t: undefined;\n\n\t\t// Convert from: { account: {id: '6' }}\n\t\t// to { accountId: '6' }\n\t\t// This conversion only works on root level objects\n\t\tconst whereWithAppliedExternalIdFields = where\n\t\t\t? this.applyExternalIdFields(this.entityType, where)\n\t\t\t: {};\n\n\t\t// Regions need some fancy handling with Query Builder. Process the where further\n\t\t// and return a Query Builder instance.\n\t\tconst query = this.em.createQueryBuilder(this.entityType);\n\n\t\tif (Object.keys(whereWithAppliedExternalIdFields).length > 0) {\n\t\t\tquery.andWhere(whereWithAppliedExternalIdFields);\n\t\t}\n\n\t\tconst result: AggregationResult = {};\n\n\t\ttry {\n\t\t\tif (requestedAggregations.has(AggregationType.COUNT)) {\n\t\t\t\tconst meta = this.database.em.getMetadata().get(this.entityType.name);\n\t\t\t\tif (meta.primaryKeys.length) {\n\t\t\t\t\t// It's a standard entity with primary keys, we can do a full distinct\n\t\t\t\t\t// on these keys.\n\t\t\t\t\tresult.count = await query.getCount(meta.primaryKeys, true);\n\t\t\t\t} else {\n\t\t\t\t\t// It's either a virtual entity, or it's an entity without primary keys.\n\t\t\t\t\t// We just need to count * as a fallback, no distinct.\n\t\t\t\t\tconst [firstRow] = await query.select(sql`count(*)`.as('count')).execute();\n\t\t\t\t\tresult.count = firstRow.count;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tlogger.error(`find ${this.entityType.name} error: ${JSON.stringify(err)}`);\n\n\t\t\tif ((err as PostgresError)?.routine === 'InitializeSessionUserId') {\n\t\t\t\t// Throw if the user credentials are incorrect\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Database connection failed, please check you are using the correct user credentials for the database.'\n\t\t\t\t);\n\t\t\t} else if ((err as PostgresError)?.code === 'ECONNREFUSED') {\n\t\t\t\t// Throw if the database address or port is incorrect\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Database connection failed, please check you are using the correct address and port for the database.'\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n\tBackendProvider,\n\tPaginationOptions,\n\tSort,\n\tFilter,\n\tBackendProviderConfig,\n\tFieldMetadata,\n\tAggregationResult,\n\tAggregationType,\n\tTraceMethod,\n\tTraceOptions,\n\ttraceSync,\n\ttrace as startTrace,\n\tGraphweaverRequestEvent,\n\tGraphweaverPluginNextFunction,\n\tEntityMetadata,\n\tgraphweaverMetadata,\n} from '@exogee/graphweaver';\nimport { logger } from '@exogee/logger';\nimport {\n\tAutoPath,\n\tLoadStrategy,\n\tPopulateHint,\n\tReference,\n\tRequestContext,\n\tsql,\n} from '@mikro-orm/core';\nimport { pluginManager, apolloPluginManager } from '@exogee/graphweaver-server';\n\nimport {\n\tLockMode,\n\tQueryFlag,\n\tReferenceKind,\n\tConnectionManager,\n\texternalIdFieldMap,\n\tAnyEntity,\n\tIsolationLevel,\n\tConnectionOptions,\n\tconnectToDatabase,\n\tDatabaseType,\n} from '..';\n\nimport { OptimisticLockError, sanitiseFilterForLogging } from '../utils';\nimport { assign } from './assign';\n\ntype PostgresError = {\n\tcode: string;\n\troutine: string;\n};\n\nconst objectOperations = new Set(['_and', '_or', '_not']);\nconst mikroObjectOperations = new Set(['$and', '$or', '$not']);\nconst nullBooleanOperations = new Set(['null', 'notnull']);\n\nconst appendPath = (path: string, newPath: string) =>\n\tpath.length ? `${path}.${newPath}` : newPath;\n\nexport const gqlToMikro = (filter: any, databaseType?: DatabaseType): any => {\n\tif (Array.isArray(filter)) {\n\t\treturn filter.map((element) => gqlToMikro(element, databaseType));\n\t} else if (typeof filter === 'object' && filter !== null) {\n\t\tfor (const key of Object.keys(filter)) {\n\t\t\t// A null here is a user-specified value and is valid to filter on\n\t\t\tif (filter[key] === null) continue;\n\n\t\t\tif (objectOperations.has(key)) {\n\t\t\t\t// { _not: '1' } => { $not: '1' }\n\t\t\t\tfilter[key.replace('_', '$')] = gqlToMikro(filter[key], databaseType);\n\t\t\t\tdelete filter[key];\n\t\t\t} else if (typeof filter[key] === 'object' && !Array.isArray(filter[key])) {\n\t\t\t\t// Recurse over nested filters only (arrays are an argument to a filter, not a nested filter)\n\t\t\t\tfilter[key] = gqlToMikro(filter[key], databaseType);\n\t\t\t} else if (key.indexOf('_') >= 0) {\n\t\t\t\tconst [newKey, operator] = key.split('_');\n\t\t\t\tlet newValue;\n\t\t\t\tif (nullBooleanOperations.has(operator) && typeof filter[key] === 'boolean') {\n\t\t\t\t\t// { firstName_null: true } => { firstName: { $eq: null } } or { firstName_null: false } => { firstName: { $ne: null } }\n\t\t\t\t\t// { firstName_notnull: true } => { firstName: { $ne: null } } or { firstName_notnull: false } => { firstName: { $eq: null } }\n\t\t\t\t\tnewValue =\n\t\t\t\t\t\t(filter[key] && operator === 'null') || (!filter[key] && operator === 'notnull')\n\t\t\t\t\t\t\t? { $eq: null }\n\t\t\t\t\t\t\t: { $ne: null };\n\t\t\t\t} else if (operator === 'ilike' && databaseType !== 'postgresql') {\n\t\t\t\t\tlogger.warn(\n\t\t\t\t\t\t`The $ilike operator is not supported by ${databaseType} databases. Operator coerced to $like.`\n\t\t\t\t\t);\n\t\t\t\t\tnewValue = { $like: filter[key] };\n\t\t\t\t} else {\n\t\t\t\t\t// { firstName_in: ['k', 'b'] } => { firstName: { $in: ['k', 'b'] } }\n\t\t\t\t\tnewValue = { [`$${operator}`]: gqlToMikro(filter[key], databaseType) };\n\t\t\t\t\t// They can construct multiple filters for the same key. In that case we need\n\t\t\t\t\t// to append them all into an object.\n\t\t\t\t}\n\n\t\t\t\tif (typeof filter[newKey] !== 'undefined') {\n\t\t\t\t\tif (typeof filter[newKey] !== 'object') {\n\t\t\t\t\t\tif (typeof newValue === 'object' && '$eq' in newValue) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`property ${newKey} on filter is ambiguous. There are two values for this property: ${filter[newKey]} and ${newValue.$eq}`\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfilter[newKey] = { ...{ $eq: filter[newKey] }, ...newValue };\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (newValue && typeof newValue === 'object' && '$eq' in newValue) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`property ${newKey} on filter is ambiguous. There are two values for this property: ${JSON.stringify(\n\t\t\t\t\t\t\t\t\tfilter[newKey]\n\t\t\t\t\t\t\t\t)} and ${JSON.stringify(newValue)}`\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfilter[newKey] = { ...filter[newKey], ...newValue };\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfilter[newKey] = newValue;\n\t\t\t\t}\n\n\t\t\t\tdelete filter[key];\n\t\t\t}\n\t\t}\n\t}\n\treturn filter;\n};\n\nexport interface AdditionalOptions {\n\ttransactionIsolationLevel?: IsolationLevel;\n\tbackendDisplayName?: string;\n}\n\nexport class MikroBackendProvider<D> implements BackendProvider<D> {\n\tprivate _backendId: string;\n\n\tprivate connection: ConnectionOptions;\n\n\tpublic entityType: new () => D;\n\tpublic connectionManagerId?: string;\n\tprivate transactionIsolationLevel!: IsolationLevel;\n\n\t// This is an optional setting that allows you to control how this provider is displayed in the Admin UI.\n\t// If you do not set a value, it will default to 'REST (hostname of baseUrl)'. Entities are grouped by\n\t// their backend's display name, so if you want to group them in a more specific way, this is the way to do it.\n\tpublic readonly backendDisplayName?: string;\n\n\tpublic readonly supportsInFilter = true;\n\n\t// Default backend provider config\n\tpublic readonly backendProviderConfig: BackendProviderConfig = {\n\t\tfilter: true,\n\t\tpagination: false,\n\t\torderBy: false,\n\t\tsupportedAggregationTypes: new Set<AggregationType>([AggregationType.COUNT]),\n\t\tsupportsPseudoCursorPagination: true,\n\t};\n\n\tget backendId() {\n\t\treturn this._backendId;\n\t}\n\n\tprivate get database() {\n\t\t// If we have a connection manager ID then use that else fallback to the Database\n\t\tif (!this.connectionManagerId) return ConnectionManager.default;\n\t\treturn ConnectionManager.database(this.connectionManagerId) || ConnectionManager.default;\n\t}\n\n\t// This is exposed for use in the RLS package\n\tpublic get transactional() {\n\t\treturn this.database.transactional;\n\t}\n\n\tpublic async withTransaction<T>(callback: () => Promise<T>) {\n\t\treturn this.database.transactional<T>(callback, this.transactionIsolationLevel);\n\t}\n\n\t// This is exposed for use in the RLS package\n\tpublic get em() {\n\t\treturn this.database.em;\n\t}\n\n\tpublic constructor(\n\t\tmikroType: new () => D,\n\t\tconnection: ConnectionOptions,\n\t\ttransactionIsolationLevel?: IsolationLevel\n\t);\n\tpublic constructor(\n\t\tmikroType: new () => D,\n\t\tconnection: ConnectionOptions,\n\t\tadditionalOptions?: AdditionalOptions\n\t);\n\tpublic constructor(\n\t\tmikroType: new () => D,\n\t\tconnection: ConnectionOptions,\n\t\toptionsOrIsolationLevel: AdditionalOptions | IsolationLevel = {\n\t\t\ttransactionIsolationLevel: IsolationLevel.REPEATABLE_READ,\n\t\t}\n\t) {\n\t\tconst options =\n\t\t\ttypeof optionsOrIsolationLevel === 'object'\n\t\t\t\t? optionsOrIsolationLevel\n\t\t\t\t: {\n\t\t\t\t\t\ttransactionIsolationLevel: optionsOrIsolationLevel,\n\t\t\t\t\t};\n\n\t\tthis.entityType = mikroType;\n\t\tthis.connectionManagerId = connection.connectionManagerId;\n\t\tthis._backendId = `mikro-orm-${connection.connectionManagerId || ''}`;\n\t\tthis.transactionIsolationLevel =\n\t\t\toptions.transactionIsolationLevel ?? IsolationLevel.REPEATABLE_READ;\n\t\tthis.backendDisplayName = options.backendDisplayName;\n\t\tthis.connection = connection;\n\t\tthis.addRequestContext();\n\t\tthis.connectToDatabase();\n\t}\n\tprivate getDbType(): DatabaseType {\n\t\tconst driver = this.em.getDriver().constructor.name;\n\t\t// This used to import the actual drivers, but since they're optional it makes more sense\n\t\t// to just use the strings.\n\t\tswitch (driver) {\n\t\t\tcase 'MsSqlDriver':\n\t\t\t\treturn 'mssql';\n\t\t\tcase 'MySqlDriver':\n\t\t\t\treturn 'mysql';\n\t\t\tcase 'PostgreSqlDriver':\n\t\t\t\treturn 'postgresql';\n\t\t\tcase 'SqliteDriver':\n\t\t\t\treturn 'sqlite';\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`This driver (${driver}) is not supported!`);\n\t\t}\n\t}\n\n\tprivate connectToDatabase = async () => {\n\t\tconst connectionManagerId = this.connectionManagerId;\n\t\tif (!connectionManagerId) {\n\t\t\tthrow new Error('Expected connectionManagerId to be defined when calling addRequestContext.');\n\t\t}\n\n\t\tapolloPluginManager.addPlugin(connectionManagerId, connectToDatabase(this.connection));\n\t};\n\n\tprivate addRequestContext = () => {\n\t\tconst connectionManagerId = this.connectionManagerId;\n\t\tif (!connectionManagerId) {\n\t\t\tthrow new Error('Expected connectionManagerId to be defined when calling addRequestContext.');\n\t\t}\n\n\t\tconst connectionPlugin = {\n\t\t\tname: connectionManagerId,\n\t\t\tevent: GraphweaverRequestEvent.OnRequest,\n\t\t\tnext: async (_: GraphweaverRequestEvent, _next: GraphweaverPluginNextFunction) => {\n\t\t\t\tlogger.trace(`Graphweaver OnRequest plugin called`);\n\n\t\t\t\tconst connection = await ConnectionManager.awaitableDatabase(connectionManagerId);\n\n\t\t\t\tif (!connection) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`No database connection found for connectionManagerId: ${connectionManagerId} after waiting for connection. This should not happen.`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn RequestContext.create(connection.orm.em, _next, {});\n\t\t\t},\n\t\t};\n\t\tpluginManager.addPlugin(connectionPlugin);\n\t};\n\n\tprivate mapAndAssignKeys = (result: D, entityType: new () => D, inputArgs: Partial<D>) => {\n\t\t// Clean the input and remove any GraphQL classes from the object\n\t\tconst assignmentObj = this.applyExternalIdFields(entityType, inputArgs);\n\t\treturn assign(result, assignmentObj, undefined, undefined, this.database.em);\n\t};\n\n\tprivate applyExternalIdFields = (target: AnyEntity | string, values: any) => {\n\t\tconst targetName = typeof target === 'string' ? target : target.name;\n\t\tconst map = externalIdFieldMap.get(targetName);\n\n\t\tconst mapFieldNames = (partialFilterObj: any) => {\n\t\t\tfor (const [from, to] of Object.entries(map || {})) {\n\t\t\t\tif (partialFilterObj[from]) {\n\t\t\t\t\tconst keys = Object.keys(partialFilterObj[from]);\n\t\t\t\t\tif (keys.length > 1) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Expected precisely 1 key in queryObj.${from} on ${target}, got ${JSON.stringify(\n\t\t\t\t\t\t\t\tpartialFilterObj[from],\n\t\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\t\t4\n\t\t\t\t\t\t\t)}`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tpartialFilterObj[to] = partialFilterObj[from][keys[0]];\n\t\t\t\t\tdelete partialFilterObj[from];\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Check for and/or/etc at the root level and handle correctly\n\t\tfor (const rootLevelKey of Object.keys(values)) {\n\t\t\tif (mikroObjectOperations.has(rootLevelKey)) {\n\t\t\t\tif (Array.isArray(values[rootLevelKey])) {\n\t\t\t\t\tfor (const field of values[rootLevelKey]) {\n\t\t\t\t\t\tmapFieldNames(field);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tmapFieldNames(values[rootLevelKey]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Map the rest of the field names as well\n\t\tmapFieldNames(values);\n\n\t\t// Traverse the nested entities\n\t\tconst { properties } = this.database.em.getMetadata().get(targetName);\n\t\tObject.values(properties)\n\t\t\t.filter((property) => typeof property.entity !== 'undefined' && values[property.name])\n\t\t\t.forEach((property) => {\n\t\t\t\tif (Array.isArray(values[property.name])) {\n\t\t\t\t\tvalues[property.name].forEach((value: any) =>\n\t\t\t\t\t\tthis.applyExternalIdFields(property.type, value)\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tvalues[property.name] = this.applyExternalIdFields(property.type, values[property.name]);\n\t\t\t\t}\n\t\t\t});\n\n\t\treturn values;\n\t};\n\n\t// Check if we have any keys that are a collection of entities\n\tpublic visitPathForPopulate = (entityName: string, updateArgBranch: any, populateBranch = '') => {\n\t\tconst { properties } = this.database.em.getMetadata().get(entityName);\n\t\tconst collectedPaths = populateBranch ? new Set<string>([populateBranch]) : new Set<string>([]);\n\n\t\tfor (const [key, value] of Object.entries(updateArgBranch ?? {})) {\n\t\t\tif (\n\t\t\t\t// If it's a relationship, go ahead and and '.' it in, recurse.\n\t\t\t\tproperties[key]?.kind === ReferenceKind.ONE_TO_ONE ||\n\t\t\t\tproperties[key]?.kind === ReferenceKind.ONE_TO_MANY ||\n\t\t\t\tproperties[key]?.kind === ReferenceKind.MANY_TO_ONE ||\n\t\t\t\tproperties[key]?.kind === ReferenceKind.MANY_TO_MANY\n\t\t\t) {\n\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\t// In the case where the array is empty we also need to make sure we load the collection.\n\t\t\t\t\tcollectedPaths.add(appendPath(populateBranch, key));\n\n\t\t\t\t\tfor (const entry of value) {\n\t\t\t\t\t\t// Recurse\n\t\t\t\t\t\tconst newPaths = this.visitPathForPopulate(\n\t\t\t\t\t\t\tproperties[key].type,\n\t\t\t\t\t\t\tentry,\n\t\t\t\t\t\t\tappendPath(populateBranch, key)\n\t\t\t\t\t\t);\n\t\t\t\t\t\tnewPaths.forEach((path) => collectedPaths.add(path));\n\t\t\t\t\t}\n\t\t\t\t} else if (typeof value === 'object') {\n\t\t\t\t\t// Recurse\n\t\t\t\t\tconst newPaths = this.visitPathForPopulate(\n\t\t\t\t\t\tproperties[key].type,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\tappendPath(populateBranch, key)\n\t\t\t\t\t);\n\t\t\t\t\tnewPaths.forEach((path) => collectedPaths.add(path));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn collectedPaths;\n\t};\n\n\t@TraceMethod()\n\tpublic async find(\n\t\tfilter: Filter<D>,\n\t\tpagination?: PaginationOptions,\n\t\tentityMetadata?: EntityMetadata,\n\t\ttrace?: TraceOptions\n\t): Promise<D[]> {\n\t\t// If we have a span, update the name\n\t\ttrace?.span.updateName(`Mikro-Orm - Find ${this.entityType.name}`);\n\n\t\tlogger.trace(\n\t\t\t{ filter: sanitiseFilterForLogging(filter), entity: this.entityType.name },\n\t\t\t'Running find with filter'\n\t\t);\n\n\t\t// Strip custom types out of the equation.\n\t\t// This query only works if we JSON.parse(JSON.stringify(filter)):\n\t\tconst where = traceSync((trace?: TraceOptions) => {\n\t\t\ttrace?.span.updateName('Convert filter to Mikro-Orm format');\n\t\t\treturn filter ? gqlToMikro(JSON.parse(JSON.stringify(filter)), this.getDbType()) : undefined;\n\t\t})();\n\n\t\t// Convert from: { account: {id: '6' }}\n\t\t// to { accountId: '6' }\n\t\t// This conversion only works on root level objects\n\t\tconst whereWithAppliedExternalIdFields = where\n\t\t\t? this.applyExternalIdFields(this.entityType, where)\n\t\t\t: {};\n\n\t\t// Regions need some fancy handling with Query Builder. Process the where further\n\t\t// and return a Query Builder instance.\n\t\tconst query = this.em.createQueryBuilder(this.entityType);\n\t\tif (Object.keys(whereWithAppliedExternalIdFields).length > 0) {\n\t\t\tquery.andWhere(whereWithAppliedExternalIdFields);\n\t\t}\n\n\t\t// If we have specified a limit, offset or order then update the query\n\t\tif (pagination?.limit) query.limit(pagination.limit);\n\t\tif (pagination?.offset) query.offset(pagination.offset);\n\t\tif (pagination?.orderBy) query.orderBy({ ...pagination.orderBy });\n\n\t\t// Certain query filters can result in duplicate records once all joins are resolved\n\t\t// These duplicates can be discarded as related entities are returned to the\n\t\t// API consumer via field resolvers\n\t\tquery.setFlag(QueryFlag.DISTINCT);\n\n\t\t// 1:1 relations that aren't on the owning side need to get populated so the references get set.\n\t\t// This method is protected, but we need to use it from here, hence the `as any`.\n\t\tconst driver = this.database.em.getDriver();\n\t\tconst meta = this.database.em.getMetadata().get(this.entityType.name);\n\t\tquery.populate((driver as any).autoJoinOneToOneOwner(meta, []));\n\n\t\ttry {\n\t\t\tconst result = await startTrace(async (trace?: TraceOptions) => {\n\t\t\t\ttrace?.span.updateName('Mikro-Orm - Fetch Data');\n\t\t\t\treturn query.getResult();\n\t\t\t})();\n\n\t\t\tlogger.trace(`find ${this.entityType.name} result: ${result.length} rows`);\n\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tlogger.error(`find ${this.entityType.name} error: ${JSON.stringify(err)}`);\n\n\t\t\tif ((err as PostgresError)?.routine === 'InitializeSessionUserId') {\n\t\t\t\t// Throw if the user credentials are incorrect\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Database connection failed, please check you are using the correct user credentials for the database.'\n\t\t\t\t);\n\t\t\t} else if ((err as PostgresError)?.code === 'ECONNREFUSED') {\n\t\t\t\t// Throw if the database address or port is incorrect\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Database connection failed, please check you are using the correct address and port for the database.'\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t}\n\t}\n\n\t@TraceMethod()\n\tpublic async findOne(\n\t\tfilter: Filter<D>,\n\t\tentityMetadata?: EntityMetadata,\n\t\ttrace?: TraceOptions\n\t): Promise<D | null> {\n\t\ttrace?.span.updateName(`Mikro-Orm - FindOne ${this.entityType.name}`);\n\t\tlogger.trace(\n\t\t\t{ entity: this.entityType.name, filter: sanitiseFilterForLogging(filter) },\n\t\t\t'Running findOne with filter'\n\t\t);\n\n\t\tconst metadata = this.em.getMetadata().get(this.entityType.name);\n\t\tlet primaryKeyField = metadata.primaryKeys[0];\n\n\t\tif (!primaryKeyField && entityMetadata) {\n\t\t\t// When using virtual entities, MikroORM will have no primary keys.\n\t\t\t// In this scenario we actually know what the primary key is from\n\t\t\t// the GraphQL metadata, so we can go ahead and use it.\n\t\t\tprimaryKeyField = graphweaverMetadata.primaryKeyFieldForEntity(entityMetadata);\n\t\t}\n\n\t\tif (!primaryKeyField || metadata.primaryKeys.length > 1) {\n\t\t\tthrow new Error(\n\t\t\t\t`Entity ${this.entityType.name} has ${metadata.primaryKeys.length} primary keys. We only support entities with a single primary key at this stage.`\n\t\t\t);\n\t\t}\n\n\t\tconst [result] = await this.find(filter, {\n\t\t\torderBy: { [primaryKeyField]: Sort.DESC },\n\t\t\toffset: 0,\n\t\t\tlimit: 1,\n\t\t});\n\n\t\tlogger.trace({ result, entity: this.entityType.name }, 'findOne result');\n\n\t\treturn result;\n\t}\n\n\t@TraceMethod()\n\tpublic async findByRelatedId(\n\t\tentity: any,\n\t\trelatedField: string,\n\t\trelatedFieldIds: string[],\n\t\tfilter?: any,\n\t\ttrace?: TraceOptions\n\t): Promise<D[]> {\n\t\ttrace?.span.updateName(`Mikro-Orm - findByRelatedId ${this.entityType.name}`);\n\t\tlogger.trace(\n\t\t\t{\n\t\t\t\tentity: this.entityType.name,\n\t\t\t\trelatedField,\n\t\t\t\trelatedFieldIds,\n\t\t\t\tfilter: sanitiseFilterForLogging(filter),\n\t\t\t},\n\t\t\t'Running findByRelatedId'\n\t\t);\n\n\t\t// Any is the actual type from MikroORM, sorry folks.\n\t\tlet queryFilter: any = { [relatedField]: { $in: relatedFieldIds } };\n\n\t\tif (filter) {\n\t\t\t// JSON.parse(JSON.stringify()) is needed. See https://exogee.atlassian.net/browse/EXOGW-419\n\t\t\tconst gqlToMikroFilter = JSON.parse(JSON.stringify([gqlToMikro(filter, this.getDbType())]));\n\t\t\t// Since the user has supplied a filter, we need to and it in.\n\t\t\tqueryFilter = { $and: [queryFilter, ...gqlToMikroFilter] };\n\t\t}\n\n\t\tconst populate = [relatedField as AutoPath<typeof entity, PopulateHint>];\n\t\tconst result = await this.database.em.find(entity, queryFilter, {\n\t\t\t// We only need one result per entity.\n\t\t\tflags: [QueryFlag.DISTINCT],\n\n\t\t\t// We do want to populate the relation, however, see below.\n\t\t\tpopulate,\n\n\t\t\t// We'd love to use the default joined loading strategy, but it doesn't work with the populateWhere option.\n\t\t\tstrategy: LoadStrategy.SELECT_IN,\n\n\t\t\t// This tells MikroORM we only need to load the related entities if they match the filter specified above.\n\t\t\tpopulateWhere: PopulateHint.INFER,\n\t\t});\n\n\t\treturn result as D[];\n\t}\n\n\t@TraceMethod()\n\tpublic async updateOne(\n\t\tid: string | number,\n\t\tupdateArgs: Partial<D & { version?: number }>,\n\t\ttrace?: TraceOptions\n\t): Promise<D> {\n\t\ttrace?.span.updateName(`Mikro-Orm - updateOne ${this.entityType.name}`);\n\n\t\tlogger.trace(\n\t\t\t{\n\t\t\t\tid,\n\t\t\t\tupdateArgs: sanitiseFilterForLogging(updateArgs),\n\t\t\t\tentity: this.entityType.name,\n\t\t\t},\n\t\t\t'Running update with args'\n\t\t);\n\n\t\tconst entity = await this.database.em.findOne(this.entityType, id, {\n\t\t\t// This is an optimisation so that assign() doesn't have to go fetch everything one at a time.\n\t\t\tpopulate: [...this.visitPathForPopulate(this.entityType.name, updateArgs)] as `${string}.`[],\n\t\t});\n\n\t\tif (entity === null) {\n\t\t\tthrow new Error(`Unable to locate ${this.entityType.name} with ID: '${id}' for updating.`);\n\t\t}\n\n\t\tconst { version, ...updateArgsWithoutVersion } = updateArgs;\n\n\t\t// If a version has been sent, let's check it\n\t\tif (version) {\n\t\t\ttry {\n\t\t\t\tawait this.database.em.lock(entity, LockMode.OPTIMISTIC, version);\n\t\t\t} catch (err) {\n\t\t\t\tthrow new OptimisticLockError((err as Error)?.message, { entity });\n\t\t\t}\n\t\t}\n\n\t\t// For an update we also want to go ahead and remove the primary key if it's autoincremented, as\n\t\t// users should not be able to change the primary key. There are also scenarios like\n\t\t// GENERATED ALWAYS AS IDENTITY where even supplying the primary key in the update query will\n\t\t// cause an error.\n\t\tconst meta = this.database.em.getMetadata().get(this.entityType.name);\n\t\tfor (const key of meta.primaryKeys) {\n\t\t\tif (meta.properties[key].autoincrement) delete (updateArgsWithoutVersion as any)[key];\n\t\t}\n\n\t\tawait this.mapAndAssignKeys(entity, this.entityType, updateArgsWithoutVersion as Partial<D>);\n\t\tawait this.database.em.persistAndFlush(entity);\n\n\t\tlogger.trace(`update ${this.entityType.name} entity`, entity);\n\n\t\treturn entity;\n\t}\n\n\t@TraceMethod()\n\tpublic async updateMany(\n\t\tupdateItems: (Partial<D> & { id: string })[],\n\t\ttrace?: TraceOptions\n\t): Promise<D[]> {\n\t\ttrace?.span.updateName(`Mikro-Orm - updateMany ${this.entityType.name}`);\n\t\tlogger.trace(\n\t\t\t{ updateItems: sanitiseFilterForLogging(updateItems), entity: this.entityType.name },\n\t\t\t'Running update many with args'\n\t\t);\n\n\t\tconst meta = this.database.em.getMetadata().get(this.entityType.name);\n\n\t\tconst entities = await this.database.transactional<D[]>(async () => {\n\t\t\treturn Promise.all<D>(\n\t\t\t\tupdateItems.map(async (item) => {\n\t\t\t\t\tif (!item?.id) throw new Error('You must pass an ID for this entity to update it.');\n\n\t\t\t\t\t// Find the entity in the database\n\t\t\t\t\tconst entity = await this.database.em.findOneOrFail(this.entityType, item.id, {\n\t\t\t\t\t\tpopulate: [...this.visitPathForPopulate(this.entityType.name, item)] as `${string}.`[],\n\t\t\t\t\t});\n\n\t\t\t\t\t// For an update we also want to go ahead and remove the primary key if it's autoincremented, as\n\t\t\t\t\t// users should not be able to change the primary key. There are also scenarios like\n\t\t\t\t\t// GENERATED ALWAYS AS IDENTITY where even supplying the primary key in the update query will\n\t\t\t\t\t// cause an error.\n\t\t\t\t\tfor (const key of meta.primaryKeys) {\n\t\t\t\t\t\tif (meta.properties[key].autoincrement) delete (item as any)[key];\n\t\t\t\t\t}\n\n\t\t\t\t\tawait this.mapAndAssignKeys(entity, this.entityType, item);\n\t\t\t\t\tthis.database.em.persist(entity);\n\t\t\t\t\treturn entity;\n\t\t\t\t})\n\t\t\t);\n\t\t});\n\n\t\tlogger.trace({ entity: this.entityType.name, entities }, 'updated items');\n\n\t\treturn entities;\n\t}\n\n\t@TraceMethod()\n\tpublic async createOrUpdateMany(items: Partial<D>[], trace?: TraceOptions): Promise<D[]> {\n\t\ttrace?.span.updateName(`Mikro-Orm - createOrUpdateMany ${this.entityType.name}`);\n\t\tlogger.trace(\n\t\t\t{ items: sanitiseFilterForLogging(items), entity: this.entityType.name },\n\t\t\t'Running create or update many with args'\n\t\t);\n\n\t\tconst entities = await this.database.transactional<D[]>(async () => {\n\t\t\treturn Promise.all<D>(\n\t\t\t\titems.map(async (item) => {\n\t\t\t\t\tlet entity;\n\t\t\t\t\tconst { id } = item as any;\n\t\t\t\t\tif (id) {\n\t\t\t\t\t\tentity = await this.database.em.findOneOrFail(this.entityType, id, {\n\t\t\t\t\t\t\tpopulate: [\n\t\t\t\t\t\t\t\t...this.visitPathForPopulate(this.entityType.name, item),\n\t\t\t\t\t\t\t] as `${string}.`[],\n\t\t\t\t\t\t});\n\t\t\t\t\t\tlogger.trace({ item, entity: this.entityType.name }, 'Running update with item');\n\t\t\t\t\t\tawait this.mapAndAssignKeys(entity, this.entityType, item);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tentity = new this.entityType();\n\t\t\t\t\t\tawait this.mapAndAssignKeys(entity, this.entityType, item);\n\t\t\t\t\t\tlogger.trace({ item, entity: this.entityType.name }, 'Running create with item');\n\t\t\t\t\t}\n\t\t\t\t\tthis.database.em.persist(entity);\n\t\t\t\t\treturn entity;\n\t\t\t\t})\n\t\t\t);\n\t\t});\n\n\t\tlogger.trace(\n\t\t\t{ entity: this.entityType.name, entities: sanitiseFilterForLogging(entities) },\n\t\t\t'created or updated items'\n\t\t);\n\n\t\treturn entities;\n\t}\n\n\t@TraceMethod()\n\tpublic async createOne(createArgs: Partial<D>, trace?: TraceOptions): Promise<D> {\n\t\ttrace?.span.updateName(`Mikro-Orm - createOne ${this.entityType.name}`);\n\t\tlogger.trace(\n\t\t\t{ createArgs: sanitiseFilterForLogging(createArgs), entity: this.entityType.name },\n\t\t\t'Running create with args'\n\t\t);\n\n\t\tconst entity = new this.entityType();\n\t\tawait this.mapAndAssignKeys(entity, this.entityType, createArgs);\n\t\tawait this.database.em.persistAndFlush(entity as Partial<D>);\n\n\t\tlogger.trace(\n\t\t\t{ entity: this.entityType.name, result: sanitiseFilterForLogging(entity) },\n\t\t\t'create result'\n\t\t);\n\n\t\treturn entity;\n\t}\n\n\t@TraceMethod()\n\tpublic async createMany(createItems: Partial<D>[], trace?: TraceOptions): Promise<D[]> {\n\t\ttrace?.span.updateName(`Mikro-Orm - createMany ${this.entityType.name}`);\n\t\treturn this._createMany(createItems);\n\t}\n\n\tpublic async createTraces(createItems: Partial<D>[]): Promise<D[]> {\n\t\treturn this._createMany(createItems);\n\t}\n\n\tprivate async _createMany(createItems: Partial<D>[]) {\n\t\tlogger.trace(\n\t\t\t{ createItems: sanitiseFilterForLogging(createItems), entity: this.entityType.name },\n\t\t\t'Running create with args'\n\t\t);\n\n\t\tconst entities = await this.database.transactional<D[]>(async () => {\n\t\t\treturn Promise.all<D>(\n\t\t\t\tcreateItems.map(async (item) => {\n\t\t\t\t\tconst entity = new this.entityType();\n\t\t\t\t\tawait this.mapAndAssignKeys(entity, this.entityType, item);\n\t\t\t\t\tthis.database.em.persist(entity as Partial<D>);\n\t\t\t\t\treturn entity;\n\t\t\t\t})\n\t\t\t);\n\t\t});\n\n\t\tlogger.trace({ entity: this.entityType.name, entities }, 'created items');\n\n\t\treturn entities;\n\t}\n\n\t@TraceMethod()\n\tpublic async deleteOne(filter: Filter<D>, trace?: TraceOptions): Promise<boolean> {\n\t\ttrace?.span.updateName(`Mikro-Orm - deleteOne ${this.entityType.name}`);\n\t\tlogger.trace(\n\t\t\t{ filter: sanitiseFilterForLogging(filter), entity: this.entityType.name },\n\t\t\t'Running delete with filter.'\n\t\t);\n\t\tconst where = filter\n\t\t\t? gqlToMikro(JSON.parse(JSON.stringify(filter)), this.getDbType())\n\t\t\t: undefined;\n\t\tconst whereWithAppliedExternalIdFields =\n\t\t\twhere && this.applyExternalIdFields(this.entityType, where);\n\n\t\tconst deletedRows = await this.database.em.nativeDelete(\n\t\t\tthis.entityType,\n\t\t\twhereWithAppliedExternalIdFields\n\t\t);\n\n\t\tif (deletedRows > 1) {\n\t\t\tthrow new Error('Multiple deleted rows');\n\t\t}\n\n\t\tlogger.trace(`delete ${this.entityType.name} result: deleted ${deletedRows} row(s)`);\n\n\t\treturn deletedRows === 1;\n\t}\n\n\t@TraceMethod()\n\tpublic async deleteMany(filter: Filter<D>, trace?: TraceOptions): Promise<boolean> {\n\t\ttrace?.span.updateName(`Mikro-Orm - deleteMany ${this.entityType.name}`);\n\t\tlogger.trace(\n\t\t\t{ filter: sanitiseFilterForLogging(filter), entity: this.entityType.name },\n\t\t\t'Running delete'\n\t\t);\n\n\t\tconst deletedRows = await this.database.transactional<number>(async () => {\n\t\t\tconst where = filter\n\t\t\t\t? gqlToMikro(JSON.parse(JSON.stringify(filter)), this.getDbType())\n\t\t\t\t: undefined;\n\t\t\tconst whereWithAppliedExternalIdFields =\n\t\t\t\twhere && this.applyExternalIdFields(this.entityType, where);\n\n\t\t\tconst toDelete = await this.database.em.count(\n\t\t\t\tthis.entityType,\n\t\t\t\twhereWithAppliedExternalIdFields\n\t\t\t);\n\t\t\tconst deletedCount = await this.database.em.nativeDelete(\n\t\t\t\tthis.entityType,\n\t\t\t\twhereWithAppliedExternalIdFields\n\t\t\t);\n\n\t\t\tif (deletedCount !== toDelete) {\n\t\t\t\tthrow new Error('We did not delete any rows, rolling back.');\n\t\t\t}\n\n\t\t\treturn deletedCount;\n\t\t});\n\n\t\tlogger.trace(`delete ${this.entityType.name} result: deleted ${deletedRows} row(s)`);\n\n\t\treturn true;\n\t}\n\n\tpublic foreignKeyForRelationshipField?(field: FieldMetadata, dataEntity: D) {\n\t\tconst value = dataEntity[field.name as keyof D];\n\n\t\tif (Reference.isReference(value)) {\n\t\t\tconst { properties } = this.database.em.getMetadata().get(this.entityType);\n\t\t\tconst property = properties[field.name];\n\t\t\tconst [primaryKey] = property.targetMeta?.primaryKeys ?? [];\n\t\t\tif (!primaryKey) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Could not determine primary key for ${field.name} on ${this.entityType.name}`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst foreignKey = (value.unwrap() as any)[primaryKey];\n\t\t\tif (foreignKey === undefined || foreignKey === null) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Could not read foreign key from reference: ${value.unwrap()} with primary key name ${primaryKey}`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn foreignKey;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t@TraceMethod()\n\tpublic async aggregate(\n\t\tfilter: Filter<D>,\n\t\trequestedAggregations: Set<AggregationType>,\n\t\ttrace?: TraceOptions\n\t): Promise<AggregationResult> {\n\t\ttrace?.span.updateName(`Mikro-Orm - aggregate ${this.entityType.name}`);\n\t\tlogger.trace(\n\t\t\t{ filter: sanitiseFilterForLogging(filter), entity: this.entityType.name },\n\t\t\t'Running aggregate with filter'\n\t\t);\n\n\t\t// Strip custom types out of the equation.\n\t\t// This query only works if we JSON.parse(JSON.stringify(filter)):\n\t\t//\n\t\t// query {\n\t\t// drivers (filter: { region: { name: \"North Shore\" }}) {\n\t\t// id\n\t\t// }\n\t\t// }\n\t\tconst where = filter\n\t\t\t? gqlToMikro(JSON.parse(JSON.stringify(filter)), this.getDbType())\n\t\t\t: undefined;\n\n\t\t// Convert from: { account: {id: '6' }}\n\t\t// to { accountId: '6' }\n\t\t// This conversion only works on root level objects\n\t\tconst whereWithAppliedExternalIdFields = where\n\t\t\t? this.applyExternalIdFields(this.entityType, where)\n\t\t\t: {};\n\n\t\t// Regions need some fancy handling with Query Builder. Process the where further\n\t\t// and return a Query Builder instance.\n\t\tconst query = this.em.createQueryBuilder(this.entityType);\n\n\t\tif (Object.keys(whereWithAppliedExternalIdFields).length > 0) {\n\t\t\tquery.andWhere(whereWithAppliedExternalIdFields);\n\t\t}\n\n\t\tconst result: AggregationResult = {};\n\n\t\ttry {\n\t\t\tif (requestedAggregations.has(AggregationType.COUNT)) {\n\t\t\t\tconst meta = this.database.em.getMetadata().get(this.entityType.name);\n\t\t\t\tif (meta.primaryKeys.length) {\n\t\t\t\t\t// It's a standard entity with primary keys, we can do a full distinct\n\t\t\t\t\t// on these keys.\n\t\t\t\t\tresult.count = await query.getCount(meta.primaryKeys, true);\n\t\t\t\t} else {\n\t\t\t\t\t// It's either a virtual entity, or it's an entity without primary keys.\n\t\t\t\t\t// We just need to count * as a fallback, no distinct.\n\t\t\t\t\tconst [firstRow] = await query.select(sql`count(*)`.as('count')).execute();\n\t\t\t\t\tresult.count = firstRow.count;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tlogger.error(`find ${this.entityType.name} error: ${JSON.stringify(err)}`);\n\n\t\t\tif ((err as PostgresError)?.routine === 'InitializeSessionUserId') {\n\t\t\t\t// Throw if the user credentials are incorrect\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Database connection failed, please check you are using the correct user credentials for the database.'\n\t\t\t\t);\n\t\t\t} else if ((err as PostgresError)?.code === 'ECONNREFUSED') {\n\t\t\t\t// Throw if the database address or port is incorrect\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Database connection failed, please check you are using the correct address and port for the database.'\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAiBO;AACP,oBAAuB;AACvB,kBAOO;AACP,gCAAmD;AAEnD,eAWO;AAEP,mBAA8D;AAC9D,oBAAuB;AAOvB,MAAM,mBAAmB,oBAAI,IAAI,CAAC,QAAQ,OAAO,MAAM,CAAC;AACxD,MAAM,wBAAwB,oBAAI,IAAI,CAAC,QAAQ,OAAO,MAAM,CAAC;AAC7D,MAAM,wBAAwB,oBAAI,IAAI,CAAC,QAAQ,SAAS,CAAC;AAEzD,MAAM,aAAa,CAAC,MAAc,YACjC,KAAK,SAAS,GAAG,IAAI,IAAI,OAAO,KAAK;AAE/B,MAAM,aAAa,CAAC,QAAa,iBAAqC;AAC5E,MAAI,MAAM,QAAQ,MAAM,GAAG;AAC1B,WAAO,OAAO,IAAI,CAAC,YAAY,WAAW,SAAS,YAAY,CAAC;AAAA,EACjE,WAAW,OAAO,WAAW,YAAY,WAAW,MAAM;AACzD,eAAW,OAAO,OAAO,KAAK,MAAM,GAAG;AAEtC,UAAI,OAAO,GAAG,MAAM,KAAM;AAE1B,UAAI,iBAAiB,IAAI,GAAG,GAAG;AAE9B,eAAO,IAAI,QAAQ,KAAK,GAAG,CAAC,IAAI,WAAW,OAAO,GAAG,GAAG,YAAY;AACpE,eAAO,OAAO,GAAG;AAAA,MAClB,WAAW,OAAO,OAAO,GAAG,MAAM,YAAY,CAAC,MAAM,QAAQ,OAAO,GAAG,CAAC,GAAG;AAE1E,eAAO,GAAG,IAAI,WAAW,OAAO,GAAG,GAAG,YAAY;AAAA,MACnD,WAAW,IAAI,QAAQ,GAAG,KAAK,GAAG;AACjC,cAAM,CAAC,QAAQ,QAAQ,IAAI,IAAI,MAAM,GAAG;AACxC,YAAI;AACJ,YAAI,sBAAsB,IAAI,QAAQ,KAAK,OAAO,OAAO,GAAG,MAAM,WAAW;AAG5E,qBACE,OAAO,GAAG,KAAK,aAAa,UAAY,CAAC,OAAO,GAAG,KAAK,aAAa,YACnE,EAAE,KAAK,KAAK,IACZ,EAAE,KAAK,KAAK;AAAA,QACjB,WAAW,aAAa,WAAW,iBAAiB,cAAc;AACjE,+BAAO;AAAA,YACN,2CAA2C,YAAY;AAAA,UACxD;AACA,qBAAW,EAAE,OAAO,OAAO,GAAG,EAAE;AAAA,QACjC,OAAO;AAEN,qBAAW,EAAE,CAAC,IAAI,QAAQ,EAAE,GAAG,WAAW,OAAO,GAAG,GAAG,YAAY,EAAE;AAAA,QAGtE;AAEA,YAAI,OAAO,OAAO,MAAM,MAAM,aAAa;AAC1C,cAAI,OAAO,OAAO,MAAM,MAAM,UAAU;AACvC,gBAAI,OAAO,aAAa,YAAY,SAAS,UAAU;AACtD,oBAAM,IAAI;AAAA,gBACT,YAAY,MAAM,oEAAoE,OAAO,MAAM,CAAC,QAAQ,SAAS,GAAG;AAAA,cACzH;AAAA,YACD;AACA,mBAAO,MAAM,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,MAAM,EAAE,GAAG,GAAG,SAAS;AAAA,UAC5D,OAAO;AACN,gBAAI,YAAY,OAAO,aAAa,YAAY,SAAS,UAAU;AAClE,oBAAM,IAAI;AAAA,gBACT,YAAY,MAAM,oEAAoE,KAAK;AAAA,kBAC1F,OAAO,MAAM;AAAA,gBACd,CAAC,QAAQ,KAAK,UAAU,QAAQ,CAAC;AAAA,cAClC;AAAA,YACD;AACA,mBAAO,MAAM,IAAI,EAAE,GAAG,OAAO,MAAM,GAAG,GAAG,SAAS;AAAA,UACnD;AAAA,QACD,OAAO;AACN,iBAAO,MAAM,IAAI;AAAA,QAClB;AAEA,eAAO,OAAO,GAAG;AAAA,MAClB;AAAA,IACD;AAAA,EACD;AACA,SAAO;AACR;AAOO,MAAM,qBAAsD;AAAA,EA2D3D,YACN,WACA,YACA,0BAA8D;AAAA,IAC7D,2BAA2B,wBAAe;AAAA,EAC3C,GACC;AAnDF,SAAgB,mBAAmB;AAGnC;AAAA,SAAgB,wBAA+C;AAAA,MAC9D,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,2BAA2B,oBAAI,IAAqB,CAAC,mCAAgB,KAAK,CAAC;AAAA,MAC3E,gCAAgC;AAAA,IACjC;AA8EA,SAAQ,oBAAoB,YAAY;AACvC,YAAM,sBAAsB,KAAK;AACjC,UAAI,CAAC,qBAAqB;AACzB,cAAM,IAAI,MAAM,4EAA4E;AAAA,MAC7F;AAEA,oDAAoB,UAAU,yBAAqB,4BAAkB,KAAK,UAAU,CAAC;AAAA,IACtF;AAEA,SAAQ,oBAAoB,MAAM;AACjC,YAAM,sBAAsB,KAAK;AACjC,UAAI,CAAC,qBAAqB;AACzB,cAAM,IAAI,MAAM,4EAA4E;AAAA,MAC7F;AAEA,YAAM,mBAAmB;AAAA,QACxB,MAAM;AAAA,QACN,OAAO,2CAAwB;AAAA,QAC/B,MAAM,OAAO,GAA4B,UAAyC;AACjF,+BAAO,MAAM,qCAAqC;AAElD,gBAAM,aAAa,MAAM,2BAAkB,kBAAkB,mBAAmB;AAEhF,cAAI,CAAC,YAAY;AAChB,kBAAM,IAAI;AAAA,cACT,yDAAyD,mBAAmB;AAAA,YAC7E;AAAA,UACD;AAEA,iBAAO,2BAAe,OAAO,WAAW,IAAI,IAAI,OAAO,CAAC,CAAC;AAAA,QAC1D;AAAA,MACD;AACA,8CAAc,UAAU,gBAAgB;AAAA,IACzC;AAEA,SAAQ,mBAAmB,CAAC,QAAW,YAAyB,cAA0B;AAEzF,YAAM,gBAAgB,KAAK,sBAAsB,YAAY,SAAS;AACtE,iBAAO,sBAAO,QAAQ,eAAe,QAAW,QAAW,KAAK,SAAS,EAAE;AAAA,IAC5E;AAEA,SAAQ,wBAAwB,CAAC,QAA4B,WAAgB;AAC5E,YAAM,aAAa,OAAO,WAAW,WAAW,SAAS,OAAO;AAChE,YAAM,MAAM,4BAAmB,IAAI,UAAU;AAE7C,YAAM,gBAAgB,CAAC,qBAA0B;AAChD,mBAAW,CAAC,MAAM,EAAE,KAAK,OAAO,QAAQ,OAAO,CAAC,CAAC,GAAG;AACnD,cAAI,iBAAiB,IAAI,GAAG;AAC3B,kBAAM,OAAO,OAAO,KAAK,iBAAiB,IAAI,CAAC;AAC/C,gBAAI,KAAK,SAAS,GAAG;AACpB,oBAAM,IAAI;AAAA,gBACT,wCAAwC,IAAI,OAAO,MAAM,SAAS,KAAK;AAAA,kBACtE,iBAAiB,IAAI;AAAA,kBACrB;AAAA,kBACA;AAAA,gBACD,CAAC;AAAA,cACF;AAAA,YACD;AAEA,6BAAiB,EAAE,IAAI,iBAAiB,IAAI,EAAE,KAAK,CAAC,CAAC;AACrD,mBAAO,iBAAiB,IAAI;AAAA,UAC7B;AAAA,QACD;AAAA,MACD;AAGA,iBAAW,gBAAgB,OAAO,KAAK,MAAM,GAAG;AAC/C,YAAI,sBAAsB,IAAI,YAAY,GAAG;AAC5C,cAAI,MAAM,QAAQ,OAAO,YAAY,CAAC,GAAG;AACxC,uBAAW,SAAS,OAAO,YAAY,GAAG;AACzC,4BAAc,KAAK;AAAA,YACpB;AAAA,UACD,OAAO;AACN,0BAAc,OAAO,YAAY,CAAC;AAAA,UACnC;AAAA,QACD;AAAA,MACD;AAEA,oBAAc,MAAM;AAGpB,YAAM,EAAE,WAAW,IAAI,KAAK,SAAS,GAAG,YAAY,EAAE,IAAI,UAAU;AACpE,aAAO,OAAO,UAAU,EACtB,OAAO,CAAC,aAAa,OAAO,SAAS,WAAW,eAAe,OAAO,SAAS,IAAI,CAAC,EACpF,QAAQ,CAAC,aAAa;AACtB,YAAI,MAAM,QAAQ,OAAO,SAAS,IAAI,CAAC,GAAG;AACzC,iBAAO,SAAS,IAAI,EAAE;AAAA,YAAQ,CAAC,UAC9B,KAAK,sBAAsB,SAAS,MAAM,KAAK;AAAA,UAChD;AAAA,QACD,OAAO;AACN,iBAAO,SAAS,IAAI,IAAI,KAAK,sBAAsB,SAAS,MAAM,OAAO,SAAS,IAAI,CAAC;AAAA,QACxF;AAAA,MACD,CAAC;AAEF,aAAO;AAAA,IACR;AAGA;AAAA,SAAO,uBAAuB,CAAC,YAAoB,iBAAsB,iBAAiB,OAAO;AAChG,YAAM,EAAE,WAAW,IAAI,KAAK,SAAS,GAAG,YAAY,EAAE,IAAI,UAAU;AACpE,YAAM,iBAAiB,iBAAiB,oBAAI,IAAY,CAAC,cAAc,CAAC,IAAI,oBAAI,IAAY,CAAC,CAAC;AAE9F,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,mBAAmB,CAAC,CAAC,GAAG;AACjE;AAAA;AAAA,UAEC,WAAW,GAAG,GAAG,SAAS,uBAAc,cACxC,WAAW,GAAG,GAAG,SAAS,uBAAc,eACxC,WAAW,GAAG,GAAG,SAAS,uBAAc,eACxC,WAAW,GAAG,GAAG,SAAS,uBAAc;AAAA,UACvC;AACD,cAAI,MAAM,QAAQ,KAAK,GAAG;AAEzB,2BAAe,IAAI,WAAW,gBAAgB,GAAG,CAAC;AAElD,uBAAW,SAAS,OAAO;AAE1B,oBAAM,WAAW,KAAK;AAAA,gBACrB,WAAW,GAAG,EAAE;AAAA,gBAChB;AAAA,gBACA,WAAW,gBAAgB,GAAG;AAAA,cAC/B;AACA,uBAAS,QAAQ,CAAC,SAAS,eAAe,IAAI,IAAI,CAAC;AAAA,YACpD;AAAA,UACD,WAAW,OAAO,UAAU,UAAU;AAErC,kBAAM,WAAW,KAAK;AAAA,cACrB,WAAW,GAAG,EAAE;AAAA,cAChB;AAAA,cACA,WAAW,gBAAgB,GAAG;AAAA,YAC/B;AACA,qBAAS,QAAQ,CAAC,SAAS,eAAe,IAAI,IAAI,CAAC;AAAA,UACpD;AAAA,QACD;AAAA,MACD;AAEA,aAAO;AAAA,IACR;AA3KC,UAAM,UACL,OAAO,4BAA4B,WAChC,0BACA;AAAA,MACA,2BAA2B;AAAA,IAC5B;AAEH,SAAK,aAAa;AAClB,SAAK,sBAAsB,WAAW;AACtC,SAAK,aAAa,aAAa,WAAW,uBAAuB,EAAE;AACnE,SAAK,4BACJ,QAAQ,6BAA6B,wBAAe;AACrD,SAAK,qBAAqB,QAAQ;AAClC,SAAK,aAAa;AAClB,SAAK,kBAAkB;AACvB,SAAK,kBAAkB;AAAA,EACxB;AAAA,EAzDA,IAAI,YAAY;AACf,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,IAAY,WAAW;AAEtB,QAAI,CAAC,KAAK,oBAAqB,QAAO,2BAAkB;AACxD,WAAO,2BAAkB,SAAS,KAAK,mBAAmB,KAAK,2BAAkB;AAAA,EAClF;AAAA;AAAA,EAGA,IAAW,gBAAgB;AAC1B,WAAO,KAAK,SAAS;AAAA,EACtB;AAAA,EAEA,MAAa,gBAAmB,UAA4B;AAC3D,WAAO,KAAK,SAAS,cAAiB,UAAU,KAAK,yBAAyB;AAAA,EAC/E;AAAA;AAAA,EAGA,IAAW,KAAK;AACf,WAAO,KAAK,SAAS;AAAA,EACtB;AAAA,EAoCQ,YAA0B;AACjC,UAAM,SAAS,KAAK,GAAG,UAAU,EAAE,YAAY;AAG/C,YAAQ,QAAQ;AAAA,MACf,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR;AACC,cAAM,IAAI,MAAM,gBAAgB,MAAM,qBAAqB;AAAA,IAC7D;AAAA,EACD;AAAA,EA6IA,MAAa,KACZ,QACA,YACA,gBACA,OACe;AAEf,WAAO,KAAK,WAAW,oBAAoB,KAAK,WAAW,IAAI,EAAE;AAEjE,yBAAO;AAAA,MACN,EAAE,YAAQ,uCAAyB,MAAM,GAAG,QAAQ,KAAK,WAAW,KAAK;AAAA,MACzE;AAAA,IACD;AAIA,UAAM,YAAQ,8BAAU,CAACA,WAAyB;AACjD,MAAAA,QAAO,KAAK,WAAW,oCAAoC;AAC3D,aAAO,SAAS,WAAW,KAAK,MAAM,KAAK,UAAU,MAAM,CAAC,GAAG,KAAK,UAAU,CAAC,IAAI;AAAA,IACpF,CAAC,EAAE;AAKH,UAAM,mCAAmC,QACtC,KAAK,sBAAsB,KAAK,YAAY,KAAK,IACjD,CAAC;AAIJ,UAAM,QAAQ,KAAK,GAAG,mBAAmB,KAAK,UAAU;AACxD,QAAI,OAAO,KAAK,gCAAgC,EAAE,SAAS,GAAG;AAC7D,YAAM,SAAS,gCAAgC;AAAA,IAChD;AAGA,QAAI,YAAY,MAAO,OAAM,MAAM,WAAW,KAAK;AACnD,QAAI,YAAY,OAAQ,OAAM,OAAO,WAAW,MAAM;AACtD,QAAI,YAAY,QAAS,OAAM,QAAQ,EAAE,GAAG,WAAW,QAAQ,CAAC;AAKhE,UAAM,QAAQ,mBAAU,QAAQ;AAIhC,UAAM,SAAS,KAAK,SAAS,GAAG,UAAU;AAC1C,UAAM,OAAO,KAAK,SAAS,GAAG,YAAY,EAAE,IAAI,KAAK,WAAW,IAAI;AACpE,UAAM,SAAU,OAAe,sBAAsB,MAAM,CAAC,CAAC,CAAC;AAE9D,QAAI;AACH,YAAM,SAAS,UAAM,mBAAAC,OAAW,OAAOD,WAAyB;AAC/D,QAAAA,QAAO,KAAK,WAAW,wBAAwB;AAC/C,eAAO,MAAM,UAAU;AAAA,MACxB,CAAC,EAAE;AAEH,2BAAO,MAAM,QAAQ,KAAK,WAAW,IAAI,YAAY,OAAO,MAAM,OAAO;AAEzE,aAAO;AAAA,IACR,SAAS,KAAK;AACb,2BAAO,MAAM,QAAQ,KAAK,WAAW,IAAI,WAAW,KAAK,UAAU,GAAG,CAAC,EAAE;AAEzE,UAAK,KAAuB,YAAY,2BAA2B;AAElE,cAAM,IAAI;AAAA,UACT;AAAA,QACD;AAAA,MACD,WAAY,KAAuB,SAAS,gBAAgB;AAE3D,cAAM,IAAI;AAAA,UACT;AAAA,QACD;AAAA,MACD,OAAO;AACN,cAAM;AAAA,MACP;AAAA,IACD;AAAA,EACD;AAAA,EAGA,MAAa,QACZ,QACA,gBACA,OACoB;AACpB,WAAO,KAAK,WAAW,uBAAuB,KAAK,WAAW,IAAI,EAAE;AACpE,yBAAO;AAAA,MACN,EAAE,QAAQ,KAAK,WAAW,MAAM,YAAQ,uCAAyB,MAAM,EAAE;AAAA,MACzE;AAAA,IACD;AAEA,UAAM,WAAW,KAAK,GAAG,YAAY,EAAE,IAAI,KAAK,WAAW,IAAI;AAC/D,QAAI,kBAAkB,SAAS,YAAY,CAAC;AAE5C,QAAI,CAAC,mBAAmB,gBAAgB;AAIvC,wBAAkB,uCAAoB,yBAAyB,cAAc;AAAA,IAC9E;AAEA,QAAI,CAAC,mBAAmB,SAAS,YAAY,SAAS,GAAG;AACxD,YAAM,IAAI;AAAA,QACT,UAAU,KAAK,WAAW,IAAI,QAAQ,SAAS,YAAY,MAAM;AAAA,MAClE;AAAA,IACD;AAEA,UAAM,CAAC,MAAM,IAAI,MAAM,KAAK,KAAK,QAAQ;AAAA,MACxC,SAAS,EAAE,CAAC,eAAe,GAAG,wBAAK,KAAK;AAAA,MACxC,QAAQ;AAAA,MACR,OAAO;AAAA,IACR,CAAC;AAED,yBAAO,MAAM,EAAE,QAAQ,QAAQ,KAAK,WAAW,KAAK,GAAG,gBAAgB;AAEvE,WAAO;AAAA,EACR;AAAA,EAGA,MAAa,gBACZ,QACA,cACA,iBACA,QACA,OACe;AACf,WAAO,KAAK,WAAW,+BAA+B,KAAK,WAAW,IAAI,EAAE;AAC5E,yBAAO;AAAA,MACN;AAAA,QACC,QAAQ,KAAK,WAAW;AAAA,QACxB;AAAA,QACA;AAAA,QACA,YAAQ,uCAAyB,MAAM;AAAA,MACxC;AAAA,MACA;AAAA,IACD;AAGA,QAAI,cAAmB,EAAE,CAAC,YAAY,GAAG,EAAE,KAAK,gBAAgB,EAAE;AAElE,QAAI,QAAQ;AAEX,YAAM,mBAAmB,KAAK,MAAM,KAAK,UAAU,CAAC,WAAW,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC;AAE1F,oBAAc,EAAE,MAAM,CAAC,aAAa,GAAG,gBAAgB,EAAE;AAAA,IAC1D;AAEA,UAAM,WAAW,CAAC,YAAqD;AACvE,UAAM,SAAS,MAAM,KAAK,SAAS,GAAG,KAAK,QAAQ,aAAa;AAAA;AAAA,MAE/D,OAAO,CAAC,mBAAU,QAAQ;AAAA;AAAA,MAG1B;AAAA;AAAA,MAGA,UAAU,yBAAa;AAAA;AAAA,MAGvB,eAAe,yBAAa;AAAA,IAC7B,CAAC;AAED,WAAO;AAAA,EACR;AAAA,EAGA,MAAa,UACZ,IACA,YACA,OACa;AACb,WAAO,KAAK,WAAW,yBAAyB,KAAK,WAAW,IAAI,EAAE;AAEtE,yBAAO;AAAA,MACN;AAAA,QACC;AAAA,QACA,gBAAY,uCAAyB,UAAU;AAAA,QAC/C,QAAQ,KAAK,WAAW;AAAA,MACzB;AAAA,MACA;AAAA,IACD;AAEA,UAAM,SAAS,MAAM,KAAK,SAAS,GAAG,QAAQ,KAAK,YAAY,IAAI;AAAA;AAAA,MAElE,UAAU,CAAC,GAAG,KAAK,qBAAqB,KAAK,WAAW,MAAM,UAAU,CAAC;AAAA,IAC1E,CAAC;AAED,QAAI,WAAW,MAAM;AACpB,YAAM,IAAI,MAAM,oBAAoB,KAAK,WAAW,IAAI,cAAc,EAAE,iBAAiB;AAAA,IAC1F;AAEA,UAAM,EAAE,SAAS,GAAG,yBAAyB,IAAI;AAGjD,QAAI,SAAS;AACZ,UAAI;AACH,cAAM,KAAK,SAAS,GAAG,KAAK,QAAQ,kBAAS,YAAY,OAAO;AAAA,MACjE,SAAS,KAAK;AACb,cAAM,IAAI,iCAAqB,KAAe,SAAS,EAAE,OAAO,CAAC;AAAA,MAClE;AAAA,IACD;AAMA,UAAM,OAAO,KAAK,SAAS,GAAG,YAAY,EAAE,IAAI,KAAK,WAAW,IAAI;AACpE,eAAW,OAAO,KAAK,aAAa;AACnC,UAAI,KAAK,WAAW,GAAG,EAAE,cAAe,QAAQ,yBAAiC,GAAG;AAAA,IACrF;AAEA,UAAM,KAAK,iBAAiB,QAAQ,KAAK,YAAY,wBAAsC;AAC3F,UAAM,KAAK,SAAS,GAAG,gBAAgB,MAAM;AAE7C,yBAAO,MAAM,UAAU,KAAK,WAAW,IAAI,WAAW,MAAM;AAE5D,WAAO;AAAA,EACR;AAAA,EAGA,MAAa,WACZ,aACA,OACe;AACf,WAAO,KAAK,WAAW,0BAA0B,KAAK,WAAW,IAAI,EAAE;AACvE,yBAAO;AAAA,MACN,EAAE,iBAAa,uCAAyB,WAAW,GAAG,QAAQ,KAAK,WAAW,KAAK;AAAA,MACnF;AAAA,IACD;AAEA,UAAM,OAAO,KAAK,SAAS,GAAG,YAAY,EAAE,IAAI,KAAK,WAAW,IAAI;AAEpE,UAAM,WAAW,MAAM,KAAK,SAAS,cAAmB,YAAY;AACnE,aAAO,QAAQ;AAAA,QACd,YAAY,IAAI,OAAO,SAAS;AAC/B,cAAI,CAAC,MAAM,GAAI,OAAM,IAAI,MAAM,mDAAmD;AAGlF,gBAAM,SAAS,MAAM,KAAK,SAAS,GAAG,cAAc,KAAK,YAAY,KAAK,IAAI;AAAA,YAC7E,UAAU,CAAC,GAAG,KAAK,qBAAqB,KAAK,WAAW,MAAM,IAAI,CAAC;AAAA,UACpE,CAAC;AAMD,qBAAW,OAAO,KAAK,aAAa;AACnC,gBAAI,KAAK,WAAW,GAAG,EAAE,cAAe,QAAQ,KAAa,GAAG;AAAA,UACjE;AAEA,gBAAM,KAAK,iBAAiB,QAAQ,KAAK,YAAY,IAAI;AACzD,eAAK,SAAS,GAAG,QAAQ,MAAM;AAC/B,iBAAO;AAAA,QACR,CAAC;AAAA,MACF;AAAA,IACD,CAAC;AAED,yBAAO,MAAM,EAAE,QAAQ,KAAK,WAAW,MAAM,SAAS,GAAG,eAAe;AAExE,WAAO;AAAA,EACR;AAAA,EAGA,MAAa,mBAAmB,OAAqB,OAAoC;AACxF,WAAO,KAAK,WAAW,kCAAkC,KAAK,WAAW,IAAI,EAAE;AAC/E,yBAAO;AAAA,MACN,EAAE,WAAO,uCAAyB,KAAK,GAAG,QAAQ,KAAK,WAAW,KAAK;AAAA,MACvE;AAAA,IACD;AAEA,UAAM,WAAW,MAAM,KAAK,SAAS,cAAmB,YAAY;AACnE,aAAO,QAAQ;AAAA,QACd,MAAM,IAAI,OAAO,SAAS;AACzB,cAAI;AACJ,gBAAM,EAAE,GAAG,IAAI;AACf,cAAI,IAAI;AACP,qBAAS,MAAM,KAAK,SAAS,GAAG,cAAc,KAAK,YAAY,IAAI;AAAA,cAClE,UAAU;AAAA,gBACT,GAAG,KAAK,qBAAqB,KAAK,WAAW,MAAM,IAAI;AAAA,cACxD;AAAA,YACD,CAAC;AACD,iCAAO,MAAM,EAAE,MAAM,QAAQ,KAAK,WAAW,KAAK,GAAG,0BAA0B;AAC/E,kBAAM,KAAK,iBAAiB,QAAQ,KAAK,YAAY,IAAI;AAAA,UAC1D,OAAO;AACN,qBAAS,IAAI,KAAK,WAAW;AAC7B,kBAAM,KAAK,iBAAiB,QAAQ,KAAK,YAAY,IAAI;AACzD,iCAAO,MAAM,EAAE,MAAM,QAAQ,KAAK,WAAW,KAAK,GAAG,0BAA0B;AAAA,UAChF;AACA,eAAK,SAAS,GAAG,QAAQ,MAAM;AAC/B,iBAAO;AAAA,QACR,CAAC;AAAA,MACF;AAAA,IACD,CAAC;AAED,yBAAO;AAAA,MACN,EAAE,QAAQ,KAAK,WAAW,MAAM,cAAU,uCAAyB,QAAQ,EAAE;AAAA,MAC7E;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA,EAGA,MAAa,UAAU,YAAwB,OAAkC;AAChF,WAAO,KAAK,WAAW,yBAAyB,KAAK,WAAW,IAAI,EAAE;AACtE,yBAAO;AAAA,MACN,EAAE,gBAAY,uCAAyB,UAAU,GAAG,QAAQ,KAAK,WAAW,KAAK;AAAA,MACjF;AAAA,IACD;AAEA,UAAM,SAAS,IAAI,KAAK,WAAW;AACnC,UAAM,KAAK,iBAAiB,QAAQ,KAAK,YAAY,UAAU;AAC/D,UAAM,KAAK,SAAS,GAAG,gBAAgB,MAAoB;AAE3D,yBAAO;AAAA,MACN,EAAE,QAAQ,KAAK,WAAW,MAAM,YAAQ,uCAAyB,MAAM,EAAE;AAAA,MACzE;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA,EAGA,MAAa,WAAW,aAA2B,OAAoC;AACtF,WAAO,KAAK,WAAW,0BAA0B,KAAK,WAAW,IAAI,EAAE;AACvE,WAAO,KAAK,YAAY,WAAW;AAAA,EACpC;AAAA,EAEA,MAAa,aAAa,aAAyC;AAClE,WAAO,KAAK,YAAY,WAAW;AAAA,EACpC;AAAA,EAEA,MAAc,YAAY,aAA2B;AACpD,yBAAO;AAAA,MACN,EAAE,iBAAa,uCAAyB,WAAW,GAAG,QAAQ,KAAK,WAAW,KAAK;AAAA,MACnF;AAAA,IACD;AAEA,UAAM,WAAW,MAAM,KAAK,SAAS,cAAmB,YAAY;AACnE,aAAO,QAAQ;AAAA,QACd,YAAY,IAAI,OAAO,SAAS;AAC/B,gBAAM,SAAS,IAAI,KAAK,WAAW;AACnC,gBAAM,KAAK,iBAAiB,QAAQ,KAAK,YAAY,IAAI;AACzD,eAAK,SAAS,GAAG,QAAQ,MAAoB;AAC7C,iBAAO;AAAA,QACR,CAAC;AAAA,MACF;AAAA,IACD,CAAC;AAED,yBAAO,MAAM,EAAE,QAAQ,KAAK,WAAW,MAAM,SAAS,GAAG,eAAe;AAExE,WAAO;AAAA,EACR;AAAA,EAGA,MAAa,UAAU,QAAmB,OAAwC;AACjF,WAAO,KAAK,WAAW,yBAAyB,KAAK,WAAW,IAAI,EAAE;AACtE,yBAAO;AAAA,MACN,EAAE,YAAQ,uCAAyB,MAAM,GAAG,QAAQ,KAAK,WAAW,KAAK;AAAA,MACzE;AAAA,IACD;AACA,UAAM,QAAQ,SACX,WAAW,KAAK,MAAM,KAAK,UAAU,MAAM,CAAC,GAAG,KAAK,UAAU,CAAC,IAC/D;AACH,UAAM,mCACL,SAAS,KAAK,sBAAsB,KAAK,YAAY,KAAK;AAE3D,UAAM,cAAc,MAAM,KAAK,SAAS,GAAG;AAAA,MAC1C,KAAK;AAAA,MACL;AAAA,IACD;AAEA,QAAI,cAAc,GAAG;AACpB,YAAM,IAAI,MAAM,uBAAuB;AAAA,IACxC;AAEA,yBAAO,MAAM,UAAU,KAAK,WAAW,IAAI,oBAAoB,WAAW,SAAS;AAEnF,WAAO,gBAAgB;AAAA,EACxB;AAAA,EAGA,MAAa,WAAW,QAAmB,OAAwC;AAClF,WAAO,KAAK,WAAW,0BAA0B,KAAK,WAAW,IAAI,EAAE;AACvE,yBAAO;AAAA,MACN,EAAE,YAAQ,uCAAyB,MAAM,GAAG,QAAQ,KAAK,WAAW,KAAK;AAAA,MACzE;AAAA,IACD;AAEA,UAAM,cAAc,MAAM,KAAK,SAAS,cAAsB,YAAY;AACzE,YAAM,QAAQ,SACX,WAAW,KAAK,MAAM,KAAK,UAAU,MAAM,CAAC,GAAG,KAAK,UAAU,CAAC,IAC/D;AACH,YAAM,mCACL,SAAS,KAAK,sBAAsB,KAAK,YAAY,KAAK;AAE3D,YAAM,WAAW,MAAM,KAAK,SAAS,GAAG;AAAA,QACvC,KAAK;AAAA,QACL;AAAA,MACD;AACA,YAAM,eAAe,MAAM,KAAK,SAAS,GAAG;AAAA,QAC3C,KAAK;AAAA,QACL;AAAA,MACD;AAEA,UAAI,iBAAiB,UAAU;AAC9B,cAAM,IAAI,MAAM,2CAA2C;AAAA,MAC5D;AAEA,aAAO;AAAA,IACR,CAAC;AAED,yBAAO,MAAM,UAAU,KAAK,WAAW,IAAI,oBAAoB,WAAW,SAAS;AAEnF,WAAO;AAAA,EACR;AAAA,EAEO,+BAAgC,OAAsB,YAAe;AAC3E,UAAM,QAAQ,WAAW,MAAM,IAAe;AAE9C,QAAI,sBAAU,YAAY,KAAK,GAAG;AACjC,YAAM,EAAE,WAAW,IAAI,KAAK,SAAS,GAAG,YAAY,EAAE,IAAI,KAAK,UAAU;AACzE,YAAM,WAAW,WAAW,MAAM,IAAI;AACtC,YAAM,CAAC,UAAU,IAAI,SAAS,YAAY,eAAe,CAAC;AAC1D,UAAI,CAAC,YAAY;AAChB,cAAM,IAAI;AAAA,UACT,uCAAuC,MAAM,IAAI,OAAO,KAAK,WAAW,IAAI;AAAA,QAC7E;AAAA,MACD;AAEA,YAAM,aAAc,MAAM,OAAO,EAAU,UAAU;AACrD,UAAI,eAAe,UAAa,eAAe,MAAM;AACpD,cAAM,IAAI;AAAA,UACT,8CAA8C,MAAM,OAAO,CAAC,0BAA0B,UAAU;AAAA,QACjG;AAAA,MACD;AAEA,aAAO;AAAA,IACR;AAEA,WAAO;AAAA,EACR;AAAA,EAGA,MAAa,UACZ,QACA,uBACA,OAC6B;AAC7B,WAAO,KAAK,WAAW,yBAAyB,KAAK,WAAW,IAAI,EAAE;AACtE,yBAAO;AAAA,MACN,EAAE,YAAQ,uCAAyB,MAAM,GAAG,QAAQ,KAAK,WAAW,KAAK;AAAA,MACzE;AAAA,IACD;AAUA,UAAM,QAAQ,SACX,WAAW,KAAK,MAAM,KAAK,UAAU,MAAM,CAAC,GAAG,KAAK,UAAU,CAAC,IAC/D;AAKH,UAAM,mCAAmC,QACtC,KAAK,sBAAsB,KAAK,YAAY,KAAK,IACjD,CAAC;AAIJ,UAAM,QAAQ,KAAK,GAAG,mBAAmB,KAAK,UAAU;AAExD,QAAI,OAAO,KAAK,gCAAgC,EAAE,SAAS,GAAG;AAC7D,YAAM,SAAS,gCAAgC;AAAA,IAChD;AAEA,UAAM,SAA4B,CAAC;AAEnC,QAAI;AACH,UAAI,sBAAsB,IAAI,mCAAgB,KAAK,GAAG;AACrD,cAAM,OAAO,KAAK,SAAS,GAAG,YAAY,EAAE,IAAI,KAAK,WAAW,IAAI;AACpE,YAAI,KAAK,YAAY,QAAQ;AAG5B,iBAAO,QAAQ,MAAM,MAAM,SAAS,KAAK,aAAa,IAAI;AAAA,QAC3D,OAAO;AAGN,gBAAM,CAAC,QAAQ,IAAI,MAAM,MAAM,OAAO,0BAAc,GAAG,OAAO,CAAC,EAAE,QAAQ;AACzE,iBAAO,QAAQ,SAAS;AAAA,QACzB;AAAA,MACD;AAAA,IACD,SAAS,KAAK;AACb,2BAAO,MAAM,QAAQ,KAAK,WAAW,IAAI,WAAW,KAAK,UAAU,GAAG,CAAC,EAAE;AAEzE,UAAK,KAAuB,YAAY,2BAA2B;AAElE,cAAM,IAAI;AAAA,UACT;AAAA,QACD;AAAA,MACD,WAAY,KAAuB,SAAS,gBAAgB;AAE3D,cAAM,IAAI;AAAA,UACT;AAAA,QACD;AAAA,MACD,OAAO;AACN,cAAM;AAAA,MACP;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AACD;AAtgBc;AAAA,MADZ,gCAAY;AAAA,GA/OD,qBAgPC;AAgFA;AAAA,MADZ,gCAAY;AAAA,GA/TD,qBAgUC;AAuCA;AAAA,MADZ,gCAAY;AAAA,GAtWD,qBAuWC;AA+CA;AAAA,MADZ,gCAAY;AAAA,GArZD,qBAsZC;AAsDA;AAAA,MADZ,gCAAY;AAAA,GA3cD,qBA4cC;AA2CA;AAAA,MADZ,gCAAY;AAAA,GAtfD,qBAufC;AAwCA;AAAA,MADZ,gCAAY;AAAA,GA9hBD,qBA+hBC;AAoBA;AAAA,MADZ,gCAAY;AAAA,GAljBD,qBAmjBC;AAgCA;AAAA,MADZ,gCAAY;AAAA,GAllBD,qBAmlBC;AA2BA;AAAA,MADZ,gCAAY;AAAA,GA7mBD,qBA8mBC;AA8DA;AAAA,MADZ,gCAAY;AAAA,GA3qBD,qBA4qBC;",
6
6
  "names": ["trace", "startTrace"]
7
7
  }
@@ -1,4 +1,5 @@
1
1
  export * from './authentication-context';
2
2
  export * from './errors';
3
+ export * from './logging';
3
4
  export * from './tracked-entity';
4
5
  export * from './untracked-property';
@@ -17,12 +17,14 @@ var utils_exports = {};
17
17
  module.exports = __toCommonJS(utils_exports);
18
18
  __reExport(utils_exports, require("./authentication-context"), module.exports);
19
19
  __reExport(utils_exports, require("./errors"), module.exports);
20
+ __reExport(utils_exports, require("./logging"), module.exports);
20
21
  __reExport(utils_exports, require("./tracked-entity"), module.exports);
21
22
  __reExport(utils_exports, require("./untracked-property"), module.exports);
22
23
  // Annotate the CommonJS export names for ESM import in node:
23
24
  0 && (module.exports = {
24
25
  ...require("./authentication-context"),
25
26
  ...require("./errors"),
27
+ ...require("./logging"),
26
28
  ...require("./tracked-entity"),
27
29
  ...require("./untracked-property")
28
30
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/index.ts"],
4
- "sourcesContent": ["export * from './authentication-context';\nexport * from './errors';\nexport * from './tracked-entity';\nexport * from './untracked-property';\n"],
5
- "mappings": ";;;;;;;;;;;;;;;AAAA;AAAA;AAAA,0BAAc,qCAAd;AACA,0BAAc,qBADd;AAEA,0BAAc,6BAFd;AAGA,0BAAc,iCAHd;",
4
+ "sourcesContent": ["export * from './authentication-context';\nexport * from './errors';\nexport * from './logging';\nexport * from './tracked-entity';\nexport * from './untracked-property';\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;AAAA;AAAA;AAAA,0BAAc,qCAAd;AACA,0BAAc,qBADd;AAEA,0BAAc,sBAFd;AAGA,0BAAc,6BAHd;AAIA,0BAAc,iCAJd;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1 @@
1
+ export declare const sanitiseFilterForLogging: (filter: any, visited?: WeakSet<object>) => any;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var logging_exports = {};
20
+ __export(logging_exports, {
21
+ sanitiseFilterForLogging: () => sanitiseFilterForLogging
22
+ });
23
+ module.exports = __toCommonJS(logging_exports);
24
+ const SENSITIVE_KEYS = /* @__PURE__ */ new Set(["token", "password", "secret", "accessToken", "refreshToken"]);
25
+ const sanitiseFilterForLogging = (filter, visited = /* @__PURE__ */ new WeakSet()) => {
26
+ if (filter == null || typeof filter !== "object") return filter;
27
+ if (visited.has(filter)) {
28
+ return "[Circular Reference]";
29
+ }
30
+ visited.add(filter);
31
+ if (Array.isArray(filter)) {
32
+ return filter.map((item) => sanitiseFilterForLogging(item, visited));
33
+ }
34
+ const sanitised = {};
35
+ for (const key of Object.keys(filter)) {
36
+ if (SENSITIVE_KEYS.has(key)) {
37
+ sanitised[key] = "[REDACTED]";
38
+ } else if (filter[key] && typeof filter[key] === "object") {
39
+ sanitised[key] = sanitiseFilterForLogging(filter[key], visited);
40
+ } else {
41
+ sanitised[key] = filter[key];
42
+ }
43
+ }
44
+ return sanitised;
45
+ };
46
+ // Annotate the CommonJS export names for ESM import in node:
47
+ 0 && (module.exports = {
48
+ sanitiseFilterForLogging
49
+ });
50
+ //# sourceMappingURL=logging.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/logging.ts"],
4
+ "sourcesContent": ["const SENSITIVE_KEYS = new Set(['token', 'password', 'secret', 'accessToken', 'refreshToken']);\n\nexport const sanitiseFilterForLogging = (\n\tfilter: any,\n\tvisited: WeakSet<object> = new WeakSet()\n): any => {\n\tif (filter == null || typeof filter !== 'object') return filter;\n\n\t// Check if we've already processed this object to prevent circular references\n\tif (visited.has(filter)) {\n\t\treturn '[Circular Reference]';\n\t}\n\n\t// Add current object to visited set\n\tvisited.add(filter);\n\n\t// Handle arrays\n\tif (Array.isArray(filter)) {\n\t\treturn filter.map((item) => sanitiseFilterForLogging(item, visited));\n\t}\n\n\t// Object: shallow copy with redaction\n\tconst sanitised: any = {};\n\n\tfor (const key of Object.keys(filter)) {\n\t\tif (SENSITIVE_KEYS.has(key)) {\n\t\t\tsanitised[key] = '[REDACTED]';\n\t\t} else if (filter[key] && typeof filter[key] === 'object') {\n\t\t\tsanitised[key] = sanitiseFilterForLogging(filter[key], visited);\n\t\t} else {\n\t\t\tsanitised[key] = filter[key];\n\t\t}\n\t}\n\n\treturn sanitised;\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAM,iBAAiB,oBAAI,IAAI,CAAC,SAAS,YAAY,UAAU,eAAe,cAAc,CAAC;AAEtF,MAAM,2BAA2B,CACvC,QACA,UAA2B,oBAAI,QAAQ,MAC9B;AACT,MAAI,UAAU,QAAQ,OAAO,WAAW,SAAU,QAAO;AAGzD,MAAI,QAAQ,IAAI,MAAM,GAAG;AACxB,WAAO;AAAA,EACR;AAGA,UAAQ,IAAI,MAAM;AAGlB,MAAI,MAAM,QAAQ,MAAM,GAAG;AAC1B,WAAO,OAAO,IAAI,CAAC,SAAS,yBAAyB,MAAM,OAAO,CAAC;AAAA,EACpE;AAGA,QAAM,YAAiB,CAAC;AAExB,aAAW,OAAO,OAAO,KAAK,MAAM,GAAG;AACtC,QAAI,eAAe,IAAI,GAAG,GAAG;AAC5B,gBAAU,GAAG,IAAI;AAAA,IAClB,WAAW,OAAO,GAAG,KAAK,OAAO,OAAO,GAAG,MAAM,UAAU;AAC1D,gBAAU,GAAG,IAAI,yBAAyB,OAAO,GAAG,GAAG,OAAO;AAAA,IAC/D,OAAO;AACN,gBAAU,GAAG,IAAI,OAAO,GAAG;AAAA,IAC5B;AAAA,EACD;AAEA,SAAO;AACR;",
6
+ "names": []
7
+ }
package/package.json CHANGED
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "name": "@exogee/graphweaver-mikroorm",
3
- "version": "2.19.7",
3
+ "version": "2.19.8",
4
4
  "description": "MikroORM backend for @exogee/graphweaver",
5
5
  "license": "Apache-2.0",
6
+ "sideEffects": false,
6
7
  "main": "lib/index.js",
7
8
  "source": "src/index.ts",
8
9
  "directories": {
@@ -13,15 +14,15 @@
13
14
  ],
14
15
  "dependencies": {
15
16
  "@apollo/server": "4.12.2",
16
- "@aws-sdk/client-secrets-manager": "3.876.0",
17
+ "@aws-sdk/client-secrets-manager": "3.879.0",
17
18
  "dataloader": "2.2.3",
18
19
  "decimal.js": "10.6.0",
19
- "dotenv": "16.4.7",
20
+ "dotenv": "17.2.2",
20
21
  "pluralize": "8.0.0",
21
22
  "reflect-metadata": "0.2.2",
22
- "@exogee/graphweaver": "2.19.7",
23
- "@exogee/graphweaver-server": "2.19.7",
24
- "@exogee/logger": "2.19.7"
23
+ "@exogee/graphweaver-server": "2.19.8",
24
+ "@exogee/graphweaver": "2.19.8",
25
+ "@exogee/logger": "2.19.8"
25
26
  },
26
27
  "peerDependencies": {
27
28
  "@mikro-orm/core": "6",
@@ -56,13 +57,13 @@
56
57
  "@mikro-orm/mysql": "6.4.16",
57
58
  "@mikro-orm/postgresql": "6.4.16",
58
59
  "@mikro-orm/sqlite": "6.4.16",
59
- "@types/node": "22.13.14",
60
+ "@types/node": "24.3.0",
60
61
  "@types/pluralize": "0.0.33",
61
62
  "esbuild": "0.25.9",
62
63
  "glob": "11.0.3",
63
64
  "graphql": "16.11.0",
64
- "tsx": "4.19.3",
65
- "typescript": "5.8.3",
65
+ "tsx": "4.20.5",
66
+ "typescript": "5.9.2",
66
67
  "vitest": "3.2.4"
67
68
  },
68
69
  "keywords": [