hysteria-orm 10.1.7 → 10.1.9

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors/hysteria_error.ts","../src/drivers/driver.ts","../src/drivers/driver_constants.ts","../src/drivers/mongo_driver.ts","../src/drivers/mysql_driver.ts","../src/drivers/pg_driver.ts","../src/drivers/sqlite3_driver.ts","../src/drivers/drivers_factory.ts","../src/sql/sql_connection_utils.ts","../src/utils/logger.ts","../src/cli/resources/migration_templates.ts","../src/cli/drop_all_tables_connector.ts","../src/env/env.ts","../src/cli/migration_create_connector.ts","../src/cli/migration_utils.ts","../src/utils/importer.ts","../src/cli/migration_run_connector.ts","../src/cache/adapters/in_memory.ts","../src/data_source/data_source.ts","../src/openapi/openapi.ts","../src/utils/hash.ts","../src/utils/query.ts","../src/sql/interpreter/mysql/alter_table/add_column.ts","../src/sql/interpreter/mysql/alter_table/add_constraint.ts","../src/sql/interpreter/mysql/alter_table/add_primary_key.ts","../src/sql/interpreter/mysql/alter_table/alter_column_type.ts","../src/utils/case_utils.ts","../src/utils/date_utils.ts","../src/utils/encryption.ts","../src/utils/reflect_metadata.ts","../src/utils/ulid.ts","../src/sql/resources/utils.ts","../src/entity.ts","../src/sql/serializer.ts","../src/sql/sql_runner/sql_runner_constants.ts","../src/sql/models/model_utils.ts","../src/sql/models/model.ts","../src/sql/models/relations/relation.ts","../src/sql/models/relations/belongs_to.ts","../src/sql/models/relations/has_many.ts","../src/sql/models/relations/has_one.ts","../src/sql/models/relations/many_to_many.ts","../src/sql/models/decorators/model_decorators_constants.ts","../src/sql/models/decorators/model_decorators.ts","../src/sql/interpreter/interpreter_utils.ts","../src/sql/interpreter/mysql/alter_table/alter_table.ts","../src/sql/interpreter/mysql/alter_table/drop_column.ts","../src/sql/interpreter/mysql/alter_table/drop_constraint.ts","../src/sql/interpreter/mysql/alter_table/drop_default.ts","../src/sql/interpreter/mysql/alter_table/drop_not_null.ts","../src/sql/interpreter/mysql/alter_table/drop_primary_key.ts","../src/sql/interpreter/mysql/alter_table/rename_column.ts","../src/sql/interpreter/mysql/alter_table/rename_table.ts","../src/sql/interpreter/mysql/alter_table/set_default.ts","../src/sql/interpreter/mysql/alter_table/set_not_null.ts","../src/sql/interpreter/mysql/column/column_type.ts","../src/sql/interpreter/mysql/constraint/after.ts","../src/sql/interpreter/mysql/constraint/constraint.ts","../src/sql/interpreter/mysql/create_table/create_table.ts","../src/sql/interpreter/mysql/delete/delete.ts","../src/sql/interpreter/mysql/distinct/distinct.ts","../src/sql/interpreter/mysql/distinct/distinct_on.ts","../src/sql/interpreter/mysql/drop_table/drop_table.ts","../src/sql/interpreter/mysql/from/from.ts","../src/sql/interpreter/mysql/group_by/group_by.ts","../src/sql/ast/query/query.ts","../src/sql/interpreter/mysql/having/having.ts","../src/sql/interpreter/mysql/index_op/create_index.ts","../src/sql/interpreter/mysql/index_op/drop_index.ts","../src/sql/interpreter/mysql/insert/insert.ts","../src/sql/interpreter/mysql/join/join.ts","../src/sql/interpreter/mysql/limit/limit.ts","../src/sql/interpreter/mysql/lock/lock.ts","../src/sql/interpreter/mysql/offset/offset.ts","../src/sql/interpreter/mysql/on_duplicate/on_duplicate.ts","../src/sql/interpreter/mysql/order_by/order_by.ts","../src/sql/interpreter/mysql/raw/raw.ts","../src/sql/interpreter/mysql/schema/foreign_key_info.ts","../src/sql/interpreter/mysql/schema/index_info.ts","../src/sql/interpreter/mysql/schema/primary_key_info.ts","../src/sql/interpreter/mysql/schema/table_info.ts","../src/sql/interpreter/mysql/select/select.ts","../src/sql/interpreter/mysql/truncate/truncate.ts","../src/sql/interpreter/mysql/union/union.ts","../src/sql/ast/query/node/raw/raw_node.ts","../src/sql/interpreter/mysql/update/update.ts","../src/sql/interpreter/mysql/where/where.ts","../src/sql/interpreter/mysql/where/where_group.ts","../src/sql/interpreter/mysql/where/where_json.ts","../src/sql/interpreter/mysql/where/where_subquery.ts","../src/sql/interpreter/mysql/with/with.ts","../src/sql/interpreter/postgres/alter_table/add_column.ts","../src/sql/interpreter/postgres/alter_table/add_constraint.ts","../src/sql/interpreter/postgres/alter_table/add_primary_key.ts","../src/sql/interpreter/postgres/alter_table/alter_column_type.ts","../src/sql/interpreter/postgres/alter_table/alter_table.ts","../src/sql/interpreter/postgres/alter_table/drop_column.ts","../src/sql/interpreter/postgres/alter_table/drop_constraint.ts","../src/sql/interpreter/postgres/alter_table/drop_default.ts","../src/sql/interpreter/postgres/alter_table/drop_not_null.ts","../src/sql/interpreter/postgres/alter_table/drop_primary_key.ts","../src/sql/interpreter/postgres/alter_table/rename_column.ts","../src/sql/interpreter/postgres/alter_table/rename_table.ts","../src/sql/interpreter/postgres/alter_table/set_default.ts","../src/sql/interpreter/postgres/alter_table/set_not_null.ts","../src/sql/interpreter/postgres/column/column_type.ts","../src/sql/interpreter/postgres/constraint/after.ts","../src/sql/interpreter/postgres/constraint/constraint.ts","../src/sql/interpreter/postgres/create_table/create_table.ts","../src/sql/interpreter/postgres/delete/delete.ts","../src/sql/interpreter/postgres/distinct/distinct.ts","../src/sql/interpreter/postgres/distinct/distinct_on.ts","../src/sql/interpreter/postgres/drop_table/drop_table.ts","../src/sql/interpreter/postgres/from/from.ts","../src/sql/interpreter/postgres/group_by/group_by.ts","../src/sql/interpreter/postgres/having/having.ts","../src/sql/interpreter/postgres/index_op/create_index.ts","../src/sql/interpreter/postgres/index_op/drop_index.ts","../src/sql/interpreter/postgres/insert/insert.ts","../src/sql/interpreter/postgres/join/join.ts","../src/sql/interpreter/postgres/limit/limit.ts","../src/sql/interpreter/postgres/lock/lock.ts","../src/sql/interpreter/postgres/offset/offset.ts","../src/sql/interpreter/postgres/on_duplicate/on_duplicate.ts","../src/sql/interpreter/postgres/order_by/order_by.ts","../src/sql/interpreter/postgres/raw/raw.ts","../src/sql/interpreter/postgres/schema/foreign_key_info.ts","../src/sql/interpreter/postgres/schema/index_info.ts","../src/sql/interpreter/postgres/schema/primary_key_info.ts","../src/sql/interpreter/postgres/schema/table_info.ts","../src/sql/interpreter/postgres/select/select.ts","../src/sql/interpreter/postgres/truncate/truncate.ts","../src/sql/interpreter/postgres/union/union.ts","../src/sql/interpreter/postgres/update/update.ts","../src/sql/interpreter/postgres/where/where.ts","../src/sql/interpreter/postgres/where/where_group.ts","../src/sql/interpreter/postgres/where/where_json.ts","../src/sql/interpreter/postgres/where/where_subquery.ts","../src/sql/interpreter/postgres/with/with.ts","../src/sql/interpreter/sqlite/alter_table/add_column.ts","../src/sql/interpreter/sqlite/alter_table/add_constraint.ts","../src/sql/interpreter/sqlite/alter_table/alter_column_type.ts","../src/sql/interpreter/sqlite/alter_table/alter_table.ts","../src/sql/interpreter/sqlite/alter_table/drop_column.ts","../src/sql/interpreter/sqlite/alter_table/drop_constraint.ts","../src/sql/interpreter/sqlite/alter_table/drop_default.ts","../src/sql/interpreter/sqlite/alter_table/drop_not_null.ts","../src/sql/interpreter/sqlite/alter_table/drop_primary_key.ts","../src/sql/interpreter/sqlite/alter_table/rename_column.ts","../src/sql/interpreter/sqlite/alter_table/rename_table.ts","../src/sql/interpreter/sqlite/alter_table/set_default.ts","../src/sql/interpreter/sqlite/alter_table/set_not_null.ts","../src/sql/interpreter/sqlite/column/column_type.ts","../src/sql/interpreter/sqlite/constraint/after.ts","../src/sql/interpreter/sqlite/constraint/constraint.ts","../src/sql/interpreter/sqlite/create_table/create_table.ts","../src/sql/interpreter/sqlite/delete/delete.ts","../src/sql/interpreter/sqlite/distinct/distinct.ts","../src/sql/interpreter/sqlite/distinct/distinct_on.ts","../src/sql/interpreter/sqlite/drop_table/drop_table.ts","../src/sql/interpreter/sqlite/from/from.ts","../src/sql/interpreter/sqlite/group_by/group_by.ts","../src/sql/interpreter/sqlite/having/having.ts","../src/sql/interpreter/sqlite/index_op/create_index.ts","../src/sql/interpreter/sqlite/index_op/drop_index.ts","../src/sql/interpreter/sqlite/insert/insert.ts","../src/sql/interpreter/sqlite/join/join.ts","../src/sql/interpreter/sqlite/limit/limit.ts","../src/sql/interpreter/sqlite/lock/lock.ts","../src/sql/interpreter/sqlite/offset/offset.ts","../src/sql/interpreter/sqlite/on_duplicate/on_duplicate.ts","../src/sql/interpreter/sqlite/order_by/order_by.ts","../src/sql/interpreter/sqlite/raw/raw.ts","../src/sql/interpreter/sqlite/schema/foreign_key_info.ts","../src/sql/interpreter/sqlite/schema/index_info.ts","../src/sql/interpreter/sqlite/schema/primary_key_info.ts","../src/sql/interpreter/sqlite/schema/table_info.ts","../src/sql/interpreter/sqlite/select/select.ts","../src/sql/interpreter/sqlite/truncate/truncate.ts","../src/sql/interpreter/sqlite/union/union.ts","../src/sql/interpreter/sqlite/update/update.ts","../src/sql/interpreter/sqlite/where/where.ts","../src/sql/interpreter/sqlite/where/where_group.ts","../src/sql/interpreter/sqlite/where/where_json.ts","../src/sql/interpreter/sqlite/where/where_subquery.ts","../src/sql/interpreter/sqlite/with/with.ts","../src/sql/ast/interpreter_map.ts","../src/sql/ast/parser.ts","../src/sql/ast/query/node/schema/foreign_key_info.ts","../src/sql/ast/query/node/schema/index_info.ts","../src/sql/ast/query/node/schema/primary_key_info.ts","../src/sql/ast/query/node/schema/table_info.ts","../src/sql/migrations/schema/schema.ts","../src/sql/ast/query/node/alter_table/add_column.ts","../src/sql/ast/query/node/alter_table/add_constraint.ts","../src/sql/ast/query/node/alter_table/add_primary_key.ts","../src/sql/ast/query/node/alter_table/alter_column_type.ts","../src/sql/ast/query/node/alter_table/alter_table.ts","../src/sql/ast/query/node/alter_table/drop_column.ts","../src/sql/ast/query/node/alter_table/drop_constraint.ts","../src/sql/ast/query/node/alter_table/drop_default.ts","../src/sql/ast/query/node/alter_table/drop_not_null.ts","../src/sql/ast/query/node/alter_table/drop_primary_key.ts","../src/sql/ast/query/node/alter_table/rename_column.ts","../src/sql/ast/query/node/alter_table/rename_table.ts","../src/sql/ast/query/node/alter_table/set_default.ts","../src/sql/ast/query/node/alter_table/set_not_null.ts","../src/sql/ast/query/node/constraint/constraint.ts","../src/sql/ast/query/node/create_table/create_table.ts","../src/sql/ast/query/node/drop_table/drop_table.ts","../src/sql/ast/query/node/index_op/create_index.ts","../src/sql/ast/query/node/index_op/drop_index.ts","../src/sql/ast/query/node/truncate/truncate.ts","../src/sql/ast/query/node/column/column_type.ts","../src/sql/ast/query/node/lock/lock.ts","../src/sql/ast/query/node/union/union.ts","../src/sql/ast/query/node/with/with.ts","../src/sql/migrations/schema/base_builder.ts","../src/sql/ast/query/node/constraint/after.ts","../src/sql/migrations/schema/constraint_builder.ts","../src/sql/migrations/schema/create_table.ts","../src/sql/migrations/schema/alter_table.ts","../src/sql/migrations/schema_diff/drop_order_resolver.ts","../src/sql/migrations/schema_diff/migration_operation_generator.ts","../src/sql/migrations/schema_diff/type_normalizer.ts","../src/sql/migrations/schema_diff/schema_diff.ts","../src/sql/ast/query/node/delete/delete.ts","../src/sql/ast/query/node/from/from.ts","../src/sql/ast/query/node/insert/insert.ts","../src/sql/ast/query/node/on_duplicate/on_duplicate.ts","../src/sql/ast/query/node/update/update.ts","../src/sql/ast/query/node/where/where.ts","../src/sql/ast/query/node/where/where_group.ts","../src/sql/ast/query/node/where/where_json.ts","../src/sql/ast/query/node/where/where_subquery.ts","../src/sql/sql_runner/sql_runner.ts","../src/sql/sql_runner/sql_runner_utils.ts","../src/utils/performance.ts","../src/sql/ast/query/node/select/basic_select.ts","../src/sql/models/model_manager/model_manager_utils.ts","../src/sql/pagination.ts","../src/utils/types.ts","../src/sql/ast/query/node/having/having.ts","../src/sql/ast/query/node/distinct/distinct.ts","../src/sql/ast/query/node/distinct/distinct_on.ts","../src/sql/ast/query/node/join/join.ts","../src/sql/ast/query/node/group_by/group_by.ts","../src/sql/ast/query/node/limit/limit.ts","../src/sql/ast/query/node/offset/offset.ts","../src/sql/ast/query/node/order_by/order_by.ts","../src/sql/query_builder/footer_query_builder.ts","../src/sql/query_builder/join_query_builder.ts","../src/sql/query_builder/select_query_builder.ts","../src/sql/query_builder/where_query_builder.ts","../src/sql/query_builder/json_query_builder.ts","../src/sql/query_builder/query_builder.ts","../src/sql/models/model_query_builder/model_query_builder.ts","../src/sql/models/model_query_builder/dry_model_query_builder.ts","../src/sql/models/model_manager/model_manager.ts","../src/sql/query_builder/dry_query_builder.ts","../src/sql/query_builder/query_builder_utils.ts","../src/sql/transactions/transaction.ts","../src/sql/sql_data_source.ts","../src/sql/migrations/migrator.ts","../src/cli/migration_rollback_connector.ts","../src/cli/resources/generate_migration_template.ts","../src/cli/resources/init_templates.ts","../src/cli/run_sql_connector.ts","../src/utils/package.ts","../src/cli.ts"],"names":["HysteriaError","caller","code","error","Driver","driverSpecificOptions","_driverSpecificOptions","DriverNotFoundError","driverName","MongoDriver","_MongoDriver","client","mongo","MysqlDriver","_MysqlDriver","mysql2","PgDriver","_PgDriver","pg","Sqlite3Driver","_Sqlite3Driver","sqlite3","DriverFactory","getDriverConnection","type","createSqlPool","input","driver","mysqlInput","pgInput","pgDriver","sqliteDriver","database","err","colors","getTimestamp","now","pad","n","formatLogMessage","level","message","timestamp","levelUpper","HysteriaLogger","customLogger","formatParams","params","param","log","query","logs","highlight","logMessage","logger_default","MigrationTemplates","dbType","result","row","tables","js","table","migration_templates_default","dropAllTablesConnector","sql","shouldExit","transactional","dbDatabase","fs","details","templates","parsedTables","dropAllTablesTemplate","trx","envBase","fillEnvWithDatabaseEnvs","envVar","key","value","trimmedKey","trimmedValue","env","getOrCreateMigrationPath","migrationPath","currentPath","path","migration_create_connector_default","name","mode","migrationFolderPath","migrationFileName","migrationFilePath","migrationTemplate","importTsUniversal","entry","tsconfigPath","filepath","mod","bundleRequire","importMigrationFile","filePath","pathToFileURL","require","createRequire","module","getMigrationTable","sqlConnection","mysqlConnection","pgConnection","promisifySqliteQuery","getMigrations","migrationNames","findMigrationNames","migrations","migrationName","migrationModule","findMigrationModule","migration","loadMigrationModule","pathToFile","migrationModulePath","join","inputMigrationPath","currentUserDirectory","fullPathToMigrationPath","migrationFiles","file","ext","fullFilePath","sqLiteConnection","resolve","reject","results","runMigrationsConnector","runUntil","migrationTable","pendingMigrations","runUntilIndex","filteredMigrations","Migrator","migrator","inMemoryCache","InMemoryAdapter","data","ttl","DataSource","detectColumnType","column","required","rest","baseType","isColumnRequired","generateColumnProperties","model","columns","properties","getRequiredFields","generateModelSchema","generateOpenApiModelWithMetadata","models","hashString","salt","hashInstance","crypto","valueToHash","getSqlDialect","sqlType","formatParam","bindParamsIntoQuery","i","pgPlaceholder","isTableMissingError","formatQuery","formattedQuery","format","MysqlAddColumnInterpreter","node","acNode","ast","AstParser","inlineConstraints","constraintParts","constraint","constraintSql","add_column_default","MysqlAddConstraintInterpreter","add_constraint_default","MysqlAddPrimaryKeyInterpreter","c","add_primary_key_default","MysqlAlterColumnTypeInterpreter","a","typeSql","resultSql","nullableSql","defaultValue","alter_column_type_default","toSnake","str","toCamel","group","convertCase","to","x","dayjs","utc","timezone","customParseFormat","getDate","date","d","localDate","utcDate","parseDate","parsed","baseSoftDeleteDate","encryptSymmetric","keyBuffer","iv","cipher","encrypted","decryptSymmetric","ivHex","decipher","decrypted","encryptAsymmetric","publicKey","symmetricKey","encryptedData","encryptedKey","publicEncrypt","decryptAsymmetric","privateKey","encryptedKeyHex","privateDecrypt","Reflect","metadataKey","metadataValue","target","propertyKey","propStore","metaMap","current","ENCODING","ENCODING_LEN","TIME_LEN","RANDOM_LEN","encodeTime","length","encodeRandom","bytes","randomBytes","randomByte","generateULID","time","random","stripIdentifierQuotes","identifier","remapSelectedColumnToFromAlias","fromAlias","modelTable","cleanCol","col","getColumnValue","deepCloneNode","val","seen","arr","out","v","Entity","parseDatabaseDataIntoModelResponse","typeofModel","modelColumns","modelColumnsMap","modelSelectedColumns","modelAnnotatedColumns","mustRemoveAnnotations","casedModel","hiddenColumnsSet","databaseColumnsMap","modelColumn","modelSelectedColumnsSet","databaseValue","modelKey","processAnnotations","annotationsData","modelAnnotatedColumnsSet","$annotations","objKey","serializeModel","processedSelectedColumns","databaseColumn","processedColumn","columnName","serializedModels","databasesWithReturning","getBaseTableName","className","snakeCaseName","plural","getBaseModelInstance","_Model","descriptor","getPrimaryKey","options","findOptions","findOneOptions","modelManager","primaryKey","primaryKeyValue","refreshedModel","modelData","modelsData","relation","leftModel","rightModels","joinTableCustomData","m2mRelation","getRelations","r","casedLeftForeignKey","casedRightForeignKey","joinTableModelsToInsert","rightModel","index","ThroughModel","modelSqlInstance","updatePayload","searchCriteria","createData","doesExist","newModel","conflictColumns","record","recordKeys","columnsToUpdate","upsertResult","lookupQuery","conflictMap","softDeleteOptions","sqlInstance","getModelColumns","getRelationsMetadata","getIndexes","getUniques","args","hasOne","hasMany","belongsTo","manyToMany","SqlDataSource","instance","payload","refreshed","Model","Relation","BelongsTo","relatedModel","foreignKey","HasMany","HasOne","ManyToMany","COLUMN_METADATA_KEY","PRIMARY_KEY_METADATA_KEY","RELATION_METADATA_KEY","INDEX_METADATA_KEY","UNIQUE_METADATA_KEY","getDefaultForeignKey","pluralize","getDefaultIndexName","getDefaultUniqueConstraintName","getDefaultFkConstraintName","leftColumn","rightColumn","getDefaultPrimaryKeyConstraintName","isPrimaryKey","targetModel","databaseName","existingColumns","primaryKeyColumn","dateColumn","booleanColumn","jsonColumn","uuidColumn","ulidColumn","integerColumn","floatColumn","symmetric","asymmetric","autoUpdate","autoCreate","fallbackForeignKey","fallbackConstraintName","targetTable","fkColumn","relations","throughModel","throughModelKeys","leftForeignKey","rightForeignKey","wasModelProvided","throughModelTable","primaryModel","fallbackLeftForeignKey","fallbackRightForeignKey","resolvedForeignKey","lazyLoadedModel","InterpreterUtils","foundColumn","casedColumn","alias","values","filteredColumns","filteredValues","_","preparedValue","fromNode","astParser","MysqlAlterTableInterpreter","atNode","tableName","parts","bindings","child","childBindings","last","isExtendingAddColumn","isNamedTableConstraint","cleaned","ensured","stmt","ifExists","alter_table_default","MysqlDropColumnInterpreter","drop_column_default","MysqlDropConstraintInterpreter","drop_constraint_default","MysqlDropDefaultInterpreter","drop_default_default","MysqlDropNotNullInterpreter","_node","drop_not_null_default","MysqlDropPrimaryKeyInterpreter","drop_primary_key_default","MysqlRenameColumnInterpreter","rename_column_default","MysqlRenameTableInterpreter","rename_table_default","MysqlSetDefaultInterpreter","set_default_default","MysqlSetNotNullInterpreter","set_not_null_default","MysqlColumnTypeInterpreter","colNode","dt","len","precision","scale","p","column_type_default","MysqlAfterConstraintInterpreter","after_default","MysqlConstraintInterpreter","cNode","utils","cols","prefix","refTable","refCols","constraint_default","MysqlCreateTableInterpreter","ctNode","inlineConstraintSql","combined","constraintBindings","columnsSql","create_table_default","MysqlDeleteInterpreter","deleteNode","delete_default","MySqlDistinctInterpreter","distinct_default","distinct_on_default","MysqlDropTableInterpreter","tableSql","drop_table_default","MySqlFromInterpreter","interpreterUtils","subQueryNodes","aliasSql","from_default","MySqlGroupByInterpreter","groupByNode","group_by_default","QueryNode","keyword","isRawValue","MysqlHavingInterpreter","havingNode","idx","placeholders","having_default","MysqlCreateIndexInterpreter","ci","create_index_default","MysqlDropIndexInterpreter","di","drop_index_default","MysqlInsertInterpreter","insertNode","formattedTable","firstRecord","formattedColumns","allValues","valuesClauses","recordValues","insert_default","MysqlJoinInterpreter","joinNode","leftColumnStr","rightColumnStr","leftSql","rightSql","join_default","MySqlLimitInterpreter","limit_default","lockTypeToSql","MysqlLockInterpreter","lockNode","lock_default","MySqlOffsetInterpreter","offset_default","MysqlOnDuplicateInterpreter","onDuplicateNode","noOpColumn","formattedNoOpColumn","on_duplicate_default","MySqlOrderByInterpreter","orderByNode","columnSql","directionSql","order_by_default","MysqlRawInterpreter","raw_default","MysqlForeignKeyInfoInterpreter","foreign_key_info_default","MysqlIndexInfoInterpreter","index_info_default","MysqlPrimaryKeyInfoInterpreter","primary_key_info_default","MysqlTableInfoInterpreter","table_info_default","MysqlSelectInterpreter","selectNode","columnResult","sqlFunction","formatted","select_default","MysqlTruncateInterpreter","truncateNode","truncate_default","MysqlUnionInterpreter","unionNode","parser","nodes","union_default","RawNode","MysqlUpdateInterpreter","updateNode","finalBindings","setClause","update_default","MysqlWhereInterpreter","whereNode","formattedRight","raw","where_default","MysqlWhereGroupInterpreter","groupNode","where_group_default","MysqlWhereJsonInterpreter","whereJsonNode","where_json_default","MysqlWhereSubqueryInterpreter","subqueryNode","subquery","subquerySql","subqueryBindings","where_subquery_default","MysqlWithInterpreter","withNode","with_default","PgAddColumnInterpreter","PgAddConstraintInterpreter","PgAddPrimaryKeyInterpreter","PgAlterColumnTypeInterpreter","restTokens","PostgresAlterTableInterpreter","PgDropColumnInterpreter","PgDropConstraintInterpreter","PostgresDropDefaultInterpreter","PostgresDropNotNullInterpreter","PgDropPrimaryKeyInterpreter","PgRenameColumnInterpreter","PgRenameTableInterpreter","PostgresSetDefaultInterpreter","PostgresSetNotNullInterpreter","PostgresColumnTypeInterpreter","withTz","PgAfterConstraintInterpreter","PostgresConstraintInterpreter","sqlPrefix","colsArr","sqlPrefixU","PostgresCreateTableInterpreter","PostgresDeleteInterpreter","PostgresDistinctInterpreter","PostgresDistinctOnInterpreter","PgDropTableInterpreter","PostgresFromInterpreter","PostgresGroupByInterpreter","PostgresHavingInterpreter","PgCreateIndexInterpreter","PostgresDropIndexInterpreter","PostgresInsertInterpreter","paramIndex","returningCols","typeCast","PostgresJoinInterpreter","PostgresLimitInterpreter","limitNode","PostgresLockInterpreter","PostgresOffsetInterpreter","offsetNode","PostgresOnDuplicateInterpreter","formattedConflictColumns","updateSet","PostgresOrderByInterpreter","PostgresRawInterpreter","PostgresForeignKeyInfoInterpreter","PostgresIndexInfoInterpreter","PostgresPrimaryKeyInfoInterpreter","PostgresTableInfoInterpreter","PostgresSelectInterpreter","PostgresTruncateInterpreter","PostgresUnionInterpreter","PostgresUpdateInterpreter","rawNodeCount","PostgresWhereInterpreter","PostgresWhereGroupInterpreter","PostgresWhereJsonInterpreter","PostgresWhereSubqueryInterpreter","PostgresWithInterpreter","materializedClause","SqliteAddColumnInterpreter","SqliteAddConstraintInterpreter","SqliteAlterColumnTypeInterpreter","SqliteAlterTableInterpreter","awaitingConstraints","cleanedSql","SqliteDropColumnInterpreter","SqliteDropConstraintInterpreter","SqliteDropDefaultInterpreter","SqliteDropNotNullInterpreter","SqliteDropPrimaryKeyInterpreter","SqliteRenameColumnInterpreter","SqliteRenameTableInterpreter","SqliteSetDefaultInterpreter","SqliteSetNotNullInterpreter","SqliteColumnTypeInterpreter","SqliteAfterConstraintInterpreter","SqliteConstraintInterpreter","autoIncrement","columnType","SqliteCreateTableInterpreter","SqliteDeleteInterpreter","SqliteDistinctInterpreter","SqliteDropTableInterpreter","SqliteFromInterpreter","SqliteGroupByInterpreter","SqliteHavingInterpreter","SqliteCreateIndexInterpreter","SqliteDropIndexInterpreter","SqliteInsertInterpreter","SqliteJoinInterpreter","SqliteLimitInterpreter","SqliteLockInterpreter","SqliteOffsetInterpreter","SqliteOnDuplicateInterpreter","SqliteOrderByInterpreter","SqliteRawInterpreter","SqliteForeignKeyInfoInterpreter","SqliteIndexInfoInterpreter","SqlitePrimaryKeyInfoInterpreter","SqliteTableInfoInterpreter","SqliteSelectInterpreter","SqliteTruncateInterpreter","SqliteUnionInterpreter","SqliteUpdateInterpreter","SqliteWhereInterpreter","SqliteWhereGroupInterpreter","SqliteWhereJsonInterpreter","SqliteWhereSubqueryInterpreter","SqliteWithInterpreter","interpreterMap","startBindingIndex","isNestedCondition","distinctOnNode","distinctNode","filteredNodes","sqlParts","allBindings","currentSqlKeyword","interpreter","sqlStatement","nextNode","chainWith","keywordToEmit","hasRecursive","candidate","ForeignKeyInfoNode","IndexInfoNode","PrimaryKeyInfoNode","TableInfoNode","AddColumnNode","AddConstraintNode","AddPrimaryKeyNode","AlterColumnTypeNode","newType","AlterTableNode","children","DropColumnNode","DropConstraintNode","DropDefaultNode","DropNotNullNode","DropPrimaryKeyNode","RenameColumnNode","oldName","newName","RenameTableNode","SetDefaultNode","SetNotNullNode","ConstraintNode","constraintType","CreateTableNode","namedConstraints","ifNotExists","DropTableNode","CreateIndexNode","indexName","unique","DropIndexNode","cascade","TruncateNode","ColumnTypeNode","dataType","opts","LockNode","lockType","skipLocked","noWait","UnionNode","isAll","WithNode","clause","body","BaseBuilder","AfterConstraintNode","ConstraintBuilder","columnNode","context","defaultName","references","defaultVal","CreateTableBuilder","AlterTableBuilder","cb","tempNodes","builder","constraints","columnNodes","constraintNode","addColumnNode","columnBuilder","isNullable","nullableNode","hasDefault","foreignTable","foreignColumn","defaultConstraintName","constraintName","Schema","fileExtension","statements","statement","tableBuilder","createTableNode","frag","flushGroup","nodeGroup","oldTable","newTable","alterNode","dropNode","columnsOrConstraintName","computedName","DropOrderResolver","changes","foreignKeys","fkId","dependencies","tableId","columnId","m","items","getDependencies","visited","temp","visit","item","dep","dropDeps","operations","sortedFKs","fk","sortedTables","t","impact","affectedConstraints","mixedOps","pk","dbColumn","MigrationOperationGenerator","fkKey","op","addSet","o","dropSet","churn","k","createTableSql","addColumnSql","uq","dropSql","uniqueDrops","u","schema","dropIndexSql","addPrimaryKeySql","pkConstraintName","addForeignKeySql","effectiveConstraintName","addUqSql","createIndexSql","relationData","explicit","referencesTable","sourceColumnName","modifySql","pkName","pkColumn","throughTable","sourceColumn","applyConstraints","b","columnData","indexData","referencesColumn","foreignKeyColumn","primaryKeyName","relatedModelPKColumn","databaseCaseConvention","relatedModelColumns","specifiedColumn","leftKey","leftKeyStr","leftKeyColumn","onDelete","onUpdate","fkConstraintName","operation","compactWhitespace","stripLengthSuffix","normalizeColumnType","dialect","rawType","lowered","base","rules","s","rule","SchemaDiff","_SchemaDiff","diff","databaseData","dbIndex","modelUniques","expectedConstraintName","modelIndex","dbCol","hasStructChange","defaultChange","expectedName","modelExpectedFkNames","rel","srcCol","srcDb","dbRelation","modelRelation","modelPrimaryKey","modelPrimaryKeyColumn","operationGenerator","formattedOperations","statementsByPhase","dbIndexes","baseCondition","normalizedDbType","normalizedModelType","isFloatingType","modelNullable","dbNullable","expectedRefTable","expectedRefColumn","expectedThroughTable","dbOnDelete","dbOnUpdate","modelOnDelete","modelOnUpdate","mr","expectedReferencedTable","fkName","localColumn","mc","referencedPkName","referencedColumn","dbPrimaryKey","columnsMatch","constraintNamesMatch","modelHasDefault","dbHasDefault","dbDefault","modelDefault","dbNorm","modelNorm","singleQuoted","processed","leftPkName","rightPkName","leftPk","rightPk","leftFkName","rightFkName","dbThrough","leftExpected","rightExpected","leftDbCol","rightDbCol","leftColOk","rightColOk","isLeft","isRight","actualName","pendingAddColumns","leftExpectedRel","rightExpectedRel","leftDbFk","rightDbFk","conflictLeft","conflictRight","tablesNeedingCheck","tableToDbFks","names","modelExpectedByTable","rels","expected","srcColRaw","dbSchema","modelCols","sourceCol","referencedTable","referencedCol","relModel","candidateCols","existsStructurally","colMatch","refTableMatch","refColMatch","dbFks","through","rightKey","leftMatch","rightMatch","leftOk","rightOk","refCol","leftRelation","rightRelation","relatedPkName","DeleteNode","FromNode","InsertNode","records","returning","disableReturning","OnDuplicateNode","UpdateNode","WhereNode","chainsWith","isNegated","operator","WhereGroupNode","WhereJsonNode","WhereSubqueryNode","SQLiteStream","Readable","db","events","pending","ended","hasError","wroteFlag","wroteValue","mockPassThrough","sqlDataSource","isTransactional","rows","inputModel","lastID","selectQuery","finalResult","insertPromises","preparedColumns","preparedValues","preparedModel","execSql","mysqlDriver","mysqlResult","withRetry","pgResult","sqliteResult","execSqlStreaming","pool","conn","passThrough","PassThrough","mysqlStream","tryRelease","pgQueryStreamDriver","streamQuery","pgStream","fn","retryConfig","retries","maxRetries","delay","attempt","withPerformance","returnType","fix","start","res","elapsed","SelectNode","isRaw","SqlModelManagerUtils","getPaginationMetadata","page","limit","total","getCursorPaginationMetadata","coerceToNumber","HavingNode","DistinctNode","DistinctOnNode","JoinNode","left","right","on","GroupByNode","LimitNode","OffsetNode","offset","OrderByNode","direction","FooterQueryBuilder","getColumnsFn","order","JoinQueryBuilder","relationTable","referencingColumnOrPrimaryColumn","primaryColumn","primaryColumnValue","SelectQueryBuilder","sqlMethodOrColumn","columnOrAlias","maybeAlias","sqlMethod","WhereQueryBuilder","columnOrCb","operatorOrValue","QueryBuilder","actualValue","min","max","regexp","isPg","cbOrQueryBuilder","nestedBuilder","queryParams","subQueryOrCb","subQuery","whereGroupNode","JsonQueryBuilder","_QueryBuilder","chunkSize","cursor","countQueryBuilder","count","lastItem","lastItemValue","queryBuilderOrCb","perPage","tableOrCb","subQueryBuilder","insertObject","rawResult","insertObjects","rawColumns","rawValues","qb","ModelQueryBuilder","_ModelQueryBuilder","serializedModelsArray","serializedModel","ignoreBeforeUpdateHook","ignoredHooks","clonedQuery","relationQueryBuilder","cbOrOperatorOrValue","maybeValue","actualOperator","modelQueryBuilder","queryBuilder","relatedModels","modelsToFillWithRelations","relatedModelsMap","foreignKeyValue","modelToFillWithRelation","relatedModelsByKey","relatedModelsGroupedByForeignKey","foreignKeyStr","relatedModelsList","manyToManyRelation","relatedModelsMapManyToMany","relatedPrimaryKey","casedRelatedPrimaryKey","annotations","filterValues","rn","withTableName","orderByClause","cteQb","outerSelectedColumnsHasMany","m2mLimit","m2mOffset","m2mSelectedColumns","rnM2m","withTableNameM2m","orderByClauseM2m","cteLeftForeignKey","qbM2m","innerQb","outerSelectedColumns","relatedInterpreter","outerInterpreter","m2m","jn","throughLeft","outerPk","ignoreHooks","DryModelQueryBuilder","ModelManager","insertedModel","insertedModels","updatedModel","retuning","returnModel","idsToFetchList","primaryKeyList","fetchedModels","DryQueryBuilder","getRawQueryBuilderModel","Transaction","_Transaction","isolationLevel","isNested","nestingDepth","levelQuery","savepoint","shortId","_SqlDataSource","inputOrCb","sanitizeModelKeys","connectionDetails","customSqlInstance","sqlForQueryBuilder","optionsOrCb","maybeOptions","ttlOrFirstArg","restArgs","mappedKeyHandler","handlerArgsCount","isTTLProvided","hashedArgs","cachedKey","cachedValue","retrievedValue","cloned","sqlTrx","_specificType","sqlStatements","indexes","rawNullable","withTimezone","map","isUnique","cr","grouped","id","instanceKeys","staticKeys","allKeys","rollbackMigrationsConnector","rollBackUntil","tableMigrations","rollBackUntilIndex","GenerateMigrationTemplate","InitTemplates","port","importType","config","runSqlConnector","databaseType","fileDir","getPackageManager","installBaseDependencies","packageManager","packageManagerCommand","devDependencies","driverDependency","devFlag","execSync","sqlDatabaseTypes","allDatabaseTypes","program","Command","option","template","resolvedPath","sqlDs","migrationMode","rollbackUntil","force","extension"],"mappings":"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","file":"cli.cjs","sourcesContent":["import { HysteriaErrorCode } from \"./hysteria_error.types\";\n\nexport class HysteriaError extends Error {\n code: HysteriaErrorCode;\n caller: string;\n error?: Error;\n\n constructor(caller: string, code: HysteriaErrorCode, error?: Error) {\n super(caller + \" - \" + code);\n this.code = code;\n this.caller = caller;\n this.error = error;\n }\n}\n","import type { DataSourceType } from \"../data_source/data_source_types\";\nimport { HysteriaError } from \"../errors/hysteria_error\";\nimport { DriverImport, DriverSpecificOptions } from \"./driver_constants\";\n\nexport abstract class Driver {\n abstract type: DataSourceType | \"redis\";\n abstract client: DriverImport;\n options?: DriverSpecificOptions<DataSourceType>;\n\n constructor(driverSpecificOptions?: DriverSpecificOptions<DataSourceType>) {\n this.options = driverSpecificOptions;\n }\n\n static async createDriver(\n _driverSpecificOptions: DriverSpecificOptions<DataSourceType>,\n ): Promise<Driver> {\n throw new HysteriaError(\n \"Driver::createDriver This error should never happen. Please report it to the developers.\",\n \"DEVELOPMENT_ERROR\",\n );\n }\n}\n","import type { RedisOptions } from \"ioredis\";\nimport type { DataSourceType } from \"../data_source/data_source_types\";\n\nexport type Mysql2Import = typeof import(\"mysql2/promise\");\nexport type Mysql2SyncImport = typeof import(\"mysql2\");\nexport type PgImport = typeof import(\"pg\");\nexport type Sqlite3Import = typeof import(\"sqlite3\");\nexport type MongoClientImport = typeof import(\"mongodb\");\n\ntype ExcludeStringFromOptions<T> = T extends string ? never : T;\n\nexport type MysqlCreateConnectionOptions = Parameters<\n Mysql2Import[\"createPool\"]\n>[0];\n\nexport type PgClientOptions = ExcludeStringFromOptions<\n ConstructorParameters<PgImport[\"Pool\"]>[0]\n>;\n\nexport type MongoConnectionOptions = NonNullable<\n ConstructorParameters<MongoClientImport[\"MongoClient\"]>[1]\n>;\n\nexport type DriverSpecificOptions<T extends DataSourceType> = T extends \"mongo\"\n ? MongoConnectionOptions\n : T extends \"cockroachdb\"\n ? PgClientOptions\n : T extends \"redis\"\n ? RedisOptions\n : T extends \"postgres\"\n ? PgClientOptions\n : T extends \"mongo\"\n ? MongoConnectionOptions\n : T extends \"mariadb\"\n ? MysqlCreateConnectionOptions\n : T extends \"mysql\"\n ? MysqlCreateConnectionOptions\n : never;\n\nexport type DriverImport =\n | Mysql2Import\n | PgImport\n | Sqlite3Import\n | MongoClientImport;\n\nexport class DriverNotFoundError extends Error {\n constructor(driverName: string) {\n super(\"\");\n this.message = `Driver '${driverName}' not found, it's likely not installed, try running 'npm install ${driverName}'`;\n }\n}\n","import type { DataSourceType } from \"../data_source/data_source_types\";\nimport { Driver } from \"./driver\";\nimport {\n DriverSpecificOptions,\n DriverNotFoundError,\n MongoClientImport,\n} from \"./driver_constants\";\n\nexport class MongoDriver extends Driver {\n override type: DataSourceType | \"redis\" = \"postgres\";\n override client: MongoClientImport;\n\n constructor(\n client: MongoClientImport,\n driverSpecificOptions?: DriverSpecificOptions<DataSourceType>,\n ) {\n super(driverSpecificOptions);\n this.client = client;\n }\n\n static async createDriver(\n driverSpecificOptions?: DriverSpecificOptions<DataSourceType>,\n ): Promise<Driver> {\n const mongo = await import(\"mongodb\").catch(() => {\n throw new DriverNotFoundError(\"mongodb\");\n });\n if (!mongo) {\n throw new DriverNotFoundError(\"mongodb\");\n }\n\n return new MongoDriver(mongo, driverSpecificOptions);\n }\n}\n","import type { DataSourceType } from \"../data_source/data_source_types\";\nimport { Driver } from \"./driver\";\nimport {\n Mysql2Import,\n DriverSpecificOptions,\n DriverNotFoundError,\n} from \"./driver_constants\";\n\nexport class MysqlDriver extends Driver {\n override type: DataSourceType | \"redis\" = \"mysql\";\n override client: Mysql2Import;\n\n constructor(\n client: Mysql2Import,\n driverSpecificOptions?: DriverSpecificOptions<DataSourceType>,\n ) {\n super(driverSpecificOptions);\n this.client = client;\n }\n\n static async createDriver(\n driverSpecificOptions?: DriverSpecificOptions<DataSourceType>,\n ): Promise<Driver> {\n const mysql2 = await import(\"mysql2/promise\").catch(() => {\n throw new DriverNotFoundError(\"mysql2\");\n });\n\n if (!mysql2) {\n throw new DriverNotFoundError(\"mysql\");\n }\n\n return new MysqlDriver(mysql2.default, driverSpecificOptions);\n }\n}\n","import { DataSourceType } from \"../data_source/data_source_types\";\nimport { Driver } from \"./driver\";\nimport {\n DriverSpecificOptions,\n DriverNotFoundError,\n PgImport,\n} from \"./driver_constants\";\n\nexport class PgDriver extends Driver {\n override type: DataSourceType | \"redis\" = \"postgres\";\n override client: PgImport;\n\n constructor(\n client: PgImport,\n driverSpecificOptions?: DriverSpecificOptions<DataSourceType>,\n ) {\n super(driverSpecificOptions);\n this.client = client;\n }\n\n static async createDriver(\n driverSpecificOptions?: DriverSpecificOptions<DataSourceType>,\n ): Promise<Driver> {\n const pg = await import(\"pg\").catch(() => {\n throw new DriverNotFoundError(\"pg\");\n });\n if (!pg) {\n throw new DriverNotFoundError(\"pg\");\n }\n\n return new PgDriver(pg.default, driverSpecificOptions);\n }\n}\n","import type { DataSourceType } from \"../data_source/data_source_types\";\nimport { Driver } from \"./driver\";\nimport {\n DriverNotFoundError,\n DriverSpecificOptions,\n Sqlite3Import,\n} from \"./driver_constants\";\n\nexport class Sqlite3Driver extends Driver {\n override type: DataSourceType | \"redis\" = \"sqlite\";\n override client: Sqlite3Import;\n\n constructor(\n client: Sqlite3Import,\n driverSpecificOptions?: DriverSpecificOptions<DataSourceType>,\n ) {\n super(driverSpecificOptions);\n this.client = client;\n }\n\n static async createDriver(\n driverSpecificOptions?: DriverSpecificOptions<DataSourceType>,\n ): Promise<Driver> {\n const sqlite3 = await import(\"sqlite3\").catch(() => {\n throw new DriverNotFoundError(\"sqlite3\");\n });\n if (!sqlite3) {\n throw new DriverNotFoundError(\"sqlite3\");\n }\n\n return new Sqlite3Driver(sqlite3.default, driverSpecificOptions);\n }\n}\n","import type { DataSourceType } from \"../data_source/data_source_types\";\nimport { HysteriaError } from \"../errors/hysteria_error\";\nimport { Driver } from \"./driver\";\nimport { DriverSpecificOptions } from \"./driver_constants\";\nimport { MongoDriver } from \"./mongo_driver\";\nimport { MysqlDriver } from \"./mysql_driver\";\nimport { PgDriver } from \"./pg_driver\";\nimport { Sqlite3Driver } from \"./sqlite3_driver\";\n\nexport class DriverFactory {\n static async getDriver(\n client: DataSourceType | \"redis\",\n driverSpecificOptions?: DriverSpecificOptions<DataSourceType>,\n ): Promise<Driver> {\n switch (client) {\n case \"mysql\":\n case \"mariadb\":\n return MysqlDriver.createDriver(driverSpecificOptions);\n case \"postgres\":\n case \"cockroachdb\":\n return PgDriver.createDriver(driverSpecificOptions);\n case \"sqlite\":\n return Sqlite3Driver.createDriver(driverSpecificOptions);\n case \"mongo\":\n return MongoDriver.createDriver(driverSpecificOptions);\n default:\n throw new HysteriaError(\n `DriverFactory::getDriver Driver ${client} not found, il likely not installed, try running npm install ${client}`,\n \"DRIVER_NOT_FOUND\",\n );\n }\n }\n}\n","import type {\n MysqlSqlDataSourceInput,\n PostgresSqlDataSourceInput,\n} from \"../data_source/data_source_types\";\nimport {\n Mysql2Import,\n PgImport,\n Sqlite3Import,\n} from \"../drivers/driver_constants\";\nimport { DriverFactory } from \"../drivers/drivers_factory\";\nimport { HysteriaError } from \"../errors/hysteria_error\";\nimport {\n GetConnectionReturnType,\n SqlDataSourceInput,\n SqlDataSourceType,\n SqlPoolType,\n} from \"./sql_data_source_types\";\nimport { SqlDataSource } from \"./sql_data_source\";\n\nconst getDriverConnection = async (type: SqlDataSourceType) => {\n const driver = (await DriverFactory.getDriver(type)).client;\n return driver;\n};\n\nexport const createSqlPool = async <T extends SqlDataSourceType>(\n type: T,\n input?: SqlDataSourceInput<T>,\n): Promise<SqlPoolType> => {\n const driver = await getDriverConnection(type);\n switch (type) {\n case \"mariadb\":\n case \"mysql\":\n const mysqlInput = input as MysqlSqlDataSourceInput;\n const mysqlDriver = driver as Mysql2Import;\n const mysqlPool = mysqlDriver.createPool({\n host: mysqlInput.host,\n port: mysqlInput.port,\n user: mysqlInput.username,\n password: mysqlInput.password,\n database: mysqlInput.database,\n ...mysqlInput?.driverOptions,\n });\n return mysqlPool;\n case \"postgres\":\n case \"cockroachdb\":\n const pgInput = input as PostgresSqlDataSourceInput;\n const pgDriver = driver as PgImport;\n const pgPool = new pgDriver.Pool({\n host: pgInput.host,\n port: pgInput.port,\n user: pgInput.username,\n password: pgInput.password,\n database: pgInput.database,\n ...pgInput?.driverOptions,\n });\n\n return pgPool;\n case \"sqlite\":\n const sqliteDriver = driver as Sqlite3Import;\n const database = input?.database as string;\n const sqlitePool = new sqliteDriver.Database(\n database,\n sqliteDriver.OPEN_READWRITE | sqliteDriver.OPEN_CREATE,\n (err) => {\n if (err) {\n throw new HysteriaError(\n \"SqliteDataSource::createSqlPool\",\n \"CONNECTION_NOT_ESTABLISHED\",\n );\n }\n },\n );\n return sqlitePool;\n default:\n throw new HysteriaError(\n \"SqlConnectionUtils::createSqlPool\",\n `UNSUPPORTED_DATABASE_TYPE_${type}`,\n );\n }\n};\n\nexport const createSqlConnection = async (\n type: SqlDataSourceType,\n sqlDataSource: SqlDataSource,\n): Promise<GetConnectionReturnType> => {\n switch (type) {\n case \"mariadb\":\n case \"mysql\":\n return sqlDataSource.getConnection(\"mysql\");\n case \"postgres\":\n case \"cockroachdb\":\n return sqlDataSource.getConnection(\"postgres\");\n case \"sqlite\":\n return sqlDataSource.getConnection(\"sqlite\");\n default:\n throw new HysteriaError(\n \"SqlConnectionUtils::createSqlConnection\",\n `UNSUPPORTED_DATABASE_TYPE_${type}`,\n );\n }\n};\n","import { highlight } from \"sql-highlight\";\n\nexport type CustomLogger = {\n info(message: string): void;\n error(message: string): void;\n warn(message: string): void;\n};\n\nconst colors = {\n info: \"\\x1b[32m\",\n warn: \"\\x1b[33m\",\n error: \"\\x1b[31m\",\n reset: \"\\x1b[0m\",\n};\n\nfunction getTimestamp(): string {\n const now = new Date();\n const pad = (n: number) => n.toString().padStart(2, \"0\");\n\n return `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())} ${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())}`;\n}\n\nfunction formatLogMessage(level: string, message: string): string {\n const timestamp = getTimestamp();\n const levelUpper = level.toUpperCase();\n\n if (level === \"error\") {\n return `${colors.error}[${levelUpper}] ${timestamp}\\n${message}${colors.reset}\\n`;\n }\n\n if (level === \"warn\") {\n return `${colors.warn}[${levelUpper}] ${timestamp}\\n${message}${colors.reset}\\n`;\n }\n\n if (level === \"info\") {\n return `${colors.info}[${levelUpper}] ${timestamp}\\n${message}${colors.reset}\\n`;\n }\n\n return `[${levelUpper}] ${timestamp}\\n${message}\\n`;\n}\n\nclass HysteriaLogger {\n static loggerInstance: CustomLogger = {\n info(message: string): void {\n console.log(formatLogMessage(\"info\", message));\n },\n error(message: string): void {\n console.error(formatLogMessage(\"error\", message));\n },\n warn(message: string): void {\n console.warn(formatLogMessage(\"warn\", message));\n },\n };\n\n static setCustomLogger(customLogger: CustomLogger) {\n this.loggerInstance = customLogger;\n }\n\n static info(message: string): void {\n this.loggerInstance.info(message);\n }\n\n static error(message: string | Error): void {\n if (message instanceof Error) {\n this.loggerInstance.error(String(message));\n return;\n }\n this.loggerInstance.error(message);\n }\n\n static warn(message: string): void {\n this.loggerInstance.warn(message);\n }\n}\n\nfunction formatParams(params: any[]): string {\n return params\n .map((param) => {\n if (typeof param === \"object\") {\n return JSON.stringify(param);\n }\n\n if (typeof param === \"string\") {\n return `'${param}'`;\n }\n\n if (typeof param === \"number\") {\n return param;\n }\n\n if (typeof param === \"boolean\") {\n return param ? \"true\" : \"false\";\n }\n\n return param;\n })\n .join(\", \");\n}\n\nexport function log(query: string, logs: boolean, params?: any[]) {\n if (!logs) {\n return;\n }\n\n query = highlight(query, {\n colors: {\n keyword: \"\\x1b[34m\",\n string: \"\\x1b[32m\",\n number: \"\\x1b[33m\",\n bracket: \"\\x1b[36m\",\n clear: \"\\x1b[0m\",\n comment: \"\\x1b[90m\",\n function: \"\\x1b[35m\",\n identifier: \"\\x1b[37m\",\n special: \"\\x1b[31m\",\n },\n });\n\n const logMessage = `${query} [${formatParams(params || [])}]`;\n HysteriaLogger.loggerInstance.info(logMessage);\n}\n\nexport function logMessage(\n message: string,\n type: \"info\" | \"error\" | \"warn\",\n logs: boolean = false,\n) {\n if (!logs) {\n return;\n }\n\n HysteriaLogger.loggerInstance[type](message);\n}\n\nexport default HysteriaLogger;\n","import { SqlDataSourceType } from \"../../sql/sql_data_source_types\";\n\nclass MigrationTemplates {\n parseGetAllTables(\n dbType: SqlDataSourceType,\n database: string,\n result: any,\n ): string[] {\n switch (dbType) {\n case \"mysql\":\n case \"mariadb\":\n const extractedNames = Object.values(result).map(\n (row: any) => row[`Tables_in_${database}`],\n );\n return extractedNames;\n case \"cockroachdb\":\n case \"postgres\":\n return result.map((row: any) => row.table_name);\n default:\n throw new Error(`Unsupported database type: ${dbType}`);\n }\n }\n\n getAllTablesTemplate(dbType: SqlDataSourceType, database: string): string {\n switch (dbType) {\n case \"mysql\":\n case \"mariadb\":\n return `SHOW TABLES FROM ${database};`;\n case \"cockroachdb\":\n case \"postgres\":\n return `SELECT table_name\nFROM information_schema.tables\nWHERE table_catalog = '${database}'\n AND table_schema = 'public'\n AND table_type = 'BASE TABLE';`;\n default:\n throw new Error(`Unsupported database type: ${dbType}`);\n }\n }\n\n dropAllTablesTemplate(dbType: SqlDataSourceType, tables: string[]): string {\n if (!tables.length) {\n return \"SELECT 1;\";\n }\n\n switch (dbType) {\n case \"mysql\":\n case \"mariadb\":\n case \"cockroachdb\":\n case \"postgres\":\n return `DROP TABLE IF EXISTS ${tables.join(\", \")} CASCADE;`;\n default:\n throw new Error(`Unsupported database type: ${dbType}`);\n }\n }\n\n basicMigrationTemplate(js: boolean = false): string {\n if (js) {\n return `import { Migration } from 'hysteria-orm';\n\nexport default class extends Migration {\n async up() {\n // Your migration logic here\n }\n\n async down() {\n // Your rollback logic here\n }\n}\n`;\n }\n\n return `import { Migration } from 'hysteria-orm';\n\nexport default class extends Migration {\n async up(): Promise<void> {\n // Your migration logic here\n }\n\n async down(): Promise<void> {\n // Your rollback logic here\n }\n}\n`;\n }\n\n createMigrationTemplate(js: boolean = false, table: string): string {\n if (js) {\n return `import { Migration } from 'hysteria-orm';\n\nexport default class extends Migration {\n async up() {\n this.schema.createTable(\n '${table}',\n (table) => {\n // Your create table logic here\n },\n );\n }\n\n async down() {\n // Your rollback logic here\n }\n}\n`;\n }\n\n return `import { Migration } from 'hysteria-orm';\n\nexport default class extends Migration {\n async up(): Promise<void> {\n this.schema.createTable(\n '${table}',\n (table) => {\n // Your create table logic here\n },\n );\n }\n\n async down(): Promise<void> {\n // Your rollback logic here\n }\n}\n`;\n }\n\n alterMigrationTemplate(js: boolean = false, table: string): string {\n if (js) {\n return `import { Migration } from 'hysteria-orm';\n\nexport default class extends Migration {\n async up() {\n this.schema.alterTable(\n '${table}',\n (table) => {\n // Your alter table logic here\n },\n );\n }\n\n async down() {\n // Your rollback logic here\n }\n}\n`;\n }\n\n return `import { Migration } from 'hysteria-orm';\n\nexport default class extends Migration {\n async up(): Promise<void> {\n this.schema.alterTable(\n '${table}',\n (table) => {\n // Your alter table logic here\n },\n );\n }\n\n async down(): Promise<void> {\n // Your rollback logic here\n }\n}\n`;\n }\n\n selectAllFromMigrationsTemplate(): string {\n return `SELECT * FROM migrations;`;\n }\n\n migrationTableTemplateMysql(): string {\n return `CREATE TABLE IF NOT EXISTS \\`migrations\\`(\n \\`id\\` INT NOT NULL AUTO_INCREMENT,\n \\`name\\` VARCHAR(255) NOT NULL,\n \\`timestamp\\` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n PRIMARY KEY (\\`id\\`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n`;\n }\n\n migrationTableTemplatePg(): string {\n return `CREATE TABLE IF NOT EXISTS migrations (\n id SERIAL PRIMARY KEY,\n name VARCHAR(255) NOT NULL,\n timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP\n);\n`;\n }\n\n migrationTableTemplateSQLite(): string {\n const now = new Date().toISOString();\n return `CREATE TABLE IF NOT EXISTS migrations (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL,\n timestamp TEXT NOT NULL DEFAULT '${now}'\n);`;\n }\n}\n\nexport default new MigrationTemplates();\n","import fs from \"fs/promises\";\nimport { createSqlPool } from \"../sql/sql_connection_utils\";\nimport { type SqlDataSource } from \"../sql/sql_data_source\";\nimport { SqlDataSourceType } from \"../sql/sql_data_source_types\";\nimport logger from \"../utils/logger\";\nimport MigrationTemplates from \"./resources/migration_templates\";\nimport { Transaction } from \"../sql/transactions/transaction\";\n\nexport default async function dropAllTablesConnector(\n sql: SqlDataSource,\n shouldExit: boolean = true,\n transactional?: boolean,\n) {\n const dbType = sql.getDbType();\n const dbDatabase = sql.database;\n if (!dbType) {\n logger.error(\"DB_TYPE is not set could not drop all tables\");\n process.exit(1);\n }\n\n if (!dbDatabase) {\n logger.error(\"DB_DATABASE is not set could not drop all tables\");\n process.exit(1);\n }\n\n logger.info(\"Dropping all tables for database type: \" + dbType);\n if (dbType === \"sqlite\") {\n await sql.closeConnection();\n\n await fs.rm(dbDatabase as string, { recursive: true, force: true });\n logger.info(\"Sqlite database dropped successfully\");\n await fs.writeFile(dbDatabase as string, \"\");\n logger.info(\"Sqlite database recreated successfully\");\n\n const details = sql.getConnectionDetails();\n sql.sqlPool = await createSqlPool(sql.getDbType(), details);\n\n if (shouldExit) {\n await sql.closeConnection();\n logger.info(\"All tables dropped successfully\");\n shouldExit && process.exit(0);\n }\n return;\n }\n\n const templates = MigrationTemplates.getAllTablesTemplate(\n dbType as SqlDataSourceType,\n dbDatabase as string,\n );\n\n const tables: string[] = await sql.rawQuery(templates);\n const parsedTables = MigrationTemplates.parseGetAllTables(\n dbType as SqlDataSourceType,\n dbDatabase as string,\n tables,\n );\n\n const dropAllTablesTemplate = MigrationTemplates.dropAllTablesTemplate(\n dbType as SqlDataSourceType,\n parsedTables,\n );\n\n let trx: Transaction | null = null;\n if (transactional) {\n trx = await sql.startTransaction();\n sql = trx.sql as SqlDataSource;\n }\n\n try {\n if (dbType === \"mysql\" || dbType === \"mariadb\") {\n await sql.rawQuery(`SET FOREIGN_KEY_CHECKS = 0;`);\n }\n\n await sql.rawQuery(dropAllTablesTemplate);\n\n if (dbType === \"mysql\" || dbType === \"mariadb\") {\n await sql.rawQuery(`SET FOREIGN_KEY_CHECKS = 1;`);\n }\n\n if (transactional) {\n await trx?.commit();\n }\n } catch (error: any) {\n if (transactional) {\n await trx?.rollback();\n }\n\n logger.error(error);\n process.exit(1);\n } finally {\n if (shouldExit) {\n await sql.closeConnection();\n }\n }\n\n logger.info(\"All tables dropped successfully\");\n shouldExit && process.exit(0);\n}\n","import fs from \"node:fs\";\nimport type { Env } from \"./env_types\";\n\nconst envBase: Env = {\n DB_TYPE: process.env.DB_TYPE,\n DB_HOST: process.env.DB_HOST,\n DB_PORT: process.env.DB_PORT,\n DB_USER: process.env.DB_USER,\n DB_PASSWORD: process.env.DB_PASSWORD,\n DB_DATABASE: process.env.DB_DATABASE,\n DB_LOGS: process.env.DB_LOGS === \"true\",\n MIGRATION_PATH: process.env.MIGRATION_PATH || \"database/migrations\",\n\n REDIS_HOST: process.env.REDIS_HOST,\n REDIS_PORT: process.env.REDIS_PORT,\n REDIS_USERNAME: process.env.REDIS_USERNAME,\n REDIS_PASSWORD: process.env.REDIS_PASSWORD,\n REDIS_DATABASE: process.env.REDIS_DATABASE,\n\n MONGO_URL: process.env.MONGO_URL,\n MONGO_LOGS: process.env.MONGO_LOGS === \"true\",\n};\n\nconst fillEnvWithDatabaseEnvs = (): Env => {\n try {\n const envs = fs.readFileSync(\".env\", \"utf8\");\n const envVars = envs.split(\"\\n\");\n envVars.forEach((envVar) => {\n const [key, value] = envVar.split(\"=\");\n const trimmedKey = key.trim();\n const trimmedValue = value.trim();\n\n switch (trimmedKey) {\n case \"DB_TYPE\":\n envBase.DB_TYPE ||= trimmedValue;\n break;\n case \"DB_HOST\":\n envBase.DB_HOST ||= trimmedValue;\n break;\n case \"DB_PORT\":\n envBase.DB_PORT ||= trimmedValue;\n break;\n case \"DB_USER\":\n envBase.DB_USER ||= trimmedValue;\n break;\n case \"DB_PASSWORD\":\n envBase.DB_PASSWORD ||= trimmedValue;\n break;\n case \"DB_DATABASE\":\n envBase.DB_DATABASE ||= trimmedValue;\n break;\n case \"MIGRATION_PATH\":\n envBase.MIGRATION_PATH ||= trimmedValue || \"database/migrations\";\n break;\n\n case \"REDIS_HOST\":\n envBase.REDIS_HOST ||= trimmedValue;\n break;\n case \"REDIS_PORT\":\n envBase.REDIS_PORT ||= trimmedValue;\n break;\n case \"REDIS_USERNAME\":\n envBase.REDIS_USERNAME ||= trimmedValue;\n break;\n case \"REDIS_PASSWORD\":\n envBase.REDIS_PASSWORD ||= trimmedValue;\n break;\n case \"REDIS_DATABASE\":\n envBase.REDIS_DATABASE ||= trimmedValue;\n break;\n\n case \"MONGO_URL\":\n envBase.MONGO_URL ||= trimmedValue;\n break;\n }\n });\n } catch (error) {\n } finally {\n return envBase;\n }\n};\n\nexport const env = fillEnvWithDatabaseEnvs();\n","import fs from \"fs\";\nimport path from \"path\";\nimport logger from \"../utils/logger\";\nimport MigrationTemplates from \"./resources/migration_templates\";\nimport { env } from \"../env/env\";\n\nconst getOrCreateMigrationPath = (): string => {\n const migrationPath = env.MIGRATION_PATH;\n const currentPath = path.resolve(process.cwd(), migrationPath);\n if (!fs.existsSync(currentPath)) {\n fs.mkdirSync(currentPath, { recursive: true });\n }\n\n return currentPath;\n};\n\nexport default (\n name: string,\n js: boolean = false,\n mode: \"alter\" | \"create\" | \"basic\" = \"basic\",\n table: string = \"table\",\n) => {\n const migrationFolderPath = getOrCreateMigrationPath();\n const timestamp = new Date().getTime();\n const migrationFileName = !js\n ? `${timestamp}_${name}.ts`\n : `${timestamp}_${name}.js`;\n const migrationFilePath = path.join(migrationFolderPath, migrationFileName);\n\n let migrationTemplate: string;\n switch (mode) {\n case \"alter\":\n migrationTemplate = MigrationTemplates.alterMigrationTemplate(js, table);\n break;\n case \"create\":\n migrationTemplate = MigrationTemplates.createMigrationTemplate(js, table);\n break;\n default:\n migrationTemplate = MigrationTemplates.basicMigrationTemplate(js);\n break;\n }\n\n fs.writeFileSync(migrationFilePath, migrationTemplate);\n logger.info(`Migration created successfully at '${migrationFilePath}'.`);\n process.exit(0);\n};\n","import fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path, { join } from \"node:path\";\nimport { pathToFileURL } from \"url\";\nimport { env } from \"../env/env\";\nimport { HysteriaError } from \"../errors/hysteria_error\";\nimport { Migration } from \"../sql/migrations/migration\";\nimport type {\n MysqlConnectionInstance,\n PgPoolClientInstance,\n SqlDataSourceType,\n SqliteConnectionInstance,\n SqlPoolType,\n} from \"../sql/sql_data_source_types\";\nimport { importTsUniversal } from \"../utils/importer\";\nimport { MigrationTableType } from \"./resources/migration_table_type\";\nimport MigrationTemplates from \"./resources/migration_templates\";\n\nconst importMigrationFile = async (filePath: string, tsconfigPath?: string) => {\n const isTs = filePath.endsWith(\".ts\");\n if (isTs) {\n await import(\"typescript\").catch(() => {\n throw new HysteriaError(\n \"MigrationUtils::importMigrationFile In order to use TypeScript migrations, you must have `typeScript` installed in your project. Please install it with `npm install typescript --save-dev`, if you're in a production environment, it's recommended to transpile your migrations to JavaScript before running the application.\",\n \"MIGRATION_MODULE_NOT_FOUND\",\n );\n });\n\n await import(\"esbuild\").catch(() => {\n throw new HysteriaError(\n \"MigrationUtils::importMigrationFile In order to use TypeScript migrations, you must have `esbuild` installed in your project. Please install it with `npm install esbuild --save-dev`, if you're in a production environment, it's recommended to transpile your migrations to JavaScript before running the application.\",\n \"MIGRATION_MODULE_NOT_FOUND\",\n );\n });\n\n await import(\"bundle-require\").catch(() => {\n throw new HysteriaError(\n \"MigrationUtils::importMigrationFile In order to use TypeScript migrations, you must have `bundle-require` installed in your project. Please install it with `npm install bundle-require --save-dev`, if you're in a production environment, it's recommended to transpile your migrations to JavaScript before running the application.\",\n \"MIGRATION_MODULE_NOT_FOUND\",\n );\n });\n\n return importTsUniversal(filePath, tsconfigPath);\n }\n\n try {\n const fileUrl = pathToFileURL(filePath).href;\n return import(fileUrl);\n } catch (error) {\n const require = createRequire(import.meta.url);\n try {\n const module = require(filePath);\n return {\n default: module.default || module,\n ...module,\n };\n } catch (requireError) {\n throw new HysteriaError(\n `MigrationUtils::importMigrationFile Failed to import migration file: ${filePath}. Both ESM and CommonJS imports failed.`,\n \"MIGRATION_MODULE_NOT_FOUND\",\n );\n }\n }\n};\n\nexport async function getMigrationTable(\n dbType: SqlDataSourceType,\n sqlConnection: SqlPoolType,\n): Promise<MigrationTableType[]> {\n switch (dbType) {\n case \"mariadb\":\n case \"mysql\":\n const mysqlConnection = sqlConnection as MysqlConnectionInstance;\n await mysqlConnection.query(\n MigrationTemplates.migrationTableTemplateMysql(),\n );\n const result = await mysqlConnection.query(\n MigrationTemplates.selectAllFromMigrationsTemplate(),\n );\n return result[0] as MigrationTableType[];\n\n case \"postgres\":\n case \"cockroachdb\":\n const pgConnection = sqlConnection as PgPoolClientInstance;\n await pgConnection.query(MigrationTemplates.migrationTableTemplatePg());\n const pgResult = await pgConnection.query(\n MigrationTemplates.selectAllFromMigrationsTemplate(),\n );\n return pgResult.rows as MigrationTableType[];\n\n case \"sqlite\":\n await promisifySqliteQuery(\n MigrationTemplates.migrationTableTemplateSQLite(),\n [],\n sqlConnection as SqliteConnectionInstance,\n );\n\n return (\n (await promisifySqliteQuery<MigrationTableType>(\n MigrationTemplates.selectAllFromMigrationsTemplate(),\n [],\n sqlConnection as SqliteConnectionInstance,\n )) || []\n );\n\n default:\n throw new HysteriaError(\n \"MigrationUtils::getMigrationTable Unsupported database type\",\n \"DEVELOPMENT_ERROR\",\n );\n }\n}\n\nexport async function getMigrations(\n dbType: SqlDataSourceType,\n migrationPath?: string,\n tsconfigPath?: string,\n): Promise<Migration[]> {\n const migrationNames = findMigrationNames(migrationPath);\n const migrations: Migration[] = [];\n\n for (const migrationName of migrationNames) {\n const migrationModule = await findMigrationModule(\n migrationName,\n migrationPath,\n tsconfigPath,\n );\n\n const migration: Migration = new migrationModule(dbType || env.DB_TYPE);\n migration.migrationName = migrationName;\n migrations.push(migration);\n }\n\n return migrations;\n}\n\nexport function getPendingMigrations(\n migrations: Migration[],\n migrationTable: MigrationTableType[],\n): Migration[] {\n return migrations.filter((migration) => {\n const migrationName = migration.migrationName;\n const migrationEntry = migrationTable.find(\n (migration) => migration.name === migrationName,\n );\n\n return !migrationEntry;\n });\n}\n\nasync function loadMigrationModule(\n pathToFile: string,\n tsconfigPath?: string,\n): Promise<new (dbType: SqlDataSourceType) => Migration> {\n const migrationModule = await importMigrationFile(pathToFile, tsconfigPath);\n if (!migrationModule.default) {\n throw new HysteriaError(\n \"MigrationUtils::loadMigrationModule Migration module does not have a default export\",\n \"MIGRATION_MODULE_NOT_FOUND\",\n );\n }\n\n return migrationModule.default;\n}\n\nasync function findMigrationModule(\n migrationName: string,\n migrationModulePath: string = env.MIGRATION_PATH || \"database/migrations\",\n tsconfigPath?: string,\n): Promise<new (dbType: SqlDataSourceType) => Migration> {\n migrationModulePath = join(migrationModulePath, migrationName);\n const migrationPath = path.resolve(process.cwd(), migrationModulePath);\n const migrationModule = await loadMigrationModule(\n migrationPath,\n tsconfigPath,\n );\n\n if (!migrationModule) {\n throw new HysteriaError(\n \"MigrationUtils::findMigrationModule migrations module not found for migration: \" +\n migrationName,\n \"MIGRATION_MODULE_NOT_FOUND\",\n );\n }\n\n return migrationModule;\n}\n\nfunction findMigrationNames(inputMigrationPath?: string): string[] {\n const currentUserDirectory = process.cwd();\n const migrationPath = path.resolve(\n inputMigrationPath || env.MIGRATION_PATH || \"database/migrations\",\n );\n\n const fullPathToMigrationPath = path.resolve(\n currentUserDirectory,\n migrationPath,\n );\n\n try {\n const migrationFiles = fs\n .readdirSync(fullPathToMigrationPath)\n .filter((file) => {\n const ext = path.extname(file);\n const fullFilePath = path.join(fullPathToMigrationPath, file);\n const isFile = fs.statSync(fullFilePath).isFile();\n return isFile && (ext === \".ts\" || ext === \".js\");\n });\n\n if (migrationFiles.length) {\n return migrationFiles;\n }\n\n throw new HysteriaError(\n \"MigrationUtils::findMigrationNames No database migration files found on path: \" +\n fullPathToMigrationPath,\n \"MIGRATION_MODULE_NOT_FOUND\",\n );\n } catch (error) {\n throw new HysteriaError(\n \"MigrationUtils::findMigrationNames No database migration files found on path: \" +\n fullPathToMigrationPath,\n \"MIGRATION_MODULE_NOT_FOUND\",\n );\n }\n}\n\nexport async function promisifySqliteQuery<T>(\n query: string,\n params: any,\n sqLiteConnection: SqliteConnectionInstance,\n): Promise<T[]> {\n return new Promise<T[]>((resolve, reject) => {\n sqLiteConnection.all<T>(query, params, (err, results) => {\n if (err) {\n reject(err);\n }\n resolve(results);\n });\n });\n}\n","import { bundleRequire } from \"bundle-require\";\nimport path from \"node:path\";\n\nexport async function importTsUniversal<T = any>(\n entry: string,\n tsconfigPath?: string,\n): Promise<T> {\n const filepath = path.isAbsolute(entry)\n ? entry\n : path.resolve(process.cwd(), entry);\n\n const { mod } = await bundleRequire({\n filepath,\n format: \"esm\",\n preserveTemporaryFile: false,\n esbuildOptions: {\n keepNames: true,\n sourcemap: true,\n },\n tsconfig: tsconfigPath ?? \"./tsconfig.json\",\n external: [\n \"ioredis\",\n \"mongodb\",\n \"pg\",\n \"mysql2\",\n \"sqlite3\",\n \"bundle-require\",\n \"esbuild\",\n \"sql-formatter\",\n \"sql-highlight\",\n \"reflect-metadata\",\n \"pluralize\",\n \"dayjs\",\n \"async-mutex\",\n \"commander\",\n ],\n });\n\n return mod as T;\n}\n","import { Migration } from \"../sql/migrations/migration\";\nimport { Migrator } from \"../sql/migrations/migrator\";\nimport { type SqlDataSource } from \"../sql/sql_data_source\";\nimport {\n AugmentedSqlDataSource,\n SqlDataSourceType,\n} from \"../sql/sql_data_source_types\";\nimport { Transaction } from \"../sql/transactions/transaction\";\nimport logger from \"../utils/logger\";\nimport { getMigrations, getMigrationTable } from \"./migration_utils\";\nimport { MigrationTableType } from \"./resources/migration_table_type\";\n\nexport default async function runMigrationsConnector(\n sql: SqlDataSource | AugmentedSqlDataSource,\n runUntil?: string,\n migrationPath?: string,\n tsconfigPath?: string,\n transactional?: boolean,\n) {\n const dbType = sql.getDbType();\n let trx: Transaction | null = null;\n logger.info(\"Running migrations for database type: \" + dbType);\n\n try {\n const migrationTable: MigrationTableType[] = await getMigrationTable(\n dbType as SqlDataSourceType,\n sql.getPool(),\n );\n const migrations: Migration[] = await getMigrations(\n dbType as SqlDataSourceType,\n migrationPath,\n tsconfigPath,\n );\n\n const pendingMigrations = migrations.filter(\n (migration) =>\n !migrationTable\n .map((table) => table.name)\n .includes(migration.migrationName),\n );\n\n if (!pendingMigrations.length) {\n logger.info(\"No pending migrations.\");\n return;\n }\n\n if (runUntil) {\n const runUntilIndex = pendingMigrations.findIndex(\n (migration) => migration.migrationName === runUntil,\n );\n\n if (runUntilIndex === -1) {\n console.error(`Migration ${runUntil} not found.`);\n return;\n }\n\n const filteredMigrations = pendingMigrations.slice(0, runUntilIndex + 1);\n\n if (transactional) {\n trx = await sql.startTransaction();\n sql = trx.sql as SqlDataSource;\n }\n\n const migrator = new Migrator(sql);\n await migrator.upMigrations(filteredMigrations);\n\n if (transactional) {\n await trx?.commit();\n }\n\n logger.info(\"Migrations ran successfully\");\n return;\n }\n\n const migrator = new Migrator(sql);\n if (transactional) {\n trx = await sql.startTransaction();\n sql = trx.sql as SqlDataSource;\n }\n\n await migrator.upMigrations(pendingMigrations);\n\n if (transactional) {\n await trx?.commit();\n }\n } catch (error: any) {\n if (transactional) {\n await trx?.rollback();\n }\n\n throw error;\n }\n\n logger.info(\"Migrations ran successfully\");\n}\n","import { CacheAdapter } from \"../cache_adapter\";\n\nconst inMemoryCache = new Map<string, any>();\n\nexport class InMemoryAdapter implements CacheAdapter {\n async get<T = void>(key: string): Promise<T> {\n return inMemoryCache.get(key);\n }\n\n async set<T = any>(key: string, data: T, ttl?: number): Promise<void> {\n inMemoryCache.set(key, data);\n if (ttl) {\n setTimeout(() => {\n inMemoryCache.delete(key);\n }, ttl);\n }\n }\n\n async invalidate(key: string): Promise<void> {\n inMemoryCache.delete(key);\n }\n}\n","import { HysteriaError } from \"../errors/hysteria_error\";\nimport type {\n DataSourceInput,\n DataSourceType,\n MongoDataSourceInput,\n MysqlSqlDataSourceInput,\n PostgresSqlDataSourceInput,\n SqliteDataSourceInput,\n} from \"./data_source_types\";\nimport { env } from \"../env/env\";\n\nexport abstract class DataSource {\n declare type: DataSourceType;\n declare host: string;\n declare port: number;\n declare username: string;\n declare password: string;\n declare database: string;\n declare url: string;\n declare logs: boolean;\n\n protected constructor(input?: DataSourceInput) {\n this.type = input?.type || (env.DB_TYPE as DataSourceType);\n switch (this.type) {\n case \"mongo\":\n this.handleMongoSource(input as MongoDataSourceInput);\n break;\n case \"cockroachdb\":\n this.handleCockroachdbSource(input as PostgresSqlDataSourceInput);\n break;\n case \"postgres\":\n this.handlePostgresSource(input as PostgresSqlDataSourceInput);\n break;\n case \"mariadb\":\n case \"mysql\":\n this.handleMysqlSource(input as MysqlSqlDataSourceInput);\n break;\n case \"sqlite\":\n this.handleSqliteSource(input as SqliteDataSourceInput);\n break;\n default:\n throw new HysteriaError(\n `Invalid database type: ${this.type}, please provide a valid database type in your input or in the .env file with the key DB_TYPE\nValid database types are: [mongo, postgres, cockroachdb, mysql, mariadb, sqlite]`,\n `UNSUPPORTED_DATABASE_TYPE_${this.type}`,\n );\n }\n }\n\n protected handleCockroachdbSource(input?: PostgresSqlDataSourceInput) {\n this.host = (input?.host || env.DB_HOST) as string;\n this.port = +(input?.port as number) || +(env.DB_PORT as string);\n this.username = (input?.username || env.DB_USER) as string;\n this.password = (input?.password || env.DB_PASSWORD) as string;\n this.database = (input?.database || env.DB_DATABASE) as string;\n this.logs = input?.logs || env.DB_LOGS || false;\n\n if (!this.port) {\n this.port = 26257;\n }\n }\n\n protected handlePostgresSource(input?: PostgresSqlDataSourceInput) {\n this.host = (input?.host || env.DB_HOST) as string;\n this.port = +(input?.port as number) || +(env.DB_PORT as string);\n this.username = (input?.username || env.DB_USER) as string;\n this.password = (input?.password || env.DB_PASSWORD) as string;\n this.database = (input?.database || env.DB_DATABASE) as string;\n this.logs = input?.logs || env.DB_LOGS || false;\n\n if (!this.port) {\n this.port = 5432;\n }\n }\n\n protected handleMysqlSource(input?: MysqlSqlDataSourceInput) {\n this.host = (input?.host || env.DB_HOST) as string;\n this.port = +(input?.port as number) || +(env.DB_PORT as string);\n this.username = (input?.username || env.DB_USER) as string;\n this.password = (input?.password || env.DB_PASSWORD) as string;\n this.database = (input?.database || env.DB_DATABASE) as string;\n this.logs = input?.logs || env.DB_LOGS || false;\n\n if (!this.port) {\n this.port = 3306;\n }\n }\n\n protected handleSqliteSource(input?: SqliteDataSourceInput) {\n this.database = (input?.database || env.DB_DATABASE) as string;\n this.logs = input?.logs || env.DB_LOGS || false;\n }\n\n protected handleMongoSource(input?: MongoDataSourceInput) {\n this.url = input?.url || (env.MONGO_URL as string);\n this.logs = input?.logs || env.MONGO_LOGS || false;\n }\n}\n","import { ColumnType } from \"../sql/models/decorators/model_decorators_types\";\nimport { Model } from \"../sql/models/model\";\nimport { OpenApiModelPropertyType, OpenApiModelType } from \"./openapi_types\";\n\n/**\n * @description Detects column type from decorator metadata and serialize/prepare functions in best effort\n * @description By default it tries to cover the base serialization of the base columns types like column.integer, column.boolean etc.\n */\nconst detectColumnType = (column: ColumnType): OpenApiModelPropertyType => {\n const { required, ...rest } = column.openApi || {};\n const baseType: OpenApiModelPropertyType = {\n ...rest,\n type: column.openApi?.type || \"string\",\n description:\n column.openApi?.description ?? `Property: ${column.columnName}`,\n };\n\n // if an explicit openApi.type was provided, we honor it\n if (column.openApi?.type) {\n return {\n ...baseType,\n type: column.openApi.type,\n };\n }\n\n // enum (array of allowed string values)\n if (Array.isArray(column.type)) {\n return {\n ...baseType,\n type: \"string\",\n enum: column.type as string[],\n };\n }\n\n // dates / times\n if (\n column.type === \"date\" ||\n column.type === \"datetime\" ||\n column.type === \"timestamp\" ||\n column.type === \"time\"\n ) {\n return {\n ...baseType,\n type: \"string\",\n format: \"date-time\",\n };\n }\n\n // boolean\n if (column.type === \"boolean\") {\n return {\n ...baseType,\n type: \"boolean\",\n };\n }\n\n // integer-like types\n if (\n column.type === \"integer\" ||\n column.type === \"tinyint\" ||\n column.type === \"smallint\" ||\n column.type === \"mediumint\" ||\n column.type === \"increment\"\n ) {\n return {\n ...baseType,\n type: \"integer\",\n format: \"int32\",\n };\n }\n\n // big integers\n if (column.type === \"biginteger\" || column.type === \"bigIncrement\") {\n return {\n ...baseType,\n type: \"integer\",\n format: \"int64\",\n };\n }\n\n // floating / decimal numbers\n if (column.type === \"float\" || column.type === \"real\") {\n return {\n ...baseType,\n type: \"number\",\n format: \"float\",\n };\n }\n\n if (column.type === \"double\") {\n return {\n ...baseType,\n type: \"number\",\n format: \"double\",\n };\n }\n\n if (column.type === \"decimal\" || column.type === \"numeric\") {\n // decimals can be represented as numbers but some APIs prefer strings for precision\n return {\n ...baseType,\n type: \"number\",\n };\n }\n\n // JSON\n if (column.type === \"json\" || column.type === \"jsonb\") {\n return {\n ...baseType,\n type: \"object\",\n };\n }\n\n // UUID / ULID\n if (column.type === \"uuid\") {\n return {\n ...baseType,\n type: \"string\",\n format: \"uuid\",\n };\n }\n\n if (column.type === \"ulid\") {\n return {\n ...baseType,\n type: \"string\",\n format: \"ulid\",\n };\n }\n\n // text / string-like\n if (\n column.type === \"string\" ||\n column.type === \"char\" ||\n column.type === \"varchar\" ||\n column.type === \"text\" ||\n column.type === \"longtext\" ||\n column.type === \"mediumtext\" ||\n column.type === \"tinytext\"\n ) {\n return {\n ...baseType,\n type: \"string\",\n };\n }\n\n // binary / blob\n if (\n column.type === \"blob\" ||\n column.type === \"binary\" ||\n column.type === \"varbinary\" ||\n column.type === \"tinyblob\" ||\n column.type === \"mediumblob\" ||\n column.type === \"longblob\"\n ) {\n return {\n ...baseType,\n type: \"string\",\n format: \"binary\",\n };\n }\n\n // year\n if (column.type === \"year\") {\n return {\n ...baseType,\n type: \"integer\",\n format: \"int32\",\n };\n }\n\n // fallback to baseType\n return baseType;\n};\n\n/**\n * Determines if a column is required based on metadata and TypeScript type\n */\nconst isColumnRequired = (column: ColumnType): boolean => {\n return column.openApi?.required ?? false;\n};\n\n/**\n * Generates OpenAPI properties from model columns\n */\nconst generateColumnProperties = (\n model: typeof Model,\n): Record<string, OpenApiModelPropertyType> => {\n const columns = model.getColumns();\n const properties: Record<string, OpenApiModelPropertyType> = {};\n\n for (const column of columns) {\n if (column.hidden) {\n continue;\n }\n\n properties[column.columnName] = detectColumnType(column);\n }\n\n return properties;\n};\n\n/**\n * Gets required fields based on column metadata and TypeScript types\n */\nconst getRequiredFields = (model: typeof Model): string[] => {\n const columns = model.getColumns();\n const required: string[] = [];\n\n for (const column of columns) {\n if (isColumnRequired(column)) {\n required.push(column.columnName);\n }\n }\n\n return required || [];\n};\n\n/**\n * Generates OpenAPI schema for a model\n */\nconst generateModelSchema = (model: typeof Model): OpenApiModelType => {\n const properties = generateColumnProperties(model);\n const required = getRequiredFields(model);\n\n return {\n type: \"object\",\n properties,\n required: required.length ? required : [],\n };\n};\n\n/**\n * Generates OpenAPI schemas for multiple models\n */\nexport const generateOpenApiModel = <T extends new () => Model>(\n models: T[],\n): OpenApiModelType[] => {\n return models.map((model) =>\n generateModelSchema(model as unknown as typeof Model),\n );\n};\n\n/**\n * Generates OpenAPI schema for a single model\n */\nexport const generateOpenApiModelSchema = <T extends new () => Model>(\n model: T,\n): OpenApiModelType => {\n return generateModelSchema(model as unknown as typeof Model);\n};\n\n/**\n * Generates OpenAPI schemas with additional metadata\n */\nexport const generateOpenApiModelWithMetadata = <T extends new () => Model>(\n models: T[],\n): Array<OpenApiModelType & { modelName: string; $id?: string }> => {\n return models.map((model) => ({\n ...generateModelSchema(model as unknown as typeof Model),\n modelName: model.name,\n $id: model.name,\n }));\n};\n","import crypto from \"node:crypto\";\n\n/**\n * Hashes a given value using SHA-256 algorithm\n * @param value - The value to hash\n * @param salt - Optional salt to add to the hash\n * @returns Promise<string> - The hashed value in hexadecimal format\n */\nexport const hashString = (value: string, salt?: string): string => {\n const hashInstance = crypto.createHash(\"sha256\");\n\n const valueToHash = salt ? salt + value : value;\n\n hashInstance.update(valueToHash);\n return hashInstance.digest(\"hex\");\n};\n\n/**\n * Verifies if a given value matches a hash\n * @param value - The value to verify\n * @param hash - The hash to compare against\n * @param salt - Optional salt that was used in the original hash\n * @returns Promise<boolean> - Whether the value matches the hash\n */\nexport async function verifyHash(\n value: string,\n hash: string,\n salt?: string,\n): Promise<boolean> {\n const hashedValue = hashString(value, salt);\n return hashedValue === hash;\n}\n","import { format } from \"sql-formatter\";\nimport { SqlDataSource } from \"../sql/sql_data_source\";\nimport { SqlDataSourceType } from \"../sql/sql_data_source_types\";\n\n/**\n * @description Removes the \"FROM\" clause and spaces around it from a statement insensitive to case\n */\nexport const removeFromStatement = (statement: string): string => {\n return statement.replace(/\\s?from\\s?/i, \"\");\n};\n\nexport const getSqlDialect = (\n sqlType: SqlDataSourceType,\n): \"mysql\" | \"postgresql\" | \"sqlite\" | \"mariadb\" | \"sql\" => {\n switch (sqlType) {\n case \"mysql\":\n return \"mysql\";\n\n case \"mariadb\":\n return \"mariadb\";\n\n case \"postgres\":\n case \"cockroachdb\":\n return \"postgresql\";\n\n case \"sqlite\":\n return \"sqlite\";\n\n default:\n return \"sql\";\n }\n};\n\nconst formatParam = (param: any): string => {\n if (param === null || param === undefined) {\n return \"NULL\";\n } else if (param instanceof Date) {\n return `'${param.toISOString()}'`;\n }\n\n const type = typeof param;\n if (type === \"boolean\") {\n return param ? \"TRUE\" : \"FALSE\";\n } else if (type === \"number\" && Number.isFinite(param)) {\n return String(param);\n } else if (type === \"bigint\") {\n return String(param);\n } else if (type === \"string\") {\n const escaped = param.replace(/'/g, \"''\");\n return `'${escaped}'`;\n }\n\n if (\n Array.isArray(param) ||\n (type === \"object\" && Object.keys(param).length > 0)\n ) {\n const json = JSON.stringify(param);\n const escaped = json.replace(/'/g, \"''\");\n return `'${escaped}'`;\n }\n\n return String(param);\n};\n\n/**\n * @description bind params into query, useful for logging and toQuery()\n */\nexport const bindParamsIntoQuery = (query: string, params: any[]): string => {\n let result = query;\n\n // Replace MySQL/SQLite-style placeholders (?) only up to params length\n for (let i = 0; i < params.length; i++) {\n if (!result.includes(\"?\")) {\n break;\n }\n result = result.replace(/\\?/, formatParam(params[i]));\n }\n\n // Replace PostgreSQL-style placeholders ($1, $2, ...)\n for (let i = 0; i < params.length; i++) {\n const pgPlaceholder = new RegExp(`\\\\$${i + 1}(?!\\\\d)`, \"g\");\n result = result.replace(pgPlaceholder, formatParam(params[i]));\n }\n\n return result;\n};\n\nexport const isTableMissingError = (\n sqlType: SqlDataSourceType,\n error: any,\n): boolean => {\n if (!error) {\n return false;\n }\n\n if (sqlType === \"mysql\" || sqlType === \"mariadb\") {\n return error.code === \"ER_NO_SUCH_TABLE\" || error.errno === 1146;\n }\n\n if (sqlType === \"postgres\" || sqlType === \"cockroachdb\") {\n return error.code === \"42P01\"; // undefined_table\n }\n\n if (sqlType === \"sqlite\") {\n return /no such table/i.test(String(error.message || \"\"));\n }\n\n return false;\n};\n\nexport const formatQuery = (sql: SqlDataSource, query: string): string => {\n const dbType = sql.getDbType();\n let formattedQuery: string;\n try {\n formattedQuery = format(query, {\n ...sql.inputDetails.queryFormatOptions,\n language: getSqlDialect(dbType as SqlDataSourceType),\n });\n } catch (_) {\n // Retry without language\n try {\n formattedQuery = format(query, {\n ...sql.inputDetails.queryFormatOptions,\n });\n } catch (_) {\n // Ultimate fallback\n formattedQuery = query;\n }\n }\n\n return formattedQuery;\n};\n","import { AstParser } from \"../../../ast/parser\";\nimport { AddColumnNode } from \"../../../ast/query/node/alter_table/add_column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlAddColumnInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode) {\n const acNode = node as AddColumnNode;\n const ast = new AstParser(this.model, \"mysql\" as SqlDataSourceType);\n let { sql } = ast.parse([acNode.column]);\n\n const inlineConstraints = (acNode as any).inlineConstraints;\n if (inlineConstraints && inlineConstraints.length > 0) {\n const constraintParts: string[] = [];\n\n for (const constraint of inlineConstraints) {\n const { sql: constraintSql } = ast.parse([constraint]);\n constraintParts.push(constraintSql);\n }\n\n if (constraintParts.length > 0) {\n sql += ` ${constraintParts.join(\" \")}`;\n }\n }\n\n return { sql: `add column ${sql}`, bindings: [] };\n }\n}\n\nexport default new MysqlAddColumnInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { AddConstraintNode } from \"../../../ast/query/node/alter_table/add_constraint\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlAddConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const acNode = node as AddConstraintNode;\n const ast = new AstParser(this.model, \"mysql\" as SqlDataSourceType);\n const { sql } = ast.parse([acNode.constraint]);\n return { sql: `add ${sql}`, bindings: [] };\n }\n}\nexport default new MysqlAddConstraintInterpreter();\n","import { AddPrimaryKeyNode } from \"../../../ast/query/node/alter_table/add_primary_key\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlAddPrimaryKeyInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const pk = node as AddPrimaryKeyNode;\n const cols = pk.columns.map((c) => `\\`${c}\\``).join(\", \");\n return { sql: `add primary key (${cols})`, bindings: [] };\n }\n}\nexport default new MysqlAddPrimaryKeyInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { AlterColumnTypeNode } from \"../../../ast/query/node/alter_table/alter_column_type\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlAlterColumnTypeInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const a = node as AlterColumnTypeNode;\n const ast = new AstParser(this.model, \"mysql\" as SqlDataSourceType);\n const { sql } = ast.parse([a.newType]);\n const [, ...rest] = sql.trim().split(/\\s+/);\n const typeSql = rest.join(\" \");\n\n // Generate type change SQL\n let resultSql = `modify column \\`${a.column}\\` ${typeSql}`;\n\n // Add constraint modifications\n if (a.options.nullable !== undefined) {\n const nullableSql = a.options.nullable ? \"\" : \" not null\";\n resultSql += nullableSql;\n }\n\n if (a.options.dropDefault) {\n resultSql += \" drop default\";\n } else if (a.options.default !== undefined) {\n let defaultValue = a.options.default;\n if (defaultValue === null) {\n defaultValue = \"null\";\n } else if (typeof defaultValue === \"string\") {\n if (defaultValue === \"NULL\") {\n defaultValue = \"null\";\n } else if (defaultValue === \"TRUE\" || defaultValue === \"FALSE\") {\n defaultValue = defaultValue.toLowerCase();\n } else {\n defaultValue = `'${defaultValue}'`;\n }\n }\n resultSql += ` default ${defaultValue}`;\n }\n\n if (a.options.unique !== undefined) {\n if (a.options.unique) {\n resultSql += \" unique\";\n }\n // MySQL doesn't support dropping unique constraint in modify column\n // It would need a separate ALTER TABLE statement\n }\n\n return { sql: resultSql, bindings: [] };\n }\n}\nexport default new MysqlAlterColumnTypeInterpreter();\n","export type CaseConvention =\n | \"camel\"\n | \"snake\"\n | \"preserve\"\n | RegExp\n | ((column: string) => string);\n\nfunction toSnake(str: any) {\n if (typeof str !== \"string\" || !str) {\n return str;\n }\n\n return str\n .replace(/([a-z])([A-Z])/g, \"$1_$2\")\n .replace(/([A-Z])([A-Z][a-z])/g, \"$1_$2\")\n .toLowerCase();\n}\n\nfunction toCamel(str: any) {\n if (typeof str !== \"string\" || !str) {\n return str;\n }\n\n return str.replace(/([-_][a-z])/g, (group) =>\n group.toUpperCase().replace(\"-\", \"\").replace(\"_\", \"\"),\n );\n}\n\nexport function convertCase(value: any, to: CaseConvention) {\n if (to === \"preserve\") {\n return value;\n }\n\n if (to === \"snake\") {\n return toSnake(value);\n }\n\n if (to === \"camel\") {\n return toCamel(value);\n }\n\n if (to instanceof RegExp) {\n return value.replace(to, (x: string) => x[1].toUpperCase());\n }\n\n return to(value);\n}\n","import dayjs from \"dayjs\";\nimport customParseFormat from \"dayjs/plugin/customParseFormat.js\";\nimport timezone from \"dayjs/plugin/timezone.js\";\nimport utc from \"dayjs/plugin/utc.js\";\nimport { HysteriaError } from \"../errors/hysteria_error\";\n\ndayjs.extend(utc);\ndayjs.extend(timezone);\ndayjs.extend(customParseFormat);\n\nexport type DateFormat = \"ISO\" | \"TIMESTAMP\" | \"DATE_ONLY\" | \"TIME_ONLY\";\nexport type Timezone = \"UTC\" | \"LOCAL\";\n\nexport const getDate = (\n date: Date,\n format: DateFormat = \"ISO\",\n timezone: Timezone = \"UTC\",\n): string => {\n if (!(date instanceof Date) || isNaN(date.getTime())) {\n throw new Error(\"Invalid date provided\");\n }\n\n const d = dayjs(date);\n\n if (timezone === \"LOCAL\") {\n const localDate = d.local();\n switch (format) {\n case \"ISO\":\n return localDate.format(\"YYYY-MM-DD HH:mm:ss\");\n case \"DATE_ONLY\":\n return localDate.format(\"YYYY-MM-DD\");\n case \"TIME_ONLY\":\n return localDate.format(\"HH:mm:ss\");\n default:\n return localDate.unix().toString();\n }\n }\n\n const utcDate = d.utc();\n switch (format) {\n case \"ISO\":\n return utcDate.format(\"YYYY-MM-DD HH:mm:ss\");\n case \"DATE_ONLY\":\n return utcDate.format(\"YYYY-MM-DD\");\n case \"TIME_ONLY\":\n return utcDate.format(\"HH:mm:ss\");\n default:\n return utcDate.unix().toString();\n }\n};\n\nexport const parseDate = (\n value: string | Date | null,\n format?: string,\n timezone: Timezone = \"UTC\",\n): Date | null => {\n if (value === null) {\n return null;\n }\n\n if (value instanceof Date) {\n if (isNaN(value.getTime())) {\n throw new HysteriaError(\"DateUtils::parseDate\", \"INVALID_DATE_OBJECT\");\n }\n return value;\n }\n\n try {\n const parsed = format ? dayjs(value, format) : dayjs(value);\n if (!parsed.isValid()) {\n throw new HysteriaError(\"DateUtils::parseDate\", \"INVALID_DATE_STRING\");\n }\n\n return timezone === \"UTC\" ? parsed.utc().toDate() : parsed.local().toDate();\n } catch (_) {\n throw new HysteriaError(\"DateUtils::parseDate\", \"FAILED_TO_PARSE_DATE\");\n }\n};\n\nexport const baseSoftDeleteDate = (date: Date = new Date()): string => {\n return dayjs(date).utc().format(\"YYYY-MM-DD HH:mm:ss\");\n};\n","import crypto, { privateDecrypt, publicEncrypt } from \"node:crypto\";\nimport { HysteriaError } from \"../errors/hysteria_error\";\n\n// #region Symmetric Encryption\nexport const encryptSymmetric = (key: string, value: string): string => {\n try {\n const keyBuffer = crypto.createHash(\"sha256\").update(key).digest();\n const iv = crypto.randomBytes(16);\n const cipher = crypto.createCipheriv(\"aes-256-cbc\", keyBuffer, iv);\n let encrypted = cipher.update(value, \"utf8\", \"hex\");\n encrypted += cipher.final(\"hex\");\n return `${iv.toString(\"hex\")}:${encrypted}`;\n } catch (error) {\n throw new HysteriaError(\n \"Encryption::encryptSymmetric\",\n \"FAILED_TO_ENCRYPT_SYMMETRICALLY\",\n error instanceof Error ? error : undefined,\n );\n }\n};\n\nexport const decryptSymmetric = (key: string, value: string): string => {\n try {\n const keyBuffer = crypto.createHash(\"sha256\").update(key).digest();\n const [ivHex, encrypted] = value.split(\":\");\n const decipher = crypto.createDecipheriv(\n \"aes-256-cbc\",\n keyBuffer,\n Buffer.from(ivHex, \"hex\"),\n );\n let decrypted = decipher.update(encrypted, \"hex\", \"utf8\");\n decrypted += decipher.final(\"utf8\");\n return decrypted;\n } catch (error) {\n throw new HysteriaError(\n \"Encryption::decryptSymmetric\",\n \"FAILED_TO_DECRYPT_SYMMETRICALLY\",\n error instanceof Error ? error : undefined,\n );\n }\n};\n// #endregion\n\n// #region Asymmetric Encryption\nexport const encryptAsymmetric = (publicKey: string, value: string): string => {\n try {\n // Generate a random symmetric key\n const symmetricKey = crypto.randomBytes(32);\n const iv = crypto.randomBytes(16);\n\n // Encrypt the data with AES\n const cipher = crypto.createCipheriv(\"aes-256-cbc\", symmetricKey, iv);\n let encryptedData = cipher.update(value, \"utf8\", \"hex\");\n encryptedData += cipher.final(\"hex\");\n\n // Encrypt the symmetric key with RSA\n const encryptedKey = publicEncrypt(publicKey, symmetricKey);\n\n // Combine all components\n return `${iv.toString(\"hex\")}:${encryptedKey.toString(\"hex\")}:${encryptedData}`;\n } catch (error) {\n throw new HysteriaError(\n \"Encryption::encryptAsymmetric\",\n \"FAILED_TO_ENCRYPT_ASYMMETRICALLY\",\n error instanceof Error ? error : undefined,\n );\n }\n};\n\nexport const decryptAsymmetric = (\n privateKey: string,\n value: string,\n): string => {\n try {\n const [ivHex, encryptedKeyHex, encryptedData] = value.split(\":\");\n\n const symmetricKey = privateDecrypt(\n privateKey,\n Buffer.from(encryptedKeyHex, \"hex\"),\n );\n\n const decipher = crypto.createDecipheriv(\n \"aes-256-cbc\",\n symmetricKey,\n Buffer.from(ivHex, \"hex\"),\n );\n\n let decrypted = decipher.update(encryptedData, \"hex\", \"utf8\");\n decrypted += decipher.final(\"utf8\");\n\n return decrypted;\n } catch (error) {\n throw new HysteriaError(\n \"Encryption::decryptAsymmetric\",\n \"FAILED_TO_DECRYPT_ASYMMETRICALLY\",\n error instanceof Error ? error : undefined,\n );\n }\n};\n// #endregion\n\nexport const generateKeyPair = (): {\n publicKey: string;\n privateKey: string;\n} => {\n const { publicKey, privateKey } = crypto.generateKeyPairSync(\"rsa\", {\n modulusLength: 4096,\n });\n\n return {\n publicKey: publicKey.export({ type: \"spki\", format: \"pem\" }).toString(),\n privateKey: privateKey.export({ type: \"pkcs8\", format: \"pem\" }).toString(),\n };\n};\n","type MetadataKey = string | symbol;\ntype Property = string | symbol | undefined;\n\ntype MetadataMap = Map<MetadataKey, unknown>;\ntype PropertyStore = Map<Property, MetadataMap>;\n\n/* Own version of reflect-metadata with only the features we need and without having to rely on the original package */\nexport class Reflect {\n private static store: WeakMap<object, PropertyStore> = new WeakMap();\n\n static defineMetadata(\n metadataKey: MetadataKey,\n metadataValue: unknown,\n target: object,\n propertyKey?: string | symbol,\n ): void {\n if (\n (typeof target !== \"object\" || target === null) &&\n typeof target !== \"function\"\n ) {\n throw new TypeError(\"target must be an object or function\");\n }\n\n let propStore = this.store.get(target);\n if (!propStore) {\n propStore = new Map();\n this.store.set(target, propStore);\n }\n\n let metaMap = propStore.get(propertyKey);\n if (!metaMap) {\n metaMap = new Map();\n propStore.set(propertyKey, metaMap);\n }\n\n metaMap.set(metadataKey, metadataValue);\n }\n\n static getMetadata<T = unknown>(\n metadataKey: MetadataKey,\n target: object,\n propertyKey?: string | symbol,\n ): T | undefined {\n if (\n (typeof target !== \"object\" || target === null) &&\n typeof target !== \"function\"\n ) {\n throw new TypeError(\"target must be an object or function\");\n }\n\n let current: object | null = target;\n while (current) {\n const propStore = this.store.get(current);\n if (propStore) {\n const metaMap = propStore.get(propertyKey);\n if (metaMap && metaMap.has(metadataKey)) {\n return metaMap.get(metadataKey) as T;\n }\n }\n\n current = Object.getPrototypeOf(current);\n }\n\n return;\n }\n}\n","import { randomBytes } from \"node:crypto\";\n\nconst ENCODING = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\";\nconst ENCODING_LEN = ENCODING.length;\nconst TIME_LEN = 10;\nconst RANDOM_LEN = 16;\n\n/**\n * Encodes a number to Base32 string\n */\nconst encodeTime = (now: number, length: number): string => {\n let str = \"\";\n for (let i = 0; i < length; i++) {\n const mod = now % ENCODING_LEN;\n str = ENCODING.charAt(mod) + str;\n now = (now - mod) / ENCODING_LEN;\n }\n return str;\n};\n\n/**\n * Generates random bytes and encodes them to Base32\n */\nconst encodeRandom = (length: number): string => {\n const bytes = randomBytes(length);\n let str = \"\";\n for (let i = 0; i < length; i++) {\n const randomByte = bytes[i];\n str += ENCODING.charAt(randomByte % ENCODING_LEN);\n }\n return str;\n};\n\n/**\n * Generates a ULID (Universally Unique Lexicographically Sortable Identifier) string, 26 characters long\n */\nexport const generateULID = (): string => {\n const now = Math.floor(Date.now() / 1000);\n const time = encodeTime(now, TIME_LEN);\n const random = encodeRandom(RANDOM_LEN);\n return time + random;\n};\n","import { HysteriaError } from \"../../errors/hysteria_error\";\n\nexport function convertValueToSQL(value: any, type: string): string {\n switch (type) {\n case \"string\":\n return `'${value}'`;\n case \"number\":\n case \"boolean\":\n return `${value}`;\n default:\n throw new HysteriaError(\n \"convertValueToSQL\",\n `UNSUPPORTED_DATABASE_TYPE_${type}`,\n );\n }\n}\n\nexport function stripIdentifierQuotes(identifier: string): string {\n return identifier.replace(/^[`\"]|[`\"]$/g, \"\");\n}\n\nexport function remapSelectedColumnToFromAlias(\n column: string,\n fromAlias: string,\n modelTable: string,\n): string {\n if (!column.includes(\".\")) {\n const cleanCol = stripIdentifierQuotes(column);\n return `${fromAlias}.${cleanCol}`;\n }\n\n let [table, col] = column.split(\".\");\n table = stripIdentifierQuotes(table);\n col = stripIdentifierQuotes(col);\n\n if (table !== modelTable) {\n return column;\n }\n\n if (col === \"*\") {\n return `${fromAlias}.*`;\n }\n\n return `${fromAlias}.${col}`;\n}\n\nexport function getColumnValue(column: string | (() => string)) {\n return typeof column === \"function\" ? column() : column;\n}\n\nexport const deepCloneNode = (val: any, seen = new WeakMap()): any => {\n if (val === null || typeof val !== \"object\") {\n return val;\n }\n\n if (seen.has(val)) {\n return seen.get(val);\n }\n\n if (Array.isArray(val)) {\n const arr: any[] = [];\n seen.set(val, arr);\n for (let i = 0; i < val.length; i++) {\n arr[i] = deepCloneNode(val[i], seen);\n }\n return arr;\n }\n\n const out: any = Object.create(Object.getPrototypeOf(val) || {});\n seen.set(val, out);\n\n for (const key of Object.getOwnPropertyNames(val)) {\n const v = (val as any)[key];\n if (typeof v === \"function\") {\n out[key] = v;\n continue;\n }\n\n out[key] = deepCloneNode(v, seen);\n }\n\n return out;\n};\n","import { CaseConvention } from \"./utils/case_utils\";\n\n/**\n * @description The most basic class for all models for both SQL and NoSQL databases\n * @internal Not meant to be used outside of the library\n */\nexport abstract class Entity {\n /**\n * @description Defines the case convention for the model\n * @description Useful in raw queries, better to leave it as none in Model definition so it will respect the exact column name from the model, else it will convert the column name to the case convention you choose (default is camel case)\n * @type {CaseConvention}\n */\n static modelCaseConvention: CaseConvention = \"camel\";\n\n /**\n * @description Defines the case convention for the database, this should be the case convention you use in your database\n * @type {CaseConvention}\n */\n static databaseCaseConvention: CaseConvention = \"snake\";\n}\n","import { convertCase } from \"../utils/case_utils\";\nimport { ColumnType } from \"./models/decorators/model_decorators_types\";\nimport { Model } from \"./models/model\";\n\nexport const parseDatabaseDataIntoModelResponse = async <\n T extends Record<string, any>,\n>(\n model: T,\n typeofModel: typeof Model,\n modelColumns: ColumnType[],\n modelColumnsMap: Map<string, ColumnType>,\n modelSelectedColumns: string[] = [],\n modelAnnotatedColumns: string[] = [],\n mustRemoveAnnotations: boolean = false,\n): Promise<T> => {\n const casedModel: Record<string, any> =\n new (typeofModel as unknown as new () => T)();\n const hiddenColumnsSet = new Set<string>(\n modelColumns\n .filter((column) => column.hidden)\n .map((column) => column.columnName),\n );\n\n const databaseColumnsMap = new Map<string, ColumnType>(\n modelColumns.map((modelColumn) => [modelColumn.databaseName, modelColumn]),\n );\n\n const modelSelectedColumnsSet = modelSelectedColumns.length\n ? new Set<string>(modelSelectedColumns)\n : null;\n\n await Promise.all(\n Object.keys(model).map(async (key) => {\n const databaseValue = model[key];\n const modelKey =\n databaseColumnsMap.get(key)?.columnName ??\n convertCase(key, typeofModel.modelCaseConvention);\n\n if (modelKey === \"$annotations\" && !mustRemoveAnnotations) {\n processAnnotations(\n model,\n key,\n casedModel,\n typeofModel,\n modelAnnotatedColumns,\n );\n return;\n }\n\n if (\n !modelColumnsMap.has(modelKey) || // Handled in the $annotations property\n hiddenColumnsSet.has(modelKey) ||\n (modelSelectedColumnsSet && !modelSelectedColumnsSet.has(modelKey))\n ) {\n return;\n }\n\n // Include null values\n if (databaseValue === null) {\n casedModel[modelKey] = null;\n return;\n }\n\n const modelColumn = modelColumnsMap.get(modelKey);\n if (modelColumn && modelColumn.serialize) {\n casedModel[modelKey] = await modelColumn.serialize(databaseValue);\n return;\n }\n\n casedModel[modelKey] = databaseValue;\n }),\n );\n\n // Fill model with modelSelectedColumns as null if not present in the model\n if (modelSelectedColumnsSet) {\n for (const column of modelSelectedColumnsSet) {\n if (!(column in casedModel)) {\n casedModel[column] = null;\n }\n }\n }\n\n return casedModel as T;\n};\n\nexport const processAnnotations = (\n model: Record<string, any>,\n key: string,\n casedModel: Record<string, any>,\n typeofModel: typeof Model,\n modelAnnotatedColumns: string[] = [],\n) => {\n const annotationsData = model[key];\n if (!annotationsData || !Object.keys(annotationsData).length) {\n return;\n }\n\n const modelAnnotatedColumnsSet =\n modelAnnotatedColumns.length > 0\n ? new Set<string>(modelAnnotatedColumns)\n : null;\n\n if (!modelAnnotatedColumnsSet) {\n return;\n }\n\n const $annotations: Record<string, any> = {};\n for (const objKey of Object.keys(annotationsData)) {\n if (modelAnnotatedColumnsSet.has(objKey)) {\n $annotations[convertCase(objKey, typeofModel.modelCaseConvention)] =\n annotationsData[objKey];\n }\n }\n\n if (Object.keys($annotations).length > 0) {\n casedModel[key] = $annotations;\n }\n};\n\n/**\n * @description Main serializer function\n */\nexport const serializeModel = async <T extends Model>(\n models: T[],\n typeofModel: typeof Model,\n modelSelectedColumns: string[] = [],\n modelAnnotatedColumns: string[] = [],\n mustRemoveAnnotations: boolean = false,\n): Promise<T | T[] | null> => {\n if (!models.length) {\n return null;\n }\n\n const modelColumns = typeofModel.getColumns();\n const modelColumnsMap = new Map<string, ColumnType>(\n modelColumns.map((modelColumn) => [modelColumn.columnName, modelColumn]),\n );\n\n // At this point `modelSelectedColumns` are in database convention\n const processedSelectedColumns: string[] = [];\n for (const databaseColumn of modelSelectedColumns) {\n // If alias, skip because it will be added in $annotations\n if (databaseColumn.toLowerCase().includes(\"as\")) {\n continue;\n }\n\n let processedColumn = databaseColumn;\n // If contains . it means it's something like user.name, so split it and return the last part since it was something useful for the query but at this point we want what to retrieve\n if (processedColumn.includes(\".\")) {\n processedColumn = processedColumn.split(\".\").pop() as string;\n }\n\n if (processedColumn === \"*\") {\n continue;\n }\n\n const columnName =\n modelColumnsMap.get(processedColumn)?.columnName ??\n convertCase(processedColumn, typeofModel.modelCaseConvention);\n processedSelectedColumns.push(columnName);\n }\n modelSelectedColumns = processedSelectedColumns;\n\n const serializedModels = await Promise.all(\n models.map(async (model) => {\n const serializedModel = await parseDatabaseDataIntoModelResponse(\n model,\n typeofModel,\n modelColumns,\n modelColumnsMap,\n modelSelectedColumns,\n modelAnnotatedColumns,\n mustRemoveAnnotations,\n );\n\n return serializedModel;\n }),\n );\n\n return serializedModels.length === 1 ? serializedModels[0] : serializedModels;\n};\n","import { SqlDataSourceType } from \"../sql_data_source_types\";\n\nexport const databasesWithReturning: SqlDataSourceType[] = [\n \"postgres\",\n \"cockroachdb\",\n];\n","import plural from \"pluralize\";\nimport { convertCase } from \"../../utils/case_utils\";\nimport { Model } from \"./model\";\n\nexport function getBaseTableName(target: typeof Model): string {\n const className = target.name;\n const snakeCaseName = convertCase(className, \"snake\");\n return plural(snakeCaseName);\n}\n\nexport function getBaseModelInstance<T extends Model>(): T {\n return {} as T;\n}\n","import { ModelManager } from \"./model_manager/model_manager\";\nimport type {\n FindOneType,\n FindReturnType,\n FindType,\n InsertOptions,\n ModelKey,\n ModelRelation,\n OnlyM2MRelations,\n UnrestrictedFindOneType,\n UnrestrictedFindType,\n UpsertOptions,\n WhereType,\n} from \"./model_manager/model_manager_types\";\nimport type { ModelQueryBuilder } from \"./model_query_builder/model_query_builder\";\nimport type {\n BaseModelMethodOptions,\n ModelWithoutRelations,\n} from \"./model_types\";\n\nimport { Entity } from \"../../entity\";\nimport { HysteriaError } from \"../../errors/hysteria_error\";\nimport { CaseConvention, convertCase } from \"../../utils/case_utils\";\nimport { baseSoftDeleteDate } from \"../../utils/date_utils\";\nimport { DryModelQueryBuilderWithoutReadOperations } from \"../query_builder/query_builder_types\";\nimport type {\n TableColumnInfo,\n TableIndexInfo,\n TableSchemaInfo,\n} from \"../schema_introspection_types\";\nimport { serializeModel } from \"../serializer\";\nimport { SqlDataSource } from \"../sql_data_source\";\nimport { databasesWithReturning } from \"../sql_runner/sql_runner_constants\";\nimport {\n belongsTo,\n column,\n getIndexes,\n getModelColumns,\n getPrimaryKey,\n getRelations,\n getRelationsMetadata,\n getUniques,\n hasMany,\n hasOne,\n manyToMany,\n} from \"./decorators/model_decorators\";\nimport {\n ColumnType,\n IndexType,\n LazyRelationType,\n UniqueType,\n} from \"./decorators/model_decorators_types\";\nimport { AnnotatedModel } from \"./model_query_builder/model_query_builder_types\";\nimport { getBaseTableName } from \"./model_utils\";\nimport { ManyToMany } from \"./relations/many_to_many\";\nimport { RelationEnum } from \"./relations/relation\";\n\n/**\n * @description Represents a Table in the Database\n */\nexport abstract class Model extends Entity {\n declare private \"*\": string;\n\n /**\n * @description The column used to soft delete a record, default is deletedAt\n */\n static softDeleteColumn = \"deletedAt\";\n\n /**\n * @description The value used to soft delete a record, default is the current date and time\n * @default format: \"YYYY-MM-DD HH:mm:ss\" in UTC timezone\n */\n static softDeleteValue: boolean | string = baseSoftDeleteDate();\n\n /**\n * @description The sql sqlInstance generated by SqlDataSource.connect\n */\n static sqlInstance: SqlDataSource;\n\n /**\n * @description Getter for the table name of the model\n */\n static get table(): string {\n const descriptor = Object.getOwnPropertyDescriptor(this, \"table\");\n if (descriptor && \"value\" in descriptor) {\n return descriptor.value;\n }\n\n return getBaseTableName(this);\n }\n\n /**\n * @description Setter for the table name of the model\n */\n static set table(value: string) {\n Object.defineProperty(this, \"table\", {\n value,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n\n /**\n * @description Getter for the primary key of the model\n */\n static get primaryKey(): string | undefined {\n return getPrimaryKey(this);\n }\n\n constructor() {\n super();\n }\n\n /**\n * @description Returns all the records for the given model\n */\n static async all<T extends Model>(\n this: new () => T | typeof Model,\n options: BaseModelMethodOptions = {},\n ): Promise<AnnotatedModel<T, {}>[]> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n return (await modelManager.find({\n ignoreHooks: options.ignoreHooks ? [\"afterFetch\", \"beforeFetch\"] : [],\n })) as AnnotatedModel<T, {}>[];\n }\n\n /**\n * @description Gives a query sqlInstance for the given model\n */\n static query<T extends Model>(\n this: new () => T | typeof Model,\n options?: Omit<BaseModelMethodOptions, \"ignoreHooks\">,\n ): ModelQueryBuilder<T> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n return modelManager.query() as ModelQueryBuilder<T>;\n }\n\n /**\n * @description Returns a dry query builder instance\n * @description The dry query builder instance will not execute the query\n */\n static dryQuery<T extends Model>(\n this: new () => T | typeof Model,\n options?: Omit<BaseModelMethodOptions, \"ignoreHooks\">,\n ): DryModelQueryBuilderWithoutReadOperations<T> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n return modelManager.dryQuery() as unknown as DryModelQueryBuilderWithoutReadOperations<T>;\n }\n\n /**\n * @description Finds the first record in the database\n * @deprecated Used only for debugging purposes, use findOne or query instead\n */\n static async first<T extends Model>(\n this: new () => T | typeof Model,\n options?: BaseModelMethodOptions,\n ): Promise<AnnotatedModel<T, {}> | null> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n return modelManager.query().one({\n ignoreHooks: options?.ignoreHooks ? [\"afterFetch\", \"beforeFetch\"] : [],\n });\n }\n\n /**\n * @description Finds records for the given model\n */\n static async find<\n T extends Model,\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(\n this: new () => T | typeof Model,\n findOptions?: FindType<T, S, R> | UnrestrictedFindType<T, S, R>,\n options?: Omit<BaseModelMethodOptions, \"ignoreHooks\">,\n ): Promise<FindReturnType<T, S, R>[]> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n return (await modelManager.find(\n findOptions as FindType<T, S, R>,\n )) as FindReturnType<T, S, R>[];\n }\n\n /**\n * @description Finds a record for the given model or throws an error if it doesn't exist\n */\n static async findOneOrFail<\n T extends Model,\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(\n this: new () => T | typeof Model,\n findOneOptions: (\n | FindOneType<T, S, R>\n | UnrestrictedFindOneType<T, S, R>\n ) & {\n customError?: Error;\n },\n options?: Omit<BaseModelMethodOptions, \"ignoreHooks\">,\n ): Promise<FindReturnType<T, S, R>> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n return (await modelManager.findOneOrFail(\n findOneOptions as FindOneType<T, S, R>,\n )) as FindReturnType<T, S, R>;\n }\n\n /**\n * @description Finds a record for the given model\n */\n static async findOne<\n T extends Model,\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(\n this: new () => T | typeof Model,\n findOneOptions: (FindOneType<T, S, R> | UnrestrictedFindOneType<T, S, R>) &\n BaseModelMethodOptions,\n options?: Omit<BaseModelMethodOptions, \"ignoreHooks\">,\n ): Promise<FindReturnType<T, S, R> | null> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n return (await modelManager.findOne(\n findOneOptions as FindOneType<T, S, R>,\n )) as FindReturnType<T, S, R> | null;\n }\n\n /**\n * @description Finds records for the given column and value\n */\n static async findBy<\n T extends Model,\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(\n this: new () => T | typeof Model,\n column: ModelKey<T>,\n value: string | number | boolean | Date | null,\n options: BaseModelMethodOptions = {},\n ): Promise<FindReturnType<T, S, R>[]> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n return (await modelManager.find({\n ignoreHooks: options.ignoreHooks ? [\"afterFetch\", \"beforeFetch\"] : [],\n where: {\n [column as unknown as keyof T]: value as T[keyof T],\n } as WhereType<T>,\n })) as FindReturnType<T, S, R>[];\n }\n\n /**\n * @description Finds the first record for the given column and value\n */\n static async findOneBy<\n T extends Model,\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(\n this: new () => T | typeof Model,\n column: ModelKey<T>,\n value: string | number | boolean | Date | null,\n options: BaseModelMethodOptions = {},\n ): Promise<FindReturnType<T, S, R> | null> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n return (await modelManager.findOne({\n ignoreHooks: options.ignoreHooks ? [\"afterFetch\", \"beforeFetch\"] : [],\n where: {\n [column as keyof T]: value as T[keyof T],\n } as WhereType<T>,\n })) as FindReturnType<T, S, R> | null;\n }\n\n /**\n * @description Finds a record for the given model for the given value, the model must have a primary key defined else it will throw an error\n */\n static async findOneByPrimaryKey<\n T extends Model,\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(\n this: new () => T | typeof Model,\n value: string | number,\n options: Omit<BaseModelMethodOptions, \"ignoreHooks\"> = {},\n ): Promise<FindReturnType<T, S, R> | null> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n return (await modelManager.findOneByPrimaryKey(value)) as FindReturnType<\n T,\n S,\n R\n > | null;\n }\n\n /**\n * @description Refreshes a model from the database, the model must have a primary key defined\n */\n static async refresh<T extends Model>(\n this: new () => T | typeof Model,\n model: T,\n options: Omit<BaseModelMethodOptions, \"ignoreHooks\"> = {},\n ): Promise<AnnotatedModel<T, {}> | null> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n const primaryKey = typeofModel.primaryKey as keyof T;\n const primaryKeyValue = model[primaryKey];\n const refreshedModel = await modelManager.findOneByPrimaryKey(\n primaryKeyValue as string,\n );\n if (!refreshedModel) {\n return null;\n }\n\n return refreshedModel;\n }\n\n /**\n * @description Saves a new record to the database\n * @description $annotations will be ignored if set in the modelData and won't be returned in the response\n * @warning If not using postgres and the model has no primary key, the model will be saved, but it won't be possible to retrieve it so at that point it will be returned as null, this is not typed as Model | null for type safety reasons\n * @mysql If no Primary Key is present in the model definition, the model will be returned\n * @sqlite If no Primary Key is present in the model definition, the model will be returned\n * @sqlite Returning Not supported and won't have effect\n */\n static async insert<T extends Model>(\n this: new () => T | typeof Model,\n modelData: Partial<ModelWithoutRelations<T>>,\n options: BaseModelMethodOptions & InsertOptions<T> = {},\n ): Promise<AnnotatedModel<T, {}>> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n return modelManager.insert(modelData as T, {\n ignoreHooks: options.ignoreHooks,\n returning: options.returning,\n });\n }\n\n /**\n * @description Saves multiple records to the database\n * @description $annotations will be ignored if set in the modelData and won't be returned in the response\n * @warning If not using postgres and the model has no primary key, the models will be saved, but it won't be possible to retrieve them so at that point they will be returned as an empty array\n * @mysql If no Primary Key is present in the model definition, the model will be returned\n * @sqlite If no Primary Key is present in the model definition, the model will be returned\n * @sqlite Returning Not supported and won't have effect\n */\n static async insertMany<T extends Model>(\n this: new () => T | typeof Model,\n modelsData: Partial<ModelWithoutRelations<T>>[],\n options: BaseModelMethodOptions & InsertOptions<T> = {},\n ): Promise<AnnotatedModel<T, {}>[]> {\n if (!modelsData.length) {\n return [];\n }\n\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n return modelManager.insertMany(modelsData as T[], {\n ignoreHooks: options.ignoreHooks,\n returning: options.returning,\n });\n }\n\n /**\n * @description Syncs in the through table the given models for the given relation\n * @param relation The many to many relation to sync, this is not type safe since many to many relations defined at a decorator level\n * @param leftModel The source (left) model instance to synchronize in the many-to-many relation.\n * @param rightModels The target (right) model instances to associate with the left model in the join table.\n * @param joinTableCustomData Optional function that returns custom data for each join table row (receives rightModel and index)\n * @param options.caseConvention Optional. Controls naming convention for left/right foreign keys in the join table. Defaults to the left model's convention; set to `none` to disable.\n * @warning Use only when the join table contains no business logic beyond foreign keys. For business logic, define and use a dedicated join model.\n * @warning This method does not trigger hooks on the join table, even if a Model exists. Use the join model's `insertMany` for hook support.\n * @throws {HysteriaError} If the specified relation does not exist on the model.\n * @throws {HysteriaError} If the specified relation is not a many-to-many relation.\n */\n static async sync<T extends Model, R extends OnlyM2MRelations<T>>(\n this: new () => T | typeof Model,\n relation: R,\n leftModel: T,\n rightModels: T[R] extends any[] ? T[R] : T[R][],\n joinTableCustomData?: (\n rightModel: T[R] extends any[] ? T[R][number] : T[R],\n index: number,\n ) => Record<string, any>,\n options: BaseModelMethodOptions & { caseConvention?: CaseConvention } = {},\n ): Promise<void> {\n if (!Array.isArray(rightModels)) {\n rightModels = [rightModels] as T[R] extends any[] ? T[R] : T[R][];\n }\n\n if (!rightModels.length) {\n return;\n }\n\n const typeofModel = this as unknown as typeof Model;\n const modelRelations = getRelations(typeofModel);\n const m2mRelation = modelRelations.find(\n (r) => r.columnName === relation,\n ) as ManyToMany;\n\n if (!m2mRelation) {\n throw new HysteriaError(\n `${typeofModel.name}::sync`,\n \"RELATION_NOT_FOUND\",\n );\n }\n\n if (m2mRelation.type !== RelationEnum.manyToMany) {\n throw new HysteriaError(\n `${typeofModel.name}::sync`,\n \"RELATION_NOT_MANY_TO_MANY\",\n );\n }\n\n const casedLeftForeignKey = convertCase(\n m2mRelation.leftForeignKey,\n options.caseConvention || typeofModel.databaseCaseConvention,\n );\n\n const casedRightForeignKey = convertCase(\n m2mRelation.rightForeignKey,\n options.caseConvention || typeofModel.databaseCaseConvention,\n );\n\n const joinTableModelsToInsert = rightModels.map((rightModel, index) => ({\n [casedLeftForeignKey]: leftModel[typeofModel.primaryKey as keyof T],\n [casedRightForeignKey]:\n rightModel[m2mRelation.model.primaryKey as keyof T],\n ...(joinTableCustomData ? joinTableCustomData(rightModel, index) : {}),\n }));\n\n class ThroughModel extends Model {\n static databaseCaseConvention: CaseConvention = \"preserve\";\n static modelCaseConvention: CaseConvention = \"preserve\";\n\n static get table() {\n return m2mRelation.throughModel;\n }\n }\n\n const throughModelManager =\n ThroughModel.dispatchModelManager<InstanceType<typeof ThroughModel>>(\n options,\n );\n\n await throughModelManager.insertMany(joinTableModelsToInsert);\n }\n\n /**\n * @description Updates a record, returns the updated record\n * @description Model is retrieved from the database using the primary key regardless of any model hooks\n * @description Can only be used if the model has a primary key, use a massive update if the model has no primary key\n * @throws {HysteriaError} If the model has no primary key\n */\n static async updateRecord<T extends Model>(\n this: new () => T | typeof Model,\n modelSqlInstance: Partial<T>,\n updatePayload?: Partial<ModelWithoutRelations<T>>,\n options: Omit<BaseModelMethodOptions, \"ignoreHooks\"> = {},\n ): Promise<AnnotatedModel<T, {}>> {\n try {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n updatePayload &&\n typeofModel.combineProps(modelSqlInstance, updatePayload as Partial<T>);\n const updatedModel = await modelManager.updateRecord(modelSqlInstance);\n return updatedModel;\n } catch (error) {\n if (\n error instanceof HysteriaError &&\n error.message === \"MODEL_HAS_NO_PRIMARY_KEY\"\n ) {\n throw new HysteriaError(\n `${this.name}::updateRecord`,\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n throw error;\n }\n }\n\n /**\n * @description Finds the first record or creates a new one if it doesn't exist\n */\n static async firstOrInsert<T extends Model, O extends boolean = false>(\n this: new () => T | typeof Model,\n searchCriteria: Partial<ModelWithoutRelations<T>>,\n createData: Partial<ModelWithoutRelations<T>>,\n options: Omit<BaseModelMethodOptions, \"ignoreHooks\"> & {\n fullResponse?: O;\n } = {},\n ): Promise<\n O extends true\n ? {\n isNew: boolean;\n model: T;\n }\n : T\n > {\n if (!options.fullResponse) {\n options.fullResponse = false as O;\n }\n\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n const doesExist = (await modelManager.findOne({\n where: searchCriteria as WhereType<T>,\n })) as T;\n\n if (doesExist) {\n if (options.fullResponse) {\n return {\n isNew: false,\n model: doesExist,\n } as O extends true ? { isNew: boolean; model: T } : T;\n }\n\n return doesExist as O extends true ? { isNew: boolean; model: T } : T;\n }\n\n const newModel = (await modelManager.insert(createData as T)) as T;\n if (options.fullResponse) {\n return {\n isNew: true,\n model: newModel,\n } as O extends true ? { isNew: boolean; model: T } : T;\n }\n\n return newModel as O extends true ? { isNew: boolean; model: T } : T;\n }\n\n /**\n * @description Updates or creates a new record, if no searchCriteria payload is provided, provided data will be inserted as is\n */\n static async upsert<T extends Model>(\n this: new () => T | typeof Model,\n searchCriteria: Partial<ModelWithoutRelations<T>>,\n data: Partial<ModelWithoutRelations<T>>,\n options: UpsertOptions<T> & BaseModelMethodOptions = {\n updateOnConflict: true,\n },\n ): Promise<AnnotatedModel<T, {}>> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n const hasSearchCriteria = Object.keys(searchCriteria).length > 0;\n\n // If no search criteria is given, it is given for granted that record must be created\n const doesExist = !hasSearchCriteria\n ? null\n : await modelManager.findOne({\n ignoreHooks: options.ignoreHooks ? [\"afterFetch\", \"beforeFetch\"] : [],\n where: searchCriteria as WhereType<T>,\n });\n\n if (doesExist) {\n (data as T)[typeofModel.primaryKey as keyof T] =\n doesExist[typeofModel.primaryKey as keyof ModelWithoutRelations<T>];\n\n if (options.updateOnConflict) {\n return (await modelManager.updateRecord(data as T, {\n returning: options.returning as ModelKey<T>[] | undefined,\n })) as T;\n }\n\n return doesExist;\n }\n\n return (await modelManager.insert(data as T, {\n ignoreHooks: options.ignoreHooks,\n returning: options.returning ?? ([\"*\"] as ModelKey<T>[]),\n })) as T;\n }\n\n /**\n * @description Updates or creates multiple records\n * @param {updateOnConflict} If true, the record will be updated if it exists, otherwise it will be ignored\n */\n static async upsertMany<T extends Model>(\n this: new () => T | typeof Model,\n conflictColumns: ModelKey<T>[],\n data: Partial<ModelWithoutRelations<T>>[],\n options: UpsertOptions<T> & BaseModelMethodOptions = {\n updateOnConflict: true,\n },\n ): Promise<AnnotatedModel<T, {}>[]> {\n if (!data.length) {\n return [];\n }\n\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n\n if (\n !data.every((record) => {\n const recordKeys = new Set(Object.keys(record));\n return conflictColumns.every((col) => recordKeys.has(col as string));\n })\n ) {\n throw new HysteriaError(\n \"Model::upsertMany\",\n \"CONFLICT_COLUMNS_NOT_PRESENT_IN_DATA\",\n );\n }\n\n const columnsToUpdate = Object.keys(data[0]);\n const upsertResult = await modelManager.upsertMany(\n conflictColumns as string[],\n columnsToUpdate,\n data as ModelWithoutRelations<T>[],\n {\n ignoreHooks: options.ignoreHooks,\n returning: options.returning,\n updateOnConflict: options.updateOnConflict ?? true,\n },\n );\n\n const dbType = typeofModel.sqlInstance.getDbType();\n if (databasesWithReturning.includes(dbType)) {\n return (await serializeModel(\n upsertResult as T[],\n typeofModel,\n options.returning as string[],\n )) as unknown as AnnotatedModel<T, {}>[];\n }\n\n const lookupQuery = modelManager.query();\n if (options.returning?.length) {\n lookupQuery.select(...options.returning);\n }\n\n const conflictMap = new Map<string, any>();\n conflictColumns.forEach((column) => {\n data.forEach((record) => {\n conflictMap.set(column as string, [\n ...(conflictMap.get(column as string) || []),\n record[column as unknown as keyof ModelWithoutRelations<T>],\n ]);\n });\n });\n\n lookupQuery.where((query) => {\n conflictColumns.forEach((column) => {\n query.orWhereIn(column, conflictMap.get(column as string) || []);\n });\n });\n\n return lookupQuery.many({\n ignoreHooks: options.ignoreHooks ? [\"afterFetch\", \"beforeFetch\"] : [],\n });\n }\n\n /**\n * @description Deletes a record to the database\n */\n static async deleteRecord<T extends Model>(\n this: new () => T | typeof Model,\n modelSqlInstance: T,\n options?: Omit<BaseModelMethodOptions, \"ignoreHooks\">,\n ): Promise<void> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n return modelManager.deleteRecord(modelSqlInstance);\n }\n\n /**\n * @description Soft Deletes a record to the database\n * @description default column: deletedAt\n * @description default value: The current date and time in UTC timezone in the format \"YYYY-MM-DD HH:mm:ss\"\n * @description You can override the column and value by providing the column and value on the static properties of the model `softDeleteColumn` and `softDeleteValue`\n */\n static async softDelete<T extends Model>(\n this: new () => T | typeof Model,\n modelSqlInstance: T,\n softDeleteOptions?: {\n column?: ModelKey<T>;\n value?: string | number | boolean | Date;\n },\n options?: Omit<BaseModelMethodOptions, \"ignoreHooks\">,\n ): Promise<AnnotatedModel<T, {}>> {\n const typeofModel = this as unknown as typeof Model;\n const {\n column = typeofModel.softDeleteColumn as ModelKey<T>,\n value = typeofModel.softDeleteValue,\n } = softDeleteOptions || {};\n\n modelSqlInstance[column as keyof T] = value as T[keyof T];\n const modelManager = typeofModel.dispatchModelManager<T>({\n trx: options?.trx,\n connection: options?.connection,\n });\n await modelManager.updateRecord(modelSqlInstance);\n\n if (typeof value === \"string\") {\n modelSqlInstance[column as keyof T] = new Date(value) as T[keyof T];\n return modelSqlInstance as AnnotatedModel<T, {}>;\n }\n\n modelSqlInstance[column as keyof T] = value as T[keyof T];\n return modelSqlInstance as AnnotatedModel<T, {}>;\n }\n\n /**\n * @description Truncates the table for the given model\n */\n static async truncate<T extends Model>(\n this: new () => T | typeof Model,\n options: BaseModelMethodOptions = {},\n ): Promise<void> {\n const typeofModel = this as unknown as typeof Model;\n const modelManager = typeofModel.dispatchModelManager<T>(options);\n return modelManager.query().truncate();\n }\n\n /**\n * @description Returns the table info for the model form the database\n */\n static async getTableInfo(): Promise<TableColumnInfo[]> {\n const typeofModel = this as unknown as typeof Model;\n typeofModel.establishConnection();\n return typeofModel.sqlInstance.getTableInfo(typeofModel.table);\n }\n\n /**\n * @description Returns the index info for the model form the database\n */\n static async getIndexInfo(): Promise<TableIndexInfo[]> {\n const typeofModel = this as unknown as typeof Model;\n typeofModel.establishConnection();\n return typeofModel.sqlInstance.getIndexInfo(typeofModel.table);\n }\n\n /**\n * @description Returns the table schema for the model form the database\n */\n static async getTableSchema(): Promise<TableSchemaInfo> {\n const typeofModel = this as unknown as typeof Model;\n typeofModel.establishConnection();\n return typeofModel.sqlInstance.getTableSchema(typeofModel.table);\n }\n\n /**\n * @description Merges the provided data with the model instance\n */\n static combineProps<T extends Model>(\n sqlInstance: Partial<T>,\n data: Partial<T>,\n ): void {\n for (const key in data) {\n Object.assign(sqlInstance, { [key]: data[key] });\n }\n }\n\n // #region Lifecycle hooks\n\n /**\n * @description Adds a beforeFetch clause to the model, adding the ability to modify the querybuilder before fetching the data\n */\n static beforeFetch?(\n queryBuilder: ModelQueryBuilder<any>,\n ): Promise<void> | void;\n\n /**\n * @description Adds a beforeInsert clause to the model modifying the data before inserting the data\n * @param {Model} data The model to be inserted, in insertMany the hook will be called for each model\n * @example\n * ```typescript\n * static async beforeInsert?(data: User): Promise<void> {\n * data.name = data.name.toUpperCase();\n * }\n * ```\n */\n static beforeInsert?(data: any): Promise<void> | void;\n\n /**\n * @description Adds a beforeInsertMany clause to the model modifying the data before inserting the data\n * @param {Model[]} data The models to be inserted, in insertMany the hook will be called for each model\n * @example\n * ```typescript\n * static async beforeInsertMany?(data: User[]): Promise<void> {\n * data.forEach((user) => {\n * user.name = user.name.toUpperCase();\n * });\n * }\n * ```\n */\n static beforeInsertMany?(data: any[]): Promise<void> | void;\n\n /**\n * @description Adds a beforeUpdate clause to the model, adding the ability to modify the query before updating the data\n * @description Includes soft delete\n */\n static beforeUpdate?(\n queryBuilder: ModelQueryBuilder<any>,\n ): Promise<void> | void;\n\n /**\n * @description Adds a beforeDelete clause to the model, adding the ability to modify the query before deleting the data\n * @warning This hook does not include soft delete since it's an update operation\n */\n static beforeDelete?(\n queryBuilder: ModelQueryBuilder<any>,\n ): Promise<void> | void;\n\n /**\n * @description Adds a afterFetch clause to the model, adding the ability to modify the data after fetching the data\n * @param {Model} data Models fetched from the database, must always provide an implementation for an array of models regardless of the query result\n * @example\n * ```typescript\n * static async afterFetch?(data: User[]): Promise<User[]> {\n * return data;\n * }\n * ```\n */\n static afterFetch?(data: any[]): Promise<any[]> | any[];\n\n // #endregion Lifecycle hooks\n\n /**\n * @description Returns the columns of the model\n */\n static getColumns(): ColumnType[] {\n return getModelColumns(this);\n }\n\n /**\n * @description Returns the relations of the model\n */\n static getRelations(): LazyRelationType[] {\n return getRelationsMetadata(this);\n }\n\n /**\n * @description Returns the indexes metadata of the model\n */\n static getIndexes(): IndexType[] {\n return getIndexes(this);\n }\n\n static getUniques(): UniqueType[] {\n return getUniques(this);\n }\n\n // JS Static methods\n\n /**\n * @description Defines a column in the model, useful in javascript in order to not have to rely on decorators since are not supported without a transpiler like babel\n * @javascript\n */\n static column(columnName: string, ...args: Parameters<typeof column>): void {\n column(...args)(this.prototype, columnName);\n }\n\n /**\n * @description Defines an hasOne relation\n * @javascript\n */\n static hasOne(columnName: string, ...args: Parameters<typeof hasOne>): void {\n hasOne(...args)(this.prototype, columnName);\n }\n\n /**\n * @description Defines an hasMany\n * @javascript\n */\n static hasMany(\n columnName: string,\n ...args: Parameters<typeof hasMany>\n ): void {\n hasMany(...args)(this.prototype, columnName);\n }\n\n /**\n * @description Defines a belongsTo\n * @javascript\n */\n static belongsTo(\n columnName: string,\n ...args: Parameters<typeof belongsTo>\n ): void {\n belongsTo(...args)(this.prototype, columnName);\n }\n\n /**\n * @description Defines a many to many\n * @javascript\n */\n static manyToMany(\n columnName: string,\n ...args: Parameters<typeof manyToMany>\n ): void {\n manyToMany(...args)(this.prototype, columnName);\n }\n\n /**\n * @description Establishes a connection to the database instantiated from the SqlDataSource.connect method, this is done automatically when using the static methods\n * @description This method is meant to be used only if you want to establish sql sqlInstance of the model directly\n * @internal\n */\n private static establishConnection(): void {\n const sql = SqlDataSource.getInstance();\n if (!sql) {\n throw new HysteriaError(\n \"sqlInstance not initialized, did you defined it in SqlDataSource.connect static method?\",\n \"CONNECTION_NOT_ESTABLISHED\",\n );\n }\n\n this.sqlInstance = sql;\n }\n\n /**\n * @description Gives the correct model manager with the correct connection based on the options provided\n */\n private static dispatchModelManager<T extends Model>(\n this: typeof Model,\n options?: BaseModelMethodOptions,\n ): ModelManager<T> {\n if (options?.connection) {\n return options.connection.getModelManager<T>(\n this as unknown as typeof Model,\n );\n }\n\n if (options?.trx) {\n return options.trx.sql.getModelManager<T>(\n this as unknown as typeof Model,\n );\n }\n\n const typeofModel = this as unknown as typeof Model;\n typeofModel.establishConnection();\n return typeofModel.sqlInstance.getModelManager<T>(typeofModel);\n }\n\n // instance methods\n\n /**\n * @description inserts or updates the model to the database, must have a primary key in order to work\n * @throws {HysteriaError} If the model has no primary key\n */\n async save<T extends Model = this>(\n options: Omit<BaseModelMethodOptions, \"ignoreHooks\"> = {},\n ) {\n const instance = this as unknown as new () => T | typeof Model;\n const typeofModel = instance.constructor as typeof Model &\n (new () => typeof Model);\n const primaryKey = typeofModel.primaryKey as keyof T;\n if (!primaryKey) {\n throw new HysteriaError(\n typeofModel.name + \"::save\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n const primaryKeyValue: string | number =\n instance[primaryKey as keyof typeof instance];\n\n const searchCriteria = primaryKeyValue\n ? ({\n [primaryKey]: primaryKeyValue,\n } as unknown as ModelWithoutRelations<T>)\n : {};\n\n const payload = instance as unknown as ModelWithoutRelations<T>;\n const result = await typeofModel.upsert(\n searchCriteria,\n payload as ModelWithoutRelations<T>,\n {\n updateOnConflict: true,\n ...options,\n },\n );\n\n typeofModel.combineProps(this as unknown as T, result as unknown as T);\n return this as unknown as T;\n }\n\n /**\n * @description Updates the model in the database, must have a primary key in order to work\n * @throws {HysteriaError} If the model has no primary key valorized in the instance\n */\n async update<T extends Model = this>(\n payload: Partial<ModelWithoutRelations<T>>,\n options: Omit<BaseModelMethodOptions, \"ignoreHooks\"> = {},\n ) {\n const instance = this as unknown as new () => T | typeof Model;\n const typeofModel = instance.constructor as typeof Model &\n (new () => typeof Model);\n\n const primaryKey = typeofModel.primaryKey as keyof T;\n if (!primaryKey) {\n throw new HysteriaError(\n typeofModel.name + \"::save\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n const primaryKeyValue: string | number =\n instance[primaryKey as keyof typeof instance];\n\n if (!primaryKeyValue) {\n throw new HysteriaError(\n typeofModel.name + \"::update\",\n \"MODEL_HAS_NO_PRIMARY_KEY_VALUE\",\n );\n }\n\n await typeofModel.updateRecord(instance as unknown as T, payload, options);\n }\n\n /**\n * @description Soft deletes the model from the database, must have a primary key in order to work\n * @throws {HysteriaError} If the model has no primary key valorized in the instance\n */\n async softDelete<T extends Model = this>(\n this: T,\n softDeleteOptions?: {\n column?: keyof ModelWithoutRelations<T>;\n value?: string | number | boolean | Date;\n },\n options?: Omit<BaseModelMethodOptions, \"ignoreHooks\">,\n ) {\n const instance = this as unknown as new () => T | typeof Model;\n const typeofModel = instance.constructor as typeof Model &\n (new () => typeof Model);\n\n const primaryKey = typeofModel.primaryKey as keyof T;\n if (!primaryKey) {\n throw new HysteriaError(\n typeofModel.name + \"::softDelete\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n const primaryKeyValue: string | number =\n instance[primaryKey as keyof typeof instance];\n\n if (!primaryKeyValue) {\n throw new HysteriaError(\n typeofModel.name + \"::softDelete\",\n \"MODEL_HAS_NO_PRIMARY_KEY_VALUE\",\n );\n }\n\n await typeofModel.softDelete(\n instance as unknown as T,\n softDeleteOptions as {\n column?: ModelKey<T>;\n value?: string | number | boolean | Date;\n },\n options,\n );\n }\n\n /**\n * @description Deletes the model from the database, must have a primary key in order to work\n * @throws {HysteriaError} If the model has no primary key valorized in the instance\n */\n async delete<T extends Model = this>(\n options: Omit<BaseModelMethodOptions, \"ignoreHooks\"> = {},\n ) {\n const instance = this as unknown as new () => T | typeof Model;\n const typeofModel = instance.constructor as typeof Model &\n (new () => typeof Model);\n\n const primaryKey = typeofModel.primaryKey as keyof T;\n if (!primaryKey) {\n throw new HysteriaError(\n typeofModel.name + \"::delete\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n const primaryKeyValue: string | number =\n instance[primaryKey as keyof typeof instance];\n\n if (!primaryKeyValue) {\n throw new HysteriaError(\n typeofModel.name + \"::delete\",\n \"MODEL_HAS_NO_PRIMARY_KEY_VALUE\",\n );\n }\n\n await typeofModel.deleteRecord(this as unknown as T, options);\n }\n\n /**\n * @description Refreshes the model from the database, it both updates the instance and returns the refreshed model\n * @throws {HysteriaError} If the model has no primary key valorized in the instance\n */\n async refresh<T extends Model = this>(\n options?: Omit<BaseModelMethodOptions, \"ignoreHooks\">,\n ) {\n const instance = this as unknown as new () => T | typeof Model;\n const typeofModel = instance.constructor as typeof Model &\n (new () => typeof Model);\n\n const primaryKey = typeofModel.primaryKey as keyof T;\n if (!primaryKey) {\n throw new HysteriaError(\n typeofModel.name + \"::refresh\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n const primaryKeyValue: string | number =\n instance[primaryKey as keyof typeof instance];\n\n if (!primaryKeyValue) {\n throw new HysteriaError(\n typeofModel.name + \"::refresh\",\n \"MODEL_HAS_NO_PRIMARY_KEY_VALUE\",\n );\n }\n\n const refreshed = await typeofModel.refresh(this as unknown as T, options);\n typeofModel.combineProps(this as unknown as T, refreshed as unknown as T);\n return this as unknown as T;\n }\n}\n","import { Model } from \"../model\";\n\n/**\n * @description Options for the relation\n * @property {string} softDeleteColumn - The column name for the soft delete column, if set, the relation will only return rows that have not been soft deleted\n * @property {string} softDeleteType - The type of the soft delete column\n */\n\nexport enum RelationEnum {\n hasOne = \"hasOne\", // One to One without foreign key\n belongsTo = \"belongsTo\", // One to One with foreign key\n hasMany = \"hasMany\",\n manyToMany = \"manyToMany\",\n}\n\n/**\n * Main Relation Class\n */\nexport abstract class Relation {\n abstract type: RelationEnum;\n model: typeof Model = Model;\n columnName: string = \"\";\n foreignKey?: string;\n relatedModel: string = \"\";\n\n protected constructor(model: typeof Model, columnName: string) {\n this.model = model;\n this.columnName = columnName;\n this.relatedModel = this.model.table;\n }\n}\n","import { Model } from \"../model\";\nimport { Relation, RelationEnum } from \"./relation\";\n\nexport class BelongsTo extends Relation {\n type: RelationEnum;\n foreignKey: string;\n\n constructor(\n relatedModel: typeof Model,\n columnName: string,\n foreignKey: string,\n ) {\n super(relatedModel, columnName);\n this.foreignKey = foreignKey;\n this.type = RelationEnum.belongsTo;\n }\n}\n","import { Model } from \"../model\";\nimport { Relation, RelationEnum } from \"./relation\";\n\nexport class HasMany extends Relation {\n type: RelationEnum = RelationEnum.hasMany;\n foreignKey: string;\n\n constructor(\n relatedModel: typeof Model,\n columnName: string,\n foreignKey: string,\n ) {\n super(relatedModel, columnName);\n this.foreignKey = foreignKey;\n this.type = RelationEnum.hasMany;\n }\n}\n","import { Model } from \"../model\";\nimport { Relation, RelationEnum } from \"./relation\";\n\nexport class HasOne extends Relation {\n type: RelationEnum;\n foreignKey: string;\n\n constructor(\n relatedModel: typeof Model,\n columnName: string,\n foreignKey: string,\n ) {\n super(relatedModel, columnName);\n this.foreignKey = foreignKey;\n this.type = RelationEnum.hasOne;\n }\n}\n","import { Model } from \"../model\";\nimport { Relation, RelationEnum } from \"./relation\";\n\nexport class ManyToMany extends Relation {\n type = RelationEnum.manyToMany;\n /**\n * @description The model that establishes the relation\n */\n primaryModel: string;\n /**\n * @description The model that is being related to\n */\n relatedModel: string;\n /**\n * @description The foreign key of the related model in the through table\n */\n rightForeignKey: string;\n /**\n * @description The table that joins the two models\n */\n throughModel: string;\n /**\n * @description The foreign key of the primary model in the through table\n */\n leftForeignKey: string;\n\n constructor(\n model: typeof Model,\n columnName: string,\n data: {\n primaryModel: string;\n throughModel: string;\n leftForeignKey: string;\n rightForeignKey: string;\n },\n ) {\n super(model, columnName);\n this.primaryModel = data.primaryModel;\n this.relatedModel = model.table;\n this.throughModel = data.throughModel;\n this.leftForeignKey = data.leftForeignKey;\n this.rightForeignKey = data.rightForeignKey;\n }\n}\n","import pluralize from \"pluralize\";\n\nexport const COLUMN_METADATA_KEY = Symbol(\"columns\");\nexport const PRIMARY_KEY_METADATA_KEY = Symbol(\"primaryKey\");\nexport const RELATION_METADATA_KEY = Symbol(\"relations\");\nexport const INDEX_METADATA_KEY = Symbol(\"indexes\");\nexport const UNIQUE_METADATA_KEY = Symbol(\"uniques\");\n\nexport const getDefaultForeignKey = (table: string) => {\n return `${pluralize.singular(table)}_id`;\n};\n\nexport const getDefaultIndexName = (table: string, column: string) => {\n return `idx_${table}_${column}`;\n};\n\nexport const getDefaultUniqueConstraintName = (\n table: string,\n column: string,\n) => {\n return `uq_${table}_${column}`;\n};\n\nexport const getDefaultFkConstraintName = (\n table: string,\n leftColumn: string,\n rightColumn?: string,\n) => {\n return `fk_${table}_${leftColumn}${rightColumn ? `_${rightColumn}` : \"\"}`;\n};\n\nexport const getDefaultPrimaryKeyConstraintName = (\n table: string,\n column: string,\n) => {\n return `pk_${table}_${column}`;\n};\n","import crypto from \"node:crypto\";\nimport { HysteriaError } from \"../../../errors/hysteria_error\";\nimport { convertCase } from \"../../../utils/case_utils\";\nimport { getDate, parseDate } from \"../../../utils/date_utils\";\nimport {\n decryptAsymmetric,\n decryptSymmetric,\n encryptAsymmetric,\n encryptSymmetric,\n} from \"../../../utils/encryption\";\nimport { Reflect } from \"../../../utils/reflect_metadata\";\nimport { generateULID } from \"../../../utils/ulid\";\nimport { OnUpdateOrDelete } from \"../../migrations/schema/schema_types\";\nimport { getColumnValue } from \"../../resources/utils\";\nimport { Model } from \"../model\";\nimport { ModelKey } from \"../model_manager/model_manager_types\";\nimport { ModelQueryBuilder } from \"../model_query_builder/model_query_builder\";\nimport { BelongsTo } from \"../relations/belongs_to\";\nimport { HasMany } from \"../relations/has_many\";\nimport { HasOne } from \"../relations/has_one\";\nimport { ManyToMany } from \"../relations/many_to_many\";\nimport { Relation, RelationEnum } from \"../relations/relation\";\nimport {\n COLUMN_METADATA_KEY,\n INDEX_METADATA_KEY,\n PRIMARY_KEY_METADATA_KEY,\n RELATION_METADATA_KEY,\n UNIQUE_METADATA_KEY,\n getDefaultFkConstraintName,\n getDefaultForeignKey,\n getDefaultIndexName,\n getDefaultPrimaryKeyConstraintName,\n getDefaultUniqueConstraintName,\n} from \"./model_decorators_constants\";\nimport type {\n AsymmetricEncryptionOptions,\n ColumnDataTypeOptionWithDatePrecision,\n ColumnDataTypeOptionWithLength,\n ColumnDataTypeOptionWithPrecision,\n ColumnDataTypeOptionWithScaleAndPrecision,\n ColumnOptions,\n ColumnType,\n DateColumnOptions,\n IndexType,\n LazyRelationType,\n ManyToManyOptions,\n SymmetricEncryptionOptions,\n ThroughModel,\n UniqueType,\n} from \"./model_decorators_types\";\n\nexport type BaseModelRelationType = {\n onDelete?: OnUpdateOrDelete;\n onUpdate?: OnUpdateOrDelete;\n constraintName?: string;\n};\n\n/**\n * @description Class decorator to define indexes on the model\n * @description If no indexName is provided, the index name will be the model name plus the columns joined by underscores\n * @example User will have an index named \"user_name_index\" on the \"name\" column\n * @example User will have an index named \"user_name_email_index\" on the \"name\" and \"email\" columns\n * ```ts\n * @index([\"name\", \"email\"], \"user_name_email_index\")\n * class User extends Model {\n * @column()\n * name!: string;\n * }\n *\n * @index([\"name\", \"email\"])\n * class User extends Model {\n * @column()\n * name!: string;\n * }\n * ```\n */\nexport function index(\n indexes: string | string[],\n indexName?: string,\n): ClassDecorator {\n return (target: Function) => {\n const newIndexes = Array.isArray(indexes) ? indexes : [indexes];\n const existingIndexes =\n Reflect.getMetadata<{ columns: string[]; name: string }[]>(\n INDEX_METADATA_KEY,\n target.prototype,\n ) || [];\n existingIndexes.push({\n columns: newIndexes,\n name:\n indexName ??\n getDefaultIndexName(\n (target as typeof Model).table,\n newIndexes.join(\"_\"),\n ),\n });\n Reflect.defineMetadata(\n INDEX_METADATA_KEY,\n existingIndexes,\n target.prototype,\n );\n };\n}\n\nexport function unique(\n columns: string | string[],\n constraintName?: string,\n): ClassDecorator {\n return (target: Function) => {\n const newColumns = Array.isArray(columns) ? columns : [columns];\n const existingUniques =\n Reflect.getMetadata<{ columns: string[]; name: string }[]>(\n UNIQUE_METADATA_KEY,\n target.prototype,\n ) || [];\n existingUniques.push({\n columns: newColumns,\n name:\n constraintName ??\n getDefaultUniqueConstraintName(\n (target as typeof Model).table,\n newColumns.join(\"_\"),\n ),\n });\n Reflect.defineMetadata(\n UNIQUE_METADATA_KEY,\n existingUniques,\n target.prototype,\n );\n };\n}\n\n/**\n * @description Decorator to define a view on the model\n * @description This will automatically create a view on the database with the given statement\n * @description Since a view is intended to get data from other tables, a migration is not necessary\n * @example\n * ```ts\n * @view((query) => {\n * query.select(\"*\").from(\"users\");\n * })\n * class User extends Model {\n * @column()\n * name!: string;\n * }\n * ```\n */\nexport function view(\n statement: (query: ModelQueryBuilder<any>) => void,\n): ClassDecorator {\n return (target: Function) => {\n const targetClass = target as typeof Model;\n const originalQuery = targetClass.query;\n targetClass.query = function (...args: Parameters<typeof originalQuery>) {\n const query = originalQuery.bind(this).call(this, ...args);\n statement(query);\n return query;\n } as typeof originalQuery;\n };\n}\n\n/**\n * @description Decorator to define a column in the model\n */\nexport function column(\n options: ColumnOptions = {\n primaryKey: false,\n },\n): PropertyDecorator {\n const isPrimaryKey = options?.primaryKey ?? false;\n return (target: Object, propertyKey: string | symbol) => {\n const targetModel = target.constructor as typeof Model;\n if (isPrimaryKey) {\n const primaryKey = Reflect.getMetadata(PRIMARY_KEY_METADATA_KEY, target);\n if (primaryKey) {\n throw new HysteriaError(\n \"ModelDecorator::column\",\n \"MULTIPLE_PRIMARY_KEYS_NOT_ALLOWED\",\n );\n }\n Reflect.defineMetadata(PRIMARY_KEY_METADATA_KEY, propertyKey, target);\n }\n const databaseName =\n options.databaseName ??\n convertCase(propertyKey as string, targetModel.databaseCaseConvention);\n const column: ColumnType = {\n columnName: propertyKey as string,\n serialize: options.serialize,\n prepare: options.prepare,\n hidden: options.hidden,\n isPrimary: isPrimaryKey,\n primaryKeyConstraintName:\n options.primaryKeyConstraintName ??\n getDefaultPrimaryKeyConstraintName(\n targetModel.table,\n propertyKey as string,\n ),\n autoUpdate: options.autoUpdate,\n databaseName,\n openApi: options.openApi,\n type: options.type,\n length: (options as ColumnDataTypeOptionWithLength)?.length,\n precision: (options as ColumnDataTypeOptionWithPrecision)?.precision,\n scale: (options as ColumnDataTypeOptionWithScaleAndPrecision)?.scale,\n withTimezone: (options as ColumnDataTypeOptionWithDatePrecision)\n ?.withTimezone,\n constraints: {\n nullable: options.nullable,\n default: options.default,\n },\n };\n const existingColumns =\n Reflect.getMetadata<ColumnType[]>(COLUMN_METADATA_KEY, target) || [];\n existingColumns.push(column);\n Reflect.defineMetadata(COLUMN_METADATA_KEY, existingColumns, target);\n };\n}\n\ncolumn.primary = primaryKeyColumn;\ncolumn.date = dateColumn;\ncolumn.boolean = booleanColumn;\ncolumn.json = jsonColumn;\ncolumn.uuid = uuidColumn;\ncolumn.ulid = ulidColumn;\ncolumn.integer = integerColumn;\ncolumn.float = floatColumn;\ncolumn.encryption = {\n symmetric,\n asymmetric,\n};\n\nfunction primaryKeyColumn(\n options: Omit<ColumnOptions, \"primaryKey\"> = {},\n): PropertyDecorator {\n return column({\n ...(options as ColumnOptions),\n primaryKey: true,\n });\n}\n\nfunction floatColumn(\n options: Omit<ColumnOptions, \"serialize\"> = {},\n): PropertyDecorator {\n return column({\n type: \"float\",\n ...(options as ColumnOptions),\n serialize: (value) => {\n if (value === undefined) {\n return;\n }\n\n if (value === null) {\n return null;\n }\n\n if (typeof value === \"number\") {\n return value;\n }\n\n if (typeof value === \"string\") {\n return +value;\n }\n\n return Number.parseFloat(value);\n },\n });\n}\n\n/**\n * @description Decorator to define a integer column in the model, this will automatically convert the integer to the correct format for the database\n * @description Useful in databases like postgres where the integer is returned as a string by the driver\n * @description Defaults type to integer for migration generation\n */\nfunction integerColumn(\n options: Omit<ColumnOptions, \"serialize\"> = {},\n): PropertyDecorator {\n return column({\n type: \"integer\",\n ...(options as ColumnOptions),\n serialize: (value) => {\n if (value === undefined) {\n return;\n }\n\n if (value === null) {\n return null;\n }\n\n if (typeof value === \"number\") {\n return value;\n }\n\n if (typeof value === \"string\") {\n return +value;\n }\n\n return Number.parseInt(value);\n },\n });\n}\n\n/**\n * @description Decorator to define a uuid column in the model\n * @description This will automatically generate a uuid if no value is provided\n * @description Defaults type to uuid for migration generation\n */\nfunction uuidColumn(\n options: Omit<ColumnOptions, \"prepare\"> = {},\n): PropertyDecorator {\n return column({\n type: \"uuid\",\n ...(options as ColumnOptions),\n prepare: (value) => {\n if (!value) {\n return crypto.randomUUID();\n }\n\n return value;\n },\n });\n}\n\n/**\n * @description Decorator to define a ulid column in the model\n * @description This will automatically generate a ulid if no value is provided\n * @description Defaults type to ulid for migration generation\n */\nfunction ulidColumn(\n options: Omit<ColumnOptions, \"prepare\"> = {},\n): PropertyDecorator {\n return column({\n type: \"ulid\",\n ...(options as ColumnOptions),\n prepare: (value) => {\n if (!value) {\n return generateULID();\n }\n\n return value;\n },\n });\n}\n\n/**\n * @description Decorator to define a symmetric encrypted column in the model with a key\n * @description This will automatically encrypt the value before it is inserted or updated in the database and decrypt it when it is retrieved from the database\n * @description If no value is provided, the value will be returned as is\n */\nfunction symmetric(\n options: Omit<SymmetricEncryptionOptions, \"prepare\" | \"serialize\">,\n): PropertyDecorator {\n return column({\n ...(options as ColumnOptions),\n prepare: (value) => {\n if (!value) {\n return value;\n }\n\n return encryptSymmetric(options.key, value);\n },\n serialize: (value) => {\n if (!value) {\n return value;\n }\n\n return decryptSymmetric(options.key, value);\n },\n });\n}\n\n/**\n * @description Decorator to define a asymmetric encrypted column in the model with public and private keys\n * @description This will automatically encrypt the value before it is inserted or updated in the database and decrypt it when it is retrieved from the database\n * @description If no value is provided, the value will be returned as is\n */\nfunction asymmetric(\n options: Omit<AsymmetricEncryptionOptions, \"prepare\" | \"serialize\">,\n): PropertyDecorator {\n return column({\n ...(options as ColumnOptions),\n prepare: (value) => {\n if (!value) {\n return value;\n }\n\n return encryptAsymmetric(options.publicKey, value);\n },\n serialize: (value) => {\n if (!value) {\n return value;\n }\n\n return decryptAsymmetric(options.privateKey, value);\n },\n });\n}\n\n/**\n * @description Decorator to define a boolean column in the model\n * @description This will automatically convert the boolean to the correct format for the database, useful for mysql since it stores booleans as tinyint(1)\n * @description Defaults type to boolean for migration generation\n */\nfunction booleanColumn(\n options: Omit<ColumnOptions, \"prepare\" | \"serialize\"> = {},\n): PropertyDecorator {\n return column({\n type: \"boolean\",\n ...(options as ColumnOptions),\n serialize: (value) => Boolean(value),\n prepare: (value) => Boolean(value),\n });\n}\n\n/**\n * @description Decorator to define a date column in the model\n * @description This will automatically convert the date to the correct format for the database\n * @description Supports both ISO format (YYYY-MM-DD HH:mm:ss) and Unix timestamp\n * @description Handles timezone conversion between UTC and local time\n * @description Can automatically update/create timestamps\n * @param options Configuration options for the date column\n * @param options.format The format to store dates in ('ISO' or 'TIMESTAMP')\n * @param options.timezone The timezone to use ('UTC' or 'LOCAL')\n * @param options.autoUpdate Whether to automatically update the timestamp on record updates\n * @param options.autoCreate Whether to automatically set the timestamp on record creation\n */\nfunction dateColumn(\n options: Omit<DateColumnOptions, \"prepare\" | \"serialize\"> = {},\n): PropertyDecorator {\n const {\n format = \"ISO\",\n timezone = \"UTC\",\n autoUpdate = false,\n autoCreate = false,\n ...rest\n } = options;\n\n return column({\n type: \"datetime\",\n ...(rest as ColumnOptions),\n autoUpdate,\n prepare: (value?: Date | string | null): string | null | undefined => {\n if (!value) {\n if (autoCreate) {\n return getDate(new Date(), format, timezone);\n }\n\n return null;\n }\n\n if (autoUpdate) {\n return getDate(new Date(), format, timezone);\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n return getDate(value, format, timezone);\n },\n serialize: (value?: Date | string | null): Date | null | undefined => {\n if (value === undefined) {\n return;\n }\n\n if (value === null) {\n return null;\n }\n\n return parseDate(value, format, timezone);\n },\n });\n}\n\n/**\n * @description Decorator to define a json column in the model\n * @description This will automatically convert the json to the correct format for the database\n * @throws json parse error if the value from the database is not valid json\n * @description Defaults type to jsonb for migration generation\n */\nfunction jsonColumn(\n options: Omit<ColumnOptions, \"prepare\" | \"serialize\"> = {},\n): PropertyDecorator {\n return column({\n type: \"jsonb\",\n ...(options as ColumnOptions),\n serialize: (value) => {\n if (typeof value === \"string\") {\n return JSON.parse(value);\n }\n\n return value;\n },\n prepare: (value) => {\n if (!(typeof value === \"string\")) {\n return JSON.stringify(value);\n }\n\n return value;\n },\n });\n}\n\nexport function getModelColumns(target: typeof Model): ColumnType[] {\n try {\n return Reflect.getMetadata(COLUMN_METADATA_KEY, target.prototype) || [];\n } catch (_) {\n return [];\n }\n}\n\n/**\n * relations\n */\n\n/**\n * @description Establishes a belongs to relation with the given model\n * @default foreignKey by default will be the singular of the model that establishes the relation name plus \"_id\"\n * @example Post that has a user will have foreignKey \"user_id\" on the model\n * ```typescript\n * belongsTo<typeof Post>(() => User, 'userId')\n * ```\n */\nexport function belongsTo<\n M extends typeof Model = any,\n R extends typeof Model = any,\n>(\n model: () => R,\n foreignKey?: ModelKey<InstanceType<M>>,\n options?: BaseModelRelationType,\n): PropertyDecorator {\n return (target: Object, propertyKey: string | symbol) => {\n const fallbackForeignKey = () =>\n getDefaultForeignKey(model().table as string);\n const fallbackConstraintName = () => {\n const targetTable = (target.constructor as typeof Model).table;\n const fkColumn = foreignKey || fallbackForeignKey();\n return getDefaultFkConstraintName(\n targetTable,\n fkColumn as string,\n model().table,\n );\n };\n\n const relation: LazyRelationType = {\n type: RelationEnum.belongsTo,\n columnName: propertyKey as string,\n model,\n foreignKey: foreignKey ? String(foreignKey) : fallbackForeignKey,\n constraintName: options?.constraintName ?? fallbackConstraintName,\n onUpdate: options?.onUpdate,\n onDelete: options?.onDelete,\n };\n\n const relations =\n Reflect.getMetadata<LazyRelationType[]>(RELATION_METADATA_KEY, target) ||\n [];\n relations.push(relation);\n Reflect.defineMetadata(RELATION_METADATA_KEY, relations, target);\n };\n}\n\n/**\n * @description Establishes a has one relation with the given model\n * @default foreignKey by default will be the singular of the model name plus \"_id\"\n * @example User will have foreignKey \"user_id\" on the Post model\n */\nexport function hasOne<T extends typeof Model>(\n model: () => T,\n foreignKey?: ModelKey<InstanceType<T>>,\n): PropertyDecorator {\n return (target: Object, propertyKey: string | symbol) => {\n const fallbackForeignKey = () =>\n getDefaultForeignKey((target.constructor as typeof Model).table);\n\n const relation: LazyRelationType = {\n type: RelationEnum.hasOne,\n columnName: propertyKey as string,\n model,\n constraintName: \"None\",\n foreignKey: foreignKey ? String(foreignKey) : fallbackForeignKey,\n };\n\n const relations =\n Reflect.getMetadata<LazyRelationType[]>(RELATION_METADATA_KEY, target) ||\n [];\n relations.push(relation);\n Reflect.defineMetadata(RELATION_METADATA_KEY, relations, target);\n };\n}\n\n/**\n * @description Establishes a has many relation with the given model\n * @default foreignKey by default will be the singular of the model name plus \"_id\"\n * @example User will have foreignKey \"user_id\" on the Post model\n */\nexport function hasMany<T extends typeof Model>(\n model: () => T,\n foreignKey?: ModelKey<InstanceType<T>>,\n): PropertyDecorator {\n return (target: Object, propertyKey: string | symbol) => {\n const fallbackForeignKey = () =>\n getDefaultForeignKey((target.constructor as typeof Model).table);\n\n const relation: LazyRelationType = {\n type: RelationEnum.hasMany,\n columnName: propertyKey as string,\n model,\n constraintName: \"None\",\n foreignKey: foreignKey ? String(foreignKey) : fallbackForeignKey,\n };\n\n const relations =\n Reflect.getMetadata<LazyRelationType[]>(RELATION_METADATA_KEY, target) ||\n [];\n relations.push(relation);\n Reflect.defineMetadata(RELATION_METADATA_KEY, relations, target);\n };\n}\n\n/**\n * @description Establishes a many to many relation with the given model\n * @default foreignKey by default will be the singular of the model that establishes the relation name plus \"_id\"\n * @param model The model that establishes the relation\n * @param throughModel The model that is used to join the two models\n * @param throughModelKeys The keys of the through model\n * @param throughModelKeys.leftForeignKey The foreign key of the through model from the primary model (where you are defining the many to many relation)\n * @param throughModelKeys.rightForeignKey The foreign key of the through model from the related model (the model you are joining to)\n * @example User will have foreignKey \"user_id\" on the Join table by default\n */\nexport function manyToMany<\n R extends typeof Model,\n T extends typeof Model,\n TM extends ThroughModel<T>,\n>(\n model: () => R,\n throughModel: TM,\n throughModelKeys?: ManyToManyOptions<T, TM>,\n options?: BaseModelRelationType,\n): PropertyDecorator {\n return (target: Object, propertyKey: string | symbol) => {\n const { leftForeignKey, rightForeignKey } = throughModelKeys ?? {};\n const wasModelProvided = typeof throughModel !== \"string\";\n const throughModelTable =\n typeof throughModel === \"string\"\n ? throughModel\n : () => throughModel().table;\n\n const primaryModel = (target.constructor as typeof Model).table;\n const fallbackLeftForeignKey = () => getDefaultForeignKey(primaryModel);\n const fallbackRightForeignKey = () => getDefaultForeignKey(model().table);\n const fallbackConstraintName = () =>\n getDefaultFkConstraintName(\n getColumnValue(throughModelTable),\n leftForeignKey ? String(leftForeignKey) : fallbackLeftForeignKey(),\n );\n\n const relation: LazyRelationType = {\n type: RelationEnum.manyToMany,\n columnName: propertyKey as string,\n model,\n constraintName: options?.constraintName ?? fallbackConstraintName,\n foreignKey: leftForeignKey\n ? String(leftForeignKey)\n : fallbackLeftForeignKey,\n onDelete: options?.onDelete,\n onUpdate: options?.onUpdate,\n manyToManyOptions: {\n primaryModel: primaryModel,\n throughModel: throughModelTable,\n leftForeignKey: leftForeignKey\n ? String(leftForeignKey)\n : fallbackLeftForeignKey,\n rightForeignKey: rightForeignKey\n ? String(rightForeignKey)\n : fallbackRightForeignKey,\n wasModelProvided,\n },\n };\n\n const relations =\n Reflect.getMetadata<LazyRelationType[]>(RELATION_METADATA_KEY, target) ||\n [];\n relations.push(relation);\n Reflect.defineMetadata(RELATION_METADATA_KEY, relations, target);\n };\n}\n\nexport function getRelationsMetadata(target: typeof Model): LazyRelationType[] {\n return Reflect.getMetadata(RELATION_METADATA_KEY, target.prototype) || [];\n}\n\n/**\n * @description Returns the relations of the model\n */\nexport function getRelations(target: typeof Model): Relation[] {\n const relations =\n Reflect.getMetadata<LazyRelationType[]>(\n RELATION_METADATA_KEY,\n target.prototype,\n ) || [];\n return relations.map((relation: LazyRelationType) => {\n const { type, model, columnName, foreignKey } = relation;\n\n const resolvedForeignKey = getColumnValue(foreignKey);\n\n const lazyLoadedModel = model();\n switch (type) {\n case RelationEnum.belongsTo:\n return new BelongsTo(lazyLoadedModel, columnName, resolvedForeignKey);\n case RelationEnum.hasOne:\n return new HasOne(lazyLoadedModel, columnName, resolvedForeignKey);\n case RelationEnum.hasMany:\n return new HasMany(lazyLoadedModel, columnName, resolvedForeignKey);\n case RelationEnum.manyToMany:\n if (!relation.manyToManyOptions) {\n throw new HysteriaError(\n \"ModelDecorator::getRelations\",\n \"MANY_TO_MANY_RELATION_MUST_HAVE_A_THROUGH_MODEL\",\n );\n }\n\n const relatedModel = model();\n return new ManyToMany(relatedModel, columnName, {\n primaryModel: relation.manyToManyOptions.primaryModel,\n throughModel: getColumnValue(relation.manyToManyOptions.throughModel),\n leftForeignKey: getColumnValue(\n relation.manyToManyOptions.leftForeignKey,\n ),\n rightForeignKey: getColumnValue(\n relation.manyToManyOptions.rightForeignKey,\n ),\n });\n default:\n throw new HysteriaError(\n \"ModelDecorator::getRelations\",\n `UNKNOWN_RELATION_TYPE_${type}`,\n );\n }\n });\n}\n\n/**\n * @description Returns the primary key of the model\n */\nexport function getPrimaryKey(target: typeof Model): string | undefined {\n return Reflect.getMetadata<string>(\n PRIMARY_KEY_METADATA_KEY,\n target.prototype,\n );\n}\n\nexport function getIndexes(target: typeof Model): IndexType[] {\n return Reflect.getMetadata(INDEX_METADATA_KEY, target.prototype) || [];\n}\n\nexport function getUniques(target: typeof Model): UniqueType[] {\n return Reflect.getMetadata(UNIQUE_METADATA_KEY, target.prototype) || [];\n}\n","import { convertCase } from \"../../utils/case_utils\";\nimport { AstParser } from \"../ast/parser\";\nimport { FromNode } from \"../ast/query/node/from\";\nimport { QueryNode } from \"../ast/query/query\";\nimport { getModelColumns } from \"../models/decorators/model_decorators\";\nimport { ColumnType } from \"../models/decorators/model_decorators_types\";\nimport { Model } from \"../models/model\";\nimport { SqlDataSourceType } from \"../sql_data_source_types\";\n\nexport class InterpreterUtils {\n private readonly modelColumnsMap: Map<string, ColumnType>;\n\n constructor(private readonly model: typeof Model) {\n const modelColumns = getModelColumns(model);\n this.modelColumnsMap = new Map(\n modelColumns.map((modelColumn) => [modelColumn.columnName, modelColumn]),\n );\n }\n\n formatStringColumn(dbType: SqlDataSourceType, column: string): string {\n if (column === \"*\") {\n return \"*\";\n }\n\n const hasTable = column.includes(\".\");\n if (hasTable) {\n const [table, foundColumn] = column.split(\".\");\n\n if (foundColumn === \"*\") {\n switch (dbType) {\n case \"mysql\":\n case \"mariadb\":\n return `\\`${table}\\`.*`;\n case \"postgres\":\n case \"cockroachdb\":\n case \"sqlite\":\n return `\"${table}\".*`;\n default:\n throw new Error(`Unsupported database type: ${dbType}`);\n }\n }\n\n const casedColumn =\n this.modelColumnsMap.get(foundColumn)?.databaseName ??\n convertCase(foundColumn, this.model.databaseCaseConvention);\n\n switch (dbType) {\n case \"mysql\":\n case \"mariadb\":\n return `\\`${table}\\`.\\`${casedColumn}\\``;\n case \"postgres\":\n case \"cockroachdb\":\n case \"sqlite\":\n return `\"${table}\".\"${casedColumn}\"`;\n default:\n throw new Error(`Unsupported database type: ${dbType}`);\n }\n }\n\n const casedColumn =\n this.modelColumnsMap.get(column)?.databaseName ??\n convertCase(column, this.model.databaseCaseConvention);\n\n switch (dbType) {\n case \"mysql\":\n case \"mariadb\":\n return `\\`${casedColumn}\\``;\n case \"postgres\":\n case \"cockroachdb\":\n case \"sqlite\":\n return `\"${casedColumn}\"`;\n default:\n throw new Error(`Unsupported database type: ${dbType}`);\n }\n }\n\n /**\n * @description Formats the table name for the database type, idempotent for quoting\n */\n formatStringTable(dbType: SqlDataSourceType, table: string): string {\n // Table normalization\n table = table.replace(/\\s+/g, \" \").trim();\n let alias = \"\";\n if (table.toLowerCase().includes(\" as \")) {\n [table, alias] = table.split(\" as \");\n }\n\n switch (dbType) {\n case \"mysql\":\n case \"mariadb\":\n return `\\`${table}\\`${alias ? ` as \\`${alias}\\`` : \"\"}`;\n case \"postgres\":\n case \"cockroachdb\":\n case \"sqlite\":\n return `\"${table}\"${alias ? ` as \"${alias}\"` : \"\"}`;\n default:\n return `${table}${alias ? ` as ${alias}` : \"\"}`;\n }\n }\n\n async prepareColumns(\n columns: string[],\n values: any[],\n mode: \"insert\" | \"update\" = \"insert\",\n ): Promise<{ columns: string[]; values: any[] }> {\n if (!columns.length) {\n return { columns, values };\n }\n\n const filteredColumns: string[] = [];\n const filteredValues: any[] = [];\n\n for (let i = 0; i < columns.length; i++) {\n const column = columns[i];\n const value = values[i];\n\n if (column === \"*\" || column === \"$annotations\") {\n continue;\n }\n\n filteredColumns.push(column);\n filteredValues.push(value);\n }\n\n await Promise.all(\n filteredColumns.map(async (_, i) => {\n const column = filteredColumns[i];\n const value = filteredValues[i];\n\n const modelColumn = this.modelColumnsMap.get(column);\n\n let preparedValue = value;\n if (modelColumn) {\n if (mode === \"insert\" && modelColumn.prepare) {\n preparedValue = await modelColumn.prepare(value);\n } else if (mode === \"update\") {\n preparedValue = (await modelColumn.prepare?.(value)) ?? value;\n }\n }\n\n filteredValues[i] = preparedValue;\n }),\n );\n\n for (const column of this.modelColumnsMap.keys()) {\n if (!filteredColumns.includes(column)) {\n const modelColumn = this.modelColumnsMap.get(column);\n if (!modelColumn) {\n continue;\n }\n\n if (\n mode === \"insert\" &&\n column === (this.model as typeof Model).primaryKey &&\n !modelColumn.prepare\n ) {\n continue;\n }\n\n if (mode === \"insert\" || modelColumn.autoUpdate) {\n filteredColumns.push(column);\n filteredValues.push(modelColumn.prepare?.(undefined) ?? undefined);\n }\n }\n }\n\n return { columns: filteredColumns, values: filteredValues };\n }\n\n /**\n * @description Formats the from node for write operations removing the \"from\" keyword\n */\n getFromForWriteOperations(\n dbType: SqlDataSourceType,\n fromNode: FromNode,\n ): string {\n if (typeof fromNode.table === \"string\") {\n return this.formatStringTable(dbType, fromNode.table);\n }\n\n const astParser = new AstParser(this.model, dbType);\n if (Array.isArray(fromNode.table)) {\n return `(${astParser.parse(fromNode.table).sql})`;\n }\n\n return `(${astParser.parse([fromNode.table as QueryNode]).sql})`;\n }\n}\n","import { AstParser } from \"../../../ast/parser\";\nimport { AlterTableNode } from \"../../../ast/query/node/alter_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlAlterTableInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const atNode = node as AlterTableNode;\n const utils = new InterpreterUtils(this.model);\n const tableName = utils.formatStringTable(\"mysql\", atNode.table);\n\n if (!atNode.children || !atNode.children.length) {\n return { sql: \"\", bindings: [] };\n }\n\n const astParser = new AstParser(this.model, \"mysql\" as SqlDataSourceType);\n const parts: string[] = [];\n const bindings: any[] = [];\n\n for (const child of atNode.children) {\n const { sql, bindings: childBindings } = astParser.parse([child]);\n\n if (child.file === \"add_column\") {\n parts.push(sql);\n } else if (\n child.file === \"add_constraint\" ||\n child.folder === \"constraint\"\n ) {\n const last = parts[parts.length - 1] ?? \"\";\n const isExtendingAddColumn = /^\\s*add\\s+column\\b/i.test(last);\n const isNamedTableConstraint = /^\\s*add\\s+constraint\\b/i.test(sql);\n if (isExtendingAddColumn && !isNamedTableConstraint) {\n const cleaned = sql.replace(/^\\s*add\\s+/i, \"\").trimStart();\n parts[parts.length - 1] = `${last} ${cleaned}`;\n } else {\n const ensured = /^\\s*add\\b/i.test(sql) ? sql : `add ${sql}`;\n parts.push(ensured);\n }\n } else if (\n child.file === \"set_default\" ||\n child.file === \"drop_default\" ||\n child.file === \"set_not_null\" ||\n child.file === \"drop_not_null\"\n ) {\n parts.push(sql);\n } else {\n parts.push(sql);\n }\n\n bindings.push(...childBindings);\n }\n\n const stmt = parts.join(\", \");\n const ifExists = atNode.ifExists ? \"if exists \" : \"\";\n const dropIndexPattern = /^\\s*drop\\s+index\\b/i;\n const finalSql = dropIndexPattern.test(stmt)\n ? stmt\n : `${ifExists}${tableName} ${stmt}`;\n return { sql: finalSql, bindings };\n }\n}\n\nexport default new MysqlAlterTableInterpreter();\n","import { DropColumnNode } from \"../../../ast/query/node/alter_table/drop_column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlDropColumnInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const d = node as DropColumnNode;\n return { sql: `drop column \\`${d.column}\\``, bindings: [] };\n }\n}\nexport default new MysqlDropColumnInterpreter();\n","import { DropConstraintNode } from \"../../../ast/query/node/alter_table/drop_constraint\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlDropConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const dNode = node as DropConstraintNode;\n return { sql: `drop constraint \\`${dNode.constraintName}\\``, bindings: [] };\n }\n}\nexport default new MysqlDropConstraintInterpreter();\n","import { DropDefaultNode } from \"../../../ast/query/node/alter_table/drop_default\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlDropDefaultInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const n = node as DropDefaultNode;\n return { sql: `alter column \\`${n.column}\\` drop default`, bindings: [] };\n }\n}\nexport default new MysqlDropDefaultInterpreter();\n","import { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlDropNotNullInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(_node: QueryNode) {\n // MySQL doesn't support standalone drop not null operations\n return { sql: \"\", bindings: [] };\n }\n}\nexport default new MysqlDropNotNullInterpreter();\n","import { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlDropPrimaryKeyInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(_node: QueryNode) {\n return { sql: `drop primary key`, bindings: [] };\n }\n}\nexport default new MysqlDropPrimaryKeyInterpreter();\n","import { RenameColumnNode } from \"../../../ast/query/node/alter_table/rename_column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlRenameColumnInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const r = node as RenameColumnNode;\n return {\n sql: `rename column \\`${r.oldName}\\` to \\`${r.newName}\\``,\n bindings: [],\n };\n }\n}\nexport default new MysqlRenameColumnInterpreter();\n","import { RenameTableNode } from \"../../../ast/query/node/alter_table/rename_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlRenameTableInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const rt = node as RenameTableNode;\n return { sql: `\\`${rt.newName}\\``, bindings: [] };\n }\n}\nexport default new MysqlRenameTableInterpreter();\n","import { SetDefaultNode } from \"../../../ast/query/node/alter_table/set_default\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlSetDefaultInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const n = node as SetDefaultNode;\n let val = n.defaultValue;\n\n if (val === \"NULL\") {\n val = \"null\";\n } else if (val === \"TRUE\" || val === \"FALSE\") {\n val = val.toLowerCase();\n } else if (\n typeof val === \"string\" &&\n val !== \"null\" &&\n val !== \"true\" &&\n val !== \"false\"\n ) {\n val = `'${val}'`;\n }\n\n return {\n sql: `alter column \\`${n.column}\\` set default ${val}`,\n bindings: [],\n };\n }\n}\nexport default new MysqlSetDefaultInterpreter();\n","import { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlSetNotNullInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(_node: QueryNode) {\n // MySQL doesn't support standalone set not null operations\n return { sql: \"\", bindings: [] };\n }\n}\nexport default new MysqlSetNotNullInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { ColumnTypeNode } from \"../../../ast/query/node/column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { getColumnValue } from \"../../../resources/utils\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlColumnTypeInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const colNode = node as ColumnTypeNode;\n if (colNode.isRawValue) {\n return { sql: colNode.column as string, bindings: [] };\n }\n\n const utils = new InterpreterUtils(this.model);\n const columnName = utils.formatStringColumn(\n \"mysql\",\n getColumnValue(colNode.column),\n );\n const dt = colNode.dataType.toLowerCase();\n\n if (dt === \"char\") {\n const len = colNode.length ?? 1;\n return { sql: `${columnName} char(${len})`, bindings: [] };\n } else if (dt === \"varchar\") {\n const len = colNode.length ?? 255;\n return { sql: `${columnName} varchar(${len})`, bindings: [] };\n } else if (dt === \"uuid\") {\n return { sql: `${columnName} varchar(36)`, bindings: [] };\n } else if (dt === \"ulid\") {\n return { sql: `${columnName} varchar(26)`, bindings: [] };\n } else if (\n dt === \"longtext\" ||\n dt === \"mediumtext\" ||\n dt === \"tinytext\" ||\n dt === \"text\"\n ) {\n return { sql: `${columnName} ${dt}`, bindings: [] };\n } else if (dt === \"integer\" || dt === \"int\") {\n let sqlType = `int`;\n if (colNode.autoIncrement) {\n sqlType += \" auto_increment\";\n }\n return { sql: `${columnName} ${sqlType}`, bindings: [] };\n } else if (dt === \"tinyint\") {\n return { sql: `${columnName} tinyint`, bindings: [] };\n } else if (dt === \"smallint\") {\n return { sql: `${columnName} smallint`, bindings: [] };\n } else if (dt === \"mediumint\") {\n return { sql: `${columnName} mediumint`, bindings: [] };\n } else if (dt === \"bigint\") {\n let sqlType = `bigint`;\n if (colNode.autoIncrement) {\n sqlType += \" auto_increment\";\n }\n return { sql: `${columnName} ${sqlType}`, bindings: [] };\n } else if (dt === \"float\") {\n return { sql: `${columnName} float`, bindings: [] };\n } else if (dt === \"double\") {\n return { sql: `${columnName} double`, bindings: [] };\n } else if (dt === \"real\") {\n return { sql: `${columnName} double`, bindings: [] };\n } else if (dt === \"decimal\") {\n const precision = colNode.precision ?? 10;\n const scale = colNode.scale ?? 0;\n return {\n sql: `${columnName} decimal(${precision}, ${scale})`,\n bindings: [],\n };\n } else if (dt === \"numeric\") {\n const precision = colNode.precision ?? 10;\n const scale = colNode.scale ?? 0;\n return {\n sql: `${columnName} numeric(${precision}, ${scale})`,\n bindings: [],\n };\n } else if (dt === \"date\") {\n return { sql: `${columnName} date`, bindings: [] };\n } else if (dt === \"time\") {\n const p =\n typeof colNode.precision === \"number\" ? `(${colNode.precision})` : \"\";\n return { sql: `${columnName} time${p}`.trimEnd(), bindings: [] };\n } else if (dt === \"datetime\") {\n const p =\n typeof colNode.precision === \"number\" ? `(${colNode.precision})` : \"\";\n return { sql: `${columnName} datetime${p}`.trimEnd(), bindings: [] };\n } else if (dt === \"timestamp\") {\n const p =\n typeof colNode.precision === \"number\" ? `(${colNode.precision})` : \"\";\n return { sql: `${columnName} timestamp${p}`.trimEnd(), bindings: [] };\n } else if (dt === \"year\") {\n return { sql: `${columnName} year`, bindings: [] };\n } else if (dt === \"boolean\") {\n return { sql: `${columnName} boolean`, bindings: [] };\n } else if (dt === \"varbinary\") {\n const len = colNode.length ?? 255;\n return { sql: `${columnName} varbinary(${len})`, bindings: [] };\n } else if (dt === \"binary\") {\n const len = colNode.length ?? 255;\n return { sql: `${columnName} binary(${len})`, bindings: [] };\n } else if (dt === \"bytea\" || dt === \"blob\") {\n return { sql: `${columnName} blob`, bindings: [] };\n } else if (dt === \"json\" || dt === \"jsonb\") {\n return { sql: `${columnName} json`, bindings: [] };\n } else if (dt === \"enum\") {\n if (colNode.enumValues && colNode.enumValues.length > 0) {\n const values = colNode.enumValues.map((v) => `'${v}'`).join(\", \");\n return { sql: `${columnName} enum(${values})`, bindings: [] };\n }\n return { sql: `${columnName} text`, bindings: [] };\n }\n\n return {\n sql: `${columnName} ${dt} ${colNode.length ? `(${colNode.length})` : \"\"}`,\n bindings: [],\n };\n }\n}\n\nexport default new MysqlColumnTypeInterpreter();\n","import { AfterConstraintNode } from \"../../../ast/query/node/constraint/after\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlAfterConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const a = node as AfterConstraintNode;\n return { sql: `after \\`${a.column}\\``, bindings: [] };\n }\n}\nexport default new MysqlAfterConstraintInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { ConstraintNode } from \"../../../ast/query/node/constraint\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { getColumnValue } from \"../../../resources/utils\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const cNode = node as ConstraintNode;\n const utils = new InterpreterUtils(this.model);\n\n if (cNode.constraintType === \"primary_key\") {\n const cols = (cNode.columns ?? [])\n .map((c) => utils.formatStringColumn(\"mysql\", getColumnValue(c)))\n .join(\", \");\n const prefix = cNode.constraintName\n ? `constraint \\`${cNode.constraintName}\\` `\n : \"\";\n return { sql: `${prefix}primary key (${cols})`, bindings: [] };\n }\n\n if (cNode.constraintType === \"unique\") {\n if (cNode.columns && cNode.columns.length > 0) {\n const cols = cNode.columns\n .map((c) => utils.formatStringColumn(\"mysql\", getColumnValue(c)))\n .join(\", \");\n const prefix = cNode.constraintName\n ? `constraint \\`${cNode.constraintName}\\` `\n : \"\";\n // For inline constraints in CREATE TABLE, don't include column names\n if (!cNode.constraintName) {\n return { sql: `unique`, bindings: [] };\n }\n return { sql: `${prefix}unique (${cols})`, bindings: [] };\n }\n return { sql: `unique`, bindings: [] };\n }\n\n if (cNode.constraintType === \"not_null\") {\n return { sql: `not null`, bindings: [] };\n }\n\n if (cNode.constraintType === \"null\") {\n return { sql: `null`, bindings: [] };\n }\n\n if (cNode.constraintType === \"default\") {\n let val = cNode.defaultValue;\n if (val === \"NULL\") {\n return { sql: `default null`, bindings: [] };\n }\n if (val === \"TRUE\" || val === \"FALSE\") {\n return { sql: `default ${val.toLowerCase()}`, bindings: [] };\n }\n if (val === null) {\n return { sql: `default null`, bindings: [] };\n }\n if (typeof val === \"string\") {\n val = `'${val}'`;\n }\n return { sql: `default ${val}`, bindings: [] };\n }\n\n if (cNode.constraintType === \"foreign_key\") {\n if (!cNode.references) {\n return { sql: \"\", bindings: [] };\n }\n const cols = (cNode.columns ?? [])\n .map((c) => utils.formatStringColumn(\"mysql\", getColumnValue(c)))\n .join(\", \");\n const refTable = utils.formatStringTable(\"mysql\", cNode.references.table);\n const refCols = cNode.references.columns\n .map((c) => utils.formatStringColumn(\"mysql\", getColumnValue(c)))\n .join(\", \");\n const prefix = cNode.constraintName\n ? `constraint \\`${cNode.constraintName}\\` `\n : \"\";\n let sql = `${prefix}foreign key (${cols}) references ${refTable}(${refCols})`;\n if (cNode.onDelete) {\n sql += ` on delete ${cNode.onDelete}`;\n }\n if (cNode.onUpdate) {\n sql += ` on update ${cNode.onUpdate}`;\n }\n return { sql, bindings: [] };\n }\n\n return { sql: \"\", bindings: [] };\n }\n}\n\nexport default new MysqlConstraintInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { CreateTableNode } from \"../../../ast/query/node/create_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlCreateTableInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const ctNode = node as CreateTableNode;\n const utils = new InterpreterUtils(this.model);\n const tableName = utils.formatStringTable(\"mysql\", ctNode.table);\n\n if (!ctNode.children || !ctNode.children.length) {\n return { sql: `${tableName} ()`, bindings: [] };\n }\n\n const astParser = new AstParser(this.model, \"mysql\" as SqlDataSourceType);\n const parts: string[] = [];\n const bindings: any[] = [];\n\n for (const child of ctNode.children) {\n const { sql, bindings: childBindings } = astParser.parse([child]);\n\n if (child.folder === \"constraint\") {\n const last = parts.pop() ?? \"\";\n const inlineConstraintSql = sql;\n\n // Handle inline constraints: not null, null, and default\n if (\n /not null/i.test(inlineConstraintSql) ||\n /null/i.test(inlineConstraintSql) ||\n /default/i.test(inlineConstraintSql)\n ) {\n let combined = `${last} ${inlineConstraintSql}`.trim();\n combined = combined.replace(\n /(references\\s+`[^`]+`\\s*\\([^)]*\\))\\s+not null/i,\n \"not null $1\",\n );\n parts.push(combined);\n bindings.push(...childBindings);\n continue;\n }\n\n parts.push(last);\n parts.push(inlineConstraintSql);\n bindings.push(...childBindings);\n continue;\n }\n\n parts.push(sql);\n bindings.push(...childBindings);\n }\n\n for (const constraint of ctNode.namedConstraints) {\n const { sql, bindings: constraintBindings } = astParser.parse([\n constraint,\n ]);\n\n parts.push(sql);\n bindings.push(...constraintBindings);\n }\n\n const columnsSql = parts.join(\", \");\n const ifNotExists = ctNode.ifNotExists ? \"if not exists \" : \"\";\n const finalSql = `${ifNotExists}${tableName} (${columnsSql})`;\n return { sql: finalSql, bindings };\n }\n}\n\nexport default new MysqlCreateTableInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { DeleteNode } from \"../../../ast/query/node/delete\";\nimport { FromNode } from \"../../../ast/query/node/from\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlDeleteInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const deleteNode = node as DeleteNode;\n\n if (\n deleteNode.isRawValue &&\n typeof deleteNode.fromNode.table === \"string\"\n ) {\n return {\n sql: deleteNode.fromNode.table,\n bindings: [],\n };\n }\n\n const formattedTable = new InterpreterUtils(\n this.model,\n ).getFromForWriteOperations(\"mysql\", deleteNode.fromNode as FromNode);\n\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n}\n\nexport default new MysqlDeleteInterpreter();\n","import { QueryNode } from \"../../../ast/query/query\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { AstParser } from \"../../../ast/parser\";\nimport { Model } from \"../../../models/model\";\n\nclass MySqlDistinctInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n return {\n sql: \"distinct\",\n bindings: [],\n };\n }\n}\n\nexport default new MySqlDistinctInterpreter();\n","import logger from \"../../../../utils/logger\";\nimport { AstParser } from \"../../../ast/parser\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MySqlDistinctInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n logger.warn(\"MySQL does not support DISTINCT ON\");\n return {\n sql: \"\",\n bindings: [],\n };\n }\n}\n\nexport default new MySqlDistinctInterpreter();\n","import { DropTableNode } from \"../../../ast/query/node/drop_table/drop_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlDropTableInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const dt = node as DropTableNode;\n const utils = new InterpreterUtils(this.model);\n const tableSql = utils.formatStringTable(\"mysql\", dt.table);\n const exists = dt.ifExists ? \"if exists \" : \"\";\n return { sql: `${exists}${tableSql}`, bindings: [] };\n }\n}\nexport default new MysqlDropTableInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { FromNode } from \"../../../ast/query/node/from\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MySqlFromInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const fromNode = node as FromNode;\n\n if (typeof fromNode.table === \"string\") {\n const interpreterUtils = new InterpreterUtils(this.model);\n\n if (fromNode.alias && fromNode.alias.length > 0) {\n const tableSql = interpreterUtils.formatStringTable(\n \"mysql\",\n fromNode.table,\n );\n\n return {\n sql: `${tableSql} as \\`${fromNode.alias}\\``,\n bindings: [],\n };\n }\n\n const tableSql = interpreterUtils.formatStringTable(\n \"mysql\",\n fromNode.table,\n );\n\n return { sql: tableSql, bindings: [] };\n }\n\n const subQueryNodes = Array.isArray(fromNode.table)\n ? fromNode.table\n : [fromNode.table];\n\n const astParser = new AstParser(this.model, \"mysql\" as SqlDataSourceType);\n const result = astParser.parse(subQueryNodes);\n\n const aliasSql =\n fromNode.alias && fromNode.alias.length\n ? ` as \\`${fromNode.alias}\\``\n : \"\";\n\n return {\n sql: `(${result.sql})${aliasSql}`,\n bindings: result.bindings,\n };\n }\n}\n\nexport default new MySqlFromInterpreter();\n","import type { GroupByNode } from \"../../../ast/query/node/group_by/group_by\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { AstParser } from \"../../../ast/parser\";\nimport { Model } from \"../../../models/model\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MySqlGroupByInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const groupByNode = node as GroupByNode;\n if (groupByNode.isRawValue) {\n return {\n sql: groupByNode.column,\n bindings: [],\n };\n }\n\n const columnSql = new InterpreterUtils(this.model).formatStringColumn(\n \"mysql\",\n groupByNode.column,\n );\n\n return {\n sql: columnSql,\n bindings: [],\n };\n }\n}\n\nexport default new MySqlGroupByInterpreter();\n","export abstract class QueryNode {\n /**\n * Sql keyword to use for the query e.g. \"select\"\n */\n keyword: string;\n\n /**\n * The current parameter index to use for the query\n */\n currParamIndex: number = 1;\n\n /**\n * Whether the query node is a raw value and should not be parsed by the interpreter\n */\n isRawValue: boolean = false;\n\n /**\n * Whether the keyword can be seen multiple times in the query, e.g. \"join\" can be seen multiple times in a query\n */\n abstract canKeywordBeSeenMultipleTimes: boolean;\n\n /**\n * The string to use to chain the keyword with the next keyword\n */\n abstract chainsWith: string;\n\n /**\n * The folder to use for the query node, e.g. \"select\" is in the \"select\" folder inside the interpreter map\n */\n abstract folder: string;\n\n /**\n * The file to use for the query node, e.g. \"select\" is in the \"select\" file inside the interpreter map\n */\n abstract file: string;\n\n constructor(keyword: string, isRawValue: boolean = false) {\n this.keyword = keyword;\n this.isRawValue = isRawValue;\n }\n}\n","import { AstParser } from \"../../../ast/parser\";\nimport { HavingNode } from \"../../../ast/query/node/having/having\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlHavingInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const havingNode = node as HavingNode;\n if (havingNode.isRawValue) {\n return {\n sql: havingNode.column,\n bindings: havingNode.value as any[],\n };\n }\n\n const idx = havingNode.currParamIndex;\n let sql = \"\";\n let bindings: any[] = [];\n\n if (\n !(havingNode.value instanceof QueryNode) &&\n !Array.isArray(havingNode.value)\n ) {\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"mysql\", havingNode.column)} ${havingNode.operator} $${idx}`;\n bindings = [havingNode.value];\n }\n\n if (Array.isArray(havingNode.value)) {\n const placeholders = havingNode.value\n .map((_, i) => `$${idx + i}`)\n .join(\", \");\n\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"mysql\", havingNode.column)} ${havingNode.operator} (${placeholders})`;\n bindings = havingNode.value;\n }\n\n if (havingNode.isNegated) {\n sql = `not (${sql})`;\n }\n\n return { sql: sql.trim(), bindings };\n }\n}\n\nexport default new MysqlHavingInterpreter();\n","import { CreateIndexNode } from \"../../../ast/query/node/index_op/create_index\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlCreateIndexInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const ci = node as CreateIndexNode;\n const utils = new InterpreterUtils(this.model);\n const tableSql = utils.formatStringTable(\"mysql\", ci.table);\n const cols = ci.columns.map((c) => `\\`${c}\\``).join(\", \");\n const unique = ci.unique ? \"unique \" : \"\";\n return {\n sql: `${unique}\\`${ci.indexName}\\` on ${tableSql} (${cols})`,\n bindings: [],\n };\n }\n}\nexport default new MysqlCreateIndexInterpreter();\n","import { DropIndexNode } from \"../../../ast/query/node/index_op/drop_index\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlDropIndexInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const di = node as DropIndexNode;\n if (!di.table) {\n throw new Error(\"MySQL DROP INDEX requires table name\");\n }\n return {\n sql: `\\`${di.indexName}\\` on \\`${di.table}\\``,\n bindings: [],\n };\n }\n}\nexport default new MysqlDropIndexInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { InsertNode } from \"../../../ast/query/node/insert\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlInsertInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const insertNode = node as InsertNode;\n\n if (insertNode.isRawValue) {\n return {\n sql: insertNode.fromNode.table as string,\n bindings: [],\n };\n }\n\n const interpreterUtils = new InterpreterUtils(this.model);\n const formattedTable = interpreterUtils.getFromForWriteOperations(\n \"mysql\",\n insertNode.fromNode,\n );\n\n if (!insertNode.records.length) {\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n\n const firstRecord = insertNode.records[0];\n const columns = Object.keys(firstRecord);\n if (!columns.length) {\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n\n const formattedColumns = columns\n .map((column) => interpreterUtils.formatStringColumn(\"mysql\", column))\n .join(\", \");\n\n const allValues: any[] = [];\n const valuesClauses: string[] = [];\n\n for (const record of insertNode.records) {\n const recordValues = columns.map((column) => record[column]);\n allValues.push(...recordValues);\n\n const placeholders = Array(columns.length).fill(\"?\").join(\", \");\n valuesClauses.push(`(${placeholders})`);\n }\n\n const sql = `${formattedTable} (${formattedColumns}) VALUES ${valuesClauses.join(\", \")}`;\n return {\n sql,\n bindings: allValues,\n };\n }\n}\n\nexport default new MysqlInsertInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { JoinNode } from \"../../../ast/query/node/join/join\";\nimport type { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlJoinInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const joinNode = node as JoinNode;\n if (joinNode.isRawValue) {\n return {\n sql: joinNode.table,\n bindings: [],\n };\n }\n\n const utils = new InterpreterUtils(this.model);\n\n let leftColumnStr = joinNode.left;\n if (!leftColumnStr.includes(\".\")) {\n leftColumnStr = `${joinNode.table}.${leftColumnStr}`;\n }\n\n let rightColumnStr = joinNode.right;\n if (!rightColumnStr.includes(\".\")) {\n rightColumnStr = `${this.model.table}.${rightColumnStr}`;\n }\n\n const leftSql = utils.formatStringColumn(\"mysql\", leftColumnStr);\n const rightSql = utils.formatStringColumn(\"mysql\", rightColumnStr);\n const tableSql = utils.formatStringTable(\"mysql\", joinNode.table);\n\n const sql = `${tableSql} on ${leftSql} ${joinNode.on?.operator} ${rightSql}`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new MysqlJoinInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { LimitNode } from \"../../../ast/query/node/limit/limit\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MySqlLimitInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const limitNode = node as LimitNode;\n\n return {\n sql: `?`,\n bindings: [limitNode.limit],\n };\n }\n}\n\nexport default new MySqlLimitInterpreter();\n","import { LockNode } from \"../../../ast/query/node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\n\nconst lockTypeToSql: Record<string, string> = {\n for_update: \"for update\",\n for_share: \"lock in share mode\",\n};\n\nexport class MysqlLockInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): { sql: string; bindings: any[] } {\n const lockNode = node as LockNode;\n let sql = lockTypeToSql[lockNode.lockType] || \"for update\";\n if (lockNode.skipLocked) {\n sql += \" skip locked\";\n }\n\n return {\n sql,\n bindings: [],\n };\n }\n}\n\nexport default new MysqlLockInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { OffsetNode } from \"../../../ast/query/node/offset/offset\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MySqlOffsetInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const offsetNode = node as OffsetNode;\n\n return {\n sql: `?`,\n bindings: [offsetNode.offset],\n };\n }\n}\n\nexport default new MySqlOffsetInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { OnDuplicateNode } from \"../../../ast/query/node/on_duplicate\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlOnDuplicateInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const onDuplicateNode = node as OnDuplicateNode;\n\n if (onDuplicateNode.isRawValue) {\n return {\n sql: onDuplicateNode.table,\n bindings: [],\n };\n }\n\n const interpreterUtils = new InterpreterUtils(this.model);\n\n if (onDuplicateNode.mode === \"ignore\") {\n const noOpColumn = (onDuplicateNode.conflictColumns?.[0] ||\n \"id\") as string;\n const formattedNoOpColumn = interpreterUtils.formatStringColumn(\n \"mysql\",\n `${onDuplicateNode.table}.${noOpColumn}`,\n );\n return {\n sql: `AS new ON DUPLICATE KEY UPDATE ${formattedNoOpColumn} = ${formattedNoOpColumn}`,\n bindings: [],\n };\n }\n\n const formattedColumns = onDuplicateNode.columnsToUpdate\n .map(\n (column) =>\n `${interpreterUtils.formatStringColumn(\"mysql\", column)} = new.${interpreterUtils.formatStringColumn(\"mysql\", column)}`,\n )\n .join(\", \");\n\n return {\n sql: `AS new ON DUPLICATE KEY UPDATE ${formattedColumns}`,\n bindings: [],\n };\n }\n}\n\nexport default new MysqlOnDuplicateInterpreter();\n","import type { OrderByNode } from \"../../../ast/query/node/order_by/order_by\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { AstParser } from \"../../../ast/parser\";\nimport { Model } from \"../../../models/model\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MySqlOrderByInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const orderByNode = node as OrderByNode;\n if (orderByNode.isRawValue) {\n return {\n sql: orderByNode.column,\n bindings: [],\n };\n }\n const columnSql = new InterpreterUtils(this.model).formatStringColumn(\n \"mysql\",\n orderByNode.column,\n );\n const directionSql = orderByNode.direction.toLowerCase();\n\n return {\n sql: `${columnSql} ${directionSql}`,\n bindings: [],\n };\n }\n}\n\nexport default new MySqlOrderByInterpreter();\n","import { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlRawInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): { sql: string; bindings: any[] } {\n const rawNode = node as RawNode;\n return {\n sql: rawNode.rawValue,\n bindings: [],\n };\n }\n}\n\nexport default new MysqlRawInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { ForeignKeyInfoNode } from \"../../../ast/query/node/schema/foreign_key_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlForeignKeyInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as ForeignKeyInfoNode;\n const table = node.table;\n const sql = `SELECT\n k.CONSTRAINT_NAME AS name,\n k.COLUMN_NAME AS column_name,\n k.REFERENCED_TABLE_NAME AS referenced_table,\n k.REFERENCED_COLUMN_NAME AS referenced_column,\n r.UPDATE_RULE AS on_update,\n r.DELETE_RULE AS on_delete\n FROM information_schema.KEY_COLUMN_USAGE k\n JOIN information_schema.REFERENTIAL_CONSTRAINTS r\n ON k.CONSTRAINT_NAME = r.CONSTRAINT_NAME AND k.CONSTRAINT_SCHEMA = r.CONSTRAINT_SCHEMA\n WHERE k.TABLE_SCHEMA = DATABASE() AND k.TABLE_NAME = '${table}' AND k.REFERENCED_TABLE_NAME IS NOT NULL\n ORDER BY k.POSITION_IN_UNIQUE_CONSTRAINT`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new MysqlForeignKeyInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { IndexInfoNode } from \"../../../ast/query/node/schema/index_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlIndexInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as IndexInfoNode;\n const table = node.table;\n const sql = `SHOW INDEX FROM \\`${table}\\``;\n return { sql, bindings: [] };\n }\n}\n\nexport default new MysqlIndexInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { PrimaryKeyInfoNode } from \"../../../ast/query/node/schema/primary_key_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlPrimaryKeyInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as PrimaryKeyInfoNode;\n const table = node.table;\n const sql = `SELECT\n CONSTRAINT_NAME AS name,\n COLUMN_NAME AS column_name\n FROM information_schema.KEY_COLUMN_USAGE k\n WHERE k.TABLE_SCHEMA = DATABASE() AND k.TABLE_NAME = '${table}' AND k.CONSTRAINT_NAME = 'PRIMARY'\n ORDER BY k.ORDINAL_POSITION`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new MysqlPrimaryKeyInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { TableInfoNode } from \"../../../ast/query/node/schema/table_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlTableInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as TableInfoNode;\n const table = node.table;\n const sql =\n `SELECT COLUMN_NAME AS column_name, ` +\n `DATA_TYPE AS data_type, ` +\n `IS_NULLABLE AS is_nullable, ` +\n `COLUMN_DEFAULT AS column_default, ` +\n `CHARACTER_MAXIMUM_LENGTH AS char_length, ` +\n `NUMERIC_PRECISION AS numeric_precision, ` +\n `NUMERIC_SCALE AS numeric_scale ` +\n `FROM information_schema.columns ` +\n `WHERE table_schema = DATABASE() AND table_name = '${table}' ` +\n `ORDER BY ORDINAL_POSITION`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new MysqlTableInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { SelectNode } from \"../../../ast/query/node/select/basic_select\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlSelectInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const selectNode = node as SelectNode;\n if (selectNode.isRawValue) {\n return {\n sql: selectNode.column as string,\n bindings: [],\n };\n }\n\n const columnResult = this.formatColumn(\n selectNode.column,\n selectNode.sqlFunction,\n );\n const aliasSql = this.formatAlias(selectNode.alias);\n return {\n sql: `${columnResult.sql}${aliasSql}`,\n bindings: columnResult.bindings,\n };\n }\n\n private formatColumn(\n column: string | QueryNode | QueryNode[],\n sqlFunction?: string,\n ): ReturnType<typeof AstParser.prototype.parse> {\n if (typeof column === \"string\") {\n const col = new InterpreterUtils(this.model).formatStringColumn(\n \"mysql\",\n column,\n );\n let sql = col;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}(${col})`;\n }\n return {\n sql,\n bindings: [],\n };\n }\n\n if (Array.isArray(column) && column.length > 0) {\n const astParser = new AstParser(this.model, \"mysql\" as SqlDataSourceType);\n const result = astParser.parse(column);\n let sql = `(${result.sql})`;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}${sql}`;\n }\n return {\n sql,\n bindings: result.bindings,\n };\n }\n\n if (!Array.isArray(column)) {\n const astParser = new AstParser(this.model, \"mysql\" as SqlDataSourceType);\n const result = astParser.parse([column]);\n let sql = `(${result.sql})`;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}${sql}`;\n }\n return {\n sql,\n bindings: result.bindings,\n };\n }\n\n const formattedColumns = column.map((col) => {\n if (typeof col === \"string\") {\n const formatted = new InterpreterUtils(this.model).formatStringColumn(\n \"mysql\",\n col,\n );\n if (sqlFunction) {\n return `${sqlFunction.toLowerCase()}(${formatted})`;\n }\n return formatted;\n }\n\n const astParser = new AstParser(this.model, \"mysql\" as SqlDataSourceType);\n const result = astParser.parse([col]);\n let sql = `(${result.sql})`;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}${sql}`;\n }\n return sql;\n });\n\n return {\n sql: formattedColumns.join(\", \"),\n bindings: [],\n };\n }\n\n private formatAlias(alias?: string): string {\n if (alias && alias.length) {\n return ` as \\`${alias}\\``;\n }\n return \"\";\n }\n}\n\nexport default new MysqlSelectInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { FromNode } from \"../../../ast/query/node/from\";\nimport { TruncateNode } from \"../../../ast/query/node/truncate\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlTruncateInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const truncateNode = node as TruncateNode;\n\n if (truncateNode.isRawValue && typeof truncateNode.fromNode === \"string\") {\n return {\n sql: truncateNode.fromNode,\n bindings: [],\n };\n }\n\n const formattedTable = new InterpreterUtils(\n this.model,\n ).getFromForWriteOperations(\"mysql\", truncateNode.fromNode as FromNode);\n\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n}\n\nexport default new MysqlTruncateInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { UnionNode } from \"../../../ast/query/node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { Model } from \"../../../models/model\";\n\nclass MysqlUnionInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const unionNode = node as UnionNode;\n const parser = new AstParser(this.model, \"mysql\");\n const nodes = Array.isArray(unionNode.query)\n ? unionNode.query\n : [unionNode.query];\n\n const ast =\n typeof unionNode.query === \"string\"\n ? { sql: unionNode.query, bindings: [] }\n : parser.parse(\n nodes.filter(Boolean) as QueryNode[],\n unionNode.currParamIndex,\n );\n\n return {\n sql: ast.sql,\n bindings: ast.bindings,\n };\n }\n}\n\nexport default new MysqlUnionInterpreter();\n","import { QueryNode } from \"../../query\";\n\nexport class RawNode extends QueryNode {\n rawValue: string;\n canKeywordBeSeenMultipleTimes = true;\n chainsWith = \" \";\n currParamIndex = 0;\n isRawValue = true;\n folder = \"raw\";\n file = \"raw\";\n\n constructor(value: string) {\n super(\"raw\", true);\n this.rawValue = value;\n }\n}\n","import { AstParser } from \"../../../ast/parser\";\nimport { FromNode } from \"../../../ast/query/node/from\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { UpdateNode } from \"../../../ast/query/node/update\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlUpdateInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const updateNode = node as UpdateNode;\n if (updateNode.isRawValue && typeof updateNode.fromNode === \"string\") {\n return {\n sql: updateNode.fromNode as string,\n bindings: updateNode.values,\n };\n }\n\n const interpreterUtils = new InterpreterUtils(this.model);\n const formattedTable = interpreterUtils.getFromForWriteOperations(\n \"mysql\",\n updateNode.fromNode as FromNode,\n );\n\n if (!updateNode.columns.length || !updateNode.values.length) {\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n\n const finalBindings: any[] = [];\n const setClause = updateNode.columns\n .map((column, index) => {\n const value = updateNode.values[index];\n if (value instanceof RawNode) {\n return `${interpreterUtils.formatStringColumn(\"mysql\", column)} = ${value.rawValue}`;\n }\n\n finalBindings.push(value);\n return `${interpreterUtils.formatStringColumn(\"mysql\", column)} = ?`;\n })\n .join(\", \");\n\n return {\n sql: `${formattedTable} set ${setClause}`,\n bindings: finalBindings,\n };\n }\n}\n\nexport default new MysqlUpdateInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport type { WhereNode } from \"../../../ast/query/node/where/where\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlWhereInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const whereNode = node as WhereNode;\n if (whereNode.isRawValue) {\n return {\n sql: whereNode.column,\n bindings: (whereNode.value as any[]) ?? [],\n };\n }\n\n let sql = \"\";\n let bindings: any[] = [];\n\n if (this.isRawNode(whereNode.value)) {\n const formattedRight = this.formatRawIdentifierIfPossible(\n whereNode.value.rawValue,\n );\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"mysql\", whereNode.column)} ${whereNode.operator} ${formattedRight}`;\n bindings = [];\n } else if (Array.isArray(whereNode.value)) {\n if (whereNode.operator.toLowerCase() === \"between\") {\n const placeholders = `? AND ?`;\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"mysql\", whereNode.column)} between ${placeholders}`;\n bindings = whereNode.value;\n } else {\n const placeholders = whereNode.value.map((_) => `?`).join(\", \");\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"mysql\", whereNode.column)} ${whereNode.operator} (${placeholders})`;\n bindings = whereNode.value;\n }\n } else {\n if (whereNode.operator.includes(\"null\")) {\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"mysql\", whereNode.column)} ${whereNode.operator}`;\n bindings = [];\n } else if (whereNode.value === undefined) {\n return { sql: \"\", bindings: [] };\n } else {\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"mysql\", whereNode.column)} ${whereNode.operator} ?`;\n bindings = [whereNode.value];\n }\n }\n\n if (whereNode.isNegated) {\n sql = `not (${sql})`;\n }\n\n return { sql: sql.trim(), bindings };\n }\n\n private isRawNode(value: any): value is RawNode {\n return (\n value &&\n typeof value === \"object\" &&\n \"rawValue\" in value &&\n value.isRawValue === true\n );\n }\n\n private formatRawIdentifierIfPossible(raw: string): string {\n const isIdentifier =\n /^[A-Za-z_][A-Za-z0-9_]*(\\.(\\*|[A-Za-z_][A-Za-z0-9_]*))?$/.test(raw);\n if (!isIdentifier) {\n return raw;\n }\n return new InterpreterUtils(this.model).formatStringColumn(\"mysql\", raw);\n }\n}\n\nexport default new MysqlWhereInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { WhereGroupNode } from \"../../../ast/query/node/where/where_group\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlWhereGroupInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const groupNode = node as WhereGroupNode;\n if (!groupNode.nodes || groupNode.nodes.length === 0) {\n return { sql: \"\", bindings: [] };\n }\n\n const astParser = new AstParser(this.model, \"mysql\" as SqlDataSourceType);\n const { sql, bindings } = astParser.parse(\n groupNode.nodes,\n groupNode.currParamIndex,\n true,\n );\n\n return {\n sql: `(${sql})`,\n bindings,\n };\n }\n}\n\nexport default new MysqlWhereGroupInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { WhereJsonNode } from \"../../../ast/query/node/where/where_json\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass MysqlWhereJsonInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const whereJsonNode = node as WhereJsonNode;\n if (whereJsonNode.isRawValue) {\n return {\n sql: whereJsonNode.column,\n bindings: [],\n };\n }\n\n let sql = \"\";\n let bindings: any[] = [];\n\n const columnSql = new InterpreterUtils(this.model).formatStringColumn(\n \"mysql\",\n whereJsonNode.column,\n );\n\n switch (whereJsonNode.jsonOperator) {\n case \"=\":\n sql = `${columnSql} = CAST(? AS JSON)`;\n bindings = [JSON.stringify(whereJsonNode.value)];\n break;\n case \"contains\":\n sql = `JSON_CONTAINS(${columnSql}, ?)`;\n bindings = [JSON.stringify(whereJsonNode.value)];\n break;\n case \"not contains\":\n sql = `JSON_CONTAINS(${columnSql}, ?)`;\n bindings = [JSON.stringify(whereJsonNode.value)];\n break;\n case \"raw\":\n sql = whereJsonNode.column;\n bindings = Array.isArray(whereJsonNode.value)\n ? whereJsonNode.value\n : [];\n break;\n }\n\n if (whereJsonNode.isNegated) {\n sql = `NOT (${sql})`;\n }\n\n return { sql: sql.trim(), bindings };\n }\n}\n\nexport default new MysqlWhereJsonInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { WhereSubqueryNode } from \"../../../ast/query/node/where/where_subquery\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlWhereSubqueryInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const subqueryNode = node as WhereSubqueryNode;\n\n if (this.isStringSubquery(subqueryNode.subquery)) {\n return this.handleStringSubquery(subqueryNode);\n }\n\n if (this.isArraySubquery(subqueryNode.subquery)) {\n return this.handleArraySubquery(subqueryNode);\n }\n\n return this.handleObjectSubquery(subqueryNode);\n }\n\n private isStringSubquery(\n subquery: string | QueryNode | QueryNode[],\n ): subquery is string {\n return typeof subquery === \"string\";\n }\n\n private isArraySubquery(\n subquery: string | QueryNode | QueryNode[],\n ): subquery is QueryNode[] {\n return Array.isArray(subquery);\n }\n\n private handleStringSubquery(\n subqueryNode: WhereSubqueryNode,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const sql = `${subqueryNode.column} ${subqueryNode.operator} (${subqueryNode.subquery})`;\n return { sql: sql.trim(), bindings: [] };\n }\n\n private handleArraySubquery(\n subqueryNode: WhereSubqueryNode,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const astParser = new AstParser(this.model, \"mysql\" as SqlDataSourceType);\n const { sql: subquerySql, bindings: subqueryBindings } = astParser.parse(\n subqueryNode.subquery as QueryNode[],\n subqueryNode.currParamIndex,\n );\n\n const sql = `${subqueryNode.column} ${subqueryNode.operator} (${subquerySql})`;\n return { sql: sql.trim(), bindings: subqueryBindings };\n }\n\n private handleObjectSubquery(\n subqueryNode: WhereSubqueryNode,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const astParser = new AstParser(this.model, \"mysql\" as SqlDataSourceType);\n const { sql: subquerySql, bindings: subqueryBindings } = astParser.parse(\n [subqueryNode.subquery as QueryNode],\n subqueryNode.currParamIndex,\n );\n\n const sql = `${subqueryNode.column} ${subqueryNode.operator} (${subquerySql})`;\n return { sql: sql.trim(), bindings: subqueryBindings };\n }\n}\n\nexport default new MysqlWhereSubqueryInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { WithNode } from \"../../../ast/query/node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass MysqlWithInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(\n node: QueryNode | string,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const withNode = node as WithNode;\n const parser = new AstParser(this.model, \"mysql\");\n const nodes = Array.isArray(withNode.body)\n ? withNode.body\n : [withNode.body];\n\n const ast = parser.parse(\n nodes.filter(Boolean) as QueryNode[],\n withNode.currParamIndex,\n );\n\n return {\n sql: `${withNode.alias} as (${ast.sql})`,\n bindings: ast.bindings,\n };\n }\n}\n\nexport default new MysqlWithInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { AddColumnNode } from \"../../../ast/query/node/alter_table/add_column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PgAddColumnInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const acNode = node as AddColumnNode;\n const ast = new AstParser(this.model, \"postgres\" as SqlDataSourceType);\n let { sql } = ast.parse([acNode.column]);\n\n const inlineConstraints = (acNode as any).inlineConstraints;\n if (inlineConstraints && inlineConstraints.length) {\n const constraintParts: string[] = [];\n\n for (const constraint of inlineConstraints) {\n const { sql: constraintSql } = ast.parse([constraint]);\n constraintParts.push(constraintSql);\n }\n\n if (constraintParts.length) {\n sql += ` ${constraintParts.join(\" \")}`;\n }\n }\n\n return { sql: `add column ${sql}`, bindings: [] };\n }\n}\nexport default new PgAddColumnInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { AddConstraintNode } from \"../../../ast/query/node/alter_table/add_constraint\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PgAddConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const acNode = node as AddConstraintNode;\n const ast = new AstParser(this.model, \"postgres\" as SqlDataSourceType);\n const { sql } = ast.parse([acNode.constraint]);\n return { sql: `add ${sql}`, bindings: [] };\n }\n}\nexport default new PgAddConstraintInterpreter();\n","import { AddPrimaryKeyNode } from \"../../../ast/query/node/alter_table/add_primary_key\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PgAddPrimaryKeyInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const pk = node as AddPrimaryKeyNode;\n const cols = pk.columns.map((c) => `\"${c}\"`).join(\", \");\n return { sql: `add primary key (${cols})`, bindings: [] };\n }\n}\nexport default new PgAddPrimaryKeyInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { AlterColumnTypeNode } from \"../../../ast/query/node/alter_table/alter_column_type\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PgAlterColumnTypeInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const a = node as AlterColumnTypeNode;\n const ast = new AstParser(this.model, \"postgres\" as SqlDataSourceType);\n const { sql } = ast.parse([a.newType]);\n const [, ...restTokens] = sql.trim().split(/\\s+/);\n const typeSql = restTokens.join(\" \");\n\n // Generate type change SQL\n let resultSql = `alter column \"${a.column}\" type ${typeSql}`;\n\n // Add constraint modifications\n if (a.options.nullable !== undefined) {\n const nullableSql = a.options.nullable\n ? `alter column \"${a.column}\" drop not null`\n : `alter column \"${a.column}\" set not null`;\n resultSql += `, ${nullableSql}`;\n }\n\n if (a.options.dropDefault) {\n resultSql += `, alter column \"${a.column}\" drop default`;\n } else if (a.options.default !== undefined) {\n let defaultValue = a.options.default;\n if (defaultValue === null) {\n defaultValue = \"null\";\n } else if (typeof defaultValue === \"string\") {\n if (defaultValue === \"NULL\") {\n defaultValue = \"null\";\n } else if (defaultValue === \"TRUE\" || defaultValue === \"FALSE\") {\n defaultValue = defaultValue.toLowerCase();\n } else {\n defaultValue = `'${defaultValue}'`;\n }\n }\n resultSql += `, alter column \"${a.column}\" set default ${defaultValue}`;\n }\n\n if (a.options.unique !== undefined) {\n if (a.options.unique) {\n resultSql += `, add constraint \"unique_${a.column}\" unique (\"${a.column}\")`;\n } else {\n resultSql += `, drop constraint \"unique_${a.column}\"`;\n }\n }\n\n return { sql: resultSql, bindings: [] };\n }\n}\nexport default new PgAlterColumnTypeInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { AlterTableNode } from \"../../../ast/query/node/alter_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresAlterTableInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const atNode = node as AlterTableNode;\n const utils = new InterpreterUtils(this.model);\n const tableName = utils.formatStringTable(\"postgres\", atNode.table);\n\n if (!atNode.children || !atNode.children.length) {\n return { sql: \"\", bindings: [] };\n }\n\n const astParser = new AstParser(\n this.model,\n \"postgres\" as SqlDataSourceType,\n );\n const parts: string[] = [];\n const bindings: any[] = [];\n\n for (const child of atNode.children) {\n const { sql, bindings: childBindings } = astParser.parse([child]);\n parts.push(sql.trim());\n bindings.push(...childBindings);\n }\n\n const stmt = parts.join(\", \");\n const ifExists = atNode.ifExists ? \"if exists \" : \"\";\n const finalSql = `${ifExists}${tableName} ${stmt}`;\n return { sql: finalSql, bindings };\n }\n}\n\nexport default new PostgresAlterTableInterpreter();\n","import { DropColumnNode } from \"../../../ast/query/node/alter_table/drop_column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PgDropColumnInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const d = node as DropColumnNode;\n return { sql: `drop column \"${d.column}\"`, bindings: [] };\n }\n}\nexport default new PgDropColumnInterpreter();\n","import { DropConstraintNode } from \"../../../ast/query/node/alter_table/drop_constraint\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PgDropConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const dNode = node as DropConstraintNode;\n return { sql: `drop constraint \"${dNode.constraintName}\"`, bindings: [] };\n }\n}\nexport default new PgDropConstraintInterpreter();\n","import { DropDefaultNode } from \"../../../ast/query/node/alter_table/drop_default\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresDropDefaultInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const n = node as DropDefaultNode;\n return { sql: `alter column \"${n.column}\" drop default`, bindings: [] };\n }\n}\nexport default new PostgresDropDefaultInterpreter();\n","import { DropNotNullNode } from \"../../../ast/query/node/alter_table/drop_not_null\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresDropNotNullInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const n = node as DropNotNullNode;\n return { sql: `alter column \"${n.column}\" drop not null`, bindings: [] };\n }\n}\nexport default new PostgresDropNotNullInterpreter();\n","import { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PgDropPrimaryKeyInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(_node: QueryNode) {\n // Not available in postgres\n return { sql: ``, bindings: [] };\n }\n}\nexport default new PgDropPrimaryKeyInterpreter();\n","import { RenameColumnNode } from \"../../../ast/query/node/alter_table/rename_column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PgRenameColumnInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const r = node as RenameColumnNode;\n return {\n sql: `rename column \"${r.oldName}\" to \"${r.newName}\"`,\n bindings: [],\n };\n }\n}\nexport default new PgRenameColumnInterpreter();\n","import { RenameTableNode } from \"../../../ast/query/node/alter_table/rename_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PgRenameTableInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const rt = node as RenameTableNode;\n return { sql: `\"${rt.newName}\"`, bindings: [] };\n }\n}\nexport default new PgRenameTableInterpreter();\n","import { SetDefaultNode } from \"../../../ast/query/node/alter_table/set_default\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresSetDefaultInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const n = node as SetDefaultNode;\n let val = n.defaultValue;\n\n if (val === \"NULL\") {\n val = \"null\";\n } else if (val === \"TRUE\" || val === \"FALSE\") {\n val = val.toLowerCase();\n } else if (\n typeof val === \"string\" &&\n val !== \"null\" &&\n val !== \"true\" &&\n val !== \"false\"\n ) {\n val = `'${val}'`;\n }\n\n return {\n sql: `alter column \"${n.column}\" set default ${val}`,\n bindings: [],\n };\n }\n}\nexport default new PostgresSetDefaultInterpreter();\n","import { SetNotNullNode } from \"../../../ast/query/node/alter_table/set_not_null\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresSetNotNullInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const n = node as SetNotNullNode;\n return { sql: `alter column \"${n.column}\" set not null`, bindings: [] };\n }\n}\nexport default new PostgresSetNotNullInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { ColumnTypeNode } from \"../../../ast/query/node/column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { getColumnValue } from \"../../../resources/utils\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresColumnTypeInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const colNode = node as ColumnTypeNode;\n if (colNode.isRawValue) {\n return { sql: colNode.column as string, bindings: [] };\n }\n\n const utils = new InterpreterUtils(this.model);\n const columnName = utils.formatStringColumn(\n \"postgres\",\n getColumnValue(colNode.column),\n );\n\n const dt = colNode.dataType.toLowerCase();\n\n if (dt === \"char\") {\n const len = colNode.length ?? 1;\n return { sql: `${columnName} char(${len})`, bindings: [] };\n } else if (dt === \"varchar\") {\n const len = colNode.length ?? 255;\n return { sql: `${columnName} varchar(${len})`, bindings: [] };\n } else if (\n dt === \"text\" ||\n dt === \"longtext\" ||\n dt === \"mediumtext\" ||\n dt === \"tinytext\"\n ) {\n return { sql: `${columnName} text`, bindings: [] };\n } else if (dt === \"uuid\") {\n return { sql: `${columnName} uuid`, bindings: [] };\n } else if (dt === \"ulid\") {\n return { sql: `${columnName} varchar(26)`, bindings: [] };\n } else if (dt === \"bigint\") {\n if (colNode.autoIncrement) {\n return { sql: `${columnName} bigserial`, bindings: [] };\n }\n return { sql: `${columnName} bigint`, bindings: [] };\n } else if (dt === \"tinyint\") {\n return { sql: `${columnName} smallint`, bindings: [] };\n } else if (dt === \"smallint\") {\n return { sql: `${columnName} smallint`, bindings: [] };\n } else if (dt === \"mediumint\") {\n return { sql: `${columnName} integer`, bindings: [] };\n } else if (dt === \"float\" || dt === \"real\") {\n return { sql: `${columnName} real`, bindings: [] };\n } else if (dt === \"double\") {\n return { sql: `${columnName} double precision`, bindings: [] };\n } else if (dt === \"decimal\" || dt === \"numeric\") {\n const precision = colNode.precision ?? 10;\n const scale = colNode.scale ?? 0;\n return {\n sql: `${columnName} numeric(${precision}, ${scale})`,\n bindings: [],\n };\n } else if (dt === \"date\") {\n return { sql: `${columnName} date`, bindings: [] };\n } else if (dt === \"year\") {\n return { sql: `${columnName} smallint`, bindings: [] };\n } else if (dt === \"time\") {\n const p =\n typeof colNode.precision === \"number\" ? `(${colNode.precision})` : \"\";\n return { sql: `${columnName} time${p}`, bindings: [] };\n } else if (dt === \"datetime\" || dt === \"timestamp\") {\n const withTz = colNode.withTimezone\n ? \" with time zone\"\n : \" without time zone\";\n const p =\n typeof colNode.precision === \"number\" ? `(${colNode.precision})` : \"\";\n return {\n sql: `${columnName} timestamp${p}${withTz}`.trimEnd(),\n bindings: [],\n };\n } else if (dt === \"boolean\" || dt === \"bool\") {\n return { sql: `${columnName} boolean`, bindings: [] };\n } else if (\n dt === \"bytea\" ||\n dt === \"binary\" ||\n dt === \"varbinary\" ||\n dt === \"blob\" ||\n dt === \"longblob\" ||\n dt === \"mediumblob\" ||\n dt === \"tinyblob\"\n ) {\n return { sql: `${columnName} bytea`, bindings: [] };\n } else if (dt === \"json\") {\n return { sql: `${columnName} json`, bindings: [] };\n } else if (dt === \"jsonb\") {\n return { sql: `${columnName} jsonb`, bindings: [] };\n } else if (dt === \"enum\") {\n if (colNode.enumValues && colNode.enumValues.length > 0) {\n const values = colNode.enumValues.map((v) => `'${v}'`).join(\", \");\n return {\n sql: `${columnName} text check (${columnName} in (${values}))`,\n bindings: [],\n };\n }\n return { sql: `${columnName} text`, bindings: [] };\n } else if (dt === \"integer\" || dt === \"int\") {\n if (colNode.autoIncrement) {\n return { sql: `${columnName} serial`, bindings: [] };\n }\n\n return { sql: `${columnName} integer`, bindings: [] };\n }\n\n return {\n sql: `${columnName} ${dt} ${colNode.length ? `(${colNode.length})` : \"\"}`,\n bindings: [],\n };\n }\n}\n\nexport default new PostgresColumnTypeInterpreter();\n","import { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PgAfterConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(_node: QueryNode) {\n return { sql: \"\", bindings: [] };\n }\n}\nexport default new PgAfterConstraintInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { ConstraintNode } from \"../../../ast/query/node/constraint\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { getColumnValue } from \"../../../resources/utils\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const cNode = node as ConstraintNode;\n\n const utils = new InterpreterUtils(this.model);\n\n if (cNode.constraintType === \"primary_key\") {\n if (cNode.columns && cNode.columns.length) {\n const sqlPrefix = cNode.constraintName\n ? `constraint \"${cNode.constraintName}\" `\n : \"\";\n const cols = (cNode.columns ?? [])\n .map((c) => utils.formatStringColumn(\"postgres\", getColumnValue(c)))\n .join(\", \");\n return { sql: `${sqlPrefix}primary key (${cols})`, bindings: [] };\n }\n return { sql: `primary key`, bindings: [] };\n }\n\n if (cNode.constraintType === \"unique\") {\n if (cNode.columns && cNode.columns.length > 0) {\n const colsArr = cNode.columns ?? [];\n const sqlPrefixU = cNode.constraintName\n ? `constraint \"${cNode.constraintName}\" `\n : \"\";\n const cols = colsArr\n .map((c) => utils.formatStringColumn(\"postgres\", getColumnValue(c)))\n .join(\", \");\n // For inline constraints in CREATE TABLE, don't include column names\n if (!cNode.constraintName) {\n return { sql: `unique`, bindings: [] };\n }\n return { sql: `${sqlPrefixU}unique (${cols})`, bindings: [] };\n }\n return { sql: `unique`, bindings: [] };\n }\n\n if (cNode.constraintType === \"not_null\") {\n return { sql: `not null`, bindings: [] };\n }\n\n if (cNode.constraintType === \"null\") {\n return { sql: `null`, bindings: [] };\n }\n\n if (cNode.constraintType === \"default\") {\n if (cNode.defaultValue !== undefined) {\n let val = cNode.defaultValue;\n if (val === \"NULL\") {\n return { sql: `default null`, bindings: [] };\n }\n if (val === \"TRUE\" || val === \"FALSE\") {\n return { sql: `default ${val.toLowerCase()}`, bindings: [] };\n }\n if (val === null) {\n return { sql: `default null`, bindings: [] };\n }\n if (typeof val === \"string\") {\n val = `'${val}'`;\n }\n return { sql: `default ${val}`, bindings: [] };\n }\n return { sql: `default null`, bindings: [] };\n }\n\n if (cNode.constraintType === \"foreign_key\") {\n if (!cNode.columns || !cNode.columns.length) {\n return { sql: \"\", bindings: [] };\n }\n const cols = cNode.columns\n .map((c) => utils.formatStringColumn(\"postgres\", getColumnValue(c)))\n .join(\", \");\n if (!cNode.references) {\n return { sql: \"\", bindings: [] };\n }\n const refTable = utils.formatStringTable(\n \"postgres\",\n cNode.references.table,\n );\n const refCols = cNode.references.columns\n .map((c) => utils.formatStringColumn(\"postgres\", getColumnValue(c)))\n .join(\", \");\n const sqlPrefix = cNode.constraintName\n ? `constraint \"${cNode.constraintName}\" `\n : \"\";\n let sql = `${sqlPrefix}foreign key (${cols}) references ${refTable}(${refCols})`;\n if (cNode.onDelete) {\n sql += ` on delete ${cNode.onDelete}`;\n }\n if (cNode.onUpdate) {\n sql += ` on update ${cNode.onUpdate}`;\n }\n return { sql, bindings: [] };\n }\n\n return { sql: \"\", bindings: [] };\n }\n}\n\nexport default new PostgresConstraintInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { CreateTableNode } from \"../../../ast/query/node/create_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresCreateTableInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const ctNode = node as CreateTableNode;\n\n const utils = new InterpreterUtils(this.model);\n const tableName = utils.formatStringTable(\"postgres\", ctNode.table);\n\n if (!ctNode.children || !ctNode.children.length) {\n return { sql: `${tableName} ()`, bindings: [] };\n }\n\n const astParser = new AstParser(\n this.model,\n \"postgres\" as SqlDataSourceType,\n );\n\n const parts: string[] = [];\n const bindings: any[] = [];\n\n for (const child of ctNode.children) {\n const { sql, bindings: childBindings } = astParser.parse([child]);\n\n if (child.folder === \"constraint\") {\n const last = parts.pop() ?? \"\";\n const inlineConstraintSql = sql;\n\n // Handle inline constraints: not null, null, and default\n if (\n /not null/i.test(inlineConstraintSql) ||\n /null/i.test(inlineConstraintSql) ||\n /default/i.test(inlineConstraintSql)\n ) {\n let combined = `${last} ${inlineConstraintSql}`.trim();\n combined = combined.replace(\n /(references\\s+\"[^\"]+\"\\s*\\([^)]*\\))\\s+not null/i,\n \"not null $1\",\n );\n parts.push(combined);\n bindings.push(...childBindings);\n continue;\n }\n\n parts.push(last);\n parts.push(inlineConstraintSql);\n bindings.push(...childBindings);\n continue;\n }\n\n parts.push(sql);\n bindings.push(...childBindings);\n }\n\n for (const constraint of ctNode.namedConstraints) {\n const { sql, bindings: constraintBindings } = astParser.parse([\n constraint,\n ]);\n\n parts.push(sql);\n bindings.push(...constraintBindings);\n }\n\n const columnsSql = parts.join(\", \");\n const ifNotExists = ctNode.ifNotExists ? \"if not exists \" : \"\";\n const finalSql = `${ifNotExists}${tableName} (${columnsSql})`;\n return { sql: finalSql, bindings };\n }\n}\n\nexport default new PostgresCreateTableInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { DeleteNode } from \"../../../ast/query/node/delete\";\nimport { FromNode } from \"../../../ast/query/node/from\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresDeleteInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const deleteNode = node as DeleteNode;\n\n if (\n deleteNode.isRawValue &&\n typeof deleteNode.fromNode.table === \"string\"\n ) {\n return {\n sql: deleteNode.fromNode.table,\n bindings: [],\n };\n }\n\n const formattedTable = new InterpreterUtils(\n this.model,\n ).getFromForWriteOperations(\"postgres\", deleteNode.fromNode as FromNode);\n\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n}\n\nexport default new PostgresDeleteInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { Model } from \"../../../models/model\";\n\nclass PostgresDistinctInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n return {\n sql: \"\",\n bindings: [],\n };\n }\n}\n\nexport default new PostgresDistinctInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { DistinctOnNode } from \"../../../ast/query/node/distinct/distinct_on\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresDistinctOnInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const distinctOnNode = node as DistinctOnNode;\n const columns = distinctOnNode.columns\n .map((col) =>\n new InterpreterUtils(this.model).formatStringColumn(\"postgres\", col),\n )\n .join(\", \");\n return {\n sql: `(${columns})`,\n bindings: [],\n };\n }\n}\n\nexport default new PostgresDistinctOnInterpreter();\n","import { DropTableNode } from \"../../../ast/query/node/drop_table/drop_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PgDropTableInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const dt = node as DropTableNode;\n const utils = new InterpreterUtils(this.model);\n const tableSql = utils.formatStringTable(\"postgres\", dt.table);\n const exists = dt.ifExists ? \"if exists \" : \"\";\n return { sql: `${exists}${tableSql}`, bindings: [] };\n }\n}\nexport default new PgDropTableInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { FromNode } from \"../../../ast/query/node/from\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresFromInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const fromNode = node as FromNode;\n\n if (typeof fromNode.table === \"string\") {\n const interpreterUtils = new InterpreterUtils(this.model);\n\n if (fromNode.alias && fromNode.alias.length > 0) {\n const tableSql = interpreterUtils.formatStringTable(\n \"postgres\",\n fromNode.table,\n );\n\n return {\n sql: `${tableSql} as \"${fromNode.alias}\"`,\n bindings: [],\n };\n }\n\n const tableSql = interpreterUtils.formatStringTable(\n \"postgres\",\n fromNode.table,\n );\n\n return { sql: tableSql, bindings: [] };\n }\n\n const subQueryNodes = Array.isArray(fromNode.table)\n ? fromNode.table\n : [fromNode.table];\n\n const astParser = new AstParser(\n this.model,\n \"postgres\" as SqlDataSourceType,\n );\n const result = astParser.parse(subQueryNodes);\n\n const aliasSql =\n fromNode.alias && fromNode.alias.length ? ` as \"${fromNode.alias}\"` : \"\";\n\n return {\n sql: `(${result.sql})${aliasSql}`,\n bindings: result.bindings,\n };\n }\n}\n\nexport default new PostgresFromInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { GroupByNode } from \"../../../ast/query/node/group_by/group_by\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { Model } from \"../../../models/model\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresGroupByInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const groupByNode = node as GroupByNode;\n if (groupByNode.isRawValue) {\n return {\n sql: groupByNode.column,\n bindings: [],\n };\n }\n\n const columnSql = new InterpreterUtils(this.model).formatStringColumn(\n \"postgres\",\n groupByNode.column,\n );\n\n return {\n sql: columnSql,\n bindings: [],\n };\n }\n}\n\nexport default new PostgresGroupByInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { HavingNode } from \"../../../ast/query/node/having/having\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresHavingInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const havingNode = node as HavingNode;\n if (havingNode.isRawValue) {\n return {\n sql: havingNode.column,\n bindings: havingNode.value as any[],\n };\n }\n\n const idx = havingNode.currParamIndex;\n let sql = \"\";\n let bindings: any[] = [];\n\n if (\n !(havingNode.value instanceof QueryNode) &&\n !Array.isArray(havingNode.value)\n ) {\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"postgres\", havingNode.column)} ${havingNode.operator} $${idx}`;\n bindings = [havingNode.value];\n }\n\n if (Array.isArray(havingNode.value)) {\n const placeholders = havingNode.value\n .map((_, i) => `$${idx + i}`)\n .join(\", \");\n\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"postgres\", havingNode.column)} ${havingNode.operator} (${placeholders})`;\n bindings = havingNode.value;\n }\n\n if (havingNode.isNegated) {\n sql = `not (${sql})`;\n }\n\n return { sql: sql.trim(), bindings };\n }\n}\n\nexport default new PostgresHavingInterpreter();\n","import { CreateIndexNode } from \"../../../ast/query/node/index_op/create_index\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PgCreateIndexInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const ci = node as CreateIndexNode;\n const utils = new InterpreterUtils(this.model);\n const tableSql = utils.formatStringTable(\"postgres\", ci.table);\n const cols = ci.columns.map((c) => `\"${c}\"`).join(\", \");\n const unique = ci.unique ? \"unique \" : \"\";\n return {\n sql: `${unique}\\\"${ci.indexName}\\\" on ${tableSql} (${cols})`,\n bindings: [],\n };\n }\n}\nexport default new PgCreateIndexInterpreter();\n","import { DropIndexNode } from \"../../../ast/query/node/index_op/drop_index\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresDropIndexInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const di = node as DropIndexNode;\n return {\n sql: `\"${di.indexName}\" ${di.cascade ? \"cascade\" : \"\"}`,\n bindings: [],\n };\n }\n}\nexport default new PostgresDropIndexInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { InsertNode } from \"../../../ast/query/node/insert\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresInsertInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const insertNode = node as InsertNode;\n if (insertNode.isRawValue) {\n return {\n sql: insertNode.fromNode.table as string,\n bindings: [],\n };\n }\n\n const interpreterUtils = new InterpreterUtils(this.model);\n const formattedTable = interpreterUtils.getFromForWriteOperations(\n \"postgres\",\n insertNode.fromNode,\n );\n\n if (!insertNode.records.length) {\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n\n const firstRecord = insertNode.records[0];\n const columns = Object.keys(firstRecord);\n if (!columns.length) {\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n\n const formattedColumns = columns\n .map((column) => interpreterUtils.formatStringColumn(\"postgres\", column))\n .join(\", \");\n\n const allValues: any[] = [];\n const valuesClauses: string[] = [];\n let paramIndex = insertNode.currParamIndex;\n\n for (const record of insertNode.records) {\n const recordValues = columns.map((column) => record[column]);\n allValues.push(...recordValues);\n\n const placeholders = columns\n .map((_, i) => {\n const value = recordValues[i];\n return `$${paramIndex++}${this.formatTypeCast(value)}`;\n })\n .join(\", \");\n\n valuesClauses.push(`(${placeholders})`);\n }\n\n let sql = `${formattedTable} (${formattedColumns}) values ${valuesClauses.join(\", \")}`;\n\n if (!insertNode.disableReturning) {\n if (insertNode.returning && insertNode.returning.length) {\n const returningCols = insertNode.returning\n .map((column) =>\n interpreterUtils.formatStringColumn(\"postgres\", column),\n )\n .join(\", \");\n sql += ` returning ${returningCols}`;\n } else {\n sql += \" returning *\";\n }\n }\n\n return {\n sql,\n bindings: allValues,\n };\n }\n\n private formatTypeCast(value: any): string {\n let typeCast = \"\";\n if (Buffer.isBuffer(value)) {\n typeCast = \"::bytea\";\n } else if (Array.isArray(value)) {\n typeCast = \"::array\";\n } else if (\n typeof value === \"object\" &&\n value !== null &&\n !(value instanceof Date)\n ) {\n typeCast = \"::jsonb\";\n } else if (typeof value === \"boolean\") {\n typeCast = \"::boolean\";\n } else if (typeof value === \"bigint\") {\n typeCast = \"::bigint\";\n }\n\n return typeCast;\n }\n}\n\nexport default new PostgresInsertInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { JoinNode } from \"../../../ast/query/node/join/join\";\nimport type { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresJoinInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const joinNode = node as JoinNode;\n if (joinNode.isRawValue) {\n return {\n sql: joinNode.table,\n bindings: [],\n };\n }\n\n const utils = new InterpreterUtils(this.model);\n\n let leftColumnStr = joinNode.left;\n if (!leftColumnStr.includes(\".\")) {\n leftColumnStr = `${joinNode.table}.${leftColumnStr}`;\n }\n\n let rightColumnStr = joinNode.right;\n if (!rightColumnStr.includes(\".\")) {\n rightColumnStr = `${this.model.table}.${rightColumnStr}`;\n }\n\n const leftSql = utils.formatStringColumn(\"postgres\", leftColumnStr);\n const rightSql = utils.formatStringColumn(\"postgres\", rightColumnStr);\n const tableSql = utils.formatStringTable(\"postgres\", joinNode.table);\n\n const sql = `${tableSql} on ${leftSql} ${joinNode.on?.operator} ${rightSql}`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new PostgresJoinInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { LimitNode } from \"../../../ast/query/node/limit/limit\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresLimitInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const limitNode = node as LimitNode;\n\n const idx = limitNode.currParamIndex;\n return {\n sql: `$${idx}`,\n bindings: [limitNode.limit],\n };\n }\n}\n\nexport default new PostgresLimitInterpreter();\n","import { LockNode } from \"../../../ast/query/node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\n\nconst lockTypeToSql: Record<string, string> = {\n for_update: \"for update\",\n for_share: \"for share\",\n for_no_key_update: \"for no key update\",\n for_key_share: \"for key share\",\n};\n\nexport class PostgresLockInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): { sql: string; bindings: any[] } {\n const lockNode = node as LockNode;\n let sql = lockTypeToSql[lockNode.lockType] || \"for update\";\n if (lockNode.skipLocked) {\n sql += \" skip locked\";\n }\n\n if (lockNode.noWait) {\n sql += \" nowait\";\n }\n return {\n sql,\n bindings: [],\n };\n }\n}\n\nexport default new PostgresLockInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { OffsetNode } from \"../../../ast/query/node/offset/offset\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresOffsetInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const offsetNode = node as OffsetNode;\n\n const idx = offsetNode.currParamIndex;\n return {\n sql: `$${idx}`,\n bindings: [offsetNode.offset],\n };\n }\n}\n\nexport default new PostgresOffsetInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { OnDuplicateNode } from \"../../../ast/query/node/on_duplicate\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresOnDuplicateInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const onDuplicateNode = node as OnDuplicateNode;\n\n if (onDuplicateNode.isRawValue) {\n return {\n sql: onDuplicateNode.table,\n bindings: [],\n };\n }\n\n const interpreterUtils = new InterpreterUtils(this.model);\n const formattedConflictColumns = onDuplicateNode.conflictColumns\n .map((column) => interpreterUtils.formatStringColumn(\"postgres\", column))\n .join(\", \");\n\n if (onDuplicateNode.mode === \"ignore\") {\n return {\n sql: `on conflict (${formattedConflictColumns}) do nothing`,\n bindings: [],\n };\n }\n\n const updateSet = onDuplicateNode.columnsToUpdate\n .map(\n (column) =>\n `${interpreterUtils.formatStringColumn(\"postgres\", column)} = excluded.${interpreterUtils.formatStringColumn(\"postgres\", column)}`,\n )\n .join(\", \");\n\n let sql = `on conflict (${formattedConflictColumns}) do update set ${updateSet}`;\n\n if (onDuplicateNode.returning && onDuplicateNode.returning.length) {\n const returningCols = onDuplicateNode.returning\n .map((column) =>\n interpreterUtils.formatStringColumn(\"postgres\", column),\n )\n .join(\", \");\n sql += ` returning ${returningCols}`;\n } else {\n sql += \" returning *\";\n }\n\n return {\n sql,\n bindings: [],\n };\n }\n}\n\nexport default new PostgresOnDuplicateInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { OrderByNode } from \"../../../ast/query/node/order_by/order_by\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { Model } from \"../../../models/model\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresOrderByInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const orderByNode = node as OrderByNode;\n if (orderByNode.isRawValue) {\n return {\n sql: orderByNode.column,\n bindings: [],\n };\n }\n\n const columnSql = new InterpreterUtils(this.model).formatStringColumn(\n \"postgres\",\n orderByNode.column,\n );\n const directionSql = orderByNode.direction.toLowerCase();\n\n return {\n sql: `${columnSql} ${directionSql}`,\n bindings: [],\n };\n }\n}\n\nexport default new PostgresOrderByInterpreter();\n","import { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresRawInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): { sql: string; bindings: any[] } {\n const rawNode = node as RawNode;\n return {\n sql: rawNode.rawValue,\n bindings: [],\n };\n }\n}\n\nexport default new PostgresRawInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { ForeignKeyInfoNode } from \"../../../ast/query/node/schema/foreign_key_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresForeignKeyInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as ForeignKeyInfoNode;\n const table = node.table;\n const sql = `SELECT\n tc.constraint_name as name,\n kcu.column_name as column_name,\n ccu.table_name as referenced_table,\n ccu.column_name as referenced_column,\n rc.update_rule as on_update,\n rc.delete_rule as on_delete\n FROM information_schema.table_constraints tc\n JOIN information_schema.key_column_usage kcu\n ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema\n JOIN information_schema.constraint_column_usage ccu\n ON ccu.constraint_name = tc.constraint_name AND ccu.table_schema = tc.table_schema\n JOIN information_schema.referential_constraints rc\n ON rc.constraint_name = tc.constraint_name AND rc.constraint_schema = tc.table_schema\n WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_schema = current_schema() AND tc.table_name = '${table}'\n ORDER BY kcu.ordinal_position`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new PostgresForeignKeyInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { IndexInfoNode } from \"../../../ast/query/node/schema/index_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresIndexInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as IndexInfoNode;\n const table = node.table;\n const sql = `SELECT\n i.relname as index_name,\n a.attname as column_name,\n ix.indisunique as is_unique\n FROM\n pg_class t,\n pg_class i,\n pg_index ix,\n pg_attribute a,\n pg_namespace n\n WHERE\n t.oid = ix.indrelid\n AND i.oid = ix.indexrelid\n AND a.attrelid = t.oid\n AND a.attnum = ANY(ix.indkey)\n AND t.relkind = 'r'\n AND t.relname = '${table}'\n AND t.relnamespace = n.oid\n AND n.nspname = current_schema()\n AND i.relname NOT LIKE 'pk_%'`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new PostgresIndexInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { PrimaryKeyInfoNode } from \"../../../ast/query/node/schema/primary_key_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresPrimaryKeyInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as PrimaryKeyInfoNode;\n const table = node.table;\n const sql = `SELECT\n tc.constraint_name as name,\n kcu.column_name as column_name\n FROM information_schema.table_constraints tc\n JOIN information_schema.key_column_usage kcu\n ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema\n WHERE tc.constraint_type = 'PRIMARY KEY' AND tc.table_schema = current_schema() AND tc.table_name = '${table}'\n ORDER BY kcu.ordinal_position`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new PostgresPrimaryKeyInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { TableInfoNode } from \"../../../ast/query/node/schema/table_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresTableInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as TableInfoNode;\n const table = node.table;\n const sql = `SELECT column_name,\n data_type,\n is_nullable,\n column_default,\n character_maximum_length AS char_length,\n numeric_precision AS numeric_precision,\n numeric_scale AS numeric_scale\nFROM information_schema.columns\nWHERE table_schema = current_schema()\n AND table_name = '${table}'\nORDER BY ordinal_position`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new PostgresTableInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { SelectNode } from \"../../../ast/query/node/select/basic_select\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresSelectInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const selectNode = node as SelectNode;\n if (selectNode.isRawValue) {\n return {\n sql: selectNode.column as string,\n bindings: [],\n };\n }\n\n const columnResult = this.formatColumn(\n selectNode.column,\n selectNode.sqlFunction,\n );\n const aliasSql = this.formatAlias(selectNode.alias);\n return {\n sql: `${columnResult.sql}${aliasSql}`,\n bindings: columnResult.bindings,\n };\n }\n\n private formatColumn(\n column: string | QueryNode | QueryNode[],\n sqlFunction?: string,\n ): ReturnType<typeof AstParser.prototype.parse> {\n if (typeof column === \"string\") {\n const col = new InterpreterUtils(this.model).formatStringColumn(\n \"postgres\",\n column,\n );\n let sql = col;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}(${col})`;\n }\n return {\n sql,\n bindings: [],\n };\n }\n\n if (Array.isArray(column) && column.length > 0) {\n const astParser = new AstParser(\n this.model,\n \"postgres\" as SqlDataSourceType,\n );\n const result = astParser.parse(column);\n let sql = `(${result.sql})`;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}${sql}`;\n }\n return {\n sql,\n bindings: result.bindings,\n };\n }\n\n if (!Array.isArray(column)) {\n const astParser = new AstParser(\n this.model,\n \"postgres\" as SqlDataSourceType,\n );\n const result = astParser.parse([column]);\n let sql = `(${result.sql})`;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}${sql}`;\n }\n return {\n sql,\n bindings: result.bindings,\n };\n }\n\n const formattedColumns = column.map((col) => {\n if (typeof col === \"string\") {\n const formatted = new InterpreterUtils(this.model).formatStringColumn(\n \"postgres\",\n col,\n );\n if (sqlFunction) {\n return `${sqlFunction.toLowerCase()}(${formatted})`;\n }\n return formatted;\n }\n\n const astParser = new AstParser(\n this.model,\n \"postgres\" as SqlDataSourceType,\n );\n const result = astParser.parse([col]);\n let sql = `(${result.sql})`;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}${sql}`;\n }\n return sql;\n });\n\n return {\n sql: formattedColumns.join(\", \"),\n bindings: [],\n };\n }\n\n private formatAlias(alias?: string): string {\n if (alias && alias.length > 0) {\n return ` as \"${alias}\"`;\n }\n return \"\";\n }\n}\n\nexport default new PostgresSelectInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { FromNode } from \"../../../ast/query/node/from\";\nimport { TruncateNode } from \"../../../ast/query/node/truncate\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresTruncateInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const truncateNode = node as TruncateNode;\n\n if (truncateNode.isRawValue && typeof truncateNode.fromNode === \"string\") {\n return {\n sql: truncateNode.fromNode,\n bindings: [],\n };\n }\n\n const formattedTable = new InterpreterUtils(\n this.model,\n ).getFromForWriteOperations(\"postgres\", truncateNode.fromNode as FromNode);\n\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n}\n\nexport default new PostgresTruncateInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { UnionNode } from \"../../../ast/query/node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { Model } from \"../../../models/model\";\n\nclass PostgresUnionInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const unionNode = node as UnionNode;\n const parser = new AstParser(this.model, \"postgres\");\n const nodes = Array.isArray(unionNode.query)\n ? unionNode.query\n : [unionNode.query];\n\n const ast =\n typeof unionNode.query === \"string\"\n ? { sql: unionNode.query, bindings: [] }\n : parser.parse(\n nodes.filter(Boolean) as QueryNode[],\n unionNode.currParamIndex,\n );\n\n return {\n sql: ast.sql,\n bindings: ast.bindings,\n };\n }\n}\n\nexport default new PostgresUnionInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { FromNode } from \"../../../ast/query/node/from\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { UpdateNode } from \"../../../ast/query/node/update\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresUpdateInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const updateNode = node as UpdateNode;\n if (updateNode.isRawValue && typeof updateNode.fromNode === \"string\") {\n return {\n sql: updateNode.fromNode as string,\n bindings: updateNode.values,\n };\n }\n\n const interpreterUtils = new InterpreterUtils(this.model);\n const formattedTable = interpreterUtils.getFromForWriteOperations(\n \"postgres\",\n updateNode.fromNode as FromNode,\n );\n\n if (!updateNode.columns.length || !updateNode.values.length) {\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n\n let rawNodeCount = 0;\n const finalBindings: any[] = [];\n const setClause = updateNode.columns\n .map((column, index) => {\n const idx = updateNode.currParamIndex + index - rawNodeCount;\n const value = updateNode.values[index];\n\n if (value instanceof RawNode) {\n rawNodeCount++;\n return `${interpreterUtils.formatStringColumn(\"postgres\", column)} = ${value.rawValue}`;\n }\n\n finalBindings.push(value);\n return `${interpreterUtils.formatStringColumn(\"postgres\", column)} = $${idx}${this.formatTypeCast(value)}`;\n })\n .join(\", \");\n\n return {\n sql: `${formattedTable} set ${setClause}`,\n bindings: finalBindings,\n };\n }\n\n private formatTypeCast(value: any): string {\n let typeCast = \"\";\n if (Buffer.isBuffer(value)) {\n typeCast = \"::bytea\";\n } else if (Array.isArray(value)) {\n typeCast = \"::array\";\n } else if (\n typeof value === \"object\" &&\n value !== null &&\n !(value instanceof Date)\n ) {\n typeCast = \"::jsonb\";\n } else if (typeof value === \"boolean\") {\n typeCast = \"::boolean\";\n } else if (typeof value === \"bigint\") {\n typeCast = \"::bigint\";\n }\n\n return typeCast;\n }\n}\n\nexport default new PostgresUpdateInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport type { WhereNode } from \"../../../ast/query/node/where/where\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresWhereInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const whereNode = node as WhereNode;\n if (whereNode.isRawValue) {\n return {\n sql: whereNode.column,\n bindings: (whereNode.value as any[]) ?? [],\n };\n }\n\n const idx = whereNode.currParamIndex;\n let sql = \"\";\n let bindings: any[] = [];\n\n if (this.isRawNode(whereNode.value)) {\n const formattedRight = this.formatRawIdentifierIfPossible(\n whereNode.value.rawValue,\n );\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"postgres\", whereNode.column)} ${whereNode.operator} ${formattedRight}`;\n bindings = [];\n } else if (Array.isArray(whereNode.value)) {\n if (whereNode.operator.toLowerCase() === \"between\") {\n const placeholders = `$${idx} AND $${idx + 1}`;\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"postgres\", whereNode.column)} between ${placeholders}`;\n bindings = whereNode.value;\n } else {\n const placeholders = whereNode.value\n .map((_, i) => `$${idx + i}`)\n .join(\", \");\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"postgres\", whereNode.column)} ${whereNode.operator} (${placeholders})`;\n bindings = whereNode.value;\n }\n } else {\n if (whereNode.operator.includes(\"null\")) {\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"postgres\", whereNode.column)} ${whereNode.operator}`;\n bindings = [];\n } else if (whereNode.value === undefined) {\n return { sql: \"\", bindings: [] };\n } else {\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"postgres\", whereNode.column)} ${whereNode.operator} $${idx}`;\n bindings = [whereNode.value];\n }\n }\n\n if (whereNode.isNegated) {\n sql = `not (${sql})`;\n }\n\n return { sql: sql.trim(), bindings };\n }\n\n private isRawNode(value: any): value is RawNode {\n return (\n value &&\n typeof value === \"object\" &&\n \"rawValue\" in value &&\n value.isRawValue === true\n );\n }\n\n private formatRawIdentifierIfPossible(raw: string): string {\n const isIdentifier =\n /^[A-Za-z_][A-Za-z0-9_]*(\\.(\\*|[A-Za-z_][A-Za-z0-9_]*))?$/.test(raw);\n if (!isIdentifier) {\n return raw;\n }\n return new InterpreterUtils(this.model).formatStringColumn(\"postgres\", raw);\n }\n}\n\nexport default new PostgresWhereInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { WhereGroupNode } from \"../../../ast/query/node/where/where_group\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresWhereGroupInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const groupNode = node as WhereGroupNode;\n if (!groupNode.nodes || !groupNode.nodes.length) {\n return { sql: \"\", bindings: [] };\n }\n\n const astParser = new AstParser(\n this.model,\n \"postgres\" as SqlDataSourceType,\n );\n\n const { sql, bindings } = astParser.parse(\n groupNode.nodes,\n groupNode.currParamIndex,\n true,\n );\n\n return {\n sql: `(${sql})`,\n bindings,\n };\n }\n}\n\nexport default new PostgresWhereGroupInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { WhereJsonNode } from \"../../../ast/query/node/where/where_json\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass PostgresWhereJsonInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const whereJsonNode = node as WhereJsonNode;\n if (whereJsonNode.isRawValue) {\n return {\n sql: whereJsonNode.column,\n bindings: [],\n };\n }\n\n const idx = whereJsonNode.currParamIndex;\n let sql = \"\";\n let bindings: any[] = [];\n\n const columnSql = new InterpreterUtils(this.model).formatStringColumn(\n \"postgres\",\n whereJsonNode.column,\n );\n\n switch (whereJsonNode.jsonOperator) {\n case \"=\":\n // Strict equality - both objects must be exactly equal\n sql = `${columnSql} = $${idx}::jsonb`;\n bindings = [JSON.stringify(whereJsonNode.value)];\n break;\n case \"contains\":\n sql = `${columnSql} @> $${idx}::jsonb`;\n bindings = [JSON.stringify(whereJsonNode.value)];\n break;\n case \"not contains\":\n sql = `${columnSql} @> $${idx}::jsonb`;\n bindings = [JSON.stringify(whereJsonNode.value)];\n break;\n case \"raw\":\n sql = whereJsonNode.column;\n bindings = Array.isArray(whereJsonNode.value)\n ? whereJsonNode.value\n : [];\n break;\n }\n\n if (whereJsonNode.isNegated) {\n sql = `NOT (${sql})`;\n }\n\n return { sql: sql.trim(), bindings };\n }\n}\n\nexport default new PostgresWhereJsonInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { WhereSubqueryNode } from \"../../../ast/query/node/where/where_subquery\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresWhereSubqueryInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const subqueryNode = node as WhereSubqueryNode;\n\n if (this.isStringSubquery(subqueryNode.subquery)) {\n return this.handleStringSubquery(subqueryNode);\n }\n\n if (this.isArraySubquery(subqueryNode.subquery)) {\n return this.handleArraySubquery(subqueryNode);\n }\n\n return this.handleObjectSubquery(subqueryNode);\n }\n\n private isStringSubquery(\n subquery: string | QueryNode | QueryNode[],\n ): subquery is string {\n return typeof subquery === \"string\";\n }\n\n private isArraySubquery(\n subquery: string | QueryNode | QueryNode[],\n ): subquery is QueryNode[] {\n return Array.isArray(subquery);\n }\n\n private handleStringSubquery(\n subqueryNode: WhereSubqueryNode,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const sql = `${subqueryNode.column} ${subqueryNode.operator} (${subqueryNode.subquery})`;\n return { sql: sql.trim(), bindings: [] };\n }\n\n private handleArraySubquery(\n subqueryNode: WhereSubqueryNode,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const astParser = new AstParser(\n this.model,\n \"postgres\" as SqlDataSourceType,\n );\n const { sql: subquerySql, bindings: subqueryBindings } = astParser.parse(\n subqueryNode.subquery as QueryNode[],\n subqueryNode.currParamIndex,\n );\n\n const sql = `${subqueryNode.column} ${subqueryNode.operator} (${subquerySql})`;\n return { sql: sql.trim(), bindings: subqueryBindings };\n }\n\n private handleObjectSubquery(\n subqueryNode: WhereSubqueryNode,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const astParser = new AstParser(\n this.model,\n \"postgres\" as SqlDataSourceType,\n );\n const { sql: subquerySql, bindings: subqueryBindings } = astParser.parse(\n [subqueryNode.subquery as QueryNode],\n subqueryNode.currParamIndex,\n );\n\n const sql = `${subqueryNode.column} ${subqueryNode.operator} (${subquerySql})`;\n return { sql: sql.trim(), bindings: subqueryBindings };\n }\n}\n\nexport default new PostgresWhereSubqueryInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { WithNode } from \"../../../ast/query/node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass PostgresWithInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(\n node: QueryNode | string,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const withNode = node as WithNode;\n const parser = new AstParser(this.model, \"postgres\");\n const nodes = Array.isArray(withNode.body)\n ? withNode.body\n : [withNode.body];\n\n const ast = parser.parse(\n nodes.filter(Boolean) as QueryNode[],\n withNode.currParamIndex,\n );\n\n const materializedClause =\n withNode.clause === \"materialized\" ? \" materialized\" : \"\";\n\n return {\n sql: `${withNode.alias} as${materializedClause} (${ast.sql})`,\n bindings: ast.bindings,\n };\n }\n}\n\nexport default new PostgresWithInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { AddColumnNode } from \"../../../ast/query/node/alter_table/add_column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteAddColumnInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const acNode = node as AddColumnNode;\n const ast = new AstParser(this.model, \"sqlite\" as SqlDataSourceType);\n let { sql } = ast.parse([acNode.column]);\n\n const inlineConstraints = (acNode as any).inlineConstraints;\n if (inlineConstraints && inlineConstraints.length > 0) {\n const constraintParts: string[] = [];\n\n for (const constraint of inlineConstraints) {\n const { sql: constraintSql } = ast.parse([constraint]);\n constraintParts.push(constraintSql);\n }\n\n if (constraintParts.length > 0) {\n sql += ` ${constraintParts.join(\" \")}`;\n }\n }\n\n return { sql: `add column ${sql}`, bindings: [] };\n }\n}\n\nexport default new SqliteAddColumnInterpreter();\n","import { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteAddConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(_node: QueryNode) {\n return { sql: \"\", bindings: [] };\n }\n}\nexport default new SqliteAddConstraintInterpreter();\n","import { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteAlterColumnTypeInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(_node: QueryNode) {\n return { sql: \"\", bindings: [] };\n }\n}\nexport default new SqliteAlterColumnTypeInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { AlterTableNode } from \"../../../ast/query/node/alter_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteAlterTableInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const atNode = node as AlterTableNode;\n const utils = new InterpreterUtils(this.model);\n const tableName = utils.formatStringTable(\"sqlite\", atNode.table);\n\n if (!atNode.children || !atNode.children.length) {\n return { sql: \"\", bindings: [] };\n }\n\n const astParser = new AstParser(this.model, \"sqlite\" as SqlDataSourceType);\n const parts: string[] = [];\n const bindings: any[] = [];\n\n let awaitingConstraints = false;\n for (const child of atNode.children) {\n const { sql, bindings: childBindings } = astParser.parse([child]);\n if (!sql || !sql.trim()) {\n continue;\n }\n\n if (child.file === \"add_column\") {\n parts.push(sql);\n awaitingConstraints = true;\n } else if (child.file === \"add_constraint\" && awaitingConstraints) {\n const last = parts.pop() ?? \"\";\n const cleanedSql = sql.replace(/^\\s*add\\s+/i, \"\").trimStart();\n parts.push(`${last} ${cleanedSql}`);\n } else if (\n child.file === \"set_not_null\" ||\n child.file === \"drop_not_null\"\n ) {\n // SQLite doesn't support these operations, skip them\n continue;\n } else if (\n child.file === \"set_default\" ||\n child.file === \"drop_default\"\n ) {\n // SQLite doesn't support these operations, skip them\n continue;\n } else {\n parts.push(sql);\n awaitingConstraints = false;\n }\n\n bindings.push(...childBindings);\n }\n\n const stmt = parts.join(\", \");\n const ifExists = atNode.ifExists ? \"if exists \" : \"\";\n\n if (!stmt.trim()) {\n return { sql: \"\", bindings: [] };\n }\n\n const finalSql = `${ifExists}${tableName} ${stmt}`;\n return { sql: finalSql, bindings };\n }\n}\n\nexport default new SqliteAlterTableInterpreter();\n","import { DropColumnNode } from \"../../../ast/query/node/alter_table/drop_column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteDropColumnInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const d = node as DropColumnNode;\n return { sql: `drop column \"${d.column}\"`, bindings: [] };\n }\n}\n\nexport default new SqliteDropColumnInterpreter();\n","import { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteDropConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(_node: QueryNode) {\n return { sql: \"\", bindings: [] };\n }\n}\nexport default new SqliteDropConstraintInterpreter();\n","import { DropDefaultNode } from \"../../../ast/query/node/alter_table/drop_default\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteDropDefaultInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const n = node as DropDefaultNode;\n return { sql: `alter column \"${n.column}\" drop default`, bindings: [] };\n }\n}\nexport default new SqliteDropDefaultInterpreter();\n","import { DropNotNullNode } from \"../../../ast/query/node/alter_table/drop_not_null\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteDropNotNullInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const n = node as DropNotNullNode;\n return { sql: `alter column \"${n.column}\" drop not null`, bindings: [] };\n }\n}\nexport default new SqliteDropNotNullInterpreter();\n","import { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteDropPrimaryKeyInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(_node: QueryNode) {\n // Not supported directly in SQLite (would require table rebuild)\n return { sql: ``, bindings: [] };\n }\n}\nexport default new SqliteDropPrimaryKeyInterpreter();\n","import { RenameColumnNode } from \"../../../ast/query/node/alter_table/rename_column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteRenameColumnInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const r = node as RenameColumnNode;\n return {\n sql: `rename column \"${r.oldName}\" to \"${r.newName}\"`,\n bindings: [],\n };\n }\n}\nexport default new SqliteRenameColumnInterpreter();\n","import { RenameTableNode } from \"../../../ast/query/node/alter_table/rename_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteRenameTableInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const rt = node as RenameTableNode;\n return { sql: `\"${rt.newName}\"`, bindings: [] };\n }\n}\nexport default new SqliteRenameTableInterpreter();\n","import { SetDefaultNode } from \"../../../ast/query/node/alter_table/set_default\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteSetDefaultInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const n = node as SetDefaultNode;\n let val = n.defaultValue;\n\n if (val === \"NULL\") {\n val = \"null\";\n } else if (val === \"TRUE\" || val === \"FALSE\") {\n val = val.toLowerCase();\n } else if (\n typeof val === \"string\" &&\n val !== \"null\" &&\n val !== \"true\" &&\n val !== \"false\"\n ) {\n val = `'${val}'`;\n }\n\n return {\n sql: `alter column \"${n.column}\" set default ${val}`,\n bindings: [],\n };\n }\n}\nexport default new SqliteSetDefaultInterpreter();\n","import { SetNotNullNode } from \"../../../ast/query/node/alter_table/set_not_null\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteSetNotNullInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const n = node as SetNotNullNode;\n return { sql: `alter column \"${n.column}\" set not null`, bindings: [] };\n }\n}\nexport default new SqliteSetNotNullInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { ColumnTypeNode } from \"../../../ast/query/node/column\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { getColumnValue } from \"../../../resources/utils\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteColumnTypeInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const colNode = node as ColumnTypeNode;\n if (colNode.isRawValue) {\n return { sql: colNode.column as string, bindings: [] };\n }\n\n const utils = new InterpreterUtils(this.model);\n const columnName = utils.formatStringColumn(\n \"sqlite\",\n getColumnValue(colNode.column),\n );\n const dt = colNode.dataType.toLowerCase();\n\n if (dt === \"char\" || dt === \"varchar\") {\n return { sql: `${columnName} text`, bindings: [] };\n } else if (dt === \"uuid\") {\n return { sql: `${columnName} varchar(36)`, bindings: [] };\n } else if (dt === \"ulid\") {\n return { sql: `${columnName} varchar(26)`, bindings: [] };\n }\n\n if (dt.includes(\"text\")) {\n return { sql: `${columnName} text`, bindings: [] };\n } else if (dt === \"integer\" || dt === \"bigint\" || dt === \"int\") {\n return { sql: `${columnName} integer`, bindings: [] };\n } else if (dt === \"tinyint\") {\n return { sql: `${columnName} integer`, bindings: [] };\n } else if (dt === \"smallint\") {\n return { sql: `${columnName} integer`, bindings: [] };\n } else if (dt === \"mediumint\") {\n return { sql: `${columnName} integer`, bindings: [] };\n }\n\n if (dt === \"float\" || dt === \"double\") {\n return { sql: `${columnName} real`, bindings: [] };\n } else if (dt === \"decimal\" || dt === \"numeric\") {\n const precision = colNode.precision ?? 10;\n const scale = colNode.scale ?? 0;\n return {\n sql: `${columnName} numeric(${precision}, ${scale})`,\n bindings: [],\n };\n }\n\n if (\n dt === \"date\" ||\n dt === \"datetime\" ||\n dt === \"timestamp\" ||\n dt === \"time\" ||\n dt === \"year\"\n ) {\n return { sql: `${columnName} text`, bindings: [] };\n } else if (dt === \"boolean\") {\n return { sql: `${columnName} integer`, bindings: [] };\n } else if (dt === \"json\" || dt === \"jsonb\") {\n return { sql: `${columnName} text`, bindings: [] };\n } else if (dt === \"enum\") {\n return { sql: `${columnName} text`, bindings: [] };\n } else if (\n dt === \"bytea\" ||\n dt === \"blob\" ||\n dt === \"binary\" ||\n dt === \"longblob\" ||\n dt === \"mediumblob\" ||\n dt === \"tinyblob\"\n ) {\n return { sql: `${columnName} blob`, bindings: [] };\n } else if (dt === \"integer\" || dt === \"int\") {\n if (colNode.autoIncrement) {\n return { sql: `${columnName} serial`, bindings: [] };\n }\n\n return { sql: `${columnName} integer`, bindings: [] };\n }\n\n return {\n sql: `${columnName} ${dt} ${colNode.length ? `(${colNode.length})` : \"\"}`,\n bindings: [],\n };\n }\n}\n\nexport default new SqliteColumnTypeInterpreter();\n","import { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteAfterConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(_node: QueryNode) {\n return { sql: \"\", bindings: [] };\n }\n}\nexport default new SqliteAfterConstraintInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { ConstraintNode } from \"../../../ast/query/node/constraint\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { getColumnValue } from \"../../../resources/utils\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteConstraintInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const cNode = node as ConstraintNode;\n const utils = new InterpreterUtils(this.model);\n const prefix = cNode.constraintName\n ? `constraint \"${cNode.constraintName}\" `\n : \"\";\n\n if (cNode.constraintType === \"primary_key\") {\n const autoIncrement = Boolean((cNode as any).autoIncrement);\n const columnType = ((cNode as any).columnType || \"\").toLowerCase();\n if (\n autoIncrement &&\n (columnType === \"integer\" || columnType === \"bigint\")\n ) {\n return { sql: `${prefix}primary key autoincrement`, bindings: [] };\n }\n return { sql: `${prefix}primary key`, bindings: [] };\n }\n\n if (cNode.constraintType === \"unique\") {\n if (cNode.columns && cNode.columns.length) {\n const cols = cNode.columns\n .map((c) => utils.formatStringColumn(\"sqlite\", getColumnValue(c)))\n .join(\", \");\n\n if (!cNode.constraintName) {\n return { sql: `unique`, bindings: [] };\n }\n return { sql: `${prefix}unique (${cols})`, bindings: [] };\n }\n return { sql: `unique`, bindings: [] };\n }\n\n if (cNode.constraintType === \"not_null\") {\n return { sql: `not null`, bindings: [] };\n }\n\n if (cNode.constraintType === \"null\") {\n return { sql: `null`, bindings: [] };\n }\n\n if (cNode.constraintType === \"default\") {\n let val = cNode.defaultValue;\n if (val === \"NULL\") {\n return { sql: `default null`, bindings: [] };\n }\n if (val === \"TRUE\" || val === \"FALSE\") {\n return { sql: `default ${val.toLowerCase()}`, bindings: [] };\n }\n if (val === null) {\n return { sql: `default null`, bindings: [] };\n }\n if (typeof val === \"string\") {\n val = `'${val}'`;\n }\n return { sql: `default ${val}`, bindings: [] };\n }\n\n if (cNode.constraintType === \"foreign_key\") {\n if (!cNode.references) {\n return { sql: \"\", bindings: [] };\n }\n const cols = (cNode.columns ?? [])\n .map((c) => utils.formatStringColumn(\"sqlite\", getColumnValue(c)))\n .join(\", \");\n const refTable = utils.formatStringTable(\n \"sqlite\",\n cNode.references.table,\n );\n const refCols = cNode.references.columns\n .map((c) => utils.formatStringColumn(\"sqlite\", getColumnValue(c)))\n .join(\", \");\n let sql = `${prefix}foreign key (${cols}) references ${refTable}(${refCols})`;\n if (cNode.onDelete) {\n sql += ` on delete ${cNode.onDelete}`;\n }\n if (cNode.onUpdate) {\n sql += ` on update ${cNode.onUpdate}`;\n }\n return { sql, bindings: [] };\n }\n\n return { sql: \"\", bindings: [] };\n }\n}\n\nexport default new SqliteConstraintInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { CreateTableNode } from \"../../../ast/query/node/create_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteCreateTableInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const ctNode = node as CreateTableNode;\n const utils = new InterpreterUtils(this.model);\n const tableName = utils.formatStringTable(\"sqlite\", ctNode.table);\n\n if (!ctNode.children || !ctNode.children.length) {\n return { sql: `${tableName} ()`, bindings: [] };\n }\n\n const astParser = new AstParser(this.model, \"sqlite\" as SqlDataSourceType);\n const parts: string[] = [];\n const bindings: any[] = [];\n\n for (const child of ctNode.children) {\n const { sql, bindings: childBindings } = astParser.parse([child]);\n\n if (child.folder === \"constraint\") {\n const last = parts.pop() ?? \"\";\n const inlineConstraintSql = sql;\n\n if (\n /not null/i.test(inlineConstraintSql) ||\n /null/i.test(inlineConstraintSql) ||\n /default/i.test(inlineConstraintSql) ||\n /primary key/i.test(inlineConstraintSql)\n ) {\n let combined = `${last} ${inlineConstraintSql}`.trim();\n combined = combined.replace(\n /(references\\s+\"[^\"]+\"\\s*\\([^)]*\\))\\s+not null/i,\n \"not null $1\",\n );\n\n parts.push(combined);\n bindings.push(...childBindings);\n continue;\n }\n\n parts.push(last);\n parts.push(inlineConstraintSql);\n bindings.push(...childBindings);\n continue;\n }\n\n parts.push(sql);\n bindings.push(...childBindings);\n }\n\n for (const constraint of ctNode.namedConstraints) {\n const { sql, bindings: constraintBindings } = astParser.parse([\n constraint,\n ]);\n\n parts.push(sql);\n bindings.push(...constraintBindings);\n }\n\n const columnsSql = parts.join(\", \");\n const ifNotExists = ctNode.ifNotExists ? \"if not exists \" : \"\";\n const finalSql = `${ifNotExists}${tableName} (${columnsSql})`;\n return { sql: finalSql, bindings };\n }\n}\n\nexport default new SqliteCreateTableInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { DeleteNode } from \"../../../ast/query/node/delete\";\nimport { FromNode } from \"../../../ast/query/node/from\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteDeleteInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const deleteNode = node as DeleteNode;\n\n if (\n deleteNode.isRawValue &&\n typeof deleteNode.fromNode.table === \"string\"\n ) {\n return {\n sql: deleteNode.fromNode.table,\n bindings: [],\n };\n }\n\n const formattedTable = new InterpreterUtils(\n this.model,\n ).getFromForWriteOperations(\"sqlite\", deleteNode.fromNode as FromNode);\n\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n}\n\nexport default new SqliteDeleteInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { Model } from \"../../../models/model\";\n\nclass SqliteDistinctInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n return {\n sql: \"distinct\",\n bindings: [],\n };\n }\n}\n\nexport default new SqliteDistinctInterpreter();\n","import logger from \"../../../../utils/logger\";\nimport { AstParser } from \"../../../ast/parser\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { Model } from \"../../../models/model\";\n\nclass SqliteDistinctInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n logger.warn(\"SQLite does not support DISTINCT ON\");\n return {\n sql: \"\",\n bindings: [],\n };\n }\n}\n\nexport default new SqliteDistinctInterpreter();\n","import { DropTableNode } from \"../../../ast/query/node/drop_table/drop_table\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteDropTableInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const dt = node as DropTableNode;\n const utils = new InterpreterUtils(this.model);\n const tableSql = utils.formatStringTable(\"sqlite\", dt.table);\n const exists = dt.ifExists ? \"if exists \" : \"\";\n return { sql: `${exists}${tableSql}`, bindings: [] };\n }\n}\nexport default new SqliteDropTableInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { FromNode } from \"../../../ast/query/node/from\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteFromInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const fromNode = node as FromNode;\n\n if (typeof fromNode.table === \"string\") {\n const interpreterUtils = new InterpreterUtils(this.model);\n\n if (fromNode.alias && fromNode.alias.length > 0) {\n const tableSql = interpreterUtils.formatStringTable(\n \"sqlite\",\n fromNode.table,\n );\n\n return {\n sql: `${tableSql} as \"${fromNode.alias}\"`,\n bindings: [],\n };\n }\n\n const tableSql = interpreterUtils.formatStringTable(\n \"sqlite\",\n fromNode.table,\n );\n\n return { sql: tableSql, bindings: [] };\n }\n\n const subQueryNodes = Array.isArray(fromNode.table)\n ? fromNode.table\n : [fromNode.table];\n\n const astParser = new AstParser(this.model, \"sqlite\" as SqlDataSourceType);\n const result = astParser.parse(subQueryNodes);\n\n const aliasSql =\n fromNode.alias && fromNode.alias.length ? ` as \"${fromNode.alias}\"` : \"\";\n\n return {\n sql: `(${result.sql})${aliasSql}`,\n bindings: result.bindings,\n };\n }\n}\n\nexport default new SqliteFromInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { GroupByNode } from \"../../../ast/query/node/group_by/group_by\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { Model } from \"../../../models/model\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteGroupByInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const groupByNode = node as GroupByNode;\n if (groupByNode.isRawValue) {\n return {\n sql: groupByNode.column,\n bindings: [],\n };\n }\n\n const columnSql = new InterpreterUtils(this.model).formatStringColumn(\n \"sqlite\",\n groupByNode.column,\n );\n\n return {\n sql: columnSql,\n bindings: [],\n };\n }\n}\n\nexport default new SqliteGroupByInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { HavingNode } from \"../../../ast/query/node/having/having\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteHavingInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const havingNode = node as HavingNode;\n if (havingNode.isRawValue) {\n return {\n sql: havingNode.column,\n bindings: havingNode.value as any[],\n };\n }\n\n const idx = havingNode.currParamIndex;\n let sql = \"\";\n let bindings: any[] = [];\n\n if (\n !(havingNode.value instanceof QueryNode) &&\n !Array.isArray(havingNode.value)\n ) {\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"sqlite\", havingNode.column)} ${havingNode.operator} $${idx}`;\n bindings = [havingNode.value];\n }\n\n if (Array.isArray(havingNode.value)) {\n const placeholders = havingNode.value\n .map((_, i) => `$${idx + i}`)\n .join(\", \");\n\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"sqlite\", havingNode.column)} ${havingNode.operator} (${placeholders})`;\n bindings = havingNode.value;\n }\n\n if (havingNode.isNegated) {\n sql = `not (${sql})`;\n }\n\n return { sql: sql.trim(), bindings };\n }\n}\n\nexport default new SqliteHavingInterpreter();\n","import { CreateIndexNode } from \"../../../ast/query/node/index_op/create_index\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteCreateIndexInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const ci = node as CreateIndexNode;\n const utils = new InterpreterUtils(this.model);\n const tableSql = utils.formatStringTable(\"sqlite\", ci.table);\n const cols = ci.columns.map((c) => `\"${c}\"`).join(\", \");\n const unique = ci.unique ? \"unique \" : \"\";\n return {\n sql: `${unique}\\\"${ci.indexName}\\\" on ${tableSql} (${cols})`,\n bindings: [],\n };\n }\n}\nexport default new SqliteCreateIndexInterpreter();\n","import { DropIndexNode } from \"../../../ast/query/node/index_op/drop_index\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteDropIndexInterpreter implements Interpreter {\n declare model: typeof Model;\n toSql(node: QueryNode) {\n const di = node as DropIndexNode;\n return { sql: ` \\\"${di.indexName}\\\"`, bindings: [] };\n }\n}\nexport default new SqliteDropIndexInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { InsertNode } from \"../../../ast/query/node/insert\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteInsertInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const insertNode = node as InsertNode;\n if (insertNode.isRawValue) {\n return {\n sql: insertNode.fromNode.table as string,\n bindings: [],\n };\n }\n\n const interpreterUtils = new InterpreterUtils(this.model);\n const formattedTable = interpreterUtils.getFromForWriteOperations(\n \"sqlite\",\n insertNode.fromNode,\n );\n\n if (!insertNode.records.length) {\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n\n const firstRecord = insertNode.records[0];\n const columns = Object.keys(firstRecord);\n\n if (!columns.length) {\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n\n const formattedColumns = columns\n .map((column) => interpreterUtils.formatStringColumn(\"sqlite\", column))\n .join(\", \");\n\n const allValues: any[] = [];\n const valuesClauses: string[] = [];\n\n for (const record of insertNode.records) {\n const recordValues = columns.map((column) => record[column]);\n allValues.push(...recordValues);\n\n const placeholders = Array(columns.length).fill(\"?\").join(\", \");\n valuesClauses.push(`(${placeholders})`);\n }\n\n const sql = `${formattedTable} (${formattedColumns}) VALUES ${valuesClauses.join(\", \")}`;\n\n return {\n sql,\n bindings: allValues,\n };\n }\n}\n\nexport default new SqliteInsertInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { JoinNode } from \"../../../ast/query/node/join/join\";\nimport type { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteJoinInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const joinNode = node as JoinNode;\n if (joinNode.isRawValue) {\n return {\n sql: joinNode.table,\n bindings: [],\n };\n }\n\n const utils = new InterpreterUtils(this.model);\n\n let leftColumnStr = joinNode.left;\n if (!leftColumnStr.includes(\".\")) {\n leftColumnStr = `${joinNode.table}.${leftColumnStr}`;\n }\n\n let rightColumnStr = joinNode.right;\n if (!rightColumnStr.includes(\".\")) {\n rightColumnStr = `${this.model.table}.${rightColumnStr}`;\n }\n\n const leftSql = utils.formatStringColumn(\"sqlite\", leftColumnStr);\n const rightSql = utils.formatStringColumn(\"sqlite\", rightColumnStr);\n const tableSql = utils.formatStringTable(\"sqlite\", joinNode.table);\n\n const sql = `${tableSql} on ${leftSql} ${joinNode.on?.operator} ${rightSql}`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new SqliteJoinInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { LimitNode } from \"../../../ast/query/node/limit/limit\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteLimitInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const limitNode = node as LimitNode;\n\n return {\n sql: `?`,\n bindings: [limitNode.limit],\n };\n }\n}\n\nexport default new SqliteLimitInterpreter();\n","import { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\n\nexport class SqliteLockInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): { sql: string; bindings: any[] } {\n // SQLite does not support FOR UPDATE/SHARE in the same way as other DBs\n return {\n sql: \"\",\n bindings: [],\n };\n }\n}\n\nexport default new SqliteLockInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { OffsetNode } from \"../../../ast/query/node/offset/offset\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteOffsetInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const offsetNode = node as OffsetNode;\n\n return {\n sql: `?`,\n bindings: [offsetNode.offset],\n };\n }\n}\n\nexport default new SqliteOffsetInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { OnDuplicateNode } from \"../../../ast/query/node/on_duplicate\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteOnDuplicateInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const onDuplicateNode = node as OnDuplicateNode;\n\n if (onDuplicateNode.isRawValue) {\n return {\n sql: onDuplicateNode.table,\n bindings: [],\n };\n }\n\n const interpreterUtils = new InterpreterUtils(this.model);\n const formattedConflictColumns = onDuplicateNode.conflictColumns\n .map((column) => interpreterUtils.formatStringColumn(\"sqlite\", column))\n .join(\", \");\n\n if (onDuplicateNode.mode === \"ignore\") {\n return {\n sql: `ON CONFLICT (${formattedConflictColumns}) DO NOTHING`,\n bindings: [],\n };\n }\n\n const updateSet = onDuplicateNode.columnsToUpdate\n .map(\n (column) =>\n `${interpreterUtils.formatStringColumn(\"sqlite\", column)} = EXCLUDED.${interpreterUtils.formatStringColumn(\"sqlite\", column)}`,\n )\n .join(\", \");\n\n return {\n sql: `ON CONFLICT (${formattedConflictColumns}) DO UPDATE SET ${updateSet}`,\n bindings: [],\n };\n }\n}\n\nexport default new SqliteOnDuplicateInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { OrderByNode } from \"../../../ast/query/node/order_by/order_by\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteOrderByInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const orderByNode = node as OrderByNode;\n if (orderByNode.isRawValue) {\n return {\n sql: orderByNode.column,\n bindings: [],\n };\n }\n\n const columnSql = new InterpreterUtils(this.model).formatStringColumn(\n \"sqlite\",\n orderByNode.column,\n );\n const directionSql = orderByNode.direction.toLowerCase();\n\n return {\n sql: `${columnSql} ${directionSql}`,\n bindings: [],\n };\n }\n}\n\nexport default new SqliteOrderByInterpreter();\n","import { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteRawInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): { sql: string; bindings: any[] } {\n const rawNode = node as RawNode;\n return {\n sql: rawNode.rawValue,\n bindings: [],\n };\n }\n}\n\nexport default new SqliteRawInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { ForeignKeyInfoNode } from \"../../../ast/query/node/schema/foreign_key_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteForeignKeyInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as ForeignKeyInfoNode;\n const table = node.table;\n const sql = `PRAGMA foreign_key_list(${table})`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new SqliteForeignKeyInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { IndexInfoNode } from \"../../../ast/query/node/schema/index_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteIndexInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as IndexInfoNode;\n const table = node.table;\n const sql = `PRAGMA index_list(${table})`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new SqliteIndexInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { PrimaryKeyInfoNode } from \"../../../ast/query/node/schema/primary_key_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqlitePrimaryKeyInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as PrimaryKeyInfoNode;\n const table = node.table;\n const sql = `SELECT\n 'PRIMARY' as name,\n name as column_name\n FROM pragma_table_info('${table}')\n WHERE pk > 0\n ORDER BY pk`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new SqlitePrimaryKeyInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { TableInfoNode } from \"../../../ast/query/node/schema/table_info\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteTableInfoInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(_node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const node = _node as TableInfoNode;\n const table = node.table;\n const sql = `PRAGMA table_info(${table})`;\n return { sql, bindings: [] };\n }\n}\n\nexport default new SqliteTableInfoInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { SelectNode } from \"../../../ast/query/node/select/basic_select\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteSelectInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const selectNode = node as SelectNode;\n if (selectNode.isRawValue) {\n return {\n sql: selectNode.column as string,\n bindings: [],\n };\n }\n\n const columnResult = this.formatColumn(\n selectNode.column,\n selectNode.sqlFunction,\n );\n const aliasSql = this.formatAlias(selectNode.alias);\n return {\n sql: `${columnResult.sql}${aliasSql}`,\n bindings: columnResult.bindings,\n };\n }\n\n private formatColumn(\n column: string | QueryNode | QueryNode[],\n sqlFunction?: string,\n ): ReturnType<typeof AstParser.prototype.parse> {\n if (typeof column === \"string\") {\n const col = new InterpreterUtils(this.model).formatStringColumn(\n \"sqlite\",\n column,\n );\n let sql = col;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}(${col})`;\n }\n return {\n sql,\n bindings: [],\n };\n }\n\n if (Array.isArray(column) && column.length > 0) {\n const astParser = new AstParser(\n this.model,\n \"sqlite\" as SqlDataSourceType,\n );\n const result = astParser.parse(column);\n let sql = `(${result.sql})`;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}${sql}`;\n }\n return {\n sql,\n bindings: result.bindings,\n };\n }\n\n if (!Array.isArray(column)) {\n const astParser = new AstParser(\n this.model,\n \"sqlite\" as SqlDataSourceType,\n );\n const result = astParser.parse([column]);\n let sql = `(${result.sql})`;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}${sql}`;\n }\n return {\n sql,\n bindings: result.bindings,\n };\n }\n\n const formattedColumns = column.map((col) => {\n if (typeof col === \"string\") {\n const formatted = new InterpreterUtils(this.model).formatStringColumn(\n \"sqlite\",\n col,\n );\n if (sqlFunction) {\n return `${sqlFunction.toLowerCase()}(${formatted})`;\n }\n return formatted;\n }\n\n const astParser = new AstParser(\n this.model,\n \"sqlite\" as SqlDataSourceType,\n );\n const result = astParser.parse([col]);\n let sql = `(${result.sql})`;\n if (sqlFunction) {\n sql = `${sqlFunction.toLowerCase()}${sql}`;\n }\n return sql;\n });\n\n return {\n sql: formattedColumns.join(\", \"),\n bindings: [],\n };\n }\n\n private formatAlias(alias?: string): string {\n if (alias && alias.length > 0) {\n return ` as \"${alias}\"`;\n }\n return \"\";\n }\n}\n\nexport default new SqliteSelectInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { FromNode } from \"../../../ast/query/node/from\";\nimport { TruncateNode } from \"../../../ast/query/node/truncate\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteTruncateInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const truncateNode = node as TruncateNode;\n\n if (truncateNode.isRawValue && typeof truncateNode.fromNode === \"string\") {\n truncateNode.keyword = \"\";\n\n return {\n sql: truncateNode.fromNode,\n bindings: [],\n };\n }\n\n const formattedTable = new InterpreterUtils(\n this.model,\n ).getFromForWriteOperations(\"sqlite\", truncateNode.fromNode as FromNode);\n\n truncateNode.keyword = \"DELETE FROM\";\n\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n}\n\nexport default new SqliteTruncateInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { UnionNode } from \"../../../ast/query/node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { Model } from \"../../../models/model\";\n\nclass SqliteUnionInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const unionNode = node as UnionNode;\n const parser = new AstParser(this.model, \"sqlite\");\n const nodes = Array.isArray(unionNode.query)\n ? unionNode.query\n : [unionNode.query];\n\n const ast =\n typeof unionNode.query === \"string\"\n ? { sql: unionNode.query, bindings: [] }\n : parser.parse(\n nodes.filter(Boolean) as QueryNode[],\n unionNode.currParamIndex,\n );\n\n return {\n sql: ast.sql,\n bindings: ast.bindings,\n };\n }\n}\n\nexport default new SqliteUnionInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { FromNode } from \"../../../ast/query/node/from\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport { UpdateNode } from \"../../../ast/query/node/update\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteUpdateInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const updateNode = node as UpdateNode;\n if (updateNode.isRawValue && typeof updateNode.fromNode === \"string\") {\n return {\n sql: updateNode.fromNode as string,\n bindings: updateNode.values,\n };\n }\n\n const interpreterUtils = new InterpreterUtils(this.model);\n const formattedTable = interpreterUtils.getFromForWriteOperations(\n \"sqlite\",\n updateNode.fromNode as FromNode,\n );\n\n if (!updateNode.columns.length || !updateNode.values.length) {\n return {\n sql: formattedTable,\n bindings: [],\n };\n }\n\n const finalBindings: any[] = [];\n const setClause = updateNode.columns\n .map((column, index) => {\n const value = updateNode.values[index];\n if (value instanceof RawNode) {\n return `${interpreterUtils.formatStringColumn(\"sqlite\", column)} = ${value.rawValue}`;\n }\n\n finalBindings.push(value);\n return `${interpreterUtils.formatStringColumn(\"sqlite\", column)} = ?`;\n })\n .join(\", \");\n\n return {\n sql: `${formattedTable} set ${setClause}`,\n bindings: finalBindings,\n };\n }\n}\n\nexport default new SqliteUpdateInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { RawNode } from \"../../../ast/query/node/raw/raw_node\";\nimport type { WhereNode } from \"../../../ast/query/node/where/where\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteWhereInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const whereNode = node as WhereNode;\n if (whereNode.isRawValue) {\n return {\n sql: whereNode.column,\n bindings: (whereNode.value as any[]) ?? [],\n };\n }\n\n let sql = \"\";\n let bindings: any[] = [];\n\n if (this.isRawNode(whereNode.value)) {\n const formattedRight = this.formatRawIdentifierIfPossible(\n whereNode.value.rawValue,\n );\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"sqlite\", whereNode.column)} ${whereNode.operator} ${formattedRight}`;\n bindings = [];\n } else if (Array.isArray(whereNode.value)) {\n if (whereNode.operator.toLowerCase() === \"between\") {\n const placeholders = `? AND ?`;\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"sqlite\", whereNode.column)} between ${placeholders}`;\n bindings = whereNode.value;\n } else {\n const placeholders = whereNode.value.map((_) => `?`).join(\", \");\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"sqlite\", whereNode.column)} ${whereNode.operator} (${placeholders})`;\n bindings = whereNode.value;\n }\n } else {\n if (whereNode.operator.includes(\"null\")) {\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"sqlite\", whereNode.column)} ${whereNode.operator}`;\n bindings = [];\n } else if (whereNode.value === undefined) {\n return { sql: \"\", bindings: [] };\n } else {\n sql = `${new InterpreterUtils(this.model).formatStringColumn(\"sqlite\", whereNode.column)} ${whereNode.operator} ?`;\n bindings = [whereNode.value];\n }\n }\n\n if (whereNode.isNegated) {\n sql = `not (${sql})`;\n }\n\n return { sql: sql.trim(), bindings };\n }\n\n private isRawNode(value: any): value is RawNode {\n return (\n value &&\n typeof value === \"object\" &&\n \"rawValue\" in value &&\n value.isRawValue === true\n );\n }\n\n private formatRawIdentifierIfPossible(raw: string): string {\n const isIdentifier =\n /^[A-Za-z_][A-Za-z0-9_]*(\\.(\\*|[A-Za-z_][A-Za-z0-9_]*))?$/.test(raw);\n if (!isIdentifier) {\n return raw;\n }\n return new InterpreterUtils(this.model).formatStringColumn(\"sqlite\", raw);\n }\n}\n\nexport default new SqliteWhereInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { WhereGroupNode } from \"../../../ast/query/node/where/where_group\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport type { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\nimport { Model } from \"../../../models/model\";\n\nclass SqliteWhereGroupInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const groupNode = node as WhereGroupNode;\n if (!groupNode.nodes || groupNode.nodes.length === 0) {\n return { sql: \"\", bindings: [] };\n }\n\n const astParser = new AstParser(this.model, \"sqlite\" as SqlDataSourceType);\n const { sql, bindings } = astParser.parse(\n groupNode.nodes,\n groupNode.currParamIndex,\n true,\n );\n\n return {\n sql: `(${sql})`,\n bindings,\n };\n }\n}\n\nexport default new SqliteWhereGroupInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { WhereJsonNode } from \"../../../ast/query/node/where/where_json\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { Interpreter } from \"../../interpreter\";\nimport { InterpreterUtils } from \"../../interpreter_utils\";\n\nclass SqliteWhereJsonInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const whereJsonNode = node as WhereJsonNode;\n if (whereJsonNode.isRawValue) {\n return {\n sql: whereJsonNode.column,\n bindings: [],\n };\n }\n\n let sql = \"\";\n let bindings: any[] = [];\n\n const columnSql = new InterpreterUtils(this.model).formatStringColumn(\n \"sqlite\",\n whereJsonNode.column,\n );\n\n switch (whereJsonNode.jsonOperator) {\n case \"=\":\n sql = `json(${columnSql}) = json(?)`;\n bindings = [JSON.stringify(whereJsonNode.value)];\n break;\n case \"contains\":\n sql = `json(${columnSql}) = json(?)`;\n bindings = [JSON.stringify(whereJsonNode.value)];\n break;\n case \"not contains\":\n sql = `json(${columnSql}) = json(?)`;\n bindings = [JSON.stringify(whereJsonNode.value)];\n break;\n case \"raw\":\n sql = whereJsonNode.column;\n bindings = Array.isArray(whereJsonNode.value)\n ? whereJsonNode.value\n : [];\n break;\n }\n\n if (whereJsonNode.isNegated) {\n sql = `NOT (${sql})`;\n }\n\n return { sql: sql.trim(), bindings };\n }\n}\n\nexport default new SqliteWhereJsonInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport type { WhereSubqueryNode } from \"../../../ast/query/node/where/where_subquery\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport { SqlDataSourceType } from \"../../../sql_data_source_types\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteWhereSubqueryInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const subqueryNode = node as WhereSubqueryNode;\n\n if (this.isStringSubquery(subqueryNode.subquery)) {\n return this.handleStringSubquery(subqueryNode);\n }\n\n if (this.isArraySubquery(subqueryNode.subquery)) {\n return this.handleArraySubquery(subqueryNode);\n }\n\n return this.handleObjectSubquery(subqueryNode);\n }\n\n private isStringSubquery(\n subquery: string | QueryNode | QueryNode[],\n ): subquery is string {\n return typeof subquery === \"string\";\n }\n\n private isArraySubquery(\n subquery: string | QueryNode | QueryNode[],\n ): subquery is QueryNode[] {\n return Array.isArray(subquery);\n }\n\n private handleStringSubquery(\n subqueryNode: WhereSubqueryNode,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const sql = `${subqueryNode.column} ${subqueryNode.operator} (${subqueryNode.subquery})`;\n return { sql: sql.trim(), bindings: [] };\n }\n\n private handleArraySubquery(\n subqueryNode: WhereSubqueryNode,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const astParser = new AstParser(this.model, \"sqlite\" as SqlDataSourceType);\n const { sql: subquerySql, bindings: subqueryBindings } = astParser.parse(\n subqueryNode.subquery as QueryNode[],\n subqueryNode.currParamIndex,\n );\n\n const sql = `${subqueryNode.column} ${subqueryNode.operator} (${subquerySql})`;\n return { sql: sql.trim(), bindings: subqueryBindings };\n }\n\n private handleObjectSubquery(\n subqueryNode: WhereSubqueryNode,\n ): ReturnType<typeof AstParser.prototype.parse> {\n const astParser = new AstParser(this.model, \"sqlite\" as SqlDataSourceType);\n const { sql: subquerySql, bindings: subqueryBindings } = astParser.parse(\n [subqueryNode.subquery as QueryNode],\n subqueryNode.currParamIndex,\n );\n\n const sql = `${subqueryNode.column} ${subqueryNode.operator} (${subquerySql})`;\n return { sql: sql.trim(), bindings: subqueryBindings };\n }\n}\n\nexport default new SqliteWhereSubqueryInterpreter();\n","import { AstParser } from \"../../../ast/parser\";\nimport { WithNode } from \"../../../ast/query/node\";\nimport { QueryNode } from \"../../../ast/query/query\";\nimport { Model } from \"../../../models/model\";\nimport type { Interpreter } from \"../../interpreter\";\n\nclass SqliteWithInterpreter implements Interpreter {\n declare model: typeof Model;\n\n toSql(node: QueryNode): ReturnType<typeof AstParser.prototype.parse> {\n const withNode = node as WithNode;\n const parser = new AstParser(this.model, \"sqlite\");\n const nodes = Array.isArray(withNode.body)\n ? withNode.body\n : [withNode.body];\n\n const ast = parser.parse(\n nodes.filter(Boolean) as QueryNode[],\n withNode.currParamIndex,\n );\n\n return {\n sql: `${withNode.alias} as (${ast.sql})`,\n bindings: ast.bindings,\n };\n }\n}\n\nexport default new SqliteWithInterpreter();\n","import mysql_alter_table_add_column from '../interpreter/mysql/alter_table/add_column';\nimport mysql_alter_table_add_constraint from '../interpreter/mysql/alter_table/add_constraint';\nimport mysql_alter_table_add_primary_key from '../interpreter/mysql/alter_table/add_primary_key';\nimport mysql_alter_table_alter_column_type from '../interpreter/mysql/alter_table/alter_column_type';\nimport mysql_alter_table_alter_table from '../interpreter/mysql/alter_table/alter_table';\nimport mysql_alter_table_drop_column from '../interpreter/mysql/alter_table/drop_column';\nimport mysql_alter_table_drop_constraint from '../interpreter/mysql/alter_table/drop_constraint';\nimport mysql_alter_table_drop_default from '../interpreter/mysql/alter_table/drop_default';\nimport mysql_alter_table_drop_not_null from '../interpreter/mysql/alter_table/drop_not_null';\nimport mysql_alter_table_drop_primary_key from '../interpreter/mysql/alter_table/drop_primary_key';\nimport mysql_alter_table_rename_column from '../interpreter/mysql/alter_table/rename_column';\nimport mysql_alter_table_rename_table from '../interpreter/mysql/alter_table/rename_table';\nimport mysql_alter_table_set_default from '../interpreter/mysql/alter_table/set_default';\nimport mysql_alter_table_set_not_null from '../interpreter/mysql/alter_table/set_not_null';\nimport mysql_column_column_type from '../interpreter/mysql/column/column_type';\nimport mysql_constraint_after from '../interpreter/mysql/constraint/after';\nimport mysql_constraint_constraint from '../interpreter/mysql/constraint/constraint';\nimport mysql_create_table_create_table from '../interpreter/mysql/create_table/create_table';\nimport mysql_delete_delete from '../interpreter/mysql/delete/delete';\nimport mysql_distinct_distinct from '../interpreter/mysql/distinct/distinct';\nimport mysql_distinct_distinct_on from '../interpreter/mysql/distinct/distinct_on';\nimport mysql_drop_table_drop_table from '../interpreter/mysql/drop_table/drop_table';\nimport mysql_from_from from '../interpreter/mysql/from/from';\nimport mysql_group_by_group_by from '../interpreter/mysql/group_by/group_by';\nimport mysql_having_having from '../interpreter/mysql/having/having';\nimport mysql_index_op_create_index from '../interpreter/mysql/index_op/create_index';\nimport mysql_index_op_drop_index from '../interpreter/mysql/index_op/drop_index';\nimport mysql_insert_insert from '../interpreter/mysql/insert/insert';\nimport mysql_join_join from '../interpreter/mysql/join/join';\nimport mysql_limit_limit from '../interpreter/mysql/limit/limit';\nimport mysql_lock_lock from '../interpreter/mysql/lock/lock';\nimport mysql_offset_offset from '../interpreter/mysql/offset/offset';\nimport mysql_on_duplicate_on_duplicate from '../interpreter/mysql/on_duplicate/on_duplicate';\nimport mysql_order_by_order_by from '../interpreter/mysql/order_by/order_by';\nimport mysql_raw_raw from '../interpreter/mysql/raw/raw';\nimport mysql_schema_foreign_key_info from '../interpreter/mysql/schema/foreign_key_info';\nimport mysql_schema_index_info from '../interpreter/mysql/schema/index_info';\nimport mysql_schema_primary_key_info from '../interpreter/mysql/schema/primary_key_info';\nimport mysql_schema_table_info from '../interpreter/mysql/schema/table_info';\nimport mysql_select_select from '../interpreter/mysql/select/select';\nimport mysql_truncate_truncate from '../interpreter/mysql/truncate/truncate';\nimport mysql_union_union from '../interpreter/mysql/union/union';\nimport mysql_update_update from '../interpreter/mysql/update/update';\nimport mysql_where_where from '../interpreter/mysql/where/where';\nimport mysql_where_where_group from '../interpreter/mysql/where/where_group';\nimport mysql_where_where_json from '../interpreter/mysql/where/where_json';\nimport mysql_where_where_subquery from '../interpreter/mysql/where/where_subquery';\nimport mysql_with_with from '../interpreter/mysql/with/with';\nimport postgres_alter_table_add_column from '../interpreter/postgres/alter_table/add_column';\nimport postgres_alter_table_add_constraint from '../interpreter/postgres/alter_table/add_constraint';\nimport postgres_alter_table_add_primary_key from '../interpreter/postgres/alter_table/add_primary_key';\nimport postgres_alter_table_alter_column_type from '../interpreter/postgres/alter_table/alter_column_type';\nimport postgres_alter_table_alter_table from '../interpreter/postgres/alter_table/alter_table';\nimport postgres_alter_table_drop_column from '../interpreter/postgres/alter_table/drop_column';\nimport postgres_alter_table_drop_constraint from '../interpreter/postgres/alter_table/drop_constraint';\nimport postgres_alter_table_drop_default from '../interpreter/postgres/alter_table/drop_default';\nimport postgres_alter_table_drop_not_null from '../interpreter/postgres/alter_table/drop_not_null';\nimport postgres_alter_table_drop_primary_key from '../interpreter/postgres/alter_table/drop_primary_key';\nimport postgres_alter_table_rename_column from '../interpreter/postgres/alter_table/rename_column';\nimport postgres_alter_table_rename_table from '../interpreter/postgres/alter_table/rename_table';\nimport postgres_alter_table_set_default from '../interpreter/postgres/alter_table/set_default';\nimport postgres_alter_table_set_not_null from '../interpreter/postgres/alter_table/set_not_null';\nimport postgres_column_column_type from '../interpreter/postgres/column/column_type';\nimport postgres_constraint_after from '../interpreter/postgres/constraint/after';\nimport postgres_constraint_constraint from '../interpreter/postgres/constraint/constraint';\nimport postgres_create_table_create_table from '../interpreter/postgres/create_table/create_table';\nimport postgres_delete_delete from '../interpreter/postgres/delete/delete';\nimport postgres_distinct_distinct from '../interpreter/postgres/distinct/distinct';\nimport postgres_distinct_distinct_on from '../interpreter/postgres/distinct/distinct_on';\nimport postgres_drop_table_drop_table from '../interpreter/postgres/drop_table/drop_table';\nimport postgres_from_from from '../interpreter/postgres/from/from';\nimport postgres_group_by_group_by from '../interpreter/postgres/group_by/group_by';\nimport postgres_having_having from '../interpreter/postgres/having/having';\nimport postgres_index_op_create_index from '../interpreter/postgres/index_op/create_index';\nimport postgres_index_op_drop_index from '../interpreter/postgres/index_op/drop_index';\nimport postgres_insert_insert from '../interpreter/postgres/insert/insert';\nimport postgres_join_join from '../interpreter/postgres/join/join';\nimport postgres_limit_limit from '../interpreter/postgres/limit/limit';\nimport postgres_lock_lock from '../interpreter/postgres/lock/lock';\nimport postgres_offset_offset from '../interpreter/postgres/offset/offset';\nimport postgres_on_duplicate_on_duplicate from '../interpreter/postgres/on_duplicate/on_duplicate';\nimport postgres_order_by_order_by from '../interpreter/postgres/order_by/order_by';\nimport postgres_raw_raw from '../interpreter/postgres/raw/raw';\nimport postgres_schema_foreign_key_info from '../interpreter/postgres/schema/foreign_key_info';\nimport postgres_schema_index_info from '../interpreter/postgres/schema/index_info';\nimport postgres_schema_primary_key_info from '../interpreter/postgres/schema/primary_key_info';\nimport postgres_schema_table_info from '../interpreter/postgres/schema/table_info';\nimport postgres_select_select from '../interpreter/postgres/select/select';\nimport postgres_truncate_truncate from '../interpreter/postgres/truncate/truncate';\nimport postgres_union_union from '../interpreter/postgres/union/union';\nimport postgres_update_update from '../interpreter/postgres/update/update';\nimport postgres_where_where from '../interpreter/postgres/where/where';\nimport postgres_where_where_group from '../interpreter/postgres/where/where_group';\nimport postgres_where_where_json from '../interpreter/postgres/where/where_json';\nimport postgres_where_where_subquery from '../interpreter/postgres/where/where_subquery';\nimport postgres_with_with from '../interpreter/postgres/with/with';\nimport sqlite_alter_table_add_column from '../interpreter/sqlite/alter_table/add_column';\nimport sqlite_alter_table_add_constraint from '../interpreter/sqlite/alter_table/add_constraint';\nimport sqlite_alter_table_alter_column_type from '../interpreter/sqlite/alter_table/alter_column_type';\nimport sqlite_alter_table_alter_table from '../interpreter/sqlite/alter_table/alter_table';\nimport sqlite_alter_table_drop_column from '../interpreter/sqlite/alter_table/drop_column';\nimport sqlite_alter_table_drop_constraint from '../interpreter/sqlite/alter_table/drop_constraint';\nimport sqlite_alter_table_drop_default from '../interpreter/sqlite/alter_table/drop_default';\nimport sqlite_alter_table_drop_not_null from '../interpreter/sqlite/alter_table/drop_not_null';\nimport sqlite_alter_table_drop_primary_key from '../interpreter/sqlite/alter_table/drop_primary_key';\nimport sqlite_alter_table_rename_column from '../interpreter/sqlite/alter_table/rename_column';\nimport sqlite_alter_table_rename_table from '../interpreter/sqlite/alter_table/rename_table';\nimport sqlite_alter_table_set_default from '../interpreter/sqlite/alter_table/set_default';\nimport sqlite_alter_table_set_not_null from '../interpreter/sqlite/alter_table/set_not_null';\nimport sqlite_column_column_type from '../interpreter/sqlite/column/column_type';\nimport sqlite_constraint_after from '../interpreter/sqlite/constraint/after';\nimport sqlite_constraint_constraint from '../interpreter/sqlite/constraint/constraint';\nimport sqlite_create_table_create_table from '../interpreter/sqlite/create_table/create_table';\nimport sqlite_delete_delete from '../interpreter/sqlite/delete/delete';\nimport sqlite_distinct_distinct from '../interpreter/sqlite/distinct/distinct';\nimport sqlite_distinct_distinct_on from '../interpreter/sqlite/distinct/distinct_on';\nimport sqlite_drop_table_drop_table from '../interpreter/sqlite/drop_table/drop_table';\nimport sqlite_from_from from '../interpreter/sqlite/from/from';\nimport sqlite_group_by_group_by from '../interpreter/sqlite/group_by/group_by';\nimport sqlite_having_having from '../interpreter/sqlite/having/having';\nimport sqlite_index_op_create_index from '../interpreter/sqlite/index_op/create_index';\nimport sqlite_index_op_drop_index from '../interpreter/sqlite/index_op/drop_index';\nimport sqlite_insert_insert from '../interpreter/sqlite/insert/insert';\nimport sqlite_join_join from '../interpreter/sqlite/join/join';\nimport sqlite_limit_limit from '../interpreter/sqlite/limit/limit';\nimport sqlite_lock_lock from '../interpreter/sqlite/lock/lock';\nimport sqlite_offset_offset from '../interpreter/sqlite/offset/offset';\nimport sqlite_on_duplicate_on_duplicate from '../interpreter/sqlite/on_duplicate/on_duplicate';\nimport sqlite_order_by_order_by from '../interpreter/sqlite/order_by/order_by';\nimport sqlite_raw_raw from '../interpreter/sqlite/raw/raw';\nimport sqlite_schema_foreign_key_info from '../interpreter/sqlite/schema/foreign_key_info';\nimport sqlite_schema_index_info from '../interpreter/sqlite/schema/index_info';\nimport sqlite_schema_primary_key_info from '../interpreter/sqlite/schema/primary_key_info';\nimport sqlite_schema_table_info from '../interpreter/sqlite/schema/table_info';\nimport sqlite_select_select from '../interpreter/sqlite/select/select';\nimport sqlite_truncate_truncate from '../interpreter/sqlite/truncate/truncate';\nimport sqlite_union_union from '../interpreter/sqlite/union/union';\nimport sqlite_update_update from '../interpreter/sqlite/update/update';\nimport sqlite_where_where from '../interpreter/sqlite/where/where';\nimport sqlite_where_where_group from '../interpreter/sqlite/where/where_group';\nimport sqlite_where_where_json from '../interpreter/sqlite/where/where_json';\nimport sqlite_where_where_subquery from '../interpreter/sqlite/where/where_subquery';\nimport sqlite_with_with from '../interpreter/sqlite/with/with';\n\nexport const interpreterMap = {\n mysql: {\n alter_table: {\n add_column: mysql_alter_table_add_column,\n add_constraint: mysql_alter_table_add_constraint,\n add_primary_key: mysql_alter_table_add_primary_key,\n alter_column_type: mysql_alter_table_alter_column_type,\n alter_table: mysql_alter_table_alter_table,\n drop_column: mysql_alter_table_drop_column,\n drop_constraint: mysql_alter_table_drop_constraint,\n drop_default: mysql_alter_table_drop_default,\n drop_not_null: mysql_alter_table_drop_not_null,\n drop_primary_key: mysql_alter_table_drop_primary_key,\n rename_column: mysql_alter_table_rename_column,\n rename_table: mysql_alter_table_rename_table,\n set_default: mysql_alter_table_set_default,\n set_not_null: mysql_alter_table_set_not_null,\n },\n column: {\n column_type: mysql_column_column_type,\n },\n constraint: {\n after: mysql_constraint_after,\n constraint: mysql_constraint_constraint,\n },\n create_table: {\n create_table: mysql_create_table_create_table,\n },\n delete: {\n delete: mysql_delete_delete,\n },\n distinct: {\n distinct: mysql_distinct_distinct,\n distinct_on: mysql_distinct_distinct_on,\n },\n drop_table: {\n drop_table: mysql_drop_table_drop_table,\n },\n from: {\n from: mysql_from_from,\n },\n group_by: {\n group_by: mysql_group_by_group_by,\n },\n having: {\n having: mysql_having_having,\n },\n index_op: {\n create_index: mysql_index_op_create_index,\n drop_index: mysql_index_op_drop_index,\n },\n insert: {\n insert: mysql_insert_insert,\n },\n join: {\n join: mysql_join_join,\n },\n limit: {\n limit: mysql_limit_limit,\n },\n lock: {\n lock: mysql_lock_lock,\n },\n offset: {\n offset: mysql_offset_offset,\n },\n on_duplicate: {\n on_duplicate: mysql_on_duplicate_on_duplicate,\n },\n order_by: {\n order_by: mysql_order_by_order_by,\n },\n raw: {\n raw: mysql_raw_raw,\n },\n schema: {\n foreign_key_info: mysql_schema_foreign_key_info,\n index_info: mysql_schema_index_info,\n primary_key_info: mysql_schema_primary_key_info,\n table_info: mysql_schema_table_info,\n },\n select: {\n select: mysql_select_select,\n },\n truncate: {\n truncate: mysql_truncate_truncate,\n },\n union: {\n union: mysql_union_union,\n },\n update: {\n update: mysql_update_update,\n },\n where: {\n where: mysql_where_where,\n where_group: mysql_where_where_group,\n where_json: mysql_where_where_json,\n where_subquery: mysql_where_where_subquery,\n },\n with: {\n with: mysql_with_with,\n },\n },\n postgres: {\n alter_table: {\n add_column: postgres_alter_table_add_column,\n add_constraint: postgres_alter_table_add_constraint,\n add_primary_key: postgres_alter_table_add_primary_key,\n alter_column_type: postgres_alter_table_alter_column_type,\n alter_table: postgres_alter_table_alter_table,\n drop_column: postgres_alter_table_drop_column,\n drop_constraint: postgres_alter_table_drop_constraint,\n drop_default: postgres_alter_table_drop_default,\n drop_not_null: postgres_alter_table_drop_not_null,\n drop_primary_key: postgres_alter_table_drop_primary_key,\n rename_column: postgres_alter_table_rename_column,\n rename_table: postgres_alter_table_rename_table,\n set_default: postgres_alter_table_set_default,\n set_not_null: postgres_alter_table_set_not_null,\n },\n column: {\n column_type: postgres_column_column_type,\n },\n constraint: {\n after: postgres_constraint_after,\n constraint: postgres_constraint_constraint,\n },\n create_table: {\n create_table: postgres_create_table_create_table,\n },\n delete: {\n delete: postgres_delete_delete,\n },\n distinct: {\n distinct: postgres_distinct_distinct,\n distinct_on: postgres_distinct_distinct_on,\n },\n drop_table: {\n drop_table: postgres_drop_table_drop_table,\n },\n from: {\n from: postgres_from_from,\n },\n group_by: {\n group_by: postgres_group_by_group_by,\n },\n having: {\n having: postgres_having_having,\n },\n index_op: {\n create_index: postgres_index_op_create_index,\n drop_index: postgres_index_op_drop_index,\n },\n insert: {\n insert: postgres_insert_insert,\n },\n join: {\n join: postgres_join_join,\n },\n limit: {\n limit: postgres_limit_limit,\n },\n lock: {\n lock: postgres_lock_lock,\n },\n offset: {\n offset: postgres_offset_offset,\n },\n on_duplicate: {\n on_duplicate: postgres_on_duplicate_on_duplicate,\n },\n order_by: {\n order_by: postgres_order_by_order_by,\n },\n raw: {\n raw: postgres_raw_raw,\n },\n schema: {\n foreign_key_info: postgres_schema_foreign_key_info,\n index_info: postgres_schema_index_info,\n primary_key_info: postgres_schema_primary_key_info,\n table_info: postgres_schema_table_info,\n },\n select: {\n select: postgres_select_select,\n },\n truncate: {\n truncate: postgres_truncate_truncate,\n },\n union: {\n union: postgres_union_union,\n },\n update: {\n update: postgres_update_update,\n },\n where: {\n where: postgres_where_where,\n where_group: postgres_where_where_group,\n where_json: postgres_where_where_json,\n where_subquery: postgres_where_where_subquery,\n },\n with: {\n with: postgres_with_with,\n },\n },\n sqlite: {\n alter_table: {\n add_column: sqlite_alter_table_add_column,\n add_constraint: sqlite_alter_table_add_constraint,\n alter_column_type: sqlite_alter_table_alter_column_type,\n alter_table: sqlite_alter_table_alter_table,\n drop_column: sqlite_alter_table_drop_column,\n drop_constraint: sqlite_alter_table_drop_constraint,\n drop_default: sqlite_alter_table_drop_default,\n drop_not_null: sqlite_alter_table_drop_not_null,\n drop_primary_key: sqlite_alter_table_drop_primary_key,\n rename_column: sqlite_alter_table_rename_column,\n rename_table: sqlite_alter_table_rename_table,\n set_default: sqlite_alter_table_set_default,\n set_not_null: sqlite_alter_table_set_not_null,\n },\n column: {\n column_type: sqlite_column_column_type,\n },\n constraint: {\n after: sqlite_constraint_after,\n constraint: sqlite_constraint_constraint,\n },\n create_table: {\n create_table: sqlite_create_table_create_table,\n },\n delete: {\n delete: sqlite_delete_delete,\n },\n distinct: {\n distinct: sqlite_distinct_distinct,\n distinct_on: sqlite_distinct_distinct_on,\n },\n drop_table: {\n drop_table: sqlite_drop_table_drop_table,\n },\n from: {\n from: sqlite_from_from,\n },\n group_by: {\n group_by: sqlite_group_by_group_by,\n },\n having: {\n having: sqlite_having_having,\n },\n index_op: {\n create_index: sqlite_index_op_create_index,\n drop_index: sqlite_index_op_drop_index,\n },\n insert: {\n insert: sqlite_insert_insert,\n },\n join: {\n join: sqlite_join_join,\n },\n limit: {\n limit: sqlite_limit_limit,\n },\n lock: {\n lock: sqlite_lock_lock,\n },\n offset: {\n offset: sqlite_offset_offset,\n },\n on_duplicate: {\n on_duplicate: sqlite_on_duplicate_on_duplicate,\n },\n order_by: {\n order_by: sqlite_order_by_order_by,\n },\n raw: {\n raw: sqlite_raw_raw,\n },\n schema: {\n foreign_key_info: sqlite_schema_foreign_key_info,\n index_info: sqlite_schema_index_info,\n primary_key_info: sqlite_schema_primary_key_info,\n table_info: sqlite_schema_table_info,\n },\n select: {\n select: sqlite_select_select,\n },\n truncate: {\n truncate: sqlite_truncate_truncate,\n },\n union: {\n union: sqlite_union_union,\n },\n update: {\n update: sqlite_update_update,\n },\n where: {\n where: sqlite_where_where,\n where_group: sqlite_where_where_group,\n where_json: sqlite_where_where_json,\n where_subquery: sqlite_where_where_subquery,\n },\n with: {\n with: sqlite_with_with,\n },\n },\n} as any;\n","import type { Interpreter } from \"../interpreter/interpreter\";\nimport { Model } from \"../models/model\";\nimport { SqlDataSourceType } from \"../sql_data_source_types\";\nimport { interpreterMap } from \"./interpreter_map\";\nimport type { AstParserType } from \"./parser_types\";\nimport { QueryNode } from \"./query/query\";\n\nexport class AstParser {\n private readonly dbType: SqlDataSourceType;\n private readonly model: typeof Model;\n\n constructor(model: typeof Model, dbType: SqlDataSourceType) {\n this.dbType = dbType;\n this.model = model;\n }\n\n parse(\n nodes: (QueryNode | null)[],\n startBindingIndex: number = 1,\n isNestedCondition: boolean = false,\n ): AstParserType {\n if (!nodes.length) {\n return {\n sql: \"\",\n bindings: [],\n };\n }\n\n const distinctOnNode = nodes.find(\n (node): node is QueryNode & { columns: string[] } =>\n !!node && node.folder === \"distinctOn\",\n );\n const distinctNode =\n !distinctOnNode &&\n nodes.find(\n (node): node is QueryNode => !!node && node.folder === \"distinct\",\n );\n const filteredNodes = nodes.filter(\n (node): node is QueryNode =>\n node !== null &&\n node.folder !== \"distinct\" &&\n node.folder !== \"distinctOn\",\n );\n const sqlParts: string[] = [];\n const allBindings: any[] = [];\n let currentSqlKeyword: string | null = null;\n\n for (let i = 0; i < filteredNodes.length; i++) {\n const node = filteredNodes[i];\n node.currParamIndex = startBindingIndex + allBindings.length;\n\n const interpreter: Interpreter =\n interpreterMap[this.mapCommonDbType(this.dbType)][node.folder][\n node.file\n ];\n\n if (!interpreter) {\n throw new Error(\n `Interpreter not found for ${this.dbType} ${node.keyword}`,\n );\n }\n\n interpreter.model = this.model;\n const sqlStatement = interpreter.toSql(node);\n\n if (!sqlStatement.sql || !sqlStatement.sql.trim().length) {\n continue;\n }\n\n const nextNode = filteredNodes[i + 1];\n const isLastOfType = !nextNode || nextNode.keyword !== node.keyword;\n const chainWith = isLastOfType ? \"\" : nextNode.chainsWith;\n\n if (\n node.folder === \"lock\" ||\n node.folder === \"on_duplicate\" ||\n node.folder === \"schema\"\n ) {\n sqlParts.push(`${sqlStatement.sql}${chainWith}`);\n allBindings.push(...sqlStatement.bindings);\n currentSqlKeyword = node.keyword;\n continue;\n }\n\n if (\n currentSqlKeyword !== node.keyword ||\n node.canKeywordBeSeenMultipleTimes\n ) {\n if (isNestedCondition) {\n sqlParts.push(`${sqlStatement.sql}${chainWith}`);\n } else {\n let keywordToEmit = node.keyword;\n if (node.folder === \"with\") {\n let j = i;\n let hasRecursive = false;\n while (\n j < filteredNodes.length &&\n filteredNodes[j].keyword === node.keyword\n ) {\n const candidate = filteredNodes[j] as any;\n if (\n candidate.folder === \"with\" &&\n candidate.clause === \"recursive\"\n ) {\n hasRecursive = true;\n break;\n }\n j++;\n }\n if (hasRecursive) {\n keywordToEmit = `${keywordToEmit} recursive`;\n }\n }\n if (keywordToEmit === \"select\") {\n if (distinctOnNode) {\n const columns = Array.isArray((distinctOnNode as any).columns)\n ? (distinctOnNode as any).columns.join(\", \")\n : \"\";\n sqlParts.push(\n `select distinct on (${columns}) ${sqlStatement.sql}${chainWith}`,\n );\n } else if (distinctNode) {\n sqlParts.push(`select distinct ${sqlStatement.sql}${chainWith}`);\n } else {\n sqlParts.push(`select ${sqlStatement.sql}${chainWith}`);\n }\n } else {\n sqlParts.push(`${keywordToEmit} ${sqlStatement.sql}${chainWith}`);\n }\n }\n currentSqlKeyword = node.keyword;\n } else {\n sqlParts.push(`${sqlStatement.sql}${chainWith}`);\n }\n\n allBindings.push(...sqlStatement.bindings);\n }\n\n const finalSql = sqlParts.join(\" \");\n\n return {\n sql: finalSql,\n bindings: allBindings,\n };\n }\n\n /**\n * Map the database type to a common type if shares the same driver (e.g. mysql and mariadb)\n */\n private mapCommonDbType(dbType: SqlDataSourceType) {\n switch (dbType) {\n case \"mariadb\":\n return \"mysql\";\n case \"cockroachdb\":\n return \"postgres\";\n default:\n return dbType;\n }\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class ForeignKeyInfoNode extends QueryNode {\n table: string;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"schema\";\n file = \"foreign_key_info\";\n\n constructor(table: string) {\n super(\"schema\");\n this.table = table;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class IndexInfoNode extends QueryNode {\n table: string;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"schema\";\n file = \"index_info\";\n\n constructor(table: string) {\n super(\"schema\");\n this.table = table;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class PrimaryKeyInfoNode extends QueryNode {\n table: string;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"schema\";\n file = \"primary_key_info\";\n\n constructor(table: string) {\n super(\"schema\");\n this.table = table;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class TableInfoNode extends QueryNode {\n table: string;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"schema\";\n file = \"table_info\";\n\n constructor(table: string) {\n super(\"schema\");\n this.table = table;\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { env } from \"../../../env/env\";\nimport { HysteriaError } from \"../../../errors/hysteria_error\";\nimport { AstParser } from \"../../ast/parser\";\nimport {\n AddPrimaryKeyNode,\n AlterTableNode,\n DropConstraintNode,\n DropPrimaryKeyNode,\n RenameTableNode,\n} from \"../../ast/query/node/alter_table\";\nimport { AddConstraintNode } from \"../../ast/query/node/alter_table/add_constraint\";\nimport { ConstraintNode } from \"../../ast/query/node/constraint\";\nimport { CreateTableNode } from \"../../ast/query/node/create_table\";\nimport { DropTableNode } from \"../../ast/query/node/drop_table\";\nimport { CreateIndexNode, DropIndexNode } from \"../../ast/query/node/index_op\";\nimport { TruncateNode } from \"../../ast/query/node/truncate\";\nimport { QueryNode } from \"../../ast/query/query\";\nimport {\n getDefaultFkConstraintName,\n getDefaultIndexName,\n getDefaultUniqueConstraintName,\n} from \"../../models/decorators/model_decorators_constants\";\nimport { Model } from \"../../models/model\";\nimport type { SqlDataSourceType } from \"../../sql_data_source_types\";\nimport { AlterTableBuilder } from \"./alter_table\";\nimport { CreateTableBuilder } from \"./create_table\";\nimport { CommonConstraintOptions } from \"./schema_types\";\n\nexport default class Schema {\n queryStatements: string[];\n sqlType: SqlDataSourceType;\n\n constructor(sqlType?: SqlDataSourceType) {\n this.sqlType = (sqlType || env.DB_TYPE) as SqlDataSourceType;\n\n if (!this.sqlType) {\n throw new HysteriaError(\n \"Schema::constructor\",\n \"ENV_NOT_SET\",\n new Error(\"env not set, please set DB_TYPE in .env file\"),\n );\n }\n\n this.queryStatements = [];\n }\n\n /**\n * @description Add raw query to the migration\n */\n rawQuery(query: string): void {\n this.queryStatements.push(query);\n }\n\n /**\n * @description Runs the sql in the given file, throws error if file does not exist or is not .sql or .txt\n * @description File is splitted by semicolons and each statement is executed separately and in order\n */\n runFile(filePath: string): void {\n if (!fs.existsSync(filePath)) {\n throw new HysteriaError(\n \"Schema::runFile\",\n `FILE_NOT_FOUND_OR_NOT_ACCESSIBLE`,\n );\n }\n\n const file = path.basename(filePath);\n const fileExtension = path.extname(file);\n if (fileExtension !== \".sql\" && fileExtension !== \".txt\") {\n throw new HysteriaError(\"Schema::runFile\", `FILE_NOT_A_SQL_OR_TXT_FILE`);\n }\n\n const query = fs.readFileSync(filePath, \"utf-8\");\n\n const statements = query\n .split(\";\")\n .map((stmt) => stmt.trim())\n .filter((stmt) => stmt.length > 0 && !stmt.startsWith(\"--\"));\n\n for (const statement of statements) {\n this.rawQuery(statement);\n }\n }\n\n /**\n * @description Create table constructor\n */\n createTable(\n table: string,\n cb: (table: CreateTableBuilder) => void,\n options?: { ifNotExists?: boolean },\n ): void {\n const tableBuilder = new CreateTableBuilder(this.sqlType, [], table);\n cb(tableBuilder);\n\n const nodes = tableBuilder.getNodes();\n const astParser = new AstParser(\n {\n table: table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model,\n this.sqlType,\n );\n\n const createTableNode = new CreateTableNode(\n table,\n nodes,\n tableBuilder.getNamedConstraints() as ConstraintNode[],\n options?.ifNotExists,\n );\n\n const frag = astParser.parse([createTableNode]).sql;\n const stmt = frag.startsWith(\"create table\")\n ? frag\n : `create table ${frag}`;\n this.rawQuery(stmt);\n }\n\n /**\n * @description Alter table constructor\n */\n alterTable(table: string, cb: (t: AlterTableBuilder) => void): void {\n const nodes: QueryNode[] = [];\n const builder = new AlterTableBuilder(table, nodes, this.sqlType);\n cb(builder);\n\n if (!nodes.length) {\n return;\n }\n\n const astParser = this.generateAstInstance({\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model);\n\n let group: QueryNode[] = [];\n const flushGroup = () => {\n if (!group.length) {\n return;\n }\n\n const nodeGroup = new AlterTableNode(table, group);\n const frag = astParser.parse([nodeGroup]).sql;\n if (!frag || !frag.trim()) {\n return;\n }\n\n const stmt = frag.startsWith(\"alter table\")\n ? frag\n : `alter table ${frag}`;\n this.rawQuery(stmt);\n group = [];\n };\n\n for (const child of nodes) {\n if (\n child.file === \"add_constraint\" &&\n group.length &&\n (group[0] as any).file === \"add_column\"\n ) {\n // merge with current add column group\n group.push(child);\n } else {\n flushGroup();\n group.push(child);\n }\n }\n flushGroup();\n }\n\n /**\n * @description Drop table in the database\n */\n dropTable(table: string, ifExists: boolean = false): void {\n const node = new DropTableNode(table, ifExists);\n const astParser = this.generateAstInstance({\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model);\n this.rawQuery(astParser.parse([node]).sql);\n }\n\n /**\n * @description Rename table in the database\n */\n renameTable(oldTable: string, newTable: string): void {\n const node = new AlterTableNode(oldTable, [new RenameTableNode(newTable)]);\n const astParser = this.generateAstInstance({\n table: oldTable,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model);\n\n this.rawQuery(astParser.parse([node]).sql);\n }\n\n /**\n * @description Truncate table\n */\n truncateTable(table: string): void {\n const node = new TruncateNode(table);\n const astParser = this.generateAstInstance({\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model);\n this.rawQuery(astParser.parse([node]).sql);\n }\n\n /**\n * @description Create index on table\n */\n createIndex(\n table: string,\n columns: string[] | string,\n options: CommonConstraintOptions,\n ): void {\n if (!Array.isArray(columns)) {\n columns = [columns];\n }\n\n const indexName =\n options.constraintName || getDefaultIndexName(table, columns.join(\"_\"));\n const node = new CreateIndexNode(table, columns, indexName);\n const astParser = this.generateAstInstance({\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model);\n this.rawQuery(astParser.parse([node]).sql);\n }\n\n /**\n * @description Drop index on table\n * @mysql requires table name for index drop\n */\n dropIndex(indexName: string, table?: string): void {\n const node = new DropIndexNode(indexName, table);\n const astParser = this.generateAstInstance({\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model);\n this.rawQuery(astParser.parse([node]).sql);\n }\n\n /**\n * @description Adds a primary key to a table\n */\n addPrimaryKey(table: string, columns: string[]): void {\n const node = new AddPrimaryKeyNode(columns);\n const astParser = this.generateAstInstance({\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model);\n this.rawQuery(astParser.parse([node]).sql);\n }\n\n /**\n * @description Adds a UNIQUE constraint to a table\n */\n addUnique(\n table: string,\n columns: string[] | string,\n options?: CommonConstraintOptions,\n ): void {\n const cols = Array.isArray(columns) ? columns : [columns];\n const constraintName =\n options?.constraintName ??\n getDefaultUniqueConstraintName(table, cols.join(\"_\"));\n\n const constraint = new ConstraintNode(\"unique\", {\n columns: cols,\n constraintName,\n });\n\n const alterNode = new AlterTableNode(table, [\n new AddConstraintNode(constraint),\n ]);\n\n const astParser = this.generateAstInstance({\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model);\n\n this.rawQuery(astParser.parse([alterNode]).sql);\n }\n\n /**\n * @description Drops a foreign key from a table, uses a standard constraint name pattern: fk_${table}_${leftColumn}_${rightColumn}\n * @description If a custom constraint name was used to generate the foreign key, use `dropConstraint` instead\n */\n dropForeignKey(table: string, leftColumn: string, rightColumn: string): void {\n const constraintName = getDefaultFkConstraintName(\n table,\n leftColumn,\n rightColumn,\n );\n\n const dropNode = new DropConstraintNode(constraintName);\n const alterNode = new AlterTableNode(table, [dropNode]);\n\n const astParser = this.generateAstInstance({\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model);\n\n this.rawQuery(astParser.parse([alterNode]).sql);\n }\n\n /**\n * @description Drops a UNIQUE constraint from a table\n * @description If no constraintName is provided, it computes the default name using columns\n */\n dropUnique(\n table: string,\n columnsOrConstraintName: string | string[],\n options?: CommonConstraintOptions,\n ): void {\n const computedName = Array.isArray(columnsOrConstraintName)\n ? getDefaultUniqueConstraintName(table, columnsOrConstraintName.join(\"_\"))\n : getDefaultUniqueConstraintName(table, columnsOrConstraintName);\n\n const constraintName = options?.constraintName ?? computedName;\n\n const dropNode = new DropConstraintNode(constraintName);\n const alterNode = new AlterTableNode(table, [dropNode]);\n\n const astParser = this.generateAstInstance({\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model);\n\n this.rawQuery(astParser.parse([alterNode]).sql);\n }\n\n /**\n * @description Drops a primary key from a table\n */\n dropPrimaryKey(table: string): void {\n const node = new DropPrimaryKeyNode();\n const astParser = this.generateAstInstance({\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model);\n this.rawQuery(astParser.parse([node]).sql);\n }\n\n /**\n * @description Adds a foreign key to a table\n */\n addConstraint(\n table: string,\n ...options: ConstructorParameters<typeof ConstraintNode>\n ): void {\n const constraint = new ConstraintNode(...options);\n\n const alterNode = new AlterTableNode(table, [\n new AddConstraintNode(constraint),\n ]);\n\n const astParser = this.generateAstInstance({\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model);\n this.rawQuery(astParser.parse([alterNode]).sql);\n }\n\n /**\n * @description Drops a constraint from a table\n */\n dropConstraint(table: string, constraintName: string): void {\n const node = new DropConstraintNode(constraintName);\n const astParser = this.generateAstInstance({\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model);\n this.rawQuery(astParser.parse([node]).sql);\n }\n\n private generateAstInstance(model: typeof Model): AstParser {\n return new AstParser(model, this.sqlType);\n }\n}\n","import { QueryNode } from \"../../query\";\nimport { ColumnTypeNode } from \"../column\";\n\nexport class AddColumnNode extends QueryNode {\n column: ColumnTypeNode;\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"alter_table\";\n file = \"add_column\";\n\n constructor(column: ColumnTypeNode) {\n super(\"\");\n this.column = column;\n }\n}\n","import { QueryNode } from \"../../query\";\nimport { ConstraintNode } from \"../constraint\";\n\nexport class AddConstraintNode extends QueryNode {\n constraint: ConstraintNode;\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"alter_table\";\n file = \"add_constraint\";\n\n constructor(constraint: ConstraintNode) {\n super(\"\");\n this.constraint = constraint;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class AddPrimaryKeyNode extends QueryNode {\n columns: string[];\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"alter_table\";\n file = \"add_primary_key\";\n\n constructor(columns: string[]) {\n super(\"\");\n this.columns = columns;\n }\n}\n","import { QueryNode } from \"../../query\";\nimport { ColumnTypeNode } from \"../column\";\n\nexport interface AlterColumnOptions {\n nullable?: boolean;\n unique?: boolean;\n default?: string | number | boolean | null;\n dropDefault?: boolean;\n}\n\nexport class AlterColumnTypeNode extends QueryNode {\n column: string;\n newType: ColumnTypeNode;\n options: AlterColumnOptions;\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"alter_table\";\n file = \"alter_column_type\";\n\n constructor(\n column: string,\n newType: ColumnTypeNode,\n options: AlterColumnOptions = {},\n ) {\n super(\"\");\n this.column = column;\n this.newType = newType;\n this.options = options;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class AlterTableNode extends QueryNode {\n table: string;\n children: QueryNode[];\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"alter_table\";\n file = \"alter_table\";\n ifExists: boolean;\n\n constructor(\n table: string,\n children: QueryNode[] = [],\n ifExists: boolean = false,\n ) {\n super(\"alter table\");\n this.table = table;\n this.children = children;\n this.ifExists = ifExists;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class DropColumnNode extends QueryNode {\n column: string;\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"alter_table\";\n file = \"drop_column\";\n constructor(column: string) {\n super(\"\");\n this.column = column;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class DropConstraintNode extends QueryNode {\n constraintName: string;\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"alter_table\";\n file = \"drop_constraint\";\n\n constructor(name: string) {\n super(\"\");\n this.constraintName = name;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class DropDefaultNode extends QueryNode {\n column: string;\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"alter_table\";\n file = \"drop_default\";\n\n constructor(column: string) {\n super(\"\");\n this.column = column;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class DropNotNullNode extends QueryNode {\n column: string;\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"alter_table\";\n file = \"drop_not_null\";\n\n constructor(column: string) {\n super(\"\");\n this.column = column;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class DropPrimaryKeyNode extends QueryNode {\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"alter_table\";\n file = \"drop_primary_key\";\n table?: string;\n\n constructor(table?: string) {\n super(\"\");\n this.table = table;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class RenameColumnNode extends QueryNode {\n oldName: string;\n newName: string;\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"alter_table\";\n file = \"rename_column\";\n constructor(oldName: string, newName: string) {\n super(\"\");\n this.oldName = oldName;\n this.newName = newName;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class RenameTableNode extends QueryNode {\n newName: string;\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"alter_table\";\n file = \"rename_table\";\n\n constructor(newName: string) {\n super(\"rename to\");\n this.newName = newName;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class SetDefaultNode extends QueryNode {\n column: string;\n defaultValue: string;\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"alter_table\";\n file = \"set_default\";\n\n constructor(column: string, defaultValue: string) {\n super(\"\");\n this.column = column;\n this.defaultValue = defaultValue;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class SetNotNullNode extends QueryNode {\n column: string;\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"alter_table\";\n file = \"set_not_null\";\n\n constructor(column: string) {\n super(\"\");\n this.column = column;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport type ConstraintType =\n | \"primary_key\"\n | \"foreign_key\"\n | \"unique\"\n | \"not_null\"\n | \"null\"\n | \"default\";\n\nexport class ConstraintNode extends QueryNode {\n constraintType: ConstraintType;\n columns?: (string | (() => string))[];\n references?: { table: string; columns: (string | (() => string))[] };\n constraintName?: string;\n onDelete?: \"cascade\" | \"restrict\" | \"set null\" | \"no action\";\n onUpdate?: \"cascade\" | \"restrict\" | \"set null\" | \"no action\";\n defaultValue?: string;\n checkExpression?: string;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"constraint\";\n file = \"constraint\";\n\n constructor(\n constraintType: ConstraintType,\n args: {\n columns?: string[];\n references?: { table: string; columns: string[] };\n constraintName?: string;\n onDelete?: \"cascade\" | \"restrict\" | \"set null\" | \"no action\";\n onUpdate?: \"cascade\" | \"restrict\" | \"set null\" | \"no action\";\n defaultValue?: string;\n checkExpression?: string;\n } = {},\n isRawValue: boolean = false,\n ) {\n super(\"\");\n this.constraintType = constraintType;\n this.columns = args.columns;\n this.references = args.references;\n this.constraintName = args.constraintName;\n this.onDelete = args.onDelete;\n this.onUpdate = args.onUpdate;\n this.defaultValue = args.defaultValue;\n this.checkExpression = args.checkExpression;\n this.isRawValue = isRawValue;\n }\n}\n","import { QueryNode } from \"../../query\";\nimport { ConstraintNode } from \"../constraint\";\n\nexport class CreateTableNode extends QueryNode {\n table: string;\n children: QueryNode[];\n namedConstraints: ConstraintNode[];\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"create_table\";\n file = \"create_table\";\n ifNotExists: boolean;\n\n constructor(\n table: string,\n children: QueryNode[] = [],\n namedConstraints: ConstraintNode[] = [],\n ifNotExists: boolean = false,\n ) {\n super(\"create table\");\n this.table = table;\n this.children = children;\n this.namedConstraints = namedConstraints;\n this.ifNotExists = ifNotExists;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class DropTableNode extends QueryNode {\n table: string;\n ifExists: boolean;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"drop_table\";\n file = \"drop_table\";\n\n constructor(table: string, ifExists: boolean = false) {\n super(\"drop table\");\n this.table = table;\n this.ifExists = ifExists;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class CreateIndexNode extends QueryNode {\n table: string;\n columns: string[];\n indexName: string;\n unique: boolean;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"index_op\";\n file = \"create_index\";\n\n constructor(\n table: string,\n columns: string[],\n indexName: string,\n unique = false,\n ) {\n super(\"create index\");\n this.table = table;\n this.columns = columns;\n this.indexName = indexName;\n this.unique = unique;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class DropIndexNode extends QueryNode {\n indexName: string;\n table?: string; // required for mysql\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n cascade = false;\n folder = \"index_op\";\n file = \"drop_index\";\n\n constructor(indexName: string, table?: string, cascade?: boolean) {\n super(\"drop index\");\n this.indexName = indexName;\n this.table = table;\n this.cascade = cascade ?? false;\n }\n}\n","import { QueryNode } from \"../../query\";\nimport { FromNode } from \"../from\";\n\nexport class TruncateNode extends QueryNode {\n fromNode: FromNode | string;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"truncate\";\n file = \"truncate\";\n\n constructor(fromNode: FromNode | string, isRawValue: boolean = false) {\n super(\"truncate\", isRawValue);\n this.fromNode = fromNode;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class ColumnTypeNode extends QueryNode {\n column: string | (() => string);\n dataType: string;\n length?: number;\n precision?: number;\n scale?: number;\n enumValues?: readonly string[];\n autoIncrement?: boolean;\n withTimezone?: boolean;\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"column\";\n file = \"column_type\";\n isRawValue = false;\n\n constructor(\n column: string,\n dataType: string,\n opts: {\n length?: number;\n precision?: number;\n scale?: number;\n enumValues?: readonly string[];\n withTimezone?: boolean;\n autoIncrement?: boolean;\n isRawValue?: boolean;\n } = {},\n ) {\n super(\"\");\n this.column = column;\n this.dataType = dataType;\n this.length = opts.length;\n this.precision = opts.precision;\n this.scale = opts.scale;\n this.enumValues = opts.enumValues;\n this.withTimezone = opts.withTimezone;\n this.autoIncrement = opts.autoIncrement;\n this.isRawValue = opts.isRawValue ?? false;\n }\n}\n","import { QueryNode } from \"../../query\";\n\ntype LockType =\n | \"for_update\"\n | \"for_share\"\n | \"for_no_key_update\"\n | \"for_key_share\";\n\nexport class LockNode extends QueryNode {\n lockType: LockType;\n skipLocked: boolean;\n noWait: boolean;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"lock\";\n file = \"lock\";\n\n constructor(\n lockType: LockType,\n skipLocked: boolean = false,\n noWait: boolean = false,\n ) {\n super(\"lock\");\n this.lockType = lockType;\n this.skipLocked = skipLocked;\n this.noWait = noWait;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class UnionNode extends QueryNode {\n query: QueryNode | QueryNode[] | string;\n isAll: boolean;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"union\";\n file = \"union\";\n\n constructor(query: QueryNode | QueryNode[] | string, isAll: boolean = false) {\n super(isAll ? \"union all\" : \"union\");\n this.query = query;\n this.isAll = isAll;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class WithNode extends QueryNode {\n alias: string;\n body: QueryNode | QueryNode[];\n clause: string;\n chainsWith = \",\";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"with\";\n file = \"with\";\n\n constructor(clause: string, alias: string, body: QueryNode | QueryNode[]) {\n if (clause === \"normal\") {\n clause = \"\";\n }\n\n super(\"with\");\n this.alias = alias;\n this.body = body;\n this.clause = clause;\n }\n}\n","import { QueryNode } from \"../../ast/query/query\";\n\nexport abstract class BaseBuilder {\n protected nodes: QueryNode[];\n\n constructor(nodes: QueryNode[]) {\n this.nodes = nodes;\n }\n\n getNodes(): QueryNode[] {\n return this.nodes;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class AfterConstraintNode extends QueryNode {\n column: string;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"constraint\";\n file = \"after\";\n\n constructor(column: string) {\n super(\"\");\n this.column = column;\n }\n}\n","import { ColumnTypeNode } from \"../../ast/query/node/column\";\nimport { ConstraintNode } from \"../../ast/query/node/constraint\";\nimport { AfterConstraintNode } from \"../../ast/query/node/constraint/after\";\nimport { QueryNode } from \"../../ast/query/query\";\nimport {\n getDefaultFkConstraintName,\n getDefaultPrimaryKeyConstraintName,\n getDefaultUniqueConstraintName,\n} from \"../../models/decorators/model_decorators_constants\";\nimport { getColumnValue } from \"../../resources/utils\";\nimport { SqlDataSourceType } from \"../../sql_data_source_types\";\nimport { BaseBuilder } from \"./base_builder\";\nimport {\n CommonConstraintOptions,\n CreateTableContext,\n ForeignKeyOptions,\n PrimaryKeyOptions,\n} from \"./schema_types\";\n\nexport class ConstraintBuilder extends BaseBuilder {\n private readonly columnNode: ColumnTypeNode;\n private readonly tableName?: string;\n private namedConstraints: QueryNode[];\n private context: CreateTableContext;\n private sqlType: SqlDataSourceType;\n\n constructor(\n sqlType: SqlDataSourceType,\n nodes: QueryNode[],\n columnNode: ColumnTypeNode,\n tableName?: string,\n namedConstraints: QueryNode[] = [],\n context: CreateTableContext = \"create_table\",\n ) {\n super(nodes);\n this.columnNode = columnNode;\n this.tableName = tableName;\n this.namedConstraints = namedConstraints;\n this.context = context;\n this.sqlType = sqlType;\n }\n\n // #region primary key\n /**\n * @description Adds a primary key constraint to the column, if no constraint name is provided, it will be generated using the standard pattern: pk_${table}_${column}\n * @param options is the options for the primary key constraint\n */\n primaryKey(options?: PrimaryKeyOptions): this {\n const defaultName = getDefaultPrimaryKeyConstraintName(\n this.tableName as string,\n getColumnValue(this.columnNode.column),\n );\n\n if (this.context === \"alter_table\") {\n this.nodes.push(\n new ConstraintNode(\"primary_key\", {\n columns: [getColumnValue(this.columnNode.column)],\n constraintName: options?.constraintName ?? defaultName,\n }),\n );\n\n return this;\n }\n\n if (this.sqlType === \"sqlite\") {\n return this.handleSqliteAutoIncrement(\n options || { constraintName: defaultName },\n );\n }\n\n this.namedConstraints.push(\n new ConstraintNode(\"primary_key\", {\n columns: [getColumnValue(this.columnNode.column)],\n constraintName: options?.constraintName ?? defaultName,\n }),\n );\n\n return this;\n }\n\n // #endregion\n\n // #region foreign key\n\n /**\n * @description Adds a foreign key constraint to the column, if no constraint name is provided, it will be generated using the standard pattern: fk_${table}_${leftColumn}_${rightColumn}\n * @param references is the table and column name to reference, e.g. \"users.id\"\n * @param options is the options for the foreign key constraint\n */\n foreignKey(\n references: `${string}.${string}`,\n options?: ForeignKeyOptions,\n ): this {\n const [table, cols] = references.split(\".\");\n const refCols = cols.split(\",\");\n const name =\n options?.constraintName ??\n getDefaultFkConstraintName(\n this.tableName ?? \"\",\n getColumnValue(this.columnNode.column),\n refCols[0],\n );\n\n if (this.context === \"alter_table\") {\n this.nodes.push(\n new ConstraintNode(\"foreign_key\", {\n columns: [getColumnValue(this.columnNode.column)],\n references: { table, columns: refCols },\n constraintName: name,\n onDelete: options?.onDelete,\n onUpdate: options?.onUpdate,\n }),\n );\n\n return this;\n }\n\n this.namedConstraints.push(\n new ConstraintNode(\"foreign_key\", {\n columns: [getColumnValue(this.columnNode.column)],\n references: { table, columns: refCols },\n constraintName: name,\n onDelete: options?.onDelete,\n onUpdate: options?.onUpdate,\n }),\n );\n\n return this;\n }\n\n /**\n * @description Sets the column to auto increment\n */\n increment(): this {\n this.columnNode.autoIncrement = true;\n return this;\n }\n\n // #endregion\n\n // #region not nullable\n /**\n * @description Sets the column to not nullable\n */\n notNullable(): this {\n this.nodes.push(\n new ConstraintNode(\"not_null\", {\n columns: [getColumnValue(this.columnNode.column)],\n }),\n );\n return this;\n }\n\n // #endregion\n\n // #region nullable\n /**\n * @description Sets the column to nullable, by default it already is nullable, this method is only used for alter table\n */\n nullable(): this {\n this.nodes.push(\n new ConstraintNode(\"null\", {\n columns: [getColumnValue(this.columnNode.column)],\n }),\n );\n\n return this;\n }\n\n // #endregion\n\n // #region default\n /**\n * @description Sets the default value for the column\n * @param value is the default value for the column\n */\n default(value: string | number | boolean | null): this {\n let defaultVal: string | undefined;\n\n if (value === null) {\n defaultVal = \"NULL\";\n } else if (typeof value === \"boolean\") {\n defaultVal = value ? \"TRUE\" : \"FALSE\";\n } else if (value !== undefined) {\n defaultVal = value.toString();\n }\n\n this.nodes.push(\n new ConstraintNode(\"default\", {\n defaultValue: defaultVal,\n }),\n );\n\n return this;\n }\n\n // #endregion\n\n // #region unique\n /**\n * @description Sets the column to unique\n * @param options is the options for the unique constraint\n */\n unique(options?: CommonConstraintOptions): this {\n if (this.context === \"alter_table\") {\n this.nodes.push(\n new ConstraintNode(\"unique\", {\n columns: [getColumnValue(this.columnNode.column)],\n constraintName:\n options?.constraintName ??\n getDefaultUniqueConstraintName(\n this.tableName ?? \"\",\n getColumnValue(this.columnNode.column),\n ),\n }),\n );\n\n return this;\n }\n\n this.namedConstraints.push(\n new ConstraintNode(\"unique\", {\n columns: [getColumnValue(this.columnNode.column)],\n constraintName:\n options?.constraintName ||\n getDefaultUniqueConstraintName(\n this.tableName ?? \"\",\n getColumnValue(this.columnNode.column),\n ),\n }),\n );\n\n return this;\n }\n // #endregion\n\n // #region after\n /**\n * @description Sets the column to be after another column\n * @param columnName is the name of the column to be after\n * @mysql only\n */\n after(columnName: string): this {\n this.nodes.push(new AfterConstraintNode(columnName));\n return this;\n }\n\n // #endregion\n\n // Sqlite is special, it doesn't support auto increment on primary key table wise, so we need to handle it inline in column definition\n private handleSqliteAutoIncrement(options?: PrimaryKeyOptions): this {\n this.nodes.push(\n new ConstraintNode(\"primary_key\", {\n columns: [getColumnValue(this.columnNode.column)],\n constraintName: options?.constraintName,\n autoIncrement: this.columnNode.autoIncrement,\n columnType: \"integer\",\n } as any),\n );\n return this;\n }\n}\n","import { ColumnTypeNode } from \"../../ast/query/node/column\";\nimport { QueryNode } from \"../../ast/query/query\";\nimport { SqlDataSourceType } from \"../../sql_data_source_types\";\nimport { BaseBuilder } from \"./base_builder\";\nimport { ConstraintBuilder } from \"./constraint_builder\";\n\nexport class CreateTableBuilder extends BaseBuilder {\n private tableName?: string;\n private namedConstraints: QueryNode[];\n private context: \"alter_table\" | \"create_table\" = \"create_table\";\n private sqlType: SqlDataSourceType;\n\n constructor(\n sqlType: SqlDataSourceType,\n nodes: QueryNode[],\n tableName?: string,\n context?: \"alter_table\" | \"create_table\",\n ) {\n super(nodes);\n this.tableName = tableName;\n this.namedConstraints = [];\n this.context = context ?? \"create_table\";\n this.sqlType = sqlType;\n }\n\n private build(node: ColumnTypeNode): ConstraintBuilder {\n this.nodes.push(node);\n return new ConstraintBuilder(\n this.sqlType,\n this.nodes,\n node,\n this.tableName,\n this.namedConstraints,\n this.context,\n );\n }\n\n // #region string\n /**\n * Fixed-length character string\n * @mysql Supported as CHAR(length)\n * @postgres Supported as CHAR(length)\n * @sqlite Supported as TEXT (length ignored)\n */\n char(name: string, length: number = 1): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"char\", { length });\n return this.build(node);\n }\n\n /**\n * Variable-length character string\n * @mysql Supported as VARCHAR(length)\n * @postgres Supported as VARCHAR(length)\n * @sqlite Supported as TEXT (length ignored)\n */\n varchar(name: string, length: number = 255): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"varchar\", { length });\n return this.build(node);\n }\n\n /**\n * @alias varchar\n */\n string(name: string, length: number = 255): ConstraintBuilder {\n return this.varchar(name, length);\n }\n\n /**\n * Text types with various sizes\n * @mysql Supported as TEXT, MEDIUMTEXT, LONGTEXT, TINYTEXT\n * @postgres All mapped to TEXT\n * @sqlite All mapped to TEXT\n */\n text(\n name: string,\n type: \"longtext\" | \"mediumtext\" | \"tinytext\" = \"longtext\",\n ): ConstraintBuilder {\n const node = new ColumnTypeNode(name, type);\n return this.build(node);\n }\n\n /**\n * @mysql LONGTEXT\n * @postgres TEXT\n * @sqlite TEXT\n */\n longtext(name: string): ConstraintBuilder {\n return this.text(name, \"longtext\");\n }\n\n /**\n * @mysql MEDIUMTEXT\n * @postgres TEXT\n * @sqlite TEXT\n */\n mediumtext(name: string): ConstraintBuilder {\n return this.text(name, \"mediumtext\");\n }\n\n /**\n * @mysql TINYTEXT\n * @postgres TEXT\n * @sqlite TEXT\n */\n tinytext(name: string): ConstraintBuilder {\n return this.text(name, \"tinytext\");\n }\n\n /**\n * UUID identifier\n * @mysql VARCHAR(36)\n * @postgres UUID (native type)\n * @sqlite VARCHAR(36)\n */\n uuid(name: string): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"uuid\");\n return this.build(node);\n }\n\n /**\n * ULID (Universally Unique Lexicographically Sortable Identifier)\n * @mysql VARCHAR(26)\n * @postgres VARCHAR(26)\n * @sqlite VARCHAR(26)\n */\n ulid(name: string): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"ulid\");\n return this.build(node);\n }\n\n // #endregion\n\n // #region number\n /**\n * Integer type\n * @mysql INT (with optional auto_increment)\n * @postgres INTEGER (with optional SERIAL for auto_increment)\n * @sqlite INTEGER (with optional autoincrement)\n */\n integer(name: string, length: number = 255): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"integer\", { length });\n return this.build(node);\n }\n\n /**\n * Small integer type\n * @mysql TINYINT\n * @postgres SMALLINT\n * @sqlite INTEGER\n */\n tinyint(name: string, length: number = 255): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"tinyint\", { length });\n return this.build(node);\n }\n\n /**\n * Small integer type\n * @mysql SMALLINT\n * @postgres SMALLINT\n * @sqlite INTEGER\n */\n smallint(name: string, length: number = 255): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"smallint\", { length });\n return this.build(node);\n }\n\n /**\n * Medium integer type\n * @mysql MEDIUMINT\n * @postgres INTEGER\n * @sqlite INTEGER\n */\n mediumint(name: string, length: number = 255): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"mediumint\", { length });\n return this.build(node);\n }\n\n /**\n * Large integer type\n * @mysql BIGINT (with optional auto_increment)\n * @postgres BIGINT (with optional BIGSERIAL for auto_increment)\n * @sqlite INTEGER\n */\n biginteger(name: string, length: number = 255): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"bigint\", { length });\n return this.build(node);\n }\n\n /**\n * @alias biginteger\n */\n bigint(name: string, length: number = 255): ConstraintBuilder {\n return this.biginteger(name, length);\n }\n\n /**\n * Single precision floating point\n * @mysql FLOAT\n * @postgres REAL\n * @sqlite REAL\n */\n float(name: string, precision: number = 10): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"float\", { precision });\n return this.build(node);\n }\n\n /**\n * Double precision floating point\n * @mysql DOUBLE\n * @postgres DOUBLE PRECISION\n * @sqlite REAL\n */\n double(name: string, precision: number = 10): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"double\", { precision });\n return this.build(node);\n }\n\n /**\n * Real number type\n * @mysql DOUBLE (alias)\n * @postgres REAL\n * @sqlite REAL\n */\n real(name: string, precision: number = 10): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"real\", { precision });\n return this.build(node);\n }\n\n /**\n * Exact decimal number\n * @mysql DECIMAL(precision, scale)\n * @postgres NUMERIC(precision, scale)\n * @sqlite NUMERIC(precision, scale)\n */\n decimal(\n name: string,\n precision: number = 10,\n scale: number = 2,\n ): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"decimal\", { precision, scale });\n return this.build(node);\n }\n\n /**\n * Exact numeric type (alias for decimal)\n * @mysql NUMERIC(precision, scale)\n * @postgres NUMERIC(precision, scale)\n * @sqlite NUMERIC(precision, scale)\n */\n numeric(\n name: string,\n precision: number = 10,\n scale: number = 2,\n ): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"numeric\", { precision, scale });\n return this.build(node);\n }\n\n // #endregion\n\n // #region incremental integers\n /**\n * @description Short for integer.increment\n * @mysql INTEGER (with auto_increment)\n * @postgres INTEGER (with SERIAL for auto_increment)\n * @sqlite INTEGER (with autoincrement)\n */\n increment(\n name: string,\n length: number = 255,\n ): Omit<ConstraintBuilder, \"increment\"> {\n return this.integer(name, length).increment();\n }\n\n /**\n * @description Short for biginteger.increment\n * @mysql BIGINT (with auto_increment)\n * @postgres BIGINT (with BIGSERIAL for auto_increment)\n * @sqlite INTEGER\n */\n bigIncrement(\n name: string,\n length: number = 255,\n ): Omit<ConstraintBuilder, \"increment\"> {\n return this.biginteger(name, length).increment();\n }\n\n // #endregion\n\n // #region date\n /**\n * Date type\n * @mysql DATE\n * @postgres DATE\n * @sqlite TEXT\n */\n date(name: string, precision?: number): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"date\", { precision });\n return this.build(node);\n }\n\n /**\n * Time type\n * @mysql TIME(precision)\n * @postgres TIME(precision)\n * @sqlite TEXT\n */\n time(name: string, precision?: number): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"time\", { precision });\n return this.build(node);\n }\n\n /**\n * Year type\n * @mysql YEAR\n * @postgres SMALLINT\n * @sqlite TEXT\n */\n year(name: string): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"year\");\n return this.build(node);\n }\n\n /**\n * Date and time type\n * @mysql DATETIME(precision)\n * @postgres TIMESTAMP(precision) WITHOUT TIME ZONE\n * @sqlite TEXT\n */\n datetime(\n name: string,\n options?: { withTimezone?: boolean; precision?: number },\n ): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"datetime\", {\n withTimezone: options?.withTimezone ?? false,\n precision: options?.precision,\n });\n return this.build(node);\n }\n\n /**\n * Timestamp type\n * @mysql TIMESTAMP(precision)\n * @postgres TIMESTAMP(precision) WITH/WITHOUT TIME ZONE\n * @sqlite TEXT\n */\n timestamp(\n name: string,\n options?: { withTimezone?: boolean; precision?: number },\n ): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"timestamp\", {\n withTimezone: options?.withTimezone ?? false,\n precision: options?.precision,\n });\n return this.build(node);\n }\n\n // #endregion\n\n // #region boolean\n /**\n * Boolean type\n * @mysql BOOLEAN\n * @postgres BOOLEAN\n * @sqlite INTEGER\n */\n boolean(name: string): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"boolean\");\n return this.build(node);\n }\n\n // #endregion\n\n // #region binary\n /**\n * Fixed-length binary data\n * @mysql BINARY(length)\n * @postgres BYTEA\n * @sqlite BLOB\n */\n binary(name: string): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"binary\");\n return this.build(node);\n }\n\n /**\n * Variable-length binary data\n * @mysql VARBINARY(length)\n * @postgres BYTEA\n * @sqlite BLOB\n */\n varbinary(name: string, length: number = 255): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"varbinary\", { length });\n return this.build(node);\n }\n\n /**\n * Binary large object\n * @mysql BLOB\n * @postgres BYTEA\n * @sqlite BLOB\n */\n blob(name: string): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"blob\");\n return this.build(node);\n }\n\n /**\n * Small binary large object\n * @mysql TINYBLOB\n * @postgres BYTEA\n * @sqlite BLOB\n */\n tinyblob(name: string): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"tinyblob\");\n return this.build(node);\n }\n\n /**\n * Medium binary large object\n * @mysql MEDIUMBLOB\n * @postgres BYTEA\n * @sqlite BLOB\n */\n mediumblob(name: string): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"mediumblob\");\n return this.build(node);\n }\n\n /**\n * Large binary large object\n * @mysql LONGBLOB\n * @postgres BYTEA\n * @sqlite BLOB\n */\n longblob(name: string): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"longblob\");\n return this.build(node);\n }\n\n // #endregion\n\n // #region json\n\n /**\n * JSON data type\n * @mysql JSON (MySQL 5.7+)\n * @postgres JSON\n * @sqlite TEXT (not supported, stored as text)\n */\n json(name: string): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"json\");\n return this.build(node);\n }\n\n /**\n * Binary JSON data type\n * @mysql Not supported (falls back to JSON)\n * @postgres JSONB\n * @sqlite TEXT (not supported, stored as text)\n */\n jsonb(name: string): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"jsonb\");\n return this.build(node);\n }\n\n // #endregion\n\n // #region enum\n /**\n * Enumeration type\n * @mysql ENUM(values)\n * @postgres TEXT with CHECK constraint\n * @sqlite TEXT\n */\n enum(name: string, values: readonly string[]): ConstraintBuilder {\n const node = new ColumnTypeNode(name, \"enum\", { enumValues: values });\n return this.build(node);\n }\n\n // #endregion\n\n // #region custom\n /**\n * Custom column type\n * @mysql Custom type as specified\n * @postgres Custom type as specified\n * @sqlite Custom type as specified\n */\n custom(name: string, type: string, length?: number): ConstraintBuilder {\n const node = new ColumnTypeNode(name, type, { length });\n return this.build(node);\n }\n\n /**\n * Raw column type\n * @mysql Custom type as specified\n * @postgres Custom type as specified\n * @sqlite Custom type as specified\n * @example\n * ```ts\n * qb.rawColumn(\"name varchar(255)\");\n * ```\n */\n rawColumn(raw: string): ConstraintBuilder {\n const node = new ColumnTypeNode(raw, \"\", { isRawValue: true });\n return this.build(node);\n }\n\n // #endregion\n\n getNamedConstraints(): QueryNode[] {\n return this.namedConstraints;\n }\n}\n","import { HysteriaError } from \"../../../errors/hysteria_error\";\nimport { ConstraintNode } from \"../../ast/query/node\";\nimport {\n AddColumnNode,\n AddPrimaryKeyNode,\n AlterColumnTypeNode,\n DropColumnNode,\n DropDefaultNode,\n RenameColumnNode,\n SetDefaultNode,\n} from \"../../ast/query/node/alter_table\";\nimport { AddConstraintNode } from \"../../ast/query/node/alter_table/add_constraint\";\nimport { DropConstraintNode } from \"../../ast/query/node/alter_table/drop_constraint\";\nimport { DropNotNullNode } from \"../../ast/query/node/alter_table/drop_not_null\";\nimport { DropPrimaryKeyNode } from \"../../ast/query/node/alter_table/drop_primary_key\";\nimport { SetNotNullNode } from \"../../ast/query/node/alter_table/set_not_null\";\nimport { ColumnTypeNode } from \"../../ast/query/node/column\";\nimport { QueryNode } from \"../../ast/query/query\";\nimport {\n getDefaultFkConstraintName,\n getDefaultUniqueConstraintName,\n} from \"../../models/decorators/model_decorators_constants\";\nimport { getColumnValue } from \"../../resources/utils\";\nimport { SqlDataSourceType } from \"../../sql_data_source_types\";\nimport { BaseBuilder } from \"./base_builder\";\nimport { ConstraintBuilder } from \"./constraint_builder\";\nimport { CreateTableBuilder } from \"./create_table\";\nimport { CommonConstraintOptions, ForeignKeyOptions } from \"./schema_types\";\n\nexport class AlterTableBuilder extends BaseBuilder {\n private table: string;\n private sqlType: SqlDataSourceType;\n\n constructor(table: string, nodes: QueryNode[], sqlType: SqlDataSourceType) {\n super(nodes);\n this.table = table;\n this.sqlType = sqlType;\n }\n\n /**\n * @description Adds a column to the table\n * @param cb is the callback that will be used to build the column\n */\n addColumn(cb: (col: CreateTableBuilder) => ConstraintBuilder): void {\n let tempNodes: QueryNode[] = [];\n const builder = new CreateTableBuilder(this.sqlType, tempNodes, this.table);\n const constraints = cb(builder);\n if (!tempNodes.length) {\n return;\n }\n\n const namedConstraints: QueryNode[] = builder.getNamedConstraints();\n const columnNodes = tempNodes.filter((n) => n.folder === \"column\");\n tempNodes = tempNodes.concat(namedConstraints);\n\n if (columnNodes.length !== 1) {\n throw new Error(\"addColumn callback must define exactly one column\");\n }\n\n const colNode = columnNodes[0] as ColumnTypeNode;\n\n const inlineConstraints = constraints.getNodes().filter((n: QueryNode) => {\n const constraintNode = n as ConstraintNode;\n return (\n constraintNode.constraintType === \"not_null\" ||\n constraintNode.constraintType === \"null\" ||\n constraintNode.constraintType === \"default\"\n );\n });\n\n const addColumnNode = new AddColumnNode(colNode);\n (addColumnNode as any).inlineConstraints = inlineConstraints;\n this.nodes.push(addColumnNode);\n\n const namedConstraintNodes = constraints\n .getNodes()\n .filter((n: QueryNode) => {\n const constraintNode = n as ConstraintNode;\n return (\n constraintNode.constraintType === \"unique\" ||\n constraintNode.constraintType === \"foreign_key\" ||\n constraintNode.constraintType === \"primary_key\"\n );\n });\n\n namedConstraintNodes.forEach((n) => {\n this.nodes.push(new AddConstraintNode(n as ConstraintNode));\n });\n }\n\n /**\n * @description Alters a column, can generate multiple sql statements depending on the constraints\n * @throws HysteriaError if sqlite database\n */\n alterColumn(columnBuilder: (col: CreateTableBuilder) => ConstraintBuilder) {\n if (this.sqlType === \"sqlite\") {\n throw new HysteriaError(\n \"AlterTableBuilder::alterColumn\",\n \"SQLITE_NOT_SUPPORTED\",\n new Error(\"sqlite does not support alter table statements\"),\n );\n }\n\n const tempNodes: QueryNode[] = [];\n const builder = new CreateTableBuilder(\n this.sqlType,\n tempNodes,\n this.table,\n \"alter_table\",\n );\n\n const constraints = columnBuilder(builder);\n if (!tempNodes.length) {\n return;\n }\n\n const columnNodes = tempNodes.filter((n) => n.folder === \"column\");\n if (columnNodes.length !== 1) {\n throw new Error(\"alterColumn callback must define exactly one column\");\n }\n\n const colNode = columnNodes[0] as ColumnTypeNode;\n const columnName = getColumnValue(colNode.column);\n const isNullable = constraints.getNodes().find((n: QueryNode) => {\n const constraintNode = n as ConstraintNode;\n return constraintNode.constraintType === \"null\";\n }) as ConstraintNode;\n\n const isNotNullable = constraints.getNodes().find((n: QueryNode) => {\n const constraintNode = n as ConstraintNode;\n return constraintNode.constraintType === \"not_null\";\n }) as ConstraintNode | undefined;\n\n const nullableNode: ConstraintNode | undefined =\n isNotNullable || isNullable;\n const hasDefault = constraints.getNodes().find((n: QueryNode) => {\n const constraintNode = n as ConstraintNode;\n return constraintNode.constraintType === \"default\";\n }) as ConstraintNode | undefined;\n\n // Always push type change node\n this.nodes.push(\n new AlterColumnTypeNode(getColumnValue(columnName), colNode, {}),\n );\n\n // Nullability\n if (nullableNode) {\n if (nullableNode.constraintType === \"not_null\") {\n this.nodes.push(new SetNotNullNode(getColumnValue(columnName)));\n } else if (nullableNode.constraintType === \"null\") {\n this.nodes.push(new DropNotNullNode(getColumnValue(columnName)));\n }\n }\n\n // Default\n if (hasDefault) {\n if (\n hasDefault.defaultValue === undefined ||\n hasDefault.defaultValue === null\n ) {\n this.nodes.push(new DropDefaultNode(getColumnValue(columnName)));\n } else {\n this.nodes.push(\n new SetDefaultNode(\n getColumnValue(columnName),\n hasDefault.defaultValue,\n ),\n );\n }\n }\n\n // wrap related constraint nodes\n constraints.getNodes().forEach((n: QueryNode) => {\n const constraintNode = n as ConstraintNode;\n switch (constraintNode.constraintType) {\n case \"primary_key\":\n this.addPrimaryKey(getColumnValue(columnName));\n break;\n case \"unique\":\n this.unique(getColumnValue(columnName), {\n constraintName: constraintNode.constraintName,\n });\n break;\n case \"foreign_key\":\n this.addForeignKey(\n getColumnValue(columnName),\n constraintNode.references?.table ?? \"\",\n getColumnValue(constraintNode.references?.columns?.[0] ?? \"\"),\n {\n constraintName: constraintNode.constraintName,\n onDelete: constraintNode.onDelete,\n onUpdate: constraintNode.onUpdate,\n },\n );\n break;\n }\n });\n }\n\n /**\n * @description Drops a column\n */\n dropColumn(name: string) {\n this.nodes.push(new DropColumnNode(name));\n }\n\n /**\n * @description Renames a column\n */\n renameColumn(oldName: string, newName: string) {\n this.nodes.push(new RenameColumnNode(oldName, newName));\n }\n\n /**\n * @description Drops a default value from a column\n * @sqlite not supported and will throw error\n */\n dropDefault(columnName: string) {\n if (this.sqlType === \"sqlite\") {\n throw new HysteriaError(\n \"AlterTableBuilder::alterColumn\",\n \"SQLITE_NOT_SUPPORTED\",\n new Error(\"sqlite does not support alter table statements\"),\n );\n }\n\n this.nodes.push(new DropDefaultNode(columnName));\n }\n\n /**\n * @description Adds a primary key to a column\n * @sqlite not supported and will throw error\n * @private Used internally by alterColumn\n */\n private addPrimaryKey(columnName: string) {\n if (this.sqlType === \"sqlite\") {\n throw new HysteriaError(\n \"AlterTableBuilder::alterColumn\",\n \"SQLITE_NOT_SUPPORTED\",\n new Error(\"sqlite does not support alter table statements\"),\n );\n }\n\n this.nodes.push(new AddPrimaryKeyNode([columnName]));\n }\n\n /**\n * @description Raw non type safe way builder to add a constraint\n * @sqlite not supported and will throw error\n */\n addConstraint(...options: ConstructorParameters<typeof ConstraintNode>) {\n if (this.sqlType === \"sqlite\") {\n throw new HysteriaError(\n \"AlterTableBuilder::alterColumn\",\n \"SQLITE_NOT_SUPPORTED\",\n new Error(\"sqlite does not support alter table statements\"),\n );\n }\n\n this.nodes.push(new AddConstraintNode(new ConstraintNode(...options)));\n }\n\n /**\n * @description Adds a foreign key constraint to a column\n * @sqlite not supported and will throw error\n * @private Used internally by alterColumn\n */\n private addForeignKey(\n columnName: string,\n foreignTable: string,\n foreignColumn: string,\n options?: ForeignKeyOptions,\n ) {\n if (this.sqlType === \"sqlite\") {\n throw new HysteriaError(\n \"AlterTableBuilder::alterColumn\",\n \"SQLITE_NOT_SUPPORTED\",\n new Error(\"sqlite does not support alter table statements\"),\n );\n }\n\n this.nodes.push(\n new AddConstraintNode(\n new ConstraintNode(\"foreign_key\", {\n columns: [columnName],\n references: { table: foreignTable, columns: [foreignColumn] },\n constraintName:\n options?.constraintName ??\n getDefaultFkConstraintName(this.table, columnName, foreignColumn),\n onDelete: options?.onDelete,\n onUpdate: options?.onUpdate,\n }),\n ),\n );\n }\n\n /**\n * @description Adds a unique constraint to a column\n * @description By default generates a constraint name using standard pattern: uq_${table}_${column}\n * @sqlite not supported and will throw error\n * @private Used internally by alterColumn\n */\n private unique(columnName: string, options?: CommonConstraintOptions) {\n if (this.sqlType === \"sqlite\") {\n throw new HysteriaError(\n \"AlterTableBuilder::alterColumn\",\n \"SQLITE_NOT_SUPPORTED\",\n new Error(\"sqlite does not support alter table statements\"),\n );\n }\n\n this.nodes.push(\n new AddConstraintNode(\n new ConstraintNode(\"unique\", {\n columns: [columnName],\n constraintName:\n options?.constraintName ??\n getDefaultUniqueConstraintName(this.table, columnName),\n }),\n ),\n );\n }\n\n /**\n * @description Sets a default value for a column\n * @sqlite not supported and will throw error\n * @private Used internally by alterColumn\n */\n private setDefault(columnName: string, defaultValue: string) {\n if (this.sqlType === \"sqlite\") {\n throw new HysteriaError(\n \"AlterTableBuilder::alterColumn\",\n \"SQLITE_NOT_SUPPORTED\",\n new Error(\"sqlite does not support alter table statements\"),\n );\n }\n\n this.nodes.push(new SetDefaultNode(columnName, defaultValue));\n }\n\n /**\n * @description Drops a foreign key by column name and referenced column, generates constraint name using standard pattern: fk_${table}_${leftColumn}_${rightColumn}\n * @description If a custom constraint name was used to generate the foreign key, use `dropConstraint` instead\n * @param leftColumn is the current model column name (e.g. userId)\n * @param rightColumn is the referenced model column name (e.g. id)\n * @sqlite not supported and will throw error\n */\n dropForeignKey(leftColumn: string, rightColumn: string) {\n if (this.sqlType === \"sqlite\") {\n throw new HysteriaError(\n \"AlterTableBuilder::dropPrimaryKey\",\n \"SQLITE_NOT_SUPPORTED\",\n new Error(\"sqlite does not support alter table statements\"),\n );\n }\n\n const defaultConstraintName = getDefaultFkConstraintName(\n this.table,\n leftColumn,\n rightColumn,\n );\n this.nodes.push(new DropConstraintNode(defaultConstraintName));\n }\n\n /**\n * @description Drops a unique constraint by column name, generates constraint name using standard pattern: uq_${table}_${column}\n * @description If a custom constraint name was used to generate the unique constraint, use `dropConstraint` instead\n * @param columnName is the current model column name (e.g. userId)\n * @sqlite not supported and will throw error\n * @cockroachdb not supported\n */\n dropUnique(columnName: string, options?: CommonConstraintOptions) {\n if (this.sqlType === \"sqlite\") {\n throw new HysteriaError(\n \"AlterTableBuilder::dropUnique\",\n \"SQLITE_NOT_SUPPORTED\",\n new Error(\"sqlite does not support alter table statements\"),\n );\n }\n\n if (this.sqlType === \"cockroachdb\") {\n throw new HysteriaError(\n \"AlterTableBuilder::dropUnique\",\n \"COCKROACHDB_NOT_SUPPORTED\",\n new Error(\"cockroachdb does not support alter table statements\"),\n );\n }\n\n const defaultConstraintName =\n options?.constraintName ??\n getDefaultUniqueConstraintName(this.table, columnName);\n\n this.nodes.push(new DropConstraintNode(defaultConstraintName));\n }\n\n /**\n * @description Drops a constraint by constraint name\n * @sqlite not supported and will throw error\n */\n dropConstraint(constraintName: string) {\n if (this.sqlType === \"sqlite\") {\n throw new HysteriaError(\n \"AlterTableBuilder::dropConstraint\",\n \"SQLITE_NOT_SUPPORTED\",\n new Error(\"sqlite does not support alter table statements\"),\n );\n }\n\n this.nodes.push(new DropConstraintNode(constraintName));\n }\n\n /**\n * @description Drops the primary key constraint\n * @postgres not supported, use `dropConstraint` instead with the pk constraint name\n * @sqlite not supported and will throw error\n * @throws HysteriaError if postgres and table is not provided\n */\n dropPrimaryKey(table?: string) {\n if (this.sqlType === \"sqlite\") {\n throw new HysteriaError(\n \"AlterTableBuilder::dropPrimaryKey\",\n \"SQLITE_NOT_SUPPORTED\",\n new Error(\"sqlite does not support alter table statements\"),\n );\n }\n\n if (this.sqlType === \"postgres\" && !table) {\n throw new HysteriaError(\n \"AlterTableBuilder::dropPrimaryKey\",\n \"POSTGRES_TABLE_REQUIRED\",\n new Error(\"postgres requires the table name\"),\n );\n }\n\n this.nodes.push(new DropPrimaryKeyNode(table));\n }\n}\n","import { Model } from \"../../models/model\";\nimport { RelationEnum } from \"../../models/relations/relation\";\nimport { SqlDataSource } from \"../../sql_data_source\";\nimport {\n DropDependencies,\n ExecutionPhase,\n MigrationOperation,\n OperationType,\n} from \"./schema_diff_types\";\n\nexport class DropOrderResolver {\n private sql: SqlDataSource;\n private models: (typeof Model)[];\n\n constructor(sql: SqlDataSource) {\n this.sql = sql;\n this.models = Object.values(this.sql.registeredModels);\n }\n\n /**\n * Builds dependency graph for objects being dropped\n */\n buildDropDependencies(changes: any): DropDependencies {\n const foreignKeys = new Map<string, string[]>();\n const tables = new Map<string, string[]>();\n const constraints = new Map<string, string[]>();\n\n // Build foreign key dependencies\n for (const relation of changes.relationsToDrop || []) {\n const fkId = `${relation.table}.${relation.relation.name}`;\n const dependencies: string[] = [];\n\n // Foreign keys depend on the referenced table\n if (relation.relation.referencedTable) {\n dependencies.push(`table.${relation.relation.referencedTable}`);\n }\n\n // Foreign keys depend on the columns they reference\n if (relation.relation.referencedColumns) {\n for (const col of relation.relation.referencedColumns) {\n dependencies.push(\n `column.${relation.relation.referencedTable}.${col}`,\n );\n }\n }\n\n foreignKeys.set(fkId, dependencies);\n }\n\n // Build table dependencies\n for (const table of changes.tablesToDrop || []) {\n const tableId = `table.${table.table}`;\n const dependencies: string[] = [];\n\n // Find all foreign keys that reference this table\n for (const model of this.models) {\n const relations = model.getRelations();\n for (const relation of relations) {\n if (relation.type === RelationEnum.belongsTo) {\n const relatedModel = relation.model();\n if (relatedModel.table === table.table) {\n dependencies.push(`fk.${model.table}.${relation.constraintName}`);\n }\n }\n }\n }\n\n tables.set(tableId, dependencies);\n }\n\n // Build constraint dependencies\n for (const column of changes.columnsToDrop || []) {\n const columnId = `column.${column.table}.${column.column}`;\n const dependencies: string[] = [];\n\n // Find constraints that depend on this column\n const model = this.models.find((m) => m.table === column.table);\n if (model) {\n const modelColumn = model\n .getColumns()\n .find((c) => c.databaseName === column.column);\n if (modelColumn) {\n // Primary key constraints\n if (modelColumn.isPrimary) {\n dependencies.push(`pk.${column.table}`);\n }\n\n // Foreign key constraints\n const relations = model.getRelations();\n for (const relation of relations) {\n if (relation.columnName === modelColumn.columnName) {\n dependencies.push(\n `fk.${column.table}.${relation.constraintName}`,\n );\n }\n }\n }\n }\n\n constraints.set(columnId, dependencies);\n }\n\n return { foreignKeys, tables, constraints };\n }\n\n /**\n * Performs reverse topological sort for safe DROP ordering\n */\n topologicalSortReverse<T>(\n items: Map<string, T[]>,\n getDependencies: (item: string) => string[],\n ): string[] {\n const visited = new Set<string>();\n const temp = new Set<string>();\n const result: string[] = [];\n\n const visit = (item: string) => {\n if (temp.has(item)) {\n throw new Error(`Circular dependency detected: ${item}`);\n }\n\n if (visited.has(item)) {\n return;\n }\n\n temp.add(item);\n const dependencies = getDependencies(item);\n for (const dep of dependencies) {\n visit(dep);\n }\n temp.delete(item);\n visited.add(item);\n result.push(item);\n };\n\n for (const item of items.keys()) {\n if (!visited.has(item)) {\n visit(item);\n }\n }\n\n return result;\n }\n\n /**\n * Generates drop operations in the correct order\n */\n generateDropOperations(changes: any): MigrationOperation[] {\n const dropDeps = this.buildDropDependencies(changes);\n const operations: MigrationOperation[] = [];\n\n // Sort foreign keys in reverse dependency order\n const sortedFKs = this.topologicalSortReverse(\n dropDeps.foreignKeys,\n (fk) => dropDeps.foreignKeys.get(fk) || [],\n );\n\n // Add foreign key drop operations\n for (const fkId of sortedFKs) {\n const [table, constraintName] = fkId.split(\".\");\n const relation = changes.relationsToDrop?.find(\n (r: any) => r.table === table && r.relation.name === constraintName,\n );\n\n if (relation) {\n operations.push({\n type: OperationType.DROP_FOREIGN_KEY,\n phase: ExecutionPhase.DESTRUCTIVE_OPERATIONS,\n table,\n constraint: constraintName,\n data: relation,\n dependencies: dropDeps.foreignKeys.get(fkId) || [],\n sqlStatements: this.generateDropForeignKeySql(relation),\n });\n }\n }\n\n // Sort tables in reverse dependency order\n const sortedTables = this.topologicalSortReverse(\n dropDeps.tables,\n (table) => dropDeps.tables.get(table) || [],\n );\n\n // Add constraint drop operations for columns being dropped\n for (const column of changes.columnsToDrop || []) {\n const columnId = `column.${column.table}.${column.column}`;\n const dependencies = dropDeps.constraints.get(columnId) || [];\n\n for (const constraint of dependencies) {\n if (constraint.startsWith(\"pk.\")) {\n operations.push({\n type: OperationType.DROP_CONSTRAINT,\n phase: ExecutionPhase.DESTRUCTIVE_OPERATIONS,\n table: column.table,\n constraint: \"PRIMARY KEY\",\n data: { type: \"primary_key\", table: column.table },\n dependencies: [columnId],\n sqlStatements: this.generateDropPrimaryKeySql(column.table),\n });\n } else if (constraint.startsWith(\"unique.\")) {\n operations.push({\n type: OperationType.DROP_CONSTRAINT,\n phase: ExecutionPhase.DESTRUCTIVE_OPERATIONS,\n table: column.table,\n constraint: `UNIQUE_${column.column}`,\n data: {\n type: \"unique\",\n table: column.table,\n column: column.column,\n },\n dependencies: [columnId],\n sqlStatements: this.generateDropUniqueConstraintSql(\n column.table,\n column.column,\n ),\n });\n }\n }\n }\n\n // Add column drop operations\n for (const column of changes.columnsToDrop || []) {\n operations.push({\n type: OperationType.DROP_COLUMN,\n phase: ExecutionPhase.DESTRUCTIVE_OPERATIONS,\n table: column.table,\n column: column.column,\n data: column,\n dependencies: [],\n sqlStatements: this.generateDropColumnSql(column),\n });\n }\n\n // Add table drop operations\n for (const tableId of sortedTables) {\n const tableName = tableId.replace(\"table.\", \"\");\n const table = changes.tablesToDrop?.find(\n (t: any) => t.table === tableName,\n );\n\n if (table) {\n operations.push({\n type: OperationType.DROP_TABLE,\n phase: ExecutionPhase.DESTRUCTIVE_OPERATIONS,\n table: tableName,\n data: table,\n dependencies: dropDeps.tables.get(tableId) || [],\n sqlStatements: this.generateDropTableSql(table),\n });\n }\n }\n\n return operations;\n }\n\n /**\n * Analyzes impact of column/table drops on constraints\n */\n analyzeConstraintImpact(changes: any): Map<string, string[]> {\n const impact = new Map<string, string[]>();\n\n for (const column of changes.columnsToDrop || []) {\n const affectedConstraints: string[] = [];\n const model = this.models.find((m) => m.table === column.table);\n\n if (model) {\n const modelColumn = model\n .getColumns()\n .find((c) => c.databaseName === column.column);\n if (modelColumn) {\n // Check primary key constraints\n if (modelColumn.isPrimary) {\n affectedConstraints.push(`PRIMARY KEY on ${column.table}`);\n }\n\n // Check foreign key constraints\n const relations = model.getRelations();\n for (const relation of relations) {\n if (relation.columnName === modelColumn.columnName) {\n affectedConstraints.push(\n `FOREIGN KEY ${relation.constraintName} on ${column.table}`,\n );\n }\n }\n }\n }\n\n impact.set(`${column.table}.${column.column}`, affectedConstraints);\n }\n\n return impact;\n }\n\n /**\n * Detects operations requiring DROP+CREATE sequences\n */\n detectMixedOperations(changes: any): any[] {\n const mixedOps: any[] = [];\n\n // Column modifications that affect constraints\n for (const column of changes.columnsToModify || []) {\n const model = this.models.find((m) => m.table === column.table);\n if (model) {\n const modelColumn = model\n .getColumns()\n .find((c) => c.databaseName === column.dbColumns.name);\n if (modelColumn) {\n const hasConstraintChanges = this.hasConstraintChanges(\n column.dbColumns,\n column.modelColumn,\n );\n if (hasConstraintChanges) {\n mixedOps.push({\n type: \"column_modification_with_constraints\",\n table: column.table,\n column: column.dbColumns.name,\n description: `Column ${column.dbColumns.name} modification requires constraint recreation`,\n });\n }\n }\n }\n }\n\n // Primary key modifications\n for (const pk of changes.primaryKeysToModify || []) {\n mixedOps.push({\n type: \"primary_key_modification\",\n table: pk.table,\n description: `Primary key modification on ${pk.table} requires FK recreation`,\n });\n }\n\n return mixedOps;\n }\n\n private hasConstraintChanges(dbColumn: any, modelColumn: any): boolean {\n // Check if nullable constraint changed\n if (dbColumn.isNullable !== !modelColumn.constraints?.nullable) {\n return true;\n }\n\n // Check if unique constraint changed\n if (dbColumn.isUnique !== !!modelColumn.constraints?.unique) {\n return true;\n }\n\n // Check if default value changed\n if (dbColumn.defaultValue !== modelColumn.constraints?.default) {\n return true;\n }\n\n return false;\n }\n\n private generateDropForeignKeySql(relation: any): string[] {\n if (this.sql.getDbType() === \"sqlite\") {\n return [];\n }\n if (!relation.relation.name) {\n return [];\n }\n return this.sql.alterTable(relation.table, (t) => {\n t.dropConstraint(relation.relation.name);\n });\n }\n\n private generateDropPrimaryKeySql(table: string): string[] {\n if (this.sql.getDbType() === \"sqlite\") {\n return [];\n }\n return this.sql.alterTable(table, (t) => {\n t.dropPrimaryKey();\n });\n }\n\n private generateDropUniqueConstraintSql(\n table: string,\n column: string,\n ): string[] {\n if (this.sql.getDbType() === \"sqlite\") {\n return [];\n }\n return this.sql.alterTable(table, (t) => {\n t.dropConstraint(`UNIQUE_${column}`);\n });\n }\n\n private generateDropColumnSql(column: any): string[] {\n return this.sql.alterTable(column.table, (t) => {\n t.dropColumn(column.column);\n });\n }\n\n private generateDropTableSql(table: any): string[] {\n return [`DROP TABLE ${table.table}`];\n }\n}\n","import { format } from \"sql-formatter\";\nimport { convertCase } from \"../../../utils/case_utils\";\nimport {\n getDefaultFkConstraintName,\n getDefaultPrimaryKeyConstraintName,\n} from \"../../models/decorators/model_decorators_constants\";\nimport {\n ColumnType,\n LazyRelationType,\n} from \"../../models/decorators/model_decorators_types\";\nimport { Model } from \"../../models/model\";\nimport { RelationEnum } from \"../../models/relations/relation\";\nimport { getColumnValue } from \"../../resources/utils\";\nimport { SqlDataSource } from \"../../sql_data_source\";\nimport { CreateTableBuilder } from \"../schema/create_table\";\nimport Schema from \"../schema/schema\";\nimport { OnUpdateOrDelete } from \"../schema/schema_types\";\nimport { DropOrderResolver } from \"./drop_order_resolver\";\nimport {\n ExecutionPhase,\n GenerateTableDiffReturnType,\n MigrationOperation,\n OperationType,\n} from \"./schema_diff_types\";\n\nexport class MigrationOperationGenerator {\n private sql: SqlDataSource;\n private models: (typeof Model)[];\n private dropResolver: DropOrderResolver;\n\n constructor(sql: SqlDataSource) {\n this.sql = sql;\n this.models = Object.values(this.sql.registeredModels);\n this.dropResolver = new DropOrderResolver(sql);\n }\n\n /**\n * Generates migration operations organized by execution phase\n */\n generateOperations(\n changes: GenerateTableDiffReturnType,\n ): MigrationOperation[] {\n const operations: MigrationOperation[] = [];\n\n // Phase 1: Structure Creation (No Dependencies)\n operations.push(...this.generateStructureCreationOperations(changes));\n\n // Phase 2: Constraint Creation (Simple Order)\n operations.push(...this.generateConstraintCreationOperations(changes));\n\n // Phase 3: Destructive Operations (Smart Dependency Resolution)\n operations.push(...this.generateDestructiveOperations(changes));\n\n // Handle column modifications (mixed operations)\n operations.push(...this.generateColumnModificationOperations(changes));\n\n const fkKey = (op: MigrationOperation) =>\n op.table && op.constraint ? `${op.table}::${op.constraint}` : undefined;\n const addSet = new Set(\n operations\n .filter((o) => o.type === OperationType.ADD_FOREIGN_KEY)\n .map((o) => fkKey(o))\n .filter(Boolean) as string[],\n );\n const dropSet = new Set(\n operations\n .filter((o) => o.type === OperationType.DROP_FOREIGN_KEY)\n .map((o) => fkKey(o))\n .filter(Boolean) as string[],\n );\n const churn = new Set<string>([...addSet].filter((k) => dropSet.has(k)));\n const filtered = operations.filter((o) => {\n const key = fkKey(o);\n if (!key) {\n return true;\n }\n if (\n churn.has(key) &&\n (o.type === OperationType.ADD_FOREIGN_KEY ||\n o.type === OperationType.DROP_FOREIGN_KEY)\n ) {\n return false;\n }\n return true;\n });\n\n return filtered;\n }\n\n /**\n * Phase 1: Structure Creation Operations\n */\n private generateStructureCreationOperations(\n changes: GenerateTableDiffReturnType,\n ): MigrationOperation[] {\n const operations: MigrationOperation[] = [];\n\n // 1. Create tables (no FK constraints)\n for (const table of changes.tablesToAdd) {\n const createTableSql = this.sql.createTable(table.table, (builder) => {\n for (const column of table.columns) {\n if (Array.isArray(column.type)) {\n builder.enum(column.databaseName, column.type);\n continue;\n }\n\n column.type &&\n this.executeBuilderMethod(\n table.table,\n builder,\n column,\n [\n column.databaseName,\n column.length,\n column.precision && !column.withTimezone\n ? column.precision\n : undefined,\n column.scale,\n column.withTimezone\n ? {\n withTimezone: column.withTimezone,\n precision: column.precision,\n }\n : undefined,\n ].filter(Boolean),\n true,\n );\n }\n });\n\n operations.push({\n type: OperationType.CREATE_TABLE,\n phase: ExecutionPhase.STRUCTURE_CREATION,\n table: table.table,\n data: table,\n dependencies: [],\n sqlStatements: [createTableSql],\n });\n }\n\n // 2. Add columns\n for (const column of changes.columnsToAdd) {\n const addColumnSql = this.generateAddColumnViaAlter(column);\n operations.push({\n type: OperationType.ADD_COLUMN,\n phase: ExecutionPhase.STRUCTURE_CREATION,\n table: column.table,\n column: column.column.databaseName,\n data: column,\n dependencies: [`table.${column.table}`],\n sqlStatements: addColumnSql,\n });\n }\n\n return operations;\n }\n\n /**\n * Phase 2: Constraint Creation Operations\n */\n private generateConstraintCreationOperations(\n changes: GenerateTableDiffReturnType,\n ): MigrationOperation[] {\n const operations: MigrationOperation[] = [];\n\n // 0. Drop UNIQUE constraints first (e.g., rename cases)\n for (const uq of changes.uniquesToDrop || []) {\n const dropSql = this.sql.alterTable(uq.table, (t) => {\n t.dropConstraint(uq.name);\n });\n operations.push({\n type: OperationType.DROP_CONSTRAINT,\n phase: ExecutionPhase.CONSTRAINT_CREATION,\n table: uq.table,\n constraint: uq.name,\n data: uq,\n dependencies: [`table.${uq.table}`],\n sqlStatements: dropSql,\n });\n }\n\n // 1. Drop indexes first (rename cases), but skip ones already handled as unique constraints\n const uniqueDrops = new Set(\n (changes.uniquesToDrop || []).map((u) => u.name),\n );\n for (const idx of changes.indexesToDrop) {\n if (uniqueDrops.has(idx.index)) {\n continue;\n }\n\n const schema = new Schema(this.sql.getDbType());\n schema.dropIndex(idx.index, idx.table);\n const dropIndexSql = schema.queryStatements[0];\n operations.push({\n type: OperationType.DROP_INDEX,\n phase: ExecutionPhase.CONSTRAINT_CREATION,\n table: idx.table,\n index: idx.index,\n data: idx,\n dependencies: [`table.${idx.table}`],\n sqlStatements: [dropIndexSql],\n });\n }\n\n // 1. Add PRIMARY KEY constraints\n for (const primaryKey of changes.primaryKeysToAdd) {\n const model = this.models.find((m) => m.table === primaryKey.table);\n const modelPrimaryKeyColumn = model\n ?.getColumns()\n .find((col) => col.columnName === primaryKey.columns[0]);\n const constraintName =\n modelPrimaryKeyColumn?.primaryKeyConstraintName ||\n getDefaultPrimaryKeyConstraintName(\n primaryKey.table,\n primaryKey.columns[0],\n );\n\n const addPrimaryKeySql = this.sql.alterTable(primaryKey.table, (t) => {\n const pkConstraintName =\n constraintName ||\n getDefaultPrimaryKeyConstraintName(\n primaryKey.table,\n primaryKey.columns[0],\n );\n t.addConstraint(\"primary_key\", {\n columns: [primaryKey.columns[0]],\n constraintName: pkConstraintName,\n });\n });\n\n operations.push({\n type: OperationType.ADD_PRIMARY_KEY,\n phase: ExecutionPhase.CONSTRAINT_CREATION,\n table: primaryKey.table,\n constraint: constraintName,\n data: primaryKey,\n dependencies: [`table.${primaryKey.table}`],\n sqlStatements: addPrimaryKeySql,\n });\n }\n\n // 3. Add FOREIGN KEY constraints\n for (const relation of changes.relationsToAdd) {\n if (relation.relation.type === RelationEnum.manyToMany) {\n continue;\n }\n\n const addForeignKeySql = this.generateAddRelationViaAlter(relation);\n const effectiveConstraintName = this.computeFkConstraintName(relation);\n\n operations.push({\n type: OperationType.ADD_FOREIGN_KEY,\n phase: ExecutionPhase.CONSTRAINT_CREATION,\n table: relation.table,\n constraint: effectiveConstraintName,\n data: relation,\n dependencies: this.getForeignKeyDependencies(relation) as any,\n sqlStatements: addForeignKeySql,\n });\n }\n\n // 4. Add UNIQUE constraints (after drops)\n for (const uq of changes.uniquesToAdd || []) {\n const model = this.models.find((m) => m.table === uq.table);\n const columns = (uq.columns || []).map((col) => {\n const mc = model?.getColumns().find((c) => c.columnName === col);\n return mc?.databaseName || col;\n });\n const addUqSql = this.sql.alterTable(uq.table, (t) => {\n t.addConstraint(\"unique\", {\n columns,\n constraintName: uq.name || \"mandatory\",\n });\n });\n operations.push({\n type: OperationType.ADD_UNIQUE_CONSTRAINT,\n phase: ExecutionPhase.CONSTRAINT_CREATION,\n table: uq.table,\n constraint: uq.name || \"mandatory\",\n data: uq,\n dependencies: [`table.${uq.table}`],\n sqlStatements: addUqSql,\n });\n }\n\n // 5. Create indexes (after drops)\n for (const index of changes.indexesToAdd) {\n const createIndexSql = this.generateCreateIndexSql(index);\n operations.push({\n type: OperationType.CREATE_INDEX,\n phase: ExecutionPhase.CONSTRAINT_CREATION,\n table: index.table,\n index: index.index,\n data: index,\n dependencies: [`table.${index.table}`],\n sqlStatements: [createIndexSql],\n });\n }\n\n return operations;\n }\n\n private computeFkConstraintName(relationData: {\n table: string;\n relation: LazyRelationType;\n }): string | undefined {\n // If explicitly provided, use it\n const explicit = getColumnValue(relationData.relation.constraintName);\n if (explicit) {\n return explicit;\n }\n\n // Determine referenced table\n let referencesTable = relationData.table;\n if (relationData.relation.type === RelationEnum.belongsTo) {\n referencesTable = relationData.relation.model().table;\n } else if (\n relationData.relation.type === RelationEnum.manyToMany &&\n relationData.relation.manyToManyOptions\n ) {\n referencesTable = getColumnValue(\n relationData.relation.manyToManyOptions.throughModel,\n );\n }\n\n // Determine source column database name\n const model = this.models.find((m) => m.table === relationData.table);\n const modelColumns = model?.getColumns() || [];\n let sourceColumnName = relationData.relation.columnName;\n if (relationData.relation.type === RelationEnum.belongsTo) {\n const fkModelCol = modelColumns.find(\n (c) => c.columnName === relationData.relation.foreignKey,\n );\n sourceColumnName =\n fkModelCol?.databaseName ||\n (relationData.relation.foreignKey as string);\n } else {\n const mc = modelColumns.find((c) => c.columnName === sourceColumnName);\n sourceColumnName = mc?.databaseName || sourceColumnName;\n }\n\n return getDefaultFkConstraintName(\n relationData.table,\n sourceColumnName,\n referencesTable,\n );\n }\n\n /**\n * Phase 3: Destructive Operations (Smart Dependency Resolution)\n */\n private generateDestructiveOperations(\n changes: GenerateTableDiffReturnType,\n ): MigrationOperation[] {\n return this.dropResolver.generateDropOperations(changes);\n }\n\n /**\n * Handle column modifications (mixed operations)\n */\n private generateColumnModificationOperations(\n changes: GenerateTableDiffReturnType,\n ): MigrationOperation[] {\n const operations: MigrationOperation[] = [];\n\n // Handle column modifications\n for (const column of changes.columnsToModify || []) {\n const modifySql = this.generateModifyColumnViaAlter(column);\n operations.push({\n type: OperationType.MODIFY_COLUMN,\n phase: ExecutionPhase.DESTRUCTIVE_OPERATIONS,\n table: column.table,\n column: column.dbColumns.name,\n data: column,\n dependencies: [],\n sqlStatements: modifySql,\n });\n }\n\n return operations;\n }\n\n /**\n * Gets dependencies for foreign key operations\n */\n private getForeignKeyDependencies(relation: {\n table: string;\n relation: LazyRelationType;\n }): string[] {\n const dependencies: string[] = [];\n\n if (relation.relation.type === RelationEnum.belongsTo) {\n const relatedModel = relation.relation.model();\n dependencies.push(`table.${relatedModel.table}`);\n\n // Add dependency on the referenced column\n const pkName = relatedModel.primaryKey || \"id\";\n const pkColumn = relatedModel\n .getColumns()\n .find((c: ColumnType) => c.columnName === pkName);\n if (pkColumn) {\n dependencies.push(\n `column.${relatedModel.table}.${pkColumn.databaseName}`,\n );\n }\n } else if (\n relation.relation.type === RelationEnum.manyToMany &&\n relation.relation.manyToManyOptions\n ) {\n const throughTable = getColumnValue(\n relation.relation.manyToManyOptions.throughModel,\n );\n dependencies.push(`table.${throughTable}`);\n }\n\n // Add dependency on the source table and column\n dependencies.push(`table.${relation.table}`);\n\n const model = this.models.find((m) => m.table === relation.table);\n if (model) {\n const sourceColumn = model\n .getColumns()\n .find(\n (c: ColumnType) =>\n c.columnName === relation.relation.columnName ||\n c.databaseName === relation.relation.columnName,\n );\n if (sourceColumn) {\n dependencies.push(\n `column.${relation.table}.${sourceColumn.databaseName}`,\n );\n }\n }\n\n return dependencies;\n }\n\n /**\n * Executes builder method for column creation\n */\n private executeBuilderMethod(\n table: string,\n builder: CreateTableBuilder,\n column: ColumnType,\n args: unknown[],\n applyConstraints: boolean = true,\n ) {\n const b = (builder[column.type as keyof typeof builder] as any)(...args);\n if (!applyConstraints) {\n return b;\n }\n\n if (column.isPrimary) {\n b.primaryKey({\n constraintName:\n column.primaryKeyConstraintName ||\n getDefaultPrimaryKeyConstraintName(table, column.columnName),\n });\n }\n\n if (column.constraints?.default !== undefined) {\n b.default(column.constraints.default);\n }\n\n if (column.constraints?.nullable === false) {\n b.notNullable();\n } else if (column.constraints?.nullable === true) {\n b.nullable();\n }\n\n return b;\n }\n\n /**\n * Generates ADD COLUMN SQL via ALTER TABLE\n */\n private generateAddColumnViaAlter(columnData: {\n table: string;\n column: ColumnType;\n }): string[] {\n const args = [\n columnData.column.databaseName,\n columnData.column.length,\n columnData.column.precision && !columnData.column.withTimezone\n ? columnData.column.precision\n : undefined,\n columnData.column.scale,\n columnData.column.withTimezone\n ? {\n withTimezone: columnData.column.withTimezone,\n precision: columnData.column.precision,\n }\n : undefined,\n ].filter(Boolean);\n\n return this.sql.alterTable(columnData.table, (t) => {\n t.addColumn((b) => {\n // First create the column without constraints\n const columnBuilder = this.executeBuilderMethod(\n columnData.table,\n b,\n columnData.column,\n args,\n false,\n );\n\n // Then apply constraints separately\n if (columnData.column.constraints?.default !== undefined) {\n columnBuilder.default(columnData.column.constraints.default);\n }\n\n if (columnData.column.constraints?.nullable === false) {\n columnBuilder.notNullable();\n } else if (columnData.column.constraints?.nullable === true) {\n columnBuilder.nullable();\n }\n\n return columnBuilder;\n });\n });\n }\n\n /**\n * Generates MODIFY COLUMN SQL via ALTER TABLE\n */\n private generateModifyColumnViaAlter(columnData: {\n table: string;\n dbColumns: any;\n modelColumn: ColumnType;\n }): string[] {\n if (this.sql.getDbType() === \"sqlite\") {\n return [];\n }\n\n // Generate type changes with constraints\n const args = [\n columnData.modelColumn.databaseName,\n columnData.modelColumn.length,\n columnData.modelColumn.precision && !columnData.modelColumn.withTimezone\n ? columnData.modelColumn.precision\n : undefined,\n columnData.modelColumn.scale,\n columnData.modelColumn.withTimezone\n ? {\n withTimezone: columnData.modelColumn.withTimezone,\n precision: columnData.modelColumn.precision,\n }\n : undefined,\n ].filter(Boolean);\n\n const alterColumnSql = this.sql.alterTable(columnData.table, (t) => {\n t.alterColumn((b) => {\n const columnBuilder = this.executeBuilderMethod(\n columnData.table,\n b,\n columnData.modelColumn,\n args,\n false,\n );\n\n // Add constraints based on the model column\n if (columnData.modelColumn.constraints?.default !== undefined) {\n columnBuilder.default(columnData.modelColumn.constraints.default);\n }\n\n if (columnData.modelColumn.constraints?.nullable === false) {\n columnBuilder.notNullable();\n } else if (columnData.modelColumn.constraints?.nullable === true) {\n columnBuilder.nullable();\n }\n\n return columnBuilder;\n });\n });\n\n return alterColumnSql;\n }\n\n /**\n * Generates CREATE INDEX SQL using schema builder\n */\n private generateCreateIndexSql(indexData: {\n table: string;\n index: string;\n }): string {\n const model = this.models.find((m) => m.table === indexData.table);\n const indexDef = model\n ?.getIndexes()\n .find((idx) => idx.name === indexData.index);\n const cols = (indexDef?.columns || []).map((col) => {\n const mc = model?.getColumns().find((c) => c.columnName === col);\n return mc?.databaseName || col;\n });\n\n const schema = new Schema(this.sql.getDbType());\n schema.createIndex(indexData.table, cols, {\n constraintName: indexData.index,\n });\n\n // Return the generated SQL\n return schema.queryStatements[0] || \"\";\n }\n\n /**\n * Generates ADD FOREIGN KEY SQL via ALTER TABLE\n */\n private generateAddRelationViaAlter(relationData: {\n table: string;\n relation: LazyRelationType;\n }): string[] {\n let referencesTable = relationData.table;\n let referencesColumn = relationData.relation.foreignKey;\n\n if (relationData.relation.type === RelationEnum.belongsTo) {\n referencesTable = relationData.relation.model().table;\n referencesColumn = relationData.relation.model().primaryKey || \"id\";\n } else if (\n relationData.relation.type === RelationEnum.manyToMany &&\n relationData.relation.manyToManyOptions\n ) {\n referencesTable = getColumnValue(\n relationData.relation.manyToManyOptions.throughModel,\n );\n referencesColumn = getColumnValue(\n relationData.relation.manyToManyOptions.rightForeignKey,\n );\n\n if (!referencesColumn || referencesColumn === \"undefined\") {\n referencesColumn = relationData.relation.model().primaryKey || \"id\";\n }\n }\n\n const constraintName =\n typeof relationData.relation.constraintName === \"string\"\n ? (relationData.relation.constraintName as string)\n : undefined;\n let foreignKeyColumn = getColumnValue(referencesColumn);\n\n if (relationData.relation.type === RelationEnum.belongsTo) {\n const relatedModel = relationData.relation.model();\n const primaryKeyName = relatedModel.primaryKey;\n const relatedModelColumns = relatedModel.getColumns();\n const relatedModelPKColumn = relatedModelColumns.find(\n (col) => col.columnName === primaryKeyName,\n );\n\n if (relatedModelPKColumn) {\n foreignKeyColumn = relatedModelPKColumn.databaseName;\n } else {\n const databaseCaseConvention =\n relatedModel?.databaseCaseConvention || \"preserve\";\n foreignKeyColumn = convertCase(primaryKeyName, databaseCaseConvention);\n }\n } else if (\n relationData.relation.type === RelationEnum.manyToMany &&\n relationData.relation.manyToManyOptions\n ) {\n const relatedModel = relationData.relation.model();\n\n if (typeof foreignKeyColumn === \"string\" && foreignKeyColumn) {\n const relatedModelColumns = relatedModel.getColumns();\n const specifiedColumn = relatedModelColumns.find(\n (col) => col.columnName === foreignKeyColumn,\n );\n\n if (specifiedColumn) {\n foreignKeyColumn = specifiedColumn.databaseName;\n } else {\n const primaryKeyName = relatedModel.primaryKey || \"id\";\n const relatedModelPKColumn = relatedModelColumns.find(\n (col) => col.columnName === primaryKeyName,\n );\n\n if (relatedModelPKColumn) {\n foreignKeyColumn = relatedModelPKColumn.databaseName;\n } else {\n const databaseCaseConvention =\n relatedModel?.databaseCaseConvention || \"preserve\";\n foreignKeyColumn = convertCase(\n foreignKeyColumn || primaryKeyName,\n databaseCaseConvention,\n );\n }\n }\n } else {\n const primaryKeyName = relatedModel.primaryKey || \"id\";\n const relatedModelColumns = relatedModel.getColumns();\n const relatedModelPKColumn = relatedModelColumns.find(\n (col) => col.columnName === primaryKeyName,\n );\n\n if (relatedModelPKColumn) {\n foreignKeyColumn = relatedModelPKColumn.databaseName;\n } else {\n const databaseCaseConvention =\n relatedModel?.databaseCaseConvention || \"preserve\";\n foreignKeyColumn = convertCase(\n primaryKeyName,\n databaseCaseConvention,\n );\n }\n }\n }\n\n const model = this.models.find((m) => m.table === relationData.table);\n const modelColumns = model?.getColumns() || [];\n\n let sourceColumnName = relationData.relation.columnName;\n\n const modelColumn = modelColumns.find(\n (col) => col.columnName === sourceColumnName,\n );\n\n if (modelColumn) {\n sourceColumnName = modelColumn.databaseName;\n } else {\n const databaseCaseConvention =\n model?.databaseCaseConvention || \"preserve\";\n sourceColumnName = convertCase(sourceColumnName, databaseCaseConvention);\n }\n\n if (relationData.relation.type === RelationEnum.belongsTo) {\n const foreignKeyColumn = modelColumns.find(\n (col) => col.columnName === relationData.relation.foreignKey,\n );\n\n if (foreignKeyColumn) {\n sourceColumnName = foreignKeyColumn.databaseName;\n } else {\n const databaseCaseConvention =\n model?.databaseCaseConvention || \"preserve\";\n sourceColumnName = convertCase(\n relationData.relation.foreignKey,\n databaseCaseConvention,\n );\n }\n } else if (\n relationData.relation.type === RelationEnum.manyToMany &&\n relationData.relation.manyToManyOptions\n ) {\n const leftKey = relationData.relation.manyToManyOptions.leftForeignKey;\n const leftKeyStr = getColumnValue(leftKey);\n\n const leftKeyColumn = modelColumns.find(\n (col) => col.columnName === leftKeyStr,\n );\n\n if (leftKeyColumn) {\n sourceColumnName = leftKeyColumn.databaseName;\n } else {\n const databaseCaseConvention =\n model?.databaseCaseConvention || \"preserve\";\n sourceColumnName = convertCase(leftKeyStr, databaseCaseConvention);\n }\n }\n\n const onDelete = relationData.relation.onDelete?.toLowerCase() as\n | OnUpdateOrDelete\n | undefined;\n const onUpdate = relationData.relation.onUpdate?.toLowerCase() as\n | OnUpdateOrDelete\n | undefined;\n\n return this.sql.alterTable(relationData.table, (t) => {\n const fkConstraintName =\n constraintName ||\n getDefaultFkConstraintName(\n relationData.table,\n sourceColumnName,\n referencesTable,\n );\n\n t.addConstraint(\"foreign_key\", {\n columns: [sourceColumnName],\n references: {\n table: referencesTable,\n columns: [foreignKeyColumn],\n },\n constraintName: fkConstraintName,\n onDelete,\n onUpdate,\n });\n });\n }\n\n /**\n * Formats SQL statements consistently\n */\n formatSqlStatements(operations: MigrationOperation[]): MigrationOperation[] {\n return operations.map((operation) => ({\n ...operation,\n sqlStatements: operation.sqlStatements.map((statement) =>\n format(statement, {\n ...this.sql.inputDetails.queryFormatOptions,\n })\n .replace(/\\n/g, \" \")\n .replace(/\\s+/g, \" \"),\n ),\n }));\n }\n}\n","export type SupportedSqlDialect =\n | \"postgres\"\n | \"cockroachdb\"\n | \"mysql\"\n | \"mariadb\"\n | \"sqlite\";\n\nfunction compactWhitespace(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction stripLengthSuffix(value: string): string {\n return value.replace(/\\s*\\([^)]*\\)/g, \"\").trim();\n}\n\nexport function normalizeColumnType(\n dialect: SupportedSqlDialect,\n rawType: string,\n): string {\n const lowered = compactWhitespace(rawType.toLowerCase());\n const base = stripLengthSuffix(lowered);\n\n switch (dialect) {\n case \"sqlite\": {\n const rules: Array<{ test: (s: string) => boolean; normalized: string }> =\n [\n { test: (s) => s.includes(\"int\"), normalized: \"integer\" },\n { test: (s) => s.includes(\"char\"), normalized: \"varchar\" },\n { test: (s) => s.includes(\"text\"), normalized: \"text\" },\n { test: (s) => s.includes(\"clob\"), normalized: \"text\" },\n { test: (s) => s.includes(\"date\"), normalized: \"text\" },\n { test: (s) => s.includes(\"time\"), normalized: \"text\" },\n { test: (s) => s.includes(\"timestamp\"), normalized: \"text\" },\n { test: (s) => s.includes(\"datetime\"), normalized: \"text\" },\n { test: (s) => s.includes(\"blob\"), normalized: \"blob\" },\n {\n test: (s) =>\n s.includes(\"real\") || s.includes(\"floa\") || s.includes(\"doub\"),\n normalized: \"real\",\n },\n { test: (s) => s.includes(\"numeric\"), normalized: \"numeric\" },\n { test: (s) => s.includes(\"bool\"), normalized: \"integer\" },\n { test: (s) => s.includes(\"uuid\"), normalized: \"varchar\" },\n { test: (s) => s.includes(\"ulid\"), normalized: \"varchar\" },\n { test: (s) => s.includes(\"jsonb\"), normalized: \"text\" },\n { test: (s) => s.includes(\"json\"), normalized: \"text\" },\n ];\n\n for (const rule of rules) {\n if (rule.test(base)) {\n return rule.normalized;\n }\n }\n\n return base;\n }\n\n case \"mysql\":\n case \"mariadb\": {\n if (base.endsWith(\"text\") || base === \"text\") return \"text\";\n switch (base) {\n case \"int\":\n case \"integer\":\n return \"integer\";\n case \"tinyint\":\n return \"tinyint\";\n case \"smallint\":\n return \"smallint\";\n case \"mediumint\":\n return \"mediumint\";\n case \"bigint\":\n return \"bigint\";\n case \"float\":\n return \"float\";\n case \"double\":\n case \"double precision\":\n return \"double\";\n case \"real\":\n return \"double\";\n case \"decimal\":\n case \"numeric\":\n return \"numeric\";\n case \"varchar\":\n case \"character varying\":\n return \"varchar\";\n case \"char\":\n case \"character\":\n return \"char\";\n case \"uuid\":\n return \"varchar\";\n case \"ulid\":\n return \"varchar\";\n case \"date\":\n return \"date\";\n case \"datetime\":\n return \"datetime\";\n case \"timestamp\":\n return \"timestamp\";\n case \"time\":\n return \"time\";\n case \"year\":\n return \"year\";\n case \"jsonb\":\n return \"json\";\n case \"json\":\n return \"json\";\n case \"enum\":\n return \"enum\";\n case \"binary\":\n return \"binary\";\n case \"varbinary\":\n return \"varbinary\";\n case \"tinyblob\":\n return \"tinyblob\";\n case \"mediumblob\":\n return \"mediumblob\";\n case \"longblob\":\n return \"longblob\";\n case \"blob\":\n return \"blob\";\n case \"boolean\":\n case \"bool\":\n return \"boolean\";\n default:\n return base;\n }\n }\n\n case \"postgres\":\n case \"cockroachdb\": {\n if (base.endsWith(\"text\") || base === \"text\") return \"text\";\n if (base.startsWith(\"timestamp\")) return \"timestamp\";\n if (base.startsWith(\"time\")) return \"time\";\n if (base === \"datetime\") return \"timestamp\";\n switch (base) {\n case \"character varying\":\n return \"varchar\";\n case \"character\":\n return \"char\";\n case \"ulid\":\n return \"varchar\";\n case \"double precision\":\n return \"double\";\n case \"real\":\n return \"real\";\n case \"float\":\n return \"real\";\n case \"integer\":\n case \"int4\":\n case \"int\":\n return \"integer\";\n case \"mediumint\":\n return \"integer\";\n case \"bigint\":\n case \"int8\":\n return \"bigint\";\n case \"smallint\":\n case \"int2\":\n return \"smallint\";\n case \"tinyint\":\n return \"smallint\";\n case \"uuid\":\n return \"uuid\";\n case \"year\":\n return \"smallint\";\n case \"bytea\":\n return \"bytea\";\n case \"binary\":\n case \"varbinary\":\n case \"blob\":\n case \"tinyblob\":\n case \"mediumblob\":\n case \"longblob\":\n return \"bytea\";\n case \"boolean\":\n case \"bool\":\n return \"boolean\";\n case \"numeric\":\n case \"decimal\":\n return \"numeric\";\n case \"jsonb\":\n return \"jsonb\";\n case \"json\":\n return \"json\";\n case \"date\":\n return \"date\";\n default:\n return base;\n }\n }\n\n default:\n return base;\n }\n}\n","import {\n getDefaultFkConstraintName,\n getDefaultForeignKey,\n} from \"../../models/decorators/model_decorators_constants\";\nimport {\n ColumnType,\n LazyRelationType,\n} from \"../../models/decorators/model_decorators_types\";\nimport { Model } from \"../../models/model\";\nimport { RelationEnum } from \"../../models/relations/relation\";\nimport { getColumnValue } from \"../../resources/utils\";\nimport {\n TableColumnInfo,\n TableForeignKeyInfo,\n TableIndexInfo,\n TablePrimaryKeyInfo,\n} from \"../../schema_introspection_types\";\nimport { SqlDataSource } from \"../../sql_data_source\";\nimport { MigrationOperationGenerator } from \"./migration_operation_generator\";\nimport {\n ExecutionPhase,\n GenerateTableDiffReturnType,\n RelationsToAdd,\n} from \"./schema_diff_types\";\nimport { normalizeColumnType } from \"./type_normalizer\";\n\nexport class SchemaDiff {\n private sql: SqlDataSource;\n private models: (typeof Model)[];\n private data: GenerateTableDiffReturnType;\n private readonly emptyStatements = [/alter table \".*\"$/];\n\n private constructor(sql: SqlDataSource) {\n this.sql = sql;\n this.models = Object.values(this.sql.registeredModels);\n this.data = {\n columnsToAdd: [],\n columnsToDrop: [],\n columnsToModify: [],\n indexesToAdd: [],\n indexesToDrop: [],\n uniquesToAdd: [],\n uniquesToDrop: [],\n tablesToAdd: [],\n relationsToAdd: [],\n relationsToDrop: [],\n relationsToModify: [],\n primaryKeysToAdd: [],\n primaryKeysToDrop: [],\n primaryKeysToModify: [],\n };\n }\n\n static async makeDiff(sql: SqlDataSource): Promise<SchemaDiff> {\n const diff = new SchemaDiff(sql);\n await Promise.all(\n diff.models.map(async (model) => {\n const databaseData = await diff.sql.getTableSchema(model.table);\n const modelData = {\n // Ignore columns that don't declare a type\n columns: model\n .getColumns()\n .filter((c) => c?.type !== undefined && c?.type !== null),\n indexes: model.getIndexes(),\n relations: model.getRelations(),\n };\n\n // Table not present in the database\n if (!databaseData.columns.length) {\n diff.data.tablesToAdd.push({\n table: model.table,\n columns: modelData.columns,\n });\n\n for (const index of modelData.indexes) {\n if (\n !databaseData.indexes\n .map((dbIndex) => dbIndex.name)\n .includes(index.name)\n ) {\n diff.data.indexesToAdd.push({\n table: model.table,\n index: index.name,\n });\n }\n }\n\n const modelUniques = (model as typeof Model).getUniques?.() || [];\n for (const uq of modelUniques) {\n diff.data.uniquesToAdd!.push({\n table: model.table,\n name: uq.name || \"mandatory\",\n columns: uq.columns,\n });\n }\n\n for (const relation of modelData.relations) {\n if (relation.type !== RelationEnum.belongsTo) {\n continue;\n }\n\n const expectedConstraintName = getColumnValue(\n relation.constraintName,\n );\n\n const dbRelation = databaseData.foreignKeys.find(\n (fk) => fk.name === expectedConstraintName,\n );\n\n if (!dbRelation) {\n diff.data.relationsToAdd.push({\n table: model.table,\n relation: relation,\n onDelete: relation.onDelete,\n onUpdate: relation.onUpdate,\n });\n }\n }\n\n return;\n }\n\n // Columns to add\n for (const column of modelData.columns) {\n const existsInDb = databaseData.columns.some(\n (dbColumn) =>\n dbColumn.name === column.databaseName ||\n dbColumn.name === column.columnName,\n );\n if (!existsInDb) {\n diff.data.columnsToAdd.push({\n table: model.table,\n column: column,\n });\n }\n }\n\n // Columns to drop\n for (const column of databaseData.columns) {\n const existsInModel = modelData.columns.some(\n (modelColumn) =>\n modelColumn.databaseName === column.name ||\n modelColumn.columnName === column.name,\n );\n if (!existsInModel) {\n diff.data.columnsToDrop.push({\n table: model.table,\n column: column.name,\n });\n }\n }\n\n // Indexes to add\n for (const index of modelData.indexes) {\n if (\n !databaseData.indexes\n .map((dbIndex) => dbIndex.name)\n .includes(index.name)\n ) {\n diff.data.indexesToAdd.push({\n table: model.table,\n index: index.name,\n });\n }\n }\n\n // Unique constraints to add (via decorator)\n const modelUniques = (model as typeof Model).getUniques?.() || [];\n for (const uq of modelUniques) {\n const exists = databaseData.indexes.some(\n (dbIndex) => dbIndex.name === uq.name && dbIndex.isUnique,\n );\n if (!exists) {\n diff.data.uniquesToAdd!.push({\n table: model.table,\n name: uq.name || \"mandatory\",\n columns: uq.columns,\n });\n }\n }\n\n // Indexes to drop (ignore unique indexes managed by constraints)\n for (const index of databaseData.indexes) {\n if (index.isUnique) {\n continue;\n }\n\n const existsInModel = modelData.indexes\n .map((modelIndex) => modelIndex.name)\n .includes(index.name);\n if (existsInModel) {\n continue;\n }\n\n diff.data.indexesToDrop.push({\n table: model.table,\n index: index.name,\n });\n }\n\n // Unique constraints to drop (not present in model uniques but unique in DB)\n for (const dbIndex of databaseData.indexes) {\n if (!dbIndex.isUnique) {\n continue;\n }\n const existsInModel = ((model as typeof Model).getUniques?.() || [])\n .map((u) => u.name)\n .includes(dbIndex.name);\n if (!existsInModel) {\n diff.data.uniquesToDrop!.push({\n table: model.table,\n name: dbIndex.name,\n });\n }\n }\n\n // Columns to modify\n for (const column of modelData.columns) {\n const dbColumn = databaseData.columns.find(\n (dbCol) =>\n dbCol.name === column.databaseName ||\n dbCol.name === column.columnName,\n );\n\n if (!dbColumn) {\n continue;\n }\n\n const hasStructChange = !diff.areColumnsEqual(\n dbColumn,\n column,\n databaseData.indexes,\n );\n const defaultChange = diff.getDefaultChange({\n table: model.table,\n dbColumns: dbColumn,\n modelColumn: column,\n });\n\n if (hasStructChange || defaultChange) {\n diff.data.columnsToModify.push({\n table: model.table,\n dbColumns: dbColumn,\n modelColumn: column,\n });\n }\n }\n\n // Relations to add\n for (const relation of modelData.relations) {\n if (\n relation.type !== RelationEnum.belongsTo &&\n relation.type !== RelationEnum.manyToMany\n ) {\n continue;\n }\n\n if (\n relation.type === RelationEnum.manyToMany &&\n relation.manyToManyOptions\n ) {\n const throughTable = getColumnValue(\n relation.manyToManyOptions.throughModel,\n );\n\n // Add the left side (this model)\n diff.data.relationsToAdd.push({\n table: throughTable,\n relation: {\n type: RelationEnum.belongsTo,\n model: () => model,\n columnName: getColumnValue(\n relation.manyToManyOptions.leftForeignKey,\n ),\n foreignKey: relation.manyToManyOptions.leftForeignKey,\n constraintName: relation.constraintName\n ? getColumnValue(relation.constraintName)\n : getDefaultFkConstraintName(\n throughTable,\n getColumnValue(\n relation.manyToManyOptions.leftForeignKey ||\n getDefaultForeignKey(model.table),\n ),\n model.table,\n ),\n onDelete: relation.onDelete,\n onUpdate: relation.onUpdate,\n },\n onDelete: relation.onDelete,\n onUpdate: relation.onUpdate,\n });\n continue;\n }\n\n const expectedName = getColumnValue(relation.constraintName);\n if (\n expectedName &&\n databaseData.foreignKeys.some((fk) => fk.name === expectedName)\n ) {\n continue;\n }\n\n const dbRelation = databaseData.foreignKeys.find((fk) =>\n diff.relationMatchesDbRelation(model, relation, fk),\n );\n\n if (!dbRelation) {\n diff.data.relationsToAdd.push({\n table: model.table,\n relation: relation,\n onDelete: relation.onDelete,\n onUpdate: relation.onUpdate,\n });\n }\n }\n\n // Relations to drop\n const modelExpectedFkNames = new Set(\n modelData.relations\n .filter((rel) => rel.type === RelationEnum.belongsTo)\n .map((rel) => {\n const srcCol = getColumnValue(rel.foreignKey) || rel.columnName;\n const mc = model\n .getColumns()\n .find((c) => c.columnName === srcCol);\n const srcDb = mc?.databaseName || srcCol;\n return (\n getColumnValue(rel.constraintName) ||\n getDefaultFkConstraintName(\n model.table,\n srcDb,\n rel.model().table,\n )\n );\n }),\n );\n\n for (const dbRelation of databaseData.foreignKeys) {\n if (dbRelation.name && modelExpectedFkNames.has(dbRelation.name)) {\n continue;\n }\n\n const modelRelation = modelData.relations.find((rel) => {\n if (\n rel.type !== RelationEnum.belongsTo &&\n rel.type !== RelationEnum.manyToMany\n ) {\n return false;\n }\n return diff.relationMatchesDbRelation(\n model,\n rel as any,\n dbRelation,\n );\n });\n\n if (!modelRelation) {\n diff.data.relationsToDrop.push({\n table: model.table,\n relation: dbRelation,\n });\n }\n }\n\n // Relations to modify\n for (const modelRelation of modelData.relations) {\n if (\n modelRelation.type !== RelationEnum.belongsTo &&\n modelRelation.type !== RelationEnum.manyToMany\n ) {\n continue;\n }\n\n const dbRelation = databaseData.foreignKeys.find((fk) =>\n diff.relationMatchesDbRelation(model, modelRelation, fk),\n );\n\n if (\n dbRelation &&\n !diff.areRelationsEqual(dbRelation, modelRelation)\n ) {\n diff.data.relationsToModify.push({\n table: model.table,\n dbRelation: dbRelation,\n modelRelation: modelRelation,\n onDelete: modelRelation.onDelete,\n onUpdate: modelRelation.onUpdate,\n });\n }\n }\n\n // Primary key to add\n const modelPrimaryKey = model.primaryKey;\n if (modelPrimaryKey && !databaseData.primaryKey) {\n diff.data.primaryKeysToAdd.push({\n table: model.table,\n columns: [modelPrimaryKey],\n });\n }\n\n // Primary key to drop\n if (databaseData.primaryKey && !modelPrimaryKey) {\n diff.data.primaryKeysToDrop.push({\n table: model.table,\n columns: databaseData.primaryKey.columns,\n name: databaseData.primaryKey.name,\n });\n }\n\n // Primary key to modify\n if (modelPrimaryKey && databaseData.primaryKey) {\n const modelPrimaryKeyColumn = model\n .getColumns()\n .find((col) => col.columnName === modelPrimaryKey);\n\n if (\n modelPrimaryKeyColumn &&\n !diff.arePrimaryKeysEqual(\n databaseData.primaryKey,\n modelPrimaryKeyColumn,\n )\n ) {\n diff.data.primaryKeysToModify.push({\n table: model.table,\n dbPrimaryKey: databaseData.primaryKey,\n modelPrimaryKey: modelPrimaryKey,\n });\n }\n }\n }),\n );\n\n await diff.processManyToMany();\n\n await diff.removeFkChurnByName();\n\n return diff;\n }\n\n getSqlStatements(): string[] {\n const operations = this.getSqlStatementsByPhase();\n return Object.values(operations).flat();\n }\n\n /**\n * Gets all SQL statements organized by execution phase\n * This is the single API to get all migration SQL statements\n */\n private getSqlStatementsByPhase(): Record<ExecutionPhase, string[]> {\n const operationGenerator = new MigrationOperationGenerator(this.sql);\n const operations = operationGenerator.generateOperations(this.data);\n const formattedOperations =\n operationGenerator.formatSqlStatements(operations);\n\n const statementsByPhase: Record<ExecutionPhase, string[]> = {\n [ExecutionPhase.STRUCTURE_CREATION]: [],\n [ExecutionPhase.CONSTRAINT_CREATION]: [],\n [ExecutionPhase.DESTRUCTIVE_OPERATIONS]: [],\n };\n\n for (const operation of formattedOperations) {\n statementsByPhase[operation.phase].push(...operation.sqlStatements);\n }\n\n return statementsByPhase;\n }\n\n private areColumnsEqual(\n dbColumn: TableColumnInfo,\n modelColumn: ColumnType,\n dbIndexes: TableIndexInfo[] = [],\n ): boolean {\n // Only provided types in the model are chosen for the diff\n let baseCondition = dbColumn.name === modelColumn.databaseName;\n\n const dialect = this.sql.getDbType();\n const normalizedDbType = normalizeColumnType(dialect, dbColumn.dataType);\n const normalizedModelType =\n typeof modelColumn.type === \"string\"\n ? normalizeColumnType(dialect, modelColumn.type)\n : undefined;\n\n if (normalizedModelType) {\n baseCondition &&= normalizedDbType === normalizedModelType;\n }\n\n if (modelColumn.length != null && dbColumn.length != null) {\n baseCondition &&= dbColumn.length === modelColumn.length;\n }\n\n const isFloatingType =\n normalizedModelType === \"real\" ||\n normalizedModelType === \"double\" ||\n normalizedModelType === \"float\";\n\n if (modelColumn.precision != null && dbColumn.precision != null) {\n if (\n (dialect === \"postgres\" || dialect === \"cockroachdb\") &&\n isFloatingType\n ) {\n // Ignore precision differences for floating types in Postgres/Cockroach\n } else {\n baseCondition &&= dbColumn.precision === modelColumn.precision;\n }\n }\n\n if (modelColumn.scale != null && dbColumn.scale != null) {\n if (\n (dialect === \"postgres\" || dialect === \"cockroachdb\") &&\n isFloatingType\n ) {\n // Ignore scale differences for floating types in Postgres/Cockroach\n } else {\n baseCondition &&= dbColumn.scale === modelColumn.scale;\n }\n }\n\n if (typeof modelColumn.type === \"string\") {\n const isTimestampLike =\n normalizedModelType === \"timestamp\" || normalizedModelType === \"time\";\n if (isTimestampLike) {\n if (\n modelColumn.withTimezone !== undefined &&\n dbColumn.withTimezone !== undefined\n ) {\n baseCondition &&=\n !!dbColumn.withTimezone === !!modelColumn.withTimezone;\n }\n }\n }\n\n // Check nullable constraint changes\n if (modelColumn.constraints?.nullable !== undefined) {\n const modelNullable = modelColumn.constraints.nullable;\n const dbNullable = dbColumn.isNullable;\n const nullableMatch = modelNullable === dbNullable;\n baseCondition = baseCondition && nullableMatch;\n }\n\n return baseCondition;\n }\n\n private areRelationsEqual(\n dbRelation: TableForeignKeyInfo,\n modelRelation: LazyRelationType,\n ): boolean {\n const expectedConstraintName = getColumnValue(modelRelation.constraintName);\n\n let baseCondition = expectedConstraintName\n ? dbRelation.name === expectedConstraintName\n : true;\n if (modelRelation.type === RelationEnum.belongsTo) {\n const relatedModel = modelRelation.model();\n const pkName = relatedModel.primaryKey || \"id\";\n const pkColumn = relatedModel\n .getColumns()\n .find((c) => c.columnName === pkName);\n const expectedRefTable = relatedModel.table;\n const expectedRefColumn = pkColumn?.databaseName || pkName;\n\n baseCondition =\n baseCondition &&\n dbRelation.referencedTable === expectedRefTable &&\n !!dbRelation.referencedColumns &&\n dbRelation.referencedColumns.length === 1 &&\n dbRelation.referencedColumns[0] === expectedRefColumn;\n } else if (\n modelRelation.type === RelationEnum.manyToMany &&\n modelRelation.manyToManyOptions\n ) {\n const expectedThroughTable = getColumnValue(\n modelRelation.manyToManyOptions.throughModel,\n );\n baseCondition =\n baseCondition && dbRelation.referencedTable === expectedThroughTable;\n }\n\n const dbOnDelete = dbRelation.onDelete?.toLowerCase();\n const dbOnUpdate = dbRelation.onUpdate?.toLowerCase();\n const modelOnDelete = modelRelation.onDelete?.toLowerCase();\n const modelOnUpdate = modelRelation.onUpdate?.toLowerCase();\n\n if (modelOnDelete) {\n baseCondition &&= dbOnDelete === modelOnDelete;\n }\n\n if (modelOnUpdate) {\n baseCondition &&= dbOnUpdate === modelOnUpdate;\n }\n\n return baseCondition;\n }\n\n private relationMatchesDbRelation(\n model: typeof Model,\n modelRelation: LazyRelationType,\n dbRelation: TableForeignKeyInfo,\n ): boolean {\n let relatedModel: typeof Model | undefined;\n const mr: any = modelRelation as any;\n if (mr && mr.model) {\n if (typeof mr.model === \"function\" && mr.model.table) {\n relatedModel = mr.model as typeof Model;\n } else if (typeof mr.model === \"function\") {\n try {\n const v = mr.model();\n if (v && v.table) {\n relatedModel = v as typeof Model;\n }\n } catch (_) {}\n }\n }\n\n if (!relatedModel) {\n return false;\n }\n const expectedReferencedTable =\n modelRelation.type === RelationEnum.belongsTo\n ? relatedModel.table\n : modelRelation.type === RelationEnum.manyToMany &&\n modelRelation.manyToManyOptions\n ? getColumnValue(modelRelation.manyToManyOptions.throughModel)\n : undefined;\n\n if (\n expectedReferencedTable &&\n dbRelation.referencedTable !== expectedReferencedTable\n ) {\n return false;\n }\n\n const fkName = getColumnValue(modelRelation.constraintName);\n if (fkName && dbRelation.name && fkName !== dbRelation.name) {\n return false;\n }\n\n const modelColumns = model.getColumns();\n const relationType = (mr.type as RelationEnum) || RelationEnum.belongsTo;\n let localColumn =\n relationType === RelationEnum.belongsTo\n ? getColumnValue(mr.foreignKey)\n : mr.columnName;\n const mc = modelColumns.find((c) => c.columnName === localColumn);\n if (mc) {\n localColumn = mc.databaseName;\n }\n\n const referencedPkName = relatedModel.primaryKey || \"id\";\n const relatedPk = relatedModel\n .getColumns()\n .find((c) => c.columnName === referencedPkName);\n const referencedColumn = relatedPk?.databaseName || referencedPkName;\n\n return (\n dbRelation.columns.length === 1 &&\n dbRelation.columns[0] === localColumn &&\n dbRelation.referencedColumns.length === 1 &&\n dbRelation.referencedColumns[0] === referencedColumn\n );\n }\n\n private arePrimaryKeysEqual(\n dbPrimaryKey: TablePrimaryKeyInfo,\n modelPrimaryKeyColumn: ColumnType,\n ): boolean {\n if (dbPrimaryKey.columns.length !== 1) {\n return false;\n }\n\n const dbPrimaryKeyColumn = dbPrimaryKey.columns[0];\n const columnsMatch =\n dbPrimaryKeyColumn === modelPrimaryKeyColumn.databaseName;\n\n const constraintNamesMatch =\n !dbPrimaryKey.name ||\n !modelPrimaryKeyColumn.primaryKeyConstraintName ||\n dbPrimaryKey.name === modelPrimaryKeyColumn.primaryKeyConstraintName;\n\n return columnsMatch && constraintNamesMatch;\n }\n private getDefaultChange(columnData: {\n table: string;\n dbColumns: TableColumnInfo;\n modelColumn: ColumnType;\n }): \"set\" | \"drop\" | false {\n const dialect = this.sql.getDbType();\n const normalizedDbType = normalizeColumnType(\n dialect,\n columnData.dbColumns.dataType,\n );\n const normalizedModelType =\n typeof columnData.modelColumn.type === \"string\"\n ? normalizeColumnType(dialect, columnData.modelColumn.type)\n : undefined;\n if (normalizedModelType && normalizedDbType !== normalizedModelType) {\n return false;\n }\n if (\n columnData.modelColumn.length != null &&\n columnData.dbColumns.length != null &&\n columnData.dbColumns.length !== columnData.modelColumn.length\n ) {\n return false;\n }\n if (\n columnData.modelColumn.precision != null &&\n columnData.dbColumns.precision != null &&\n columnData.dbColumns.precision !== columnData.modelColumn.precision\n ) {\n return false;\n }\n if (\n columnData.modelColumn.scale != null &&\n columnData.dbColumns.scale != null &&\n columnData.dbColumns.scale !== columnData.modelColumn.scale\n ) {\n return false;\n }\n if (\n typeof columnData.modelColumn.type === \"string\" &&\n (normalizedModelType === \"timestamp\" || normalizedModelType === \"time\") &&\n columnData.modelColumn.withTimezone !== undefined &&\n columnData.dbColumns.withTimezone !== undefined &&\n !!columnData.dbColumns.withTimezone !==\n !!columnData.modelColumn.withTimezone\n ) {\n return false;\n }\n const modelHasDefault =\n columnData.modelColumn.constraints?.default !== undefined;\n const dbHasDefault =\n columnData.dbColumns.defaultValue !== null &&\n columnData.dbColumns.defaultValue !== undefined;\n if (modelHasDefault && !dbHasDefault) {\n return \"set\";\n }\n if (!modelHasDefault && dbHasDefault) {\n return \"drop\";\n }\n if (modelHasDefault && dbHasDefault) {\n const dbDefault = String(columnData.dbColumns.defaultValue);\n const modelDefault = String(\n columnData.modelColumn.constraints?.default as any,\n );\n\n const dbNorm = this.normalizeDefaultValue(\n dialect,\n normalizedDbType,\n dbDefault,\n );\n const modelNorm = this.normalizeDefaultValue(\n dialect,\n normalizedModelType || normalizedDbType,\n modelDefault,\n );\n return dbNorm !== modelNorm ? \"set\" : false;\n }\n return false;\n }\n\n private normalizeDefaultValue(\n dialect: ReturnType<SqlDataSource[\"getDbType\"]>,\n dataType: string | undefined,\n value: string,\n ): string {\n let v = String(value).trim();\n if (!v) {\n return v;\n }\n if (dialect === \"postgres\" || dialect === \"cockroachdb\") {\n // Special handling for JSON/JSONB default values\n if (dataType === \"json\" || dataType === \"jsonb\") {\n try {\n // Remove PostgreSQL type annotations and quotes\n v = v.replace(/^\\((.*)\\)$/s, \"$1\");\n v = v.replace(/::(jsonb?|[a-zA-Z_ ]+[\\[\\]]*)/g, \"\");\n\n // Remove outer quotes if present\n const singleQuoted = v.match(/^'(.*)'$/s);\n if (singleQuoted) {\n v = singleQuoted[1];\n }\n\n // For empty object representations\n if (v === \"{}\" || v === \"\") {\n return \"{}\";\n }\n\n // Parse and re-stringify to normalize JSON format\n const parsed = JSON.parse(v);\n return JSON.stringify(parsed);\n } catch (_) {\n // If parsing fails, continue with regular normalization\n }\n }\n\n // Regular normalization for non-JSON types\n v = v.replace(/^\\((.*)\\)$/s, \"$1\");\n v = v.replace(/::[a-zA-Z_ ]+[\\[\\]]*/g, \"\");\n const singleQuoted = v.match(/^'(.*)'$/s);\n if (singleQuoted) {\n v = singleQuoted[1];\n }\n if (/^true$/i.test(v)) {\n return \"true\";\n }\n if (/^false$/i.test(v)) {\n return \"false\";\n }\n if (/^null$/i.test(v)) {\n return \"null\";\n }\n if (/^\\d+(?:\\.\\d+)?$/.test(v)) {\n return v;\n }\n return v;\n }\n if (dialect === \"mysql\" || dialect === \"mariadb\") {\n v = v.replace(/^\\((.*)\\)$/s, \"$1\");\n const singleQuoted = v.match(/^'(.*)'$/s);\n if (singleQuoted) {\n v = singleQuoted[1];\n }\n if (/^current_timestamp(?:\\(\\d+\\))?$/i.test(v)) {\n return \"current_timestamp\";\n }\n return v;\n }\n if (dialect === \"sqlite\") {\n v = v.replace(/^\\((.*)\\)$/s, \"$1\");\n const singleQuoted = v.match(/^'(.*)'$/s);\n if (singleQuoted) {\n v = singleQuoted[1];\n }\n return v.toLowerCase();\n }\n return v;\n }\n\n private async processManyToMany(): Promise<void> {\n const processed = new Set<string>();\n for (const model of this.models) {\n const relations = model.getRelations();\n for (const relation of relations) {\n if (\n relation.type !== RelationEnum.manyToMany ||\n !relation.manyToManyOptions\n ) {\n continue;\n }\n if (relation.manyToManyOptions.wasModelProvided) {\n continue;\n }\n\n const throughTable = getColumnValue(\n relation.manyToManyOptions.throughModel,\n );\n if (processed.has(throughTable)) {\n continue;\n }\n processed.add(throughTable);\n\n const leftModel = this.models.find(\n (m) => m.table === relation?.manyToManyOptions?.primaryModel,\n );\n const rightModel = relation.model();\n if (!leftModel || !rightModel) {\n continue;\n }\n\n const leftPkName = leftModel.primaryKey || \"id\";\n const rightPkName = rightModel.primaryKey || \"id\";\n const leftPk = leftModel\n .getColumns()\n .find((c) => c.columnName === leftPkName);\n const rightPk = rightModel\n .getColumns()\n .find((c) => c.columnName === rightPkName);\n if (!leftPk || !rightPk) {\n continue;\n }\n\n const leftFkName =\n getColumnValue(relation.manyToManyOptions.leftForeignKey) ||\n leftPkName;\n const rightFkName =\n getColumnValue(relation.manyToManyOptions.rightForeignKey) ||\n rightPkName;\n\n const dbThrough = await this.sql.getTableSchema(throughTable);\n if (!dbThrough.columns.length) {\n this.data.tablesToAdd.push({\n table: throughTable,\n columns: [\n this.clonePkAsColumn(leftPk, leftFkName),\n this.clonePkAsColumn(rightPk, rightFkName),\n ],\n });\n\n this.pushM2mFkRelations({\n throughTable,\n leftModel,\n rightModel,\n leftFkName,\n rightFkName,\n onDelete: relation.onDelete,\n onUpdate: relation.onUpdate,\n constraintName: undefined,\n });\n continue;\n }\n\n const leftExpected = this.clonePkAsColumn(leftPk, leftFkName);\n const rightExpected = this.clonePkAsColumn(rightPk, rightFkName);\n const leftDbCol = dbThrough.columns.find((c) => c.name === leftFkName);\n const rightDbCol = dbThrough.columns.find(\n (c) => c.name === rightFkName,\n );\n const leftColOk = leftDbCol\n ? this.areColumnsEqual(leftDbCol, leftExpected, dbThrough.indexes)\n : false;\n const rightColOk = rightDbCol\n ? this.areColumnsEqual(rightDbCol, rightExpected, dbThrough.indexes)\n : false;\n\n // Drop old FK-bound columns that do not match the expected names\n for (const fk of dbThrough.foreignKeys) {\n const isLeft = fk.referencedTable === leftModel.table;\n const isRight = fk.referencedTable === rightModel.table;\n if (!isLeft && !isRight) {\n continue;\n }\n const expectedName = isLeft ? leftFkName : rightFkName;\n const actualName = fk.columns[0];\n if (actualName && actualName !== expectedName) {\n this.data.relationsToDrop.push({\n table: throughTable,\n relation: fk,\n });\n if (actualName !== leftFkName && actualName !== rightFkName) {\n this.data.columnsToDrop.push({\n table: throughTable,\n column: actualName,\n });\n }\n }\n }\n\n // Add missing columns (dedup when both sides are the same name)\n const pendingAddColumns: Record<string, ColumnType> = {};\n if (!leftColOk) {\n pendingAddColumns[leftExpected.databaseName] = leftExpected;\n }\n if (!rightColOk) {\n pendingAddColumns[rightExpected.databaseName] =\n pendingAddColumns[rightExpected.databaseName] || rightExpected;\n }\n for (const name of Object.keys(pendingAddColumns)) {\n this.data.columnsToAdd.push({\n table: throughTable,\n column: pendingAddColumns[name],\n });\n }\n\n const leftExpectedRel = this.buildBelongsToRelation(\n throughTable,\n () => leftModel,\n leftFkName,\n leftPkName,\n undefined,\n relation.onDelete,\n relation.onUpdate,\n );\n const rightExpectedRel = this.buildBelongsToRelation(\n throughTable,\n relation.model,\n rightFkName,\n rightPkName,\n undefined,\n relation.onDelete,\n relation.onUpdate,\n );\n\n const leftDbFk = dbThrough.foreignKeys.find(\n (fk) =>\n fk.referencedTable === leftModel.table &&\n fk.columns.length === 1 &&\n fk.columns[0] === leftFkName,\n );\n const rightDbFk = dbThrough.foreignKeys.find(\n (fk) =>\n fk.referencedTable === rightModel.table &&\n fk.columns.length === 1 &&\n fk.columns[0] === rightFkName,\n );\n if (!leftDbFk) {\n const conflictLeft = dbThrough.foreignKeys.find(\n (fk) => fk.referencedTable === leftModel.table,\n );\n if (conflictLeft) {\n this.data.relationsToDrop.push({\n table: throughTable,\n relation: conflictLeft,\n });\n }\n this.data.relationsToAdd.push(leftExpectedRel as RelationsToAdd);\n }\n if (!rightDbFk) {\n const conflictRight = dbThrough.foreignKeys.find(\n (fk) => fk.referencedTable === rightModel.table,\n );\n if (conflictRight) {\n this.data.relationsToDrop.push({\n table: throughTable,\n relation: conflictRight,\n });\n }\n this.data.relationsToAdd.push(rightExpectedRel as RelationsToAdd);\n }\n }\n }\n }\n\n private async removeFkChurnByName(): Promise<void> {\n const tablesNeedingCheck = new Set<string>();\n for (const rel of this.data.relationsToAdd) {\n tablesNeedingCheck.add(rel.table);\n }\n for (const rel of this.data.relationsToDrop) {\n tablesNeedingCheck.add(rel.table);\n }\n\n const tableToDbFks = new Map<string, Set<string>>();\n for (const table of tablesNeedingCheck) {\n const schema = await this.sql.getTableSchema(table);\n const names = new Set(\n (schema.foreignKeys || [])\n .map((fk) => fk.name)\n .filter(Boolean) as string[],\n );\n tableToDbFks.set(table, names);\n }\n\n const modelExpectedByTable = new Map<string, Set<string>>();\n for (const model of this.models) {\n const rels = model.getRelations();\n const expected = new Set<string>();\n for (const rel of rels) {\n if (rel.type !== RelationEnum.belongsTo) {\n continue;\n }\n const srcColRaw = (rel as any).foreignKey || rel.columnName;\n const mc = model.getColumns().find((c) => c.columnName === srcColRaw);\n const srcDb = mc?.databaseName || srcColRaw;\n const name =\n getColumnValue((rel as any).constraintName) ||\n getDefaultFkConstraintName(model.table, srcDb, rel.model().table);\n expected.add(name);\n }\n modelExpectedByTable.set(model.table, expected);\n }\n\n this.data.relationsToAdd = await Promise.all(\n this.data.relationsToAdd.map(async (r) => {\n const dbSchema = await this.sql.getTableSchema(r.table);\n const model = this.models.find((m) => m.table === r.table);\n const modelCols = model?.getColumns() || [];\n\n let sourceCol = (r.relation as any).columnName;\n if (r.relation.type === RelationEnum.belongsTo) {\n const fkModelCol = modelCols.find(\n (c) => c.columnName === (r.relation as any).foreignKey,\n );\n sourceCol =\n fkModelCol?.databaseName || (r.relation as any).foreignKey;\n } else {\n const mc = modelCols.find((c) => c.columnName === sourceCol);\n sourceCol = mc?.databaseName || sourceCol;\n }\n\n let referencedTable = r.table;\n let referencedCol = (r.relation as any).foreignKey;\n if (r.relation.type === RelationEnum.belongsTo) {\n const relModel = r.relation.model();\n referencedTable = relModel.table;\n const pkName = relModel.primaryKey || \"id\";\n const pkCol = relModel\n .getColumns()\n .find((c) => c.columnName === pkName);\n referencedCol = pkCol?.databaseName || pkName;\n }\n\n const candidateCols = new Set<string>(\n [sourceCol, (r.relation as any).columnName].filter(\n Boolean,\n ) as string[],\n );\n const existsStructurally = dbSchema.foreignKeys.some((fk) => {\n if (fk.columns.length !== 1 || fk.referencedColumns.length !== 1) {\n return false;\n }\n const colMatch = candidateCols.has(fk.columns[0]);\n const refTableMatch = fk.referencedTable === referencedTable;\n const refColMatch = fk.referencedColumns[0] === referencedCol;\n return colMatch && refTableMatch && refColMatch;\n });\n\n const expectedName =\n getColumnValue((r.relation as any).constraintName) ||\n getDefaultFkConstraintName(r.table, sourceCol, referencedTable);\n const dbFks = tableToDbFks.get(r.table) || new Set<string>();\n\n if (existsStructurally || (expectedName && dbFks.has(expectedName))) {\n return null;\n }\n\n if (\n r.relation.type === RelationEnum.manyToMany &&\n r.relation.manyToManyOptions\n ) {\n const through = getColumnValue(\n r.relation.manyToManyOptions.throughModel,\n );\n const leftKey = getColumnValue(\n r.relation.manyToManyOptions.leftForeignKey,\n );\n const rightKey = getColumnValue(\n r.relation.manyToManyOptions.rightForeignKey,\n );\n const leftMatch =\n r.table === through &&\n r.relation.columnName === leftKey &&\n r.relation.model().table === model?.table;\n const rightMatch =\n r.table === through &&\n r.relation.columnName === rightKey &&\n r.relation.model().table !== model?.table;\n\n const dbThrough = await this.sql.getTableSchema(through);\n const leftOk = dbThrough.foreignKeys.some(\n (fk) =>\n fk.columns.length === 1 &&\n fk.columns[0] === leftKey &&\n fk.referencedTable === (model?.table || \"\"),\n );\n const rightOk = dbThrough.foreignKeys.some(\n (fk) =>\n fk.columns.length === 1 &&\n fk.columns[0] === rightKey &&\n fk.referencedTable === r.relation.model().table,\n );\n if ((leftMatch && leftOk) || (rightMatch && rightOk)) {\n return null;\n }\n }\n\n return r;\n }),\n ).then((arr) => arr.filter(Boolean) as typeof this.data.relationsToAdd);\n\n this.data.relationsToDrop = await Promise.all(\n this.data.relationsToDrop.map(async (r) => {\n const model = this.models.find((m) => m.table === r.table);\n if (!model) {\n return r;\n }\n const rels = model.getRelations();\n const modelCols = model.getColumns();\n const matches = rels.some((rel: any) => {\n if (rel.type !== RelationEnum.belongsTo) {\n return false;\n }\n const mc = modelCols.find((c) => c.columnName === rel.foreignKey);\n const srcCol = mc?.databaseName || rel.foreignKey;\n const relModel = rel.model();\n const pkName = relModel.primaryKey || \"id\";\n const pkCol = relModel\n .getColumns()\n .find((c: any) => c.columnName === pkName);\n const refCol = pkCol?.databaseName || pkName;\n return (\n r.relation.columns.length === 1 &&\n r.relation.columns[0] === srcCol &&\n r.relation.referencedTable === relModel.table &&\n r.relation.referencedColumns.length === 1 &&\n r.relation.referencedColumns[0] === refCol\n );\n });\n return matches ? null : r;\n }),\n ).then((arr) => arr.filter(Boolean) as typeof this.data.relationsToDrop);\n }\n\n private clonePkAsColumn(pk: ColumnType, columnName: string): ColumnType {\n return {\n columnName,\n databaseName: columnName,\n isPrimary: false,\n type: pk.type,\n length: pk.length,\n precision: pk.precision,\n scale: pk.scale,\n withTimezone: pk.withTimezone,\n constraints: { nullable: false },\n } as ColumnType;\n }\n\n private pushM2mFkRelations(input: {\n throughTable: string;\n leftModel: typeof Model;\n rightModel: typeof Model;\n leftFkName: string;\n rightFkName: string;\n onDelete?: string;\n onUpdate?: string;\n constraintName?: string | (() => string);\n }): void {\n const leftRelation = this.buildBelongsToRelation(\n input.throughTable,\n () => input.leftModel,\n input.leftFkName,\n input.leftModel.primaryKey || \"id\",\n input.constraintName,\n input.onDelete,\n input.onUpdate,\n );\n const rightRelation = this.buildBelongsToRelation(\n input.throughTable,\n () => input.rightModel,\n input.rightFkName,\n input.rightModel.primaryKey || \"id\",\n input.constraintName,\n input.onDelete,\n input.onUpdate,\n );\n this.data.relationsToAdd.push(leftRelation as RelationsToAdd);\n this.data.relationsToAdd.push(rightRelation as RelationsToAdd);\n }\n\n private buildBelongsToRelation(\n table: string,\n relatedModel: () => typeof Model,\n sourceColumnName: string,\n relatedPkName: string,\n constraintName?: string | (() => string),\n onDelete?: string,\n onUpdate?: string,\n ) {\n const constraint = constraintName\n ? getColumnValue(constraintName)\n : getDefaultFkConstraintName(\n table,\n sourceColumnName,\n relatedModel().table,\n );\n return {\n table,\n relation: {\n type: RelationEnum.belongsTo,\n model: relatedModel,\n columnName: sourceColumnName,\n foreignKey: sourceColumnName,\n constraintName: constraint,\n onDelete: onDelete,\n onUpdate: onUpdate,\n },\n onDelete,\n onUpdate,\n } as const;\n }\n}\n","import { QueryNode } from \"../../query\";\nimport { FromNode } from \"../from\";\n\nexport class DeleteNode extends QueryNode {\n fromNode: FromNode;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"delete\";\n file = \"delete\";\n\n constructor(fromNode: FromNode, isRawValue: boolean = false) {\n super(\"delete from\", isRawValue);\n this.fromNode = fromNode;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class FromNode extends QueryNode {\n table: string | QueryNode | QueryNode[];\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"from\";\n file = \"from\";\n alias?: string;\n\n constructor(table: string | QueryNode | QueryNode[], alias?: string) {\n super(\"from\");\n this.table = table;\n this.alias = alias;\n }\n}\n","import { QueryNode } from \"../../query\";\nimport { FromNode } from \"../from\";\n\nexport class InsertNode extends QueryNode {\n fromNode: FromNode;\n records: Record<string, any>[];\n returning?: string[];\n disableReturning: boolean;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"insert\";\n file = \"insert\";\n\n constructor(\n fromNode: FromNode,\n records: Record<string, any>[] = [],\n returning?: string[],\n disableReturning: boolean = false,\n isRawValue: boolean = false,\n ) {\n super(\"insert into\", isRawValue);\n this.fromNode = fromNode;\n this.records = records;\n this.returning = returning;\n this.disableReturning = disableReturning;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class OnDuplicateNode extends QueryNode {\n table: string;\n conflictColumns: string[];\n columnsToUpdate: string[];\n returning?: string[];\n mode: \"update\" | \"ignore\";\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"on_duplicate\";\n file = \"on_duplicate\";\n\n constructor(\n table: string,\n conflictColumns: string[],\n columnsToUpdate: string[],\n mode: \"update\" | \"ignore\" = \"update\",\n returning?: string[],\n isRawValue: boolean = false,\n ) {\n super(\"on duplicate\", isRawValue);\n this.table = table;\n this.conflictColumns = conflictColumns;\n this.columnsToUpdate = columnsToUpdate;\n this.mode = mode;\n this.returning = returning;\n }\n}\n","import { QueryNode } from \"../../query\";\nimport { RawNode } from \"../raw/raw_node\";\nimport { FromNode } from \"../from\";\n\nexport class UpdateNode extends QueryNode {\n fromNode: FromNode;\n columns: string[];\n values: (any | RawNode)[];\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"update\";\n file = \"update\";\n\n constructor(\n fromNode: FromNode,\n columns: string[] = [],\n values: (any | RawNode)[] = [],\n isRawValue: boolean = false,\n ) {\n super(\"update\", isRawValue);\n this.fromNode = fromNode;\n this.columns = columns;\n this.values = values;\n }\n}\n","import { QueryNode } from \"../../query\";\nimport { RawNode } from \"../raw/raw_node\";\n\nexport type BaseValues = string | number | boolean | undefined | null | RawNode;\n\nexport type BinaryOperatorType =\n | \"=\"\n | \"!=\"\n | \"<>\"\n | \">\"\n | \"<\"\n | \">=\"\n | \"<=\"\n | \"is\"\n | \"is not\"\n | \"like\"\n | \"not like\"\n | \"is null\"\n | \"is not null\"\n | \"ilike\"\n | \"in\"\n | \"not in\"\n | \"between\"\n | \"not between\"\n | \"regexp\"\n | \"not regexp\"\n | \"not ilike\";\n\nexport class WhereNode extends QueryNode {\n column: string;\n isNegated: boolean;\n operator: BinaryOperatorType;\n value: BaseValues | BaseValues[];\n chainsWith: \"and\" | \"or\" = \"and\";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"where\";\n file = \"where\";\n\n constructor(\n column: string,\n chainsWith: \"and\" | \"or\",\n isNegated: boolean = false,\n operator: BinaryOperatorType,\n value: BaseValues | BaseValues[],\n isRawValue: boolean = false,\n ) {\n super(\"where\", isRawValue);\n this.column = column;\n this.chainsWith = ` ${chainsWith}` as \"and\" | \"or\";\n this.isNegated = isNegated;\n this.operator = operator;\n this.value = value;\n }\n}\n","import { QueryNode } from \"../../query\";\nimport type { WhereNode } from \"./where\";\nimport type { WhereSubqueryNode } from \"./where_subquery\";\n\nexport type WhereNodeType =\n | \"where\"\n | \"raw_where\"\n | \"where_group\"\n | \"where_subquery\";\n\nexport class WhereGroupNode extends QueryNode {\n nodes: (WhereNode | WhereGroupNode | WhereSubqueryNode)[];\n chainsWith: \"and\" | \"or\";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"where\";\n file = \"where_group\";\n\n constructor(\n nodes: (WhereNode | WhereGroupNode | WhereSubqueryNode)[],\n chainsWith: \"and\" | \"or\" = \"and\",\n ) {\n super(\"where\");\n this.nodes = nodes;\n this.chainsWith = ` ${chainsWith}` as \"and\" | \"or\";\n }\n}\n","import { WhereNode } from \"./where\";\n\nexport type JsonOperatorType =\n | \"=\" // Basic equality\n | \"!=\" // Not equal\n | \"contains\" // JSON contains\n | \"not contains\" // JSON doesn't contain\n | \"raw\"; // Raw JSON expression\n\nexport class WhereJsonNode extends WhereNode {\n value: any[];\n jsonOperator: JsonOperatorType;\n file = \"where_json\";\n\n constructor(\n column: string,\n chainsWith: \"and\" | \"or\",\n isNegated: boolean = false,\n operator: JsonOperatorType,\n value: any[],\n isRawValue: boolean = false,\n ) {\n // Use the basic operator from WhereNode, but we'll override it in interpreters\n super(column, chainsWith, isNegated, \"=\", value as any, isRawValue);\n this.jsonOperator = operator;\n this.value = value;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport type SubqueryOperatorType =\n | \"in\"\n | \"not in\"\n | \"exists\"\n | \"not exists\"\n | \"between\"\n | \"not between\"\n | \">\"\n | \"<\"\n | \">=\"\n | \"<=\";\n\nexport class WhereSubqueryNode extends QueryNode {\n column: string;\n operator: SubqueryOperatorType;\n subquery: string | QueryNode | QueryNode[];\n chainsWith: \"and\" | \"or\";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"where\";\n file = \"where_subquery\";\n\n constructor(\n column: string,\n operator: SubqueryOperatorType,\n subquery: string | QueryNode | QueryNode[],\n chainsWith: \"and\" | \"or\" = \"and\",\n ) {\n super(\"where\");\n this.column = column;\n this.operator = operator;\n this.subquery = subquery;\n this.chainsWith = ` ${chainsWith}` as \"and\" | \"or\";\n }\n}\n","import { PassThrough } from \"node:stream\";\nimport { DriverNotFoundError } from \"../../drivers/driver_constants\";\nimport { HysteriaError } from \"../../errors/hysteria_error\";\nimport { log, logMessage } from \"../../utils/logger\";\nimport { Model } from \"../models/model\";\nimport { AnnotatedModel } from \"../models/model_query_builder/model_query_builder_types\";\nimport { StreamOptions } from \"../query_builder/query_builder_types\";\nimport { SqlDataSource } from \"../sql_data_source\";\nimport {\n ConnectionPolicies,\n GetConnectionReturnType,\n SqlDataSourceType,\n} from \"../sql_data_source_types\";\nimport {\n Returning,\n SqlLiteOptions,\n SqlRunnerReturnType,\n} from \"./sql_runner_types\";\nimport { promisifySqliteQuery, SQLiteStream } from \"./sql_runner_utils\";\n\nexport const execSql = async <M extends Model, T extends Returning>(\n query: string,\n params: any[],\n sqlDataSource: SqlDataSource,\n returning: T = \"raw\" as T,\n options?: {\n sqlLiteOptions?: SqlLiteOptions<M>;\n shouldNotLog?: boolean;\n },\n): Promise<SqlRunnerReturnType<T>> => {\n const sqlType = sqlDataSource.type as SqlDataSourceType;\n if (!options?.shouldNotLog) {\n log(query, sqlDataSource.logs, params);\n }\n\n switch (sqlType) {\n case \"mysql\":\n case \"mariadb\":\n const mysqlDriver =\n (sqlDataSource.sqlConnection as GetConnectionReturnType<\"mysql\">) ??\n sqlDataSource.getPool(\"mysql\");\n\n const [mysqlResult] = await withRetry(\n () => mysqlDriver.query(query, params),\n sqlDataSource.inputDetails.connectionPolicies?.retry,\n sqlDataSource.logs,\n );\n\n if (returning === \"affectedRows\") {\n return (mysqlResult as { affectedRows: number })\n .affectedRows as SqlRunnerReturnType<T>;\n }\n\n return mysqlResult as SqlRunnerReturnType<T>;\n case \"postgres\":\n case \"cockroachdb\":\n const pgDriver =\n (sqlDataSource.sqlConnection as GetConnectionReturnType<\"postgres\">) ??\n sqlDataSource.getPool(\"postgres\");\n\n const pgResult = await withRetry(\n () => pgDriver.query(query, params),\n sqlDataSource.inputDetails.connectionPolicies?.retry,\n sqlDataSource.logs,\n );\n\n if (returning === \"raw\") {\n return pgResult.rows as SqlRunnerReturnType<T>;\n }\n\n return pgResult.rowCount as number as SqlRunnerReturnType<T>;\n case \"sqlite\":\n const sqliteResult = await withRetry(\n () =>\n promisifySqliteQuery<M>(query, params, sqlDataSource, {\n typeofModel: options?.sqlLiteOptions?.typeofModel,\n mode: options?.sqlLiteOptions?.mode || \"fetch\",\n models: options?.sqlLiteOptions?.models,\n }),\n sqlDataSource.inputDetails.connectionPolicies?.retry,\n sqlDataSource.logs,\n );\n\n if (returning === \"raw\") {\n return !Array.isArray(sqliteResult)\n ? ([sqliteResult] as SqlRunnerReturnType<T>)\n : (sqliteResult as SqlRunnerReturnType<T>);\n }\n\n return sqliteResult as SqlRunnerReturnType<T>;\n default:\n throw new HysteriaError(\n \"ExecSql\",\n `UNSUPPORTED_DATABASE_TYPE_${sqlType}`,\n );\n }\n};\n\nexport const execSqlStreaming = async <\n M extends Model,\n T extends \"generator\" | \"stream\" = \"generator\",\n A extends Record<string, any> = {},\n R extends Record<string, any> = {},\n>(\n query: string,\n params: any[],\n sqlDataSource: SqlDataSource,\n options: StreamOptions = {},\n events: {\n onData?: (\n passThrough: PassThrough & AsyncGenerator<AnnotatedModel<M, A, R>>,\n row: any,\n ) => void | Promise<void>;\n },\n): Promise<PassThrough & AsyncGenerator<AnnotatedModel<M, A, R>>> => {\n const sqlType = sqlDataSource.type as SqlDataSourceType;\n\n switch (sqlType) {\n case \"mariadb\":\n case \"mysql\": {\n const pool = sqlDataSource.getPool(\"mysql\");\n const conn =\n (sqlDataSource.sqlConnection as GetConnectionReturnType<\"mysql\">) ??\n (await pool.getConnection());\n const passThrough = new PassThrough({\n objectMode: options.objectMode ?? true,\n highWaterMark: options.highWaterMark,\n }) as PassThrough & AsyncGenerator<AnnotatedModel<M, A, R>>;\n\n const rawConn = conn.connection as any;\n const mysqlStream = rawConn.query(query, params).stream({\n highWaterMark: options.highWaterMark,\n objectMode: options.objectMode ?? true,\n });\n\n let pending = 0;\n let ended = false;\n let hasError = false;\n\n const tryRelease = () => {\n try {\n conn.release();\n } catch {}\n };\n\n mysqlStream.on(\"data\", (row: any) => {\n if (events.onData) {\n pending++;\n Promise.resolve(events.onData(passThrough, row))\n .then(() => {\n pending--;\n if (ended && pending === 0 && !hasError) {\n tryRelease();\n passThrough.end();\n }\n })\n .catch((err: any) => {\n hasError = true;\n tryRelease();\n passThrough.destroy(err);\n });\n return;\n }\n\n passThrough.write(row);\n });\n\n mysqlStream.on(\"end\", () => {\n ended = true;\n if (pending === 0 && !hasError) {\n tryRelease();\n passThrough.end();\n }\n });\n\n mysqlStream.on(\"error\", (err: any) => {\n hasError = true;\n tryRelease();\n passThrough.destroy(err);\n });\n\n passThrough.on(\"close\", () => {\n tryRelease();\n });\n\n return passThrough;\n }\n\n case \"cockroachdb\":\n case \"postgres\": {\n const pgDriver =\n (sqlDataSource.sqlConnection as GetConnectionReturnType<\"postgres\">) ??\n (await sqlDataSource.getPool(\"postgres\").connect());\n\n const pgQueryStreamDriver = await import(\"pg-query-stream\").catch(() => {\n throw new DriverNotFoundError(\"pg-query-stream\");\n });\n\n const passThrough = new PassThrough({\n objectMode: options.objectMode || true,\n highWaterMark: options.highWaterMark,\n }) as PassThrough & AsyncGenerator<AnnotatedModel<M, A, R>>;\n\n const streamQuery = new pgQueryStreamDriver.default(query, params, {\n highWaterMark: options.highWaterMark,\n rowMode: options.rowMode,\n batchSize: options.batchSize,\n types: options.types,\n });\n\n const pgStream = pgDriver.query(streamQuery);\n\n let pending = 0;\n let ended = false;\n let hasError = false;\n\n const tryRelease = (err?: any) => {\n try {\n pgDriver.release(err);\n } catch {}\n };\n\n pgStream.on(\"data\", (row: any) => {\n if (events.onData) {\n pending++;\n Promise.resolve(events.onData(passThrough, row))\n .then(() => {\n pending--;\n if (ended && pending === 0 && !hasError) {\n tryRelease();\n passThrough.end();\n }\n })\n .catch((err: any) => {\n hasError = true;\n tryRelease(err);\n passThrough.destroy(err);\n });\n return;\n }\n\n passThrough.write(row);\n });\n\n pgStream.on(\"end\", () => {\n ended = true;\n if (pending === 0 && !hasError) {\n tryRelease();\n passThrough.end();\n }\n });\n\n pgStream.on(\"error\", (err: any) => {\n hasError = true;\n tryRelease(err);\n passThrough.destroy(err);\n });\n\n return passThrough;\n }\n\n case \"sqlite\": {\n const sqliteDriver =\n (sqlDataSource.sqlConnection as GetConnectionReturnType<\"sqlite\">) ??\n sqlDataSource.getPool(\"sqlite\");\n const stream = new SQLiteStream(sqliteDriver, query, params, {\n onData: events.onData as (\n _passThrough: any,\n row: any,\n ) => void | Promise<void>,\n });\n\n return stream as unknown as PassThrough &\n AsyncGenerator<AnnotatedModel<M, A, R>>;\n }\n\n default:\n throw new HysteriaError(\n \"ExecSqlStreaming\",\n `UNSUPPORTED_DATABASE_TYPE_${sqlType}`,\n );\n }\n};\n\nasync function withRetry<T>(\n fn: () => Promise<T>,\n retryConfig: ConnectionPolicies[\"retry\"] = { maxRetries: 0, delay: 0 },\n logs: boolean = false,\n): Promise<T> {\n let retries = 0;\n const maxRetries = retryConfig.maxRetries || 0;\n const delay = retryConfig.delay || 0;\n\n async function attempt(): Promise<T> {\n try {\n return fn();\n } catch (err: any) {\n if (\n !Object.prototype.hasOwnProperty.call(err, \"code\") ||\n err.code !== \"ECONNREFUSED\"\n ) {\n throw err;\n }\n\n if (retries < maxRetries) {\n retries++;\n logMessage(\n `Retrying sql in ${delay}ms (attempt ${retries}/${maxRetries})`,\n \"info\",\n logs,\n );\n\n await new Promise((resolve) => setTimeout(resolve, delay));\n return attempt();\n }\n\n throw err;\n }\n }\n\n return attempt();\n}\n","import { PassThrough, Readable } from \"node:stream\";\nimport { HysteriaError } from \"../../errors/hysteria_error\";\nimport { AstParser } from \"../ast/parser\";\nimport { InsertNode } from \"../ast/query/node/insert\";\nimport { InterpreterUtils } from \"../interpreter/interpreter_utils\";\nimport { Model } from \"../models/model\";\nimport { AnnotatedModel } from \"../models/model_query_builder/model_query_builder_types\";\nimport { SqlDataSource } from \"../sql_data_source\";\nimport { SqlLiteOptions } from \"./sql_runner_types\";\nimport { FromNode } from \"../ast/query/node/from\";\n\nexport class SQLiteStream extends Readable {\n private db: any;\n private query: string;\n private params: any[];\n private started: boolean;\n private events: {\n onData?: (\n _passThrough: PassThrough & AsyncGenerator<AnnotatedModel<Model, {}, {}>>,\n row: any,\n ) => void | Promise<void>;\n };\n\n constructor(\n db: any,\n query: string,\n params: any[] = [],\n events: {\n onData?: (\n _passThrough: PassThrough &\n AsyncGenerator<AnnotatedModel<Model, {}, {}>>,\n row: any,\n ) => void | Promise<void>;\n },\n ) {\n super({ objectMode: true });\n this.db = db;\n this.query = query;\n this.params = params;\n this.started = false;\n this.events = events;\n }\n\n _read(): void {\n if (this.started) {\n return;\n }\n\n this.started = true;\n this.readRows();\n }\n\n private readRows(): void {\n let pending = 0;\n let ended = false;\n let hasError = false;\n\n this.db.each(\n this.query,\n this.params,\n (err: any, row: any) => {\n if (err) {\n hasError = true;\n this.emit(\"error\", err);\n return;\n }\n\n pending++;\n\n let wroteFlag = false;\n let wroteValue: any;\n\n const mockPassThrough = {\n write: (v: any) => {\n wroteFlag = true;\n wroteValue = v;\n },\n } as PassThrough & AsyncGenerator<AnnotatedModel<Model, {}, {}>>;\n\n Promise.resolve(this.events.onData?.(mockPassThrough, row))\n .then(() => {\n if (hasError) {\n return;\n }\n\n if (wroteFlag) {\n this.push(wroteValue);\n return;\n }\n\n this.push(row);\n })\n .catch((err: any) => {\n hasError = true;\n this.emit(\"error\", err);\n })\n .finally(() => {\n pending--;\n if (ended && pending === 0 && !hasError) {\n this.push(null);\n }\n });\n },\n (err: any) => {\n if (err) {\n hasError = true;\n this.emit(\"error\", err);\n return;\n }\n\n ended = true;\n if (pending === 0 && !hasError) {\n this.push(null);\n }\n },\n );\n }\n}\n\nexport const promisifySqliteQuery = <T extends Model>(\n query: string,\n params: any,\n sqlDataSource: SqlDataSource,\n options: SqlLiteOptions<T>,\n): Promise<number | T | T[]> => {\n const isTransactional = [\n \"begin\",\n \"begin transaction\",\n \"commit\",\n \"rollback\",\n ].includes(query.trim().toLowerCase());\n\n const sqliteDriver =\n options.customConnection ?? sqlDataSource.getPool(\"sqlite\");\n\n if (isTransactional) {\n return new Promise<number>((resolve, reject) => {\n sqliteDriver.run(query, params, function (this: any, err) {\n if (err) {\n reject(err);\n }\n resolve(this.changes);\n });\n });\n }\n\n if (options.mode === \"fetch\") {\n return new Promise<T[]>((resolve, reject) => {\n sqliteDriver.all(query, params, (err, rows) => {\n if (err) {\n reject(err);\n }\n\n if (!rows || !rows.length) {\n resolve([] as T[]);\n }\n\n resolve(rows as T[]);\n });\n });\n }\n\n const typeofModel = options?.typeofModel;\n if (!typeofModel) {\n return new Promise<number>((resolve, reject) => {\n sqliteDriver.run(query, params, function (this: any, err) {\n if (err) {\n reject(new Error(err.message));\n } else {\n resolve(this.changes as number);\n }\n });\n });\n }\n\n const primaryKeyName = typeofModel.primaryKey as string;\n const table = typeofModel.table;\n if (options.mode === \"insertOne\" || options.mode === \"insertMany\") {\n if (options.mode === \"insertOne\") {\n return new Promise<T>((resolve, reject) => {\n sqliteDriver.run(query, params, function (this: any, err: any) {\n if (err) {\n return reject(err);\n }\n\n const inputModel =\n options.models &&\n Array.isArray(options.models) &&\n options.models.length\n ? options.models[0]\n : null;\n\n if (!primaryKeyName) {\n resolve(inputModel as T);\n return;\n }\n\n const lastID = inputModel?.[primaryKeyName as keyof T] || this.lastID;\n\n if (!lastID) {\n return reject(\n new HysteriaError(\n \"SqlRunnerUtils::promisifySqliteQuery\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n ),\n );\n }\n\n const selectQuery = `SELECT * FROM ${table} WHERE ${primaryKeyName} = ?`;\n sqliteDriver.get(selectQuery, [lastID], (err: any, row: T) => {\n if (err) {\n return reject(err);\n }\n\n resolve(row as T);\n });\n });\n });\n }\n\n if (!Array.isArray(options.models)) {\n throw new HysteriaError(\n \"SqlRunnerUtils::massiveInsert models should be an array, report to the maintainers.\",\n \"DEVELOPMENT_ERROR\",\n );\n }\n\n const models = options.models as T[];\n let finalResult: T[] = [];\n return new Promise<T[]>(async (resolve, reject) => {\n try {\n const insertPromises = models.map(async (model) => {\n const interpreterUtils = new InterpreterUtils(typeofModel);\n\n const { columns: preparedColumns, values: preparedValues } =\n await interpreterUtils.prepareColumns(\n Object.keys(model),\n Object.values(model),\n \"insert\",\n );\n\n const preparedModel = Object.fromEntries(\n preparedColumns.map((column, index) => [\n column,\n preparedValues[index],\n ]),\n );\n\n const astParser = new AstParser(\n typeofModel,\n sqlDataSource.getDbType(),\n );\n\n const { sql: query, bindings: params } = astParser.parse([\n new InsertNode(new FromNode(typeofModel.table), [preparedModel]),\n ]);\n\n return new Promise<T>((resolve, reject) => {\n sqliteDriver.run(query, params, function (err: any) {\n if (err) {\n return reject(err);\n }\n\n const lastID = model[primaryKeyName as keyof T] || this.lastID;\n if (!primaryKeyName) {\n resolve(model as T);\n return;\n }\n\n if (!lastID) {\n return reject(\n new HysteriaError(\n \"SqlRunnerUtils::promisifySqliteQuery\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n ),\n );\n }\n\n const selectQuery = `SELECT * FROM ${table} WHERE ${primaryKeyName} = ?`;\n sqliteDriver.get(selectQuery, [lastID], (err: any, row: T) => {\n if (err) {\n return reject(err);\n }\n\n resolve(row as T);\n });\n });\n });\n });\n\n finalResult = await Promise.all(insertPromises);\n resolve(finalResult);\n } catch (err) {\n reject(err);\n }\n });\n }\n\n return new Promise<number>((resolve, reject) => {\n sqliteDriver.run(query, params, function (this: { changes: number }, err) {\n if (err) {\n reject(new Error(err.message));\n } else {\n resolve(this.changes as number);\n }\n });\n });\n};\n","type WithPerformanceResult<R = any> = [string, R];\n\n/**\n * @description executes the async function with a timer to check how long it took\n * @param `returnType` of the performance in milliseconds or seconds\n * @param `fix` Number of digits in the decimal part of the performance result\n * @returns An array with the millis or seconds that the function took as first element, and the result of the async function as second element\n */\nexport const withPerformance =\n <A extends any[], R>(\n fn: (...args: A) => Promise<R>,\n returnType: \"millis\" | \"seconds\" = \"millis\",\n fix = 3,\n ) =>\n async (...args: A): Promise<WithPerformanceResult<R>> => {\n const start = performance.now();\n const res = await fn(...args);\n const elapsed = performance.now() - start;\n\n const value = returnType === \"millis\" ? elapsed : elapsed / 1000;\n return [value.toFixed(fix), res];\n };\n","import { QueryNode } from \"../../query\";\n\nexport class SelectNode extends QueryNode {\n column: string | QueryNode | QueryNode[];\n alias?: string;\n sqlFunction?: string;\n chainsWith = \", \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"select\";\n file = \"select\";\n\n constructor(\n column: string | QueryNode | QueryNode[],\n alias?: string,\n sqlFunction?: string,\n isRaw?: boolean,\n ) {\n super(\"select\");\n this.column = column;\n this.alias = alias;\n this.sqlFunction = sqlFunction;\n this.isRawValue = isRaw ?? false;\n }\n}\n","import { HysteriaError } from \"../../../errors/hysteria_error\";\nimport { SqlDataSource } from \"../../sql_data_source\";\nimport { SqlDataSourceType } from \"../../sql_data_source_types\";\nimport { getRelations } from \"../decorators/model_decorators\";\nimport { Model } from \"../model\";\nimport { Relation } from \"../relations/relation\";\nimport { ModelRelation } from \"./model_manager_types\";\n\nexport default class SqlModelManagerUtils<T extends Model> {\n protected dbType: SqlDataSourceType;\n protected sqlDataSource: SqlDataSource;\n protected modelRelations: Relation[];\n protected modelRelationsMap: Map<string, Relation>;\n\n constructor(\n typeofModel: typeof Model,\n dbType: SqlDataSourceType,\n sqlDataSource: SqlDataSource,\n ) {\n this.dbType = dbType;\n this.sqlDataSource = sqlDataSource;\n this.modelRelations = getRelations(typeofModel);\n this.modelRelationsMap = new Map(\n this.modelRelations.map((relation) => [relation.columnName, relation]),\n );\n }\n\n getRelationFromModel(relation: ModelRelation<T>): Relation {\n const modelRelation = this.modelRelationsMap.get(relation.toString());\n if (!modelRelation) {\n throw new HysteriaError(\n \"SqlModelManagerUtils::getRelationFromModel\",\n `RELATION_NOT_FOUND_IN_MODEL_${relation.toString()}`,\n );\n }\n\n return modelRelation;\n }\n}\n","import { Model } from \"./models/model\";\nimport { AnnotatedModel } from \"./models/model_query_builder/model_query_builder_types\";\n\nexport type PaginationMetadata = {\n perPage: number;\n currentPage: number;\n firstPage: number;\n isEmpty: boolean;\n total: number;\n lastPage: number;\n hasMorePages: boolean;\n hasPages: boolean;\n};\n\nexport type CursorPaginationMetadata = {\n perPage: number;\n firstPage: number;\n isEmpty: boolean;\n total: number;\n};\n\nexport type PaginatedData<\n T extends Model,\n A extends object = {},\n R extends object = {},\n> = {\n paginationMetadata: PaginationMetadata;\n data: AnnotatedModel<T, A, R>[];\n};\n\nexport type CursorPaginatedData<\n T extends Model,\n A extends object = {},\n R extends object = {},\n> = {\n paginationMetadata: CursorPaginationMetadata;\n data: AnnotatedModel<T, A, R>[];\n};\n\nexport function getPaginationMetadata(\n page: number,\n limit: number,\n total: number,\n): PaginationMetadata {\n return {\n total: total,\n perPage: limit,\n currentPage: page,\n firstPage: 1,\n isEmpty: total === 0,\n lastPage: Math.max(1, Math.ceil(total / limit)),\n hasMorePages: page < Math.max(1, Math.ceil(total / limit)),\n hasPages: total > limit,\n };\n}\n\nexport function getCursorPaginationMetadata(\n limit: number,\n total: number,\n): CursorPaginationMetadata {\n return {\n perPage: limit,\n total: total,\n firstPage: 1,\n isEmpty: total === 0,\n };\n}\n","export type PickMethods<T, K extends keyof T> = {\n [P in K]: T[P];\n};\n\nexport const coerceToNumber = (value: string | number): number => {\n if (typeof value === \"number\") {\n return value;\n }\n\n return parseFloat(value);\n};\n","import { QueryNode } from \"../../query\";\n\nexport type BaseValues = string | number | boolean | null;\n\nexport type BinaryOperatorType =\n | \"=\"\n | \"!=\"\n | \"<>\"\n | \">\"\n | \"<\"\n | \">=\"\n | \"<=\"\n | \"like\"\n | \"ilike\"\n | \"in\";\n\nexport class HavingNode extends QueryNode {\n column: string;\n isNegated: boolean;\n operator: BinaryOperatorType;\n value: BaseValues | BaseValues[];\n chainsWith: \"and\" | \"or\" = \"and\";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"having\";\n file = \"having\";\n\n constructor(\n column: string,\n chainsWith: \"and\" | \"or\",\n isNegated: boolean = false,\n operator: BinaryOperatorType,\n value: BaseValues | BaseValues[],\n isRawValue: boolean = false,\n ) {\n super(\"having\", isRawValue);\n this.column = column;\n this.chainsWith = `${chainsWith} ` as \"and\" | \"or\";\n this.isNegated = isNegated;\n this.operator = operator;\n this.value = value;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class DistinctNode extends QueryNode {\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"distinct\";\n file = \"distinct\";\n\n constructor() {\n super(\"distinct\");\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class DistinctOnNode extends QueryNode {\n columns: string[];\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"distinctOn\";\n file = \"distinct_on\";\n\n constructor(columns: string[]) {\n super(\"select\");\n this.columns = columns;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class JoinNode extends QueryNode {\n table: string;\n left: string;\n right: string;\n on?: { left?: string; right?: string; operator: string };\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = true;\n folder = \"join\";\n file = \"join\";\n type: \"inner\" | \"left\" | \"right\" | \"full\" | \"cross\" | \"natural\" = \"inner\";\n\n constructor(\n table: string,\n left: string,\n right: string,\n type: \"inner\" | \"left\" | \"right\" | \"full\" | \"cross\" | \"natural\" = \"inner\",\n on: { left?: string; right?: string; operator: string },\n isRawValue: boolean = false,\n ) {\n super(`${type} join`, isRawValue);\n this.table = table;\n this.left = left;\n this.right = right;\n this.on = on;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class GroupByNode extends QueryNode {\n column: string;\n chainsWith = \", \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"group_by\";\n file = \"group_by\";\n\n constructor(column: string, isRawValue: boolean = false) {\n super(\"group by\", isRawValue);\n this.column = column;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class LimitNode extends QueryNode {\n limit: number;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"limit\";\n file = \"limit\";\n\n constructor(limit: number) {\n super(\"limit\");\n this.limit = limit;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class OffsetNode extends QueryNode {\n offset: number;\n chainsWith = \" \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"offset\";\n file = \"offset\";\n\n constructor(offset: number) {\n super(\"offset\");\n this.offset = offset;\n }\n}\n","import { QueryNode } from \"../../query\";\n\nexport class OrderByNode extends QueryNode {\n column: string;\n direction: \"asc\" | \"desc\";\n chainsWith = \", \";\n canKeywordBeSeenMultipleTimes = false;\n folder = \"order_by\";\n file = \"order_by\";\n\n constructor(\n column: string,\n direction: \"asc\" | \"desc\" = \"asc\",\n isRawValue: boolean = false,\n ) {\n super(\"order by\", isRawValue);\n this.column = column;\n this.direction = direction;\n }\n}\n","import logger from \"../../utils/logger\";\nimport { GroupByNode } from \"../ast/query/node/group_by/group_by\";\nimport { LimitNode } from \"../ast/query/node/limit/limit\";\nimport { OffsetNode } from \"../ast/query/node/offset/offset\";\nimport { OrderByNode } from \"../ast/query/node/order_by/order_by\";\nimport { ColumnType } from \"../models/decorators/model_decorators_types\";\nimport { Model } from \"../models/model\";\nimport type {\n ModelKey,\n OrderByChoices,\n} from \"../models/model_manager/model_manager_types\";\nimport { SqlDataSource } from \"../sql_data_source\";\nimport { SelectableColumn } from \"./query_builder_types\";\n\nexport abstract class FooterQueryBuilder<T extends Model> {\n protected sqlDataSource: SqlDataSource;\n protected model: typeof Model;\n protected groupByNodes: GroupByNode[];\n protected orderByNodes: OrderByNode[];\n protected limitNode: LimitNode | null;\n protected offsetNode: OffsetNode | null;\n protected modelColumns: ColumnType[];\n protected modelColumnsMap: Map<string, ColumnType>;\n protected logs: boolean;\n\n protected constructor(model: typeof Model, sqlDataSource: SqlDataSource) {\n this.model = model;\n this.sqlDataSource = sqlDataSource;\n this.groupByNodes = [];\n this.orderByNodes = [];\n this.limitNode = null;\n this.offsetNode = null;\n this.logs = this.sqlDataSource.logs;\n const getColumnsFn = (this.model as any)?.getColumns;\n this.modelColumns =\n typeof getColumnsFn === \"function\" ? getColumnsFn.call(this.model) : [];\n this.modelColumnsMap = new Map(\n this.modelColumns.map((modelColumn) => [\n modelColumn.columnName,\n modelColumn,\n ]),\n );\n }\n\n /**\n * @description Clears the group by query\n */\n clearGroupBy(): this {\n this.groupByNodes = [];\n return this;\n }\n\n /**\n * @description Clears the order by query\n */\n clearOrderBy(): this {\n this.orderByNodes = [];\n return this;\n }\n\n /**\n * @description Clears the limit query\n */\n clearLimit(): this {\n this.limitNode = null;\n return this;\n }\n\n /**\n * @description Clears the offset query\n */\n clearOffset(): this {\n this.offsetNode = null;\n return this;\n }\n\n /**\n * @description Adds a group by query\n */\n groupBy(...columns: ModelKey<T>[]): this;\n groupBy<S extends string>(...columns: SelectableColumn<S>[]): this;\n groupBy(...columns: (ModelKey<T> | SelectableColumn<string>)[]): this {\n columns.forEach((column) => {\n this.groupByNodes.push(new GroupByNode(column as string));\n });\n\n return this;\n }\n\n /**\n * @description Adds a raw group by query, GROUP BY clause is not necessary and will be added automatically\n */\n groupByRaw(query: string): this {\n this.groupByNodes.push(new GroupByNode(query, true));\n return this;\n }\n\n /**\n * @description Adds an order by query\n */\n orderBy(column: ModelKey<T>, order: OrderByChoices): this;\n orderBy<S extends string>(\n column: SelectableColumn<S>,\n order: OrderByChoices,\n ): this;\n orderBy(\n column: ModelKey<T> | SelectableColumn<string>,\n order: OrderByChoices,\n ): this {\n this.orderByNodes.push(new OrderByNode(column as string, order));\n return this;\n }\n\n /**\n * @description Adds a raw order by query, ORDER BY clause is not necessary and will be added automatically\n */\n orderByRaw(query: string): this {\n this.orderByNodes.push(new OrderByNode(query, \"asc\", true));\n return this;\n }\n\n /**\n * @description Adds a limit query\n */\n limit(limit: number): this {\n if (typeof limit !== \"number\") {\n logger.warn(\n `${this.model.name}::limit Non numeric value provided to \\`limit\\``,\n );\n }\n\n this.limitNode = new LimitNode(limit);\n return this;\n }\n\n /**\n * @description Adds an offset query\n */\n offset(offset: number): this {\n if (typeof offset !== \"number\") {\n logger.warn(\n `${this.model.name}::offset Non numeric value provided to \\`offset\\``,\n );\n }\n\n this.offsetNode = new OffsetNode(offset);\n return this;\n }\n}\n","import { HysteriaError } from \"../../errors/hysteria_error\";\nimport { JoinNode } from \"../ast/query/node/join\";\nimport { BinaryOperatorType } from \"../ast/query/node/where\";\nimport { Model } from \"../models/model\";\nimport { ModelKey } from \"../models/model_manager/model_manager_types\";\nimport { SqlDataSource } from \"../sql_data_source\";\nimport { FooterQueryBuilder } from \"./footer_query_builder\";\nimport { JoinableColumn } from \"./query_builder_types\";\n\nexport abstract class JoinQueryBuilder<\n T extends Model,\n> extends FooterQueryBuilder<T> {\n protected joinNodes: JoinNode[];\n protected constructor(model: typeof Model, sqlDataSource: SqlDataSource) {\n super(model, sqlDataSource);\n this.joinNodes = [];\n }\n\n /**\n * @description Clear the join query\n */\n clearJoin(): this {\n this.joinNodes = [];\n return this;\n }\n\n /**\n * @description Join a table with the current model, join clause is not necessary and will be added automatically\n */\n joinRaw(query: string): this {\n this.joinNodes.push(\n new JoinNode(\n query,\n \"\",\n \"\",\n \"inner\",\n {\n operator: \"=\",\n },\n true,\n ),\n );\n return this;\n }\n\n /**\n * @description Join a table with the current model, join clause is not necessary and will be added automatically\n */\n leftJoinRaw(query: string): this {\n this.joinNodes.push(\n new JoinNode(\n query,\n \"\",\n \"\",\n \"left\",\n {\n operator: \"=\",\n },\n true,\n ),\n );\n return this;\n }\n\n /**\n * @description Join a table with the current model, join clause is not necessary and will be added automatically\n */\n rightJoinRaw(query: string): this {\n this.joinNodes.push(\n new JoinNode(\n query,\n \"\",\n \"\",\n \"right\",\n {\n operator: \"=\",\n },\n true,\n ),\n );\n return this;\n }\n\n /**\n * @description Join a table with the current model, join clause is not necessary and will be added automatically\n */\n fullJoinRaw(query: string): this {\n this.joinNodes.push(\n new JoinNode(query, \"\", \"\", \"full\", { operator: \"=\" }, true),\n );\n\n return this;\n }\n\n /**\n * @description Join a table with the current model, join clause is not necessary and will be added automatically\n */\n crossJoinRaw(query: string): this {\n this.joinNodes.push(\n new JoinNode(query, \"\", \"\", \"cross\", { operator: \"=\" }, true),\n );\n\n return this;\n }\n\n /**\n * @description Join a table with the current model, join clause is not necessary and will be added automatically\n */\n naturalJoinRaw(query: string): this {\n this.joinNodes.push(\n new JoinNode(query, \"\", \"\", \"natural\", { operator: \"=\" }, true),\n );\n\n return this;\n }\n\n /**\n * @alias join\n * @param relationTable - The table to join\n * @param referencingColumn - The column to reference from the relation table, must be in the format of `table.column`\n * @param primaryColumn - The primary column of the current model, default is caller model primary key if using a Model, if using a Raw Query Builder you must provide the key for the primary table, must be in the format of `table.column`\n * @param operator - The comparison operator to use in the ON clause (default: \"=\")\n */\n innerJoin(\n relationTable: string,\n referencingColumn: JoinableColumn,\n primaryColumn: JoinableColumn,\n operator?: BinaryOperatorType,\n ): this;\n innerJoin(\n relationTable: string,\n referencingColumn: JoinableColumn,\n primaryColumn?: JoinableColumn,\n operator?: BinaryOperatorType,\n ): this;\n innerJoin<R extends typeof Model>(\n relationModel: R,\n referencingColumn: ModelKey<InstanceType<R>>,\n primaryColumn: ModelKey<T>,\n operator?: BinaryOperatorType,\n ): this;\n innerJoin<R extends typeof Model>(\n relationModel: R,\n referencingColumn: ModelKey<InstanceType<R>>,\n primaryColumn?: ModelKey<T>,\n operator?: BinaryOperatorType,\n ): this;\n innerJoin<R extends typeof Model>(\n relationTable: string | R,\n referencingColumnOrPrimaryColumn:\n | JoinableColumn\n | ModelKey<InstanceType<R>>\n | ModelKey<T>,\n primaryColumn?: JoinableColumn | ModelKey<T>,\n operator?: BinaryOperatorType,\n ): this {\n let primaryColumnValue: string | ModelKey<T> | undefined = primaryColumn;\n const op: BinaryOperatorType | undefined = operator;\n\n if (!primaryColumnValue) {\n if (!this.model.primaryKey) {\n throw new HysteriaError(\n \"JoinQueryBuilder::join\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n primaryColumnValue = `${this.model.table}.${this.model.primaryKey}`;\n }\n\n this.join(\n typeof relationTable === \"string\" ? relationTable : relationTable.table,\n referencingColumnOrPrimaryColumn as JoinableColumn,\n primaryColumnValue as JoinableColumn,\n op,\n );\n\n return this;\n }\n\n /**\n * @description Join a table with the current model\n * @param relationTable - The table to join\n * @param referencingColumn - The column to reference from the relation table, must be in the format of `table.column`\n * @param primaryColumn - The primary column of the current model, default is caller model primary key if using a Model, if using a Raw Query Builder you must provide the key for the primary table, must be in the format of `table.column`\n * @param operator - The comparison operator to use in the ON clause (default: \"=\")\n */\n join(\n relationTable: string,\n referencingColumn: JoinableColumn,\n primaryColumn: JoinableColumn,\n operator?: BinaryOperatorType,\n ): this;\n join(\n relationTable: string,\n referencingColumn: JoinableColumn,\n primaryColumn?: JoinableColumn,\n operator?: BinaryOperatorType,\n ): this;\n join<R extends typeof Model>(\n relationModel: R,\n referencingColumn: ModelKey<InstanceType<R>>,\n primaryColumn: ModelKey<T>,\n operator?: BinaryOperatorType,\n ): this;\n join<R extends typeof Model>(\n relationModel: R,\n referencingColumn: ModelKey<InstanceType<R>>,\n primaryColumn?: ModelKey<T>,\n operator?: BinaryOperatorType,\n ): this;\n join<R extends typeof Model>(\n relationTable: string | R,\n referencingColumnOrPrimaryColumn:\n | JoinableColumn\n | ModelKey<InstanceType<R>>\n | ModelKey<T>,\n primaryColumn?: JoinableColumn | ModelKey<T>,\n operator?: BinaryOperatorType,\n ): this {\n let primaryColumnValue: string | ModelKey<T> | undefined = primaryColumn;\n const op: BinaryOperatorType | undefined = operator;\n\n if (!primaryColumnValue) {\n if (!this.model.primaryKey) {\n throw new HysteriaError(\n \"JoinQueryBuilder::join\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n primaryColumnValue = `${this.model.table}.${this.model.primaryKey}`;\n }\n\n this.joinNodes.push(\n new JoinNode(\n typeof relationTable === \"string\" ? relationTable : relationTable.table,\n referencingColumnOrPrimaryColumn as string,\n primaryColumnValue as string,\n \"inner\",\n {\n operator: op || \"=\",\n },\n ),\n );\n return this;\n }\n\n /**\n * @description Join a table with the current model\n * @param relationTable - The table to join\n * @param referencingColumn - The column to reference from the relation table, must be in the format of `table.column`\n * @param primaryColumn - The primary column of the current model, default is caller model primary key if using a Model, if using a Raw Query Builder you must provide the key for the primary table, must be in the format of `table.column`\n * @param operator - The comparison operator to use in the ON clause (default: \"=\")\n */\n leftJoin(\n relationTable: string,\n referencingColumn: JoinableColumn,\n primaryColumn: JoinableColumn,\n operator?: BinaryOperatorType,\n ): this;\n leftJoin(\n relationTable: string,\n referencingColumn: JoinableColumn,\n primaryColumn?: JoinableColumn,\n operator?: BinaryOperatorType,\n ): this;\n leftJoin<R extends typeof Model>(\n relationModel: R,\n referencingColumn: ModelKey<InstanceType<R>>,\n primaryColumn: ModelKey<T>,\n operator?: BinaryOperatorType,\n ): this;\n leftJoin<R extends typeof Model>(\n relationModel: R,\n referencingColumn: ModelKey<InstanceType<R>>,\n primaryColumn?: ModelKey<T>,\n operator?: BinaryOperatorType,\n ): this;\n leftJoin<R extends typeof Model>(\n relationTable: string | R,\n referencingColumnOrPrimaryColumn:\n | JoinableColumn\n | ModelKey<InstanceType<R>>\n | ModelKey<T>,\n primaryColumn?: JoinableColumn | ModelKey<T>,\n operator?: BinaryOperatorType,\n ): this {\n let primaryColumnValue: string | ModelKey<T> | undefined = primaryColumn;\n const op: BinaryOperatorType | undefined = operator;\n\n if (!primaryColumnValue) {\n if (!this.model.primaryKey) {\n throw new HysteriaError(\n \"JoinQueryBuilder::join\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n primaryColumnValue = `${this.model.table}.${this.model.primaryKey}`;\n }\n\n this.joinNodes.push(\n new JoinNode(\n typeof relationTable === \"string\" ? relationTable : relationTable.table,\n referencingColumnOrPrimaryColumn as string,\n primaryColumnValue as string,\n \"left\",\n {\n operator: op || \"=\",\n },\n ),\n );\n return this;\n }\n\n /**\n * @description Join a table with the current model\n * @param relationTable - The table to join\n * @param referencingColumn - The column to reference from the relation table\n * @param primaryColumn - The primary column of the current model, default is caller model primary key if using A Model, if using a Raw Query Builder you must provide the key for the primary table\n * @param operator - The comparison operator to use in the ON clause (default: \"=\")\n */\n rightJoin(\n relationTable: string,\n referencingColumnOrPrimaryColumn: JoinableColumn,\n primaryColumn: JoinableColumn,\n operator?: BinaryOperatorType,\n ): this;\n rightJoin(\n relationTable: string,\n referencingColumnOrPrimaryColumn: JoinableColumn,\n primaryColumn?: JoinableColumn,\n operator?: BinaryOperatorType,\n ): this;\n rightJoin<R extends typeof Model>(\n relationTable: string | R,\n referencingColumnOrPrimaryColumn:\n | ModelKey<InstanceType<R>>\n | JoinableColumn\n | ModelKey<T>,\n primaryColumn?: JoinableColumn | ModelKey<T>,\n operator?: BinaryOperatorType,\n ): this {\n let primaryColumnValue: string | ModelKey<T> | undefined = primaryColumn;\n const op: BinaryOperatorType | undefined = operator;\n\n if (!primaryColumnValue) {\n if (!this.model.primaryKey) {\n throw new HysteriaError(\n \"JoinQueryBuilder::join\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n primaryColumnValue = `${this.model.table}.${this.model.primaryKey}`;\n }\n\n this.joinNodes.push(\n new JoinNode(\n typeof relationTable === \"string\" ? relationTable : relationTable.table,\n referencingColumnOrPrimaryColumn as string,\n primaryColumnValue as string,\n \"right\",\n {\n operator: op || \"=\",\n },\n ),\n );\n return this;\n }\n\n /**\n * @description Perform a FULL OUTER JOIN with another table\n * @param relationTable - The table to join\n * @param referencingColumn - The column to reference from the relation table\n * @param primaryColumn - The primary column of the current model\n * @param operator - The comparison operator to use in the ON clause (default: \"=\")\n */\n fullJoin(\n relationTable: string,\n referencingColumnOrPrimaryColumn: JoinableColumn,\n primaryColumn: JoinableColumn,\n operator?: BinaryOperatorType,\n ): this;\n fullJoin(\n relationTable: string,\n referencingColumnOrPrimaryColumn: JoinableColumn,\n primaryColumn?: JoinableColumn,\n operator?: BinaryOperatorType,\n ): this;\n fullJoin<R extends typeof Model>(\n relationTable: string | R,\n referencingColumnOrPrimaryColumn:\n | ModelKey<InstanceType<R>>\n | JoinableColumn\n | ModelKey<T>,\n primaryColumn?: JoinableColumn | ModelKey<T>,\n operator?: BinaryOperatorType,\n ): this {\n let primaryColumnValue: string | ModelKey<T> | undefined = primaryColumn;\n const op: BinaryOperatorType | undefined = operator;\n\n if (!primaryColumnValue) {\n if (!this.model.primaryKey) {\n throw new HysteriaError(\n \"JoinQueryBuilder::join\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n primaryColumnValue = `${this.model.table}.${this.model.primaryKey}`;\n }\n\n this.joinNodes.push(\n new JoinNode(\n typeof relationTable === \"string\" ? relationTable : relationTable.table,\n referencingColumnOrPrimaryColumn as string,\n primaryColumnValue as string,\n \"full\",\n {\n operator: op || \"=\",\n },\n ),\n );\n return this;\n }\n}\n","import { convertCase } from \"../../utils/case_utils\";\nimport { DistinctNode } from \"../ast/query/node/distinct/distinct\";\nimport { DistinctOnNode } from \"../ast/query/node/distinct/distinct_on\";\nimport { FromNode } from \"../ast/query/node/from/from\";\nimport { SelectNode } from \"../ast/query/node/select/basic_select\";\nimport { SqlMethod } from \"../ast/query/node/select/select_types\";\nimport { Model } from \"../models/model\";\nimport { ModelKey } from \"../models/model_manager/model_manager_types\";\nimport { SqlDataSource } from \"../sql_data_source\";\nimport { SqlDataSourceType, TableFormat } from \"../sql_data_source_types\";\nimport { JoinQueryBuilder } from \"./join_query_builder\";\nimport { SelectableColumn } from \"./query_builder_types\";\n\nexport class SelectQueryBuilder<T extends Model> extends JoinQueryBuilder<T> {\n protected dbType: SqlDataSourceType;\n protected modelSelectedColumns: string[] = [];\n protected modelAnnotatedColumns: string[] = [];\n protected withQuery?: string;\n protected fromNode: FromNode;\n protected distinctNode: DistinctNode | null;\n protected distinctOnNode: DistinctOnNode | null;\n protected selectNodes: SelectNode[];\n\n constructor(model: typeof Model, sqlDataSource: SqlDataSource) {\n super(model, sqlDataSource);\n this.dbType = sqlDataSource.getDbType();\n this.fromNode = new FromNode(this.model.table || \"\");\n this.distinctNode = null;\n this.distinctOnNode = null;\n this.selectNodes = [];\n }\n\n /**\n * @description Adds a SELECT condition to the query.\n * @description Can be stacked multiple times\n * @warning For annotations, use the `annotate` method instead, aliases and methods are not supported in the select method and will give error `column \"${columnName} as ${alias}\" does not exist`\n * @example\n * ```ts\n * const user = await User.query().select(\"name\", \"age\").first(); // SELECT name, age FROM users\n * const user = await User.query().select(\"name\", \"users.age\").first(); // SELECT name, users.age FROM users\n * ```\n */\n select<S extends string>(...columns: SelectableColumn<S>[]): this;\n select(...columns: (ModelKey<T> | \"*\")[]): this;\n select<S extends string>(\n ...columns: (ModelKey<T> | \"*\" | SelectableColumn<S>)[]\n ): this {\n this.modelSelectedColumns = [\n ...this.modelSelectedColumns,\n ...(columns as string[]),\n ];\n\n const casedColumns = columns.map((column) =>\n convertCase(column as string, this.model.databaseCaseConvention),\n );\n\n casedColumns.forEach((column) => {\n this.selectNodes.push(new SelectNode(column));\n });\n\n return this;\n }\n\n /**\n * @description Adds a raw select statement to the query\n * @warning For models, only annotated columns are available and will be added to the `$annotations` property of the model. Everything else will be ignored, if you need a query like `selectRaw` you can use the `QueryBuilder` instead.\n */\n selectRaw(statement: string): this {\n this.selectNodes.push(\n new SelectNode(statement, undefined, undefined, true),\n );\n return this;\n }\n\n /**\n * @description Clears the SELECT clause\n */\n clearSelect(): this {\n this.modelSelectedColumns = [];\n this.selectNodes = [];\n return this;\n }\n\n /**\n * @description Clears the FROM clause\n */\n clearFrom(): this {\n this.fromNode = new FromNode(this.model.table || \"\");\n return this;\n }\n\n /**\n * @description Clears the DISTINCT clause\n */\n clearDistinct(): this {\n this.distinctNode = null;\n return this;\n }\n\n /**\n * @description Clears the DISTINCT ON clause\n */\n clearDistinctOn(): this {\n this.distinctOnNode = null;\n return this;\n }\n\n /**\n * @description Annotates a column with a SQL method or a simple alias\n * @description If using a model, the result will be available in the $annotations property of the model, else it will be available in the result of the query\n * @example\n * ```ts\n * const user = await User.query().annotate(\"max\", \"id\", \"maxId\").first(); // max(id) as maxId\n * const user = await User.query().annotate(\"id\", \"superId\").first(); // id as superId\n * const user = await User.query().annotate(\"id\", \"superId\").first(); // id as superId\n * ```\n */\n annotate(column: string, alias: string): this;\n annotate(sqlMethod: SqlMethod, column: string, alias: string): this;\n annotate(sqlMethod: string, column: string, alias: string): this;\n annotate(\n sqlMethodOrColumn: string | SqlMethod,\n columnOrAlias: string,\n maybeAlias?: string,\n ): this {\n let sqlMethod: string | undefined;\n let column: string;\n let alias: string;\n\n if (maybeAlias) {\n sqlMethod = sqlMethodOrColumn;\n column = columnOrAlias;\n alias = maybeAlias;\n } else {\n sqlMethod = undefined;\n column = sqlMethodOrColumn as string;\n alias = columnOrAlias;\n }\n\n this.selectNodes.push(new SelectNode(column, alias, sqlMethod));\n this.modelAnnotatedColumns.push(alias);\n\n return this;\n }\n\n /**\n * @description Sets the table to select from, by default is the table defined in the Model\n * @description Can be used on non select queries too, it will only specify the table name (es. INSERT INTO $table)\n * @param table The table name to query from, must be in valid sql format `table` or `table as alias`\n */\n from<S extends string>(table: TableFormat<S>): this {\n this.fromNode = new FromNode(table);\n return this;\n }\n\n /**\n * @description Sets the table to select from, by default is the table defined in the Model\n * @description Better naming convention for non select queries\n * @alias from\n */\n table(table: string): this {\n this.fromNode = new FromNode(table);\n return this;\n }\n\n /**\n * @description Adds a DISTINCT clause to the query\n */\n distinct(): this {\n this.distinctNode = new DistinctNode();\n return this;\n }\n\n /**\n * @description Adds a DISTINCT ON clause to the query, does not stack, only the last one will be used\n * @warning Cannot use both DISTINCT and DISTINCT ON in the same query, only the DISTINCT ON will be used\n * @postgresql Only usable with PostgreSQL\n */\n distinctOn(...columns: ModelKey<T>[]): this;\n distinctOn<S extends string>(...columns: SelectableColumn<S>[]): this;\n distinctOn<S extends string>(\n ...columns: (ModelKey<T> | SelectableColumn<S>)[]\n ): this {\n this.distinctOnNode = new DistinctOnNode(columns as string[]);\n return this;\n }\n}\n","import { HavingNode } from \"../ast/query/node/having\";\nimport type {\n BaseValues,\n BinaryOperatorType,\n} from \"../ast/query/node/where/where\";\nimport { WhereNode } from \"../ast/query/node/where/where\";\nimport { WhereGroupNode } from \"../ast/query/node/where/where_group\";\nimport type { SubqueryOperatorType } from \"../ast/query/node/where/where_subquery\";\nimport { WhereSubqueryNode } from \"../ast/query/node/where/where_subquery\";\nimport { Model } from \"../models/model\";\nimport type { ModelKey } from \"../models/model_manager/model_manager_types\";\nimport { SqlDataSource } from \"../sql_data_source\";\nimport { QueryBuilder } from \"./query_builder\";\nimport type { WhereOnlyQueryBuilder } from \"./query_builder_types\";\nimport { SelectableColumn } from \"./query_builder_types\";\nimport { SelectQueryBuilder } from \"./select_query_builder\";\n\nexport abstract class WhereQueryBuilder<\n T extends Model,\n> extends SelectQueryBuilder<T> {\n protected whereNodes: (WhereNode | WhereGroupNode | WhereSubqueryNode)[];\n protected havingNodes: HavingNode[];\n protected isNestedCondition = false;\n\n constructor(\n model: typeof Model,\n sqlDataSource: SqlDataSource,\n isNestedCondition = false,\n ) {\n super(model, sqlDataSource);\n this.whereNodes = [];\n this.havingNodes = [];\n this.isNestedCondition = isNestedCondition;\n }\n\n clearWhere(): this {\n this.whereNodes = [];\n return this;\n }\n\n clearHaving(): this {\n this.havingNodes = [];\n return this;\n }\n\n /**\n * @description Accepts a value and executes a callback only of the value is not null or undefined.\n * @warning The value is not checked for truthiness but existence, it is only checked for undefined or null. So false, 0, \"\", etc. will be considered truthy.\n */\n strictWhen(value: any, cb: (query: this) => void): this {\n if (value === undefined || value === null) {\n return this;\n }\n\n cb(this);\n return this;\n }\n\n /**\n * @description Accepts a value and executes a callback only of the value is not falsy.\n * @warning The value is checked for truthiness, so false, 0, \"\", etc. will be considered falsy. Use strictWhen for null or undefined only cases.\n */\n when(value: any, cb: (query: this) => void): this {\n if (!value) {\n return this;\n }\n\n cb(this);\n return this;\n }\n\n /**\n * @description Adds a WHERE condition to the query.\n */\n where(\n column: ModelKey<T>,\n operator: BinaryOperatorType,\n value: BaseValues,\n ): this;\n where<S extends string>(\n column: SelectableColumn<S>,\n operator: BinaryOperatorType,\n value: BaseValues,\n ): this;\n where(cb: (queryBuilder: WhereOnlyQueryBuilder<T>) => void): this;\n where(\n column: ModelKey<T> | SelectableColumn<string>,\n subQuery: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): this;\n where(\n column: ModelKey<T> | SelectableColumn<string>,\n operator: SubqueryOperatorType,\n subQuery: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): this;\n where(\n column: ModelKey<T> | SelectableColumn<string>,\n value: BaseValues,\n ): this;\n where(\n columnOrCb:\n | ModelKey<T>\n | SelectableColumn<string>\n | ((queryBuilder: WhereOnlyQueryBuilder<T>) => void),\n operatorOrValue?:\n | BinaryOperatorType\n | BaseValues\n | SubqueryOperatorType\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n value?:\n | BaseValues\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n ): this {\n if (typeof columnOrCb === \"function\") {\n return this.andWhereGroup(\n columnOrCb as unknown as (qb: WhereQueryBuilder<T>) => void,\n );\n }\n\n if (typeof operatorOrValue === \"function\" && value === undefined) {\n return this.andWhereSubQuery(\n columnOrCb as string,\n \"in\",\n operatorOrValue as (subQuery: QueryBuilder<T>) => void,\n );\n }\n\n if (operatorOrValue instanceof QueryBuilder && value === undefined) {\n return this.andWhereSubQuery(\n columnOrCb as string,\n \"in\",\n operatorOrValue as QueryBuilder<T>,\n );\n }\n\n if (\n typeof operatorOrValue === \"string\" &&\n (operatorOrValue as string) !== \"=\" &&\n value !== undefined &&\n (value instanceof QueryBuilder || typeof value === \"function\")\n ) {\n return this.andWhereSubQuery(\n columnOrCb as string,\n operatorOrValue as SubqueryOperatorType,\n value as QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n );\n }\n\n return this.andWhere(\n columnOrCb as ModelKey<T>,\n operatorOrValue as BinaryOperatorType,\n value as BaseValues,\n );\n }\n\n /**\n * @description Adds an AND WHERE condition to the query.\n */\n andWhere(\n column: ModelKey<T>,\n operator: BinaryOperatorType,\n value: BaseValues,\n ): this;\n andWhere(\n column: SelectableColumn<string>,\n operator: BinaryOperatorType,\n value: BaseValues,\n ): this;\n andWhere(\n column: ModelKey<T> | SelectableColumn<string>,\n value: BaseValues,\n ): this;\n andWhere(cb: (queryBuilder: WhereOnlyQueryBuilder<T>) => void): this;\n andWhere(\n column: ModelKey<T> | SelectableColumn<string>,\n subQuery: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): this;\n andWhere(\n column: ModelKey<T> | SelectableColumn<string>,\n operator: SubqueryOperatorType,\n subQuery: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): this;\n andWhere<S extends string>(\n columnOrCb:\n | ModelKey<T>\n | SelectableColumn<S>\n | ((queryBuilder: WhereQueryBuilder<T>) => void),\n operatorOrValue?:\n | BinaryOperatorType\n | BaseValues\n | SubqueryOperatorType\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n value?:\n | BaseValues\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n ): this {\n if (typeof columnOrCb === \"function\") {\n return this.andWhereGroup(\n columnOrCb as (qb: WhereQueryBuilder<T>) => void,\n );\n }\n\n if (typeof operatorOrValue === \"function\" && value === undefined) {\n return this.andWhereSubQuery(\n columnOrCb as string,\n \"in\",\n operatorOrValue as (subQuery: QueryBuilder<T>) => void,\n );\n }\n\n if (operatorOrValue instanceof QueryBuilder && value === undefined) {\n return this.andWhereSubQuery(\n columnOrCb as string,\n \"in\",\n operatorOrValue as QueryBuilder<T>,\n );\n }\n\n if (\n typeof operatorOrValue === \"string\" &&\n (operatorOrValue as string) !== \"=\" &&\n value !== undefined &&\n (value instanceof QueryBuilder || typeof value === \"function\")\n ) {\n return this.andWhereSubQuery(\n columnOrCb as string,\n operatorOrValue as SubqueryOperatorType,\n value as QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n );\n }\n\n let operator: BinaryOperatorType = \"=\";\n let actualValue: BaseValues;\n\n if (\n typeof operatorOrValue === \"string\" &&\n value !== undefined &&\n !(value instanceof QueryBuilder) &&\n typeof value !== \"function\"\n ) {\n operator = operatorOrValue as BinaryOperatorType;\n actualValue = value as BaseValues;\n } else {\n actualValue = operatorOrValue as BaseValues;\n operator = \"=\";\n }\n\n this.whereNodes.push(\n new WhereNode(columnOrCb as string, \"and\", false, operator, actualValue),\n );\n return this;\n }\n\n /**\n * @description Adds an OR WHERE condition to the query.\n */\n orWhere(\n column: ModelKey<T>,\n operator: BinaryOperatorType,\n value: BaseValues,\n ): this;\n orWhere<S extends string>(\n column: SelectableColumn<S>,\n operator: BinaryOperatorType,\n value: BaseValues,\n ): this;\n orWhere<S extends string>(\n column: ModelKey<T> | SelectableColumn<S>,\n value: BaseValues,\n ): this;\n orWhere(cb: (queryBuilder: WhereOnlyQueryBuilder<T>) => void): this;\n orWhere(\n column: ModelKey<T> | SelectableColumn<string>,\n subQuery: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): this;\n orWhere(\n column: ModelKey<T> | SelectableColumn<string>,\n operator: SubqueryOperatorType,\n subQuery: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): this;\n orWhere<S extends string>(\n columnOrCb:\n | ModelKey<T>\n | SelectableColumn<S>\n | ((queryBuilder: WhereQueryBuilder<T>) => void),\n operatorOrValue?:\n | BinaryOperatorType\n | BaseValues\n | SubqueryOperatorType\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n value?:\n | BaseValues\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n ): this {\n if (typeof columnOrCb === \"function\") {\n return this.orWhereGroup(\n columnOrCb as (qb: WhereQueryBuilder<T>) => void,\n );\n }\n\n if (typeof operatorOrValue === \"function\" && value === undefined) {\n return this.orWhereSubQuery(\n columnOrCb as string,\n \"in\",\n operatorOrValue as (subQuery: QueryBuilder<T>) => void,\n );\n }\n\n if (operatorOrValue instanceof QueryBuilder && value === undefined) {\n return this.orWhereSubQuery(\n columnOrCb as string,\n \"in\",\n operatorOrValue as QueryBuilder<T>,\n );\n }\n\n if (\n typeof operatorOrValue === \"string\" &&\n (operatorOrValue as string) !== \"=\" &&\n value !== undefined &&\n (value instanceof QueryBuilder || typeof value === \"function\")\n ) {\n return this.orWhereSubQuery(\n columnOrCb as string,\n operatorOrValue as SubqueryOperatorType,\n value as QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n );\n }\n\n let operator: BinaryOperatorType = \"=\";\n let actualValue: BaseValues;\n\n if (\n typeof operatorOrValue === \"string\" &&\n value !== undefined &&\n !(value instanceof QueryBuilder) &&\n typeof value !== \"function\"\n ) {\n operator = operatorOrValue as BinaryOperatorType;\n actualValue = value as BaseValues;\n } else {\n actualValue = operatorOrValue as BaseValues;\n operator = \"=\";\n }\n\n this.whereNodes.push(\n new WhereNode(columnOrCb as string, \"or\", false, operator, actualValue),\n );\n return this;\n }\n\n /**\n * @description Adds a negated WHERE condition to the query.\n */\n whereNot(\n column: ModelKey<T>,\n operator: BinaryOperatorType,\n value: BaseValues,\n ): this;\n whereNot<S extends string>(\n column: SelectableColumn<S>,\n operator: BinaryOperatorType,\n value: BaseValues,\n ): this;\n whereNot(\n column: ModelKey<T> | SelectableColumn<string>,\n value: BaseValues,\n ): this;\n whereNot(\n column: ModelKey<T> | SelectableColumn<string>,\n subQuery: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): this;\n whereNot(\n column: ModelKey<T> | SelectableColumn<string>,\n operator: SubqueryOperatorType,\n subQuery: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): this;\n whereNot<S extends string>(\n column: ModelKey<T> | SelectableColumn<S>,\n operatorOrValue:\n | BinaryOperatorType\n | BaseValues\n | SubqueryOperatorType\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n value?:\n | BaseValues\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n ): this {\n if (typeof operatorOrValue === \"function\" && value === undefined) {\n return this.andWhereSubQuery(\n column as string,\n \"not in\",\n operatorOrValue as (subQuery: QueryBuilder<T>) => void,\n );\n }\n\n if (operatorOrValue instanceof QueryBuilder && value === undefined) {\n return this.andWhereSubQuery(\n column as string,\n \"not in\",\n operatorOrValue as QueryBuilder<T>,\n );\n }\n\n if (\n typeof operatorOrValue === \"string\" &&\n value !== undefined &&\n (value instanceof QueryBuilder || typeof value === \"function\")\n ) {\n return this.andWhereSubQuery(\n column as string,\n operatorOrValue as SubqueryOperatorType,\n value as QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n );\n }\n\n let operator: BinaryOperatorType = \"=\";\n let actualValue: BaseValues;\n\n if (\n typeof operatorOrValue === \"string\" &&\n value !== undefined &&\n !(value instanceof QueryBuilder) &&\n typeof value !== \"function\"\n ) {\n operator = operatorOrValue as BinaryOperatorType;\n actualValue = value as BaseValues;\n } else {\n actualValue = operatorOrValue as BaseValues;\n operator = \"=\";\n }\n\n this.whereNodes.push(\n new WhereNode(column as string, \"and\", true, operator, actualValue),\n );\n return this;\n }\n\n /**\n * @description Adds a negated AND WHERE condition to the query.\n */\n andWhereNot(\n column: ModelKey<T>,\n operator: BinaryOperatorType,\n value: BaseValues,\n ): this;\n andWhereNot<S extends string>(\n column: SelectableColumn<S>,\n operator: BinaryOperatorType,\n value: BaseValues,\n ): this;\n andWhereNot(\n column: ModelKey<T> | SelectableColumn<string>,\n value: BaseValues,\n ): this;\n andWhereNot(\n column: ModelKey<T> | SelectableColumn<string>,\n subQuery: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): this;\n andWhereNot(\n column: ModelKey<T> | SelectableColumn<string>,\n operator: SubqueryOperatorType,\n subQuery: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): this;\n andWhereNot<S extends string>(\n column: ModelKey<T> | SelectableColumn<S>,\n operatorOrValue:\n | BinaryOperatorType\n | BaseValues\n | SubqueryOperatorType\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n value?:\n | BaseValues\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n ): this {\n if (typeof operatorOrValue === \"function\" && value === undefined) {\n return this.andWhereSubQuery(\n column as string,\n \"not in\",\n operatorOrValue as (subQuery: QueryBuilder<T>) => void,\n );\n }\n\n if (operatorOrValue instanceof QueryBuilder && value === undefined) {\n return this.andWhereSubQuery(\n column as string,\n \"not in\",\n operatorOrValue as QueryBuilder<T>,\n );\n }\n\n if (\n typeof operatorOrValue === \"string\" &&\n value !== undefined &&\n (value instanceof QueryBuilder || typeof value === \"function\")\n ) {\n return this.andWhereSubQuery(\n column as string,\n operatorOrValue as SubqueryOperatorType,\n value as QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n );\n }\n\n let operator: BinaryOperatorType = \"=\";\n let actualValue: BaseValues;\n\n if (\n typeof operatorOrValue === \"string\" &&\n value !== undefined &&\n !(value instanceof QueryBuilder) &&\n typeof value !== \"function\"\n ) {\n operator = operatorOrValue as BinaryOperatorType;\n actualValue = value as BaseValues;\n } else {\n actualValue = operatorOrValue as BaseValues;\n operator = \"=\";\n }\n\n this.whereNodes.push(\n new WhereNode(column as string, \"and\", true, operator, actualValue),\n );\n return this;\n }\n\n /**\n * @description Adds a negated OR WHERE condition to the query.\n */\n orWhereNot(\n column: ModelKey<T>,\n operator: BinaryOperatorType,\n value: BaseValues,\n ): this;\n orWhereNot<S extends string>(\n column: SelectableColumn<S>,\n operator: BinaryOperatorType,\n value: BaseValues,\n ): this;\n orWhereNot(\n column: ModelKey<T> | SelectableColumn<string>,\n value: BaseValues,\n ): this;\n orWhereNot(\n column: ModelKey<T> | SelectableColumn<string>,\n subQuery: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): this;\n orWhereNot(\n column: ModelKey<T> | SelectableColumn<string>,\n operator: SubqueryOperatorType,\n subQuery: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): this;\n orWhereNot<S extends string>(\n column: ModelKey<T> | SelectableColumn<S>,\n operatorOrValue:\n | BinaryOperatorType\n | BaseValues\n | SubqueryOperatorType\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n value?:\n | BaseValues\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n ): this {\n if (typeof operatorOrValue === \"function\" && value === undefined) {\n return this.orWhereSubQuery(\n column as string,\n \"not in\",\n operatorOrValue as (subQuery: QueryBuilder<T>) => void,\n );\n }\n\n if (operatorOrValue instanceof QueryBuilder && value === undefined) {\n return this.orWhereSubQuery(\n column as string,\n \"not in\",\n operatorOrValue as QueryBuilder<T>,\n );\n }\n\n if (\n typeof operatorOrValue === \"string\" &&\n value !== undefined &&\n (value instanceof QueryBuilder || typeof value === \"function\")\n ) {\n return this.orWhereSubQuery(\n column as string,\n operatorOrValue as SubqueryOperatorType,\n value as QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n );\n }\n\n let operator: BinaryOperatorType = \"=\";\n let actualValue: BaseValues;\n\n if (\n typeof operatorOrValue === \"string\" &&\n value !== undefined &&\n !(value instanceof QueryBuilder) &&\n typeof value !== \"function\"\n ) {\n operator = operatorOrValue as BinaryOperatorType;\n actualValue = value as BaseValues;\n } else {\n actualValue = operatorOrValue as BaseValues;\n operator = \"=\";\n }\n\n this.whereNodes.push(\n new WhereNode(column as string, \"or\", true, operator, actualValue),\n );\n return this;\n }\n\n /**\n * @description Adds a WHERE BETWEEN condition to the query.\n */\n whereBetween(column: ModelKey<T>, min: BaseValues, max: BaseValues): this;\n whereBetween<S extends string>(\n column: SelectableColumn<S>,\n min: BaseValues,\n max: BaseValues,\n ): this;\n whereBetween(\n column: ModelKey<T> | SelectableColumn<string>,\n min: BaseValues,\n max: BaseValues,\n ): this {\n return this.andWhereBetween(column as ModelKey<T>, min, max);\n }\n\n /**\n * @description Adds an AND WHERE BETWEEN condition to the query.\n */\n andWhereBetween(column: ModelKey<T>, min: BaseValues, max: BaseValues): this;\n andWhereBetween<S extends string>(\n column: SelectableColumn<S>,\n min: BaseValues,\n max: BaseValues,\n ): this;\n andWhereBetween(\n column: ModelKey<T> | SelectableColumn<string>,\n min: BaseValues,\n max: BaseValues,\n ): this {\n this.whereNodes.push(\n new WhereNode(column as string, \"and\", false, \"between\", [min, max]),\n );\n return this;\n }\n\n /**\n * @description Adds an OR WHERE BETWEEN condition to the query.\n */\n orWhereBetween(column: ModelKey<T>, min: BaseValues, max: BaseValues): this;\n orWhereBetween<S extends string>(\n column: SelectableColumn<S>,\n min: BaseValues,\n max: BaseValues,\n ): this;\n orWhereBetween(\n column: ModelKey<T> | SelectableColumn<string>,\n min: BaseValues,\n max: BaseValues,\n ): this {\n this.whereNodes.push(\n new WhereNode(column as string, \"or\", false, \"between\", [min, max]),\n );\n return this;\n }\n\n /**\n * @description Adds a WHERE NOT BETWEEN condition to the query.\n */\n whereNotBetween(column: ModelKey<T>, min: BaseValues, max: BaseValues): this;\n whereNotBetween<S extends string>(\n column: SelectableColumn<S>,\n min: BaseValues,\n max: BaseValues,\n ): this;\n whereNotBetween(\n column: ModelKey<T> | SelectableColumn<string>,\n min: BaseValues,\n max: BaseValues,\n ): this {\n return this.andWhereNotBetween(column as ModelKey<T>, min, max);\n }\n\n /**\n * @description Adds an AND WHERE NOT BETWEEN condition to the query.\n */\n andWhereNotBetween(\n column: ModelKey<T>,\n min: BaseValues,\n max: BaseValues,\n ): this;\n andWhereNotBetween<S extends string>(\n column: SelectableColumn<S>,\n min: BaseValues,\n max: BaseValues,\n ): this;\n andWhereNotBetween(\n column: ModelKey<T> | SelectableColumn<string>,\n min: BaseValues,\n max: BaseValues,\n ): this {\n this.whereNodes.push(\n new WhereNode(column as string, \"and\", true, \"between\", [min, max]),\n );\n return this;\n }\n\n /**\n * @description Adds an OR WHERE NOT BETWEEN condition to the query.\n */\n orWhereNotBetween(\n column: ModelKey<T>,\n min: BaseValues,\n max: BaseValues,\n ): this;\n orWhereNotBetween<S extends string>(\n column: SelectableColumn<S>,\n min: BaseValues,\n max: BaseValues,\n ): this;\n orWhereNotBetween(\n column: ModelKey<T> | SelectableColumn<string>,\n min: BaseValues,\n max: BaseValues,\n ): this {\n this.whereNodes.push(\n new WhereNode(column as string, \"or\", true, \"between\", [min, max]),\n );\n return this;\n }\n\n /**\n * @description Adds a WHERE LIKE condition to the query.\n */\n whereLike(column: ModelKey<T>, value: string): this;\n whereLike<S extends string>(column: SelectableColumn<S>, value: string): this;\n whereLike(\n column: ModelKey<T> | SelectableColumn<string>,\n value: string,\n ): this {\n return this.andWhereLike(column as ModelKey<T>, value);\n }\n\n /**\n * @description Adds an AND WHERE LIKE condition to the query.\n */\n andWhereLike(column: ModelKey<T>, value: string): this;\n andWhereLike<S extends string>(\n column: SelectableColumn<S>,\n value: string,\n ): this;\n andWhereLike(\n column: ModelKey<T> | SelectableColumn<string>,\n value: string,\n ): this {\n this.where(column as string, \"like\", value);\n return this;\n }\n\n /**\n * @description Adds an OR WHERE LIKE condition to the query.\n */\n orWhereLike(column: ModelKey<T>, value: string): this;\n orWhereLike<S extends string>(\n column: SelectableColumn<S>,\n value: string,\n ): this;\n orWhereLike(\n column: ModelKey<T> | SelectableColumn<string>,\n value: string,\n ): this {\n this.orWhere(column as string, \"like\", value);\n return this;\n }\n\n /**\n * @description Adds a WHERE ILIKE condition to the query.\n */\n whereILike(column: ModelKey<T>, value: string): this;\n whereILike<S extends string>(\n column: SelectableColumn<S>,\n value: string,\n ): this;\n whereILike(\n column: ModelKey<T> | SelectableColumn<string>,\n value: string,\n ): this {\n return this.andWhereILike(column as ModelKey<T>, value);\n }\n\n /**\n * @description Adds an AND WHERE ILIKE condition to the query.\n */\n andWhereILike(column: ModelKey<T>, value: string): this;\n andWhereILike<S extends string>(\n column: SelectableColumn<S>,\n value: string,\n ): this;\n andWhereILike(\n column: ModelKey<T> | SelectableColumn<string>,\n value: string,\n ): this {\n this.where(column as string, \"ilike\", value);\n return this;\n }\n\n /**\n * @description Adds an OR WHERE ILIKE condition to the query.\n */\n orWhereILike(column: ModelKey<T>, value: string): this;\n orWhereILike<S extends string>(\n column: SelectableColumn<S>,\n value: string,\n ): this;\n orWhereILike(\n column: ModelKey<T> | SelectableColumn<string>,\n value: string,\n ): this {\n this.orWhere(column as string, \"ilike\", value);\n return this;\n }\n\n /**\n * @description Adds a WHERE NOT LIKE condition to the query.\n */\n whereNotLike(column: ModelKey<T>, value: string): this;\n whereNotLike<S extends string>(\n column: SelectableColumn<S>,\n value: string,\n ): this;\n whereNotLike(\n column: ModelKey<T> | SelectableColumn<string>,\n value: string,\n ): this {\n return this.andWhereNotLike(column as ModelKey<T>, value);\n }\n\n /**\n * @description Adds an AND WHERE NOT LIKE condition to the query.\n */\n andWhereNotLike(column: ModelKey<T>, value: string): this;\n andWhereNotLike<S extends string>(\n column: SelectableColumn<S>,\n value: string,\n ): this;\n andWhereNotLike(\n column: ModelKey<T> | SelectableColumn<string>,\n value: string,\n ): this {\n this.where(column as string, \"not like\", value);\n return this;\n }\n\n /**\n * @description Adds an OR WHERE NOT LIKE condition to the query.\n */\n orWhereNotLike(column: ModelKey<T>, value: string): this;\n orWhereNotLike<S extends string>(\n column: SelectableColumn<S>,\n value: string,\n ): this;\n orWhereNotLike(\n column: ModelKey<T> | SelectableColumn<string>,\n value: string,\n ): this {\n this.orWhere(column as string, \"not like\", value);\n return this;\n }\n\n /**\n * @description Adds a WHERE NOT ILIKE condition to the query.\n */\n whereNotILike(column: ModelKey<T>, value: string): this;\n whereNotILike<S extends string>(\n column: SelectableColumn<S>,\n value: string,\n ): this;\n whereNotILike(\n column: ModelKey<T> | SelectableColumn<string>,\n value: string,\n ): this {\n return this.andWhereNotILike(column as ModelKey<T>, value);\n }\n\n /**\n * @description Adds an AND WHERE NOT ILIKE condition to the query.\n */\n andWhereNotILike(column: ModelKey<T>, value: string): this;\n andWhereNotILike<S extends string>(\n column: SelectableColumn<S>,\n value: string,\n ): this;\n andWhereNotILike(\n column: ModelKey<T> | SelectableColumn<string>,\n value: string,\n ): this {\n this.where(column as string, \"not ilike\", value);\n return this;\n }\n\n /**\n * @description Adds an OR WHERE NOT ILIKE condition to the query.\n */\n orWhereNotILike(column: ModelKey<T>, value: string): this;\n orWhereNotILike<S extends string>(\n column: SelectableColumn<S>,\n value: string,\n ): this;\n orWhereNotILike(\n column: ModelKey<T> | SelectableColumn<string>,\n value: string,\n ): this {\n this.orWhere(column as string, \"not ilike\", value);\n return this;\n }\n\n /**\n * @description Adds a WHERE IN condition to the query.\n * @warning If the array is empty, it will add an impossible condition.\n */\n whereIn(column: ModelKey<T>, values: BaseValues[]): this;\n whereIn<S extends string>(\n column: SelectableColumn<S>,\n values: BaseValues[],\n ): this;\n whereIn(\n column: ModelKey<T> | SelectableColumn<string>,\n values:\n | BaseValues[]\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n ): this {\n return this.andWhereIn(column as ModelKey<T>, values as any);\n }\n\n /**\n * @description Adds an AND WHERE IN condition to the query.\n * @warning If the array is empty, it will add an impossible condition.\n */\n andWhereIn(column: ModelKey<T>, values: BaseValues[]): this;\n andWhereIn<S extends string>(\n column: SelectableColumn<S>,\n values: BaseValues[],\n ): this;\n andWhereIn(\n column: ModelKey<T> | SelectableColumn<string>,\n values:\n | BaseValues[]\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n ): this {\n if (Array.isArray(values)) {\n if (!values.length) {\n this.whereNodes.push(\n new WhereNode(\"false\", \"and\", true, \"=\", [], true),\n );\n return this;\n }\n\n this.whereNodes.push(\n new WhereNode(column as string, \"and\", false, \"in\", values),\n );\n return this;\n }\n\n return this.andWhereSubQuery(\n column as string,\n \"in\",\n values as QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n );\n }\n\n /**\n * @description Adds an OR WHERE IN condition to the query.\n * @warning If the array is empty, it will add an impossible condition.\n */\n orWhereIn(column: ModelKey<T>, values: BaseValues[]): this;\n orWhereIn<S extends string>(\n column: SelectableColumn<S>,\n values: BaseValues[],\n ): this;\n orWhereIn(\n column: ModelKey<T> | SelectableColumn<string>,\n values:\n | BaseValues[]\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n ): this {\n if (Array.isArray(values)) {\n if (!values.length) {\n this.whereNodes.push(new WhereNode(\"false\", \"or\", true, \"=\", [], true));\n return this;\n }\n\n this.whereNodes.push(\n new WhereNode(column as string, \"or\", false, \"in\", values),\n );\n return this;\n }\n\n return this.orWhereSubQuery(\n column as string,\n \"in\",\n values as QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n );\n }\n\n /**\n * @description Adds a WHERE NOT IN condition to the query.\n * @warning If the array is empty, it will add an obvious condition to make it true.\n */\n whereNotIn(column: ModelKey<T>, values: BaseValues[]): this;\n whereNotIn<S extends string>(\n column: SelectableColumn<S>,\n values: BaseValues[],\n ): this;\n whereNotIn(\n column: ModelKey<T> | SelectableColumn<string>,\n values:\n | BaseValues[]\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n ): this {\n return this.andWhereNotIn(column as ModelKey<T>, values as any);\n }\n\n /**\n * @description Adds an OR WHERE NOT IN condition to the query.\n * @warning If the array is empty, it will add an obvious condition to make it true.\n */\n andWhereNotIn(column: ModelKey<T>, values: BaseValues[]): this;\n andWhereNotIn<S extends string>(\n column: SelectableColumn<S>,\n values: BaseValues[],\n ): this;\n andWhereNotIn(\n column: ModelKey<T> | SelectableColumn<string>,\n values:\n | BaseValues[]\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n ): this {\n if (Array.isArray(values)) {\n if (!values.length) {\n this.whereNodes.push(new WhereNode(\"true\", \"and\", true, \"=\", [], true));\n return this;\n }\n\n this.whereNodes.push(\n new WhereNode(column as string, \"and\", true, \"in\", values),\n );\n return this;\n }\n\n return this.andWhereSubQuery(\n column as string,\n \"not in\",\n values as QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n );\n }\n\n /**\n * @description Adds an OR WHERE NOT IN condition to the query.\n * @warning If the array is empty, it will add an obvious condition to make it true.\n */\n orWhereNotIn(column: ModelKey<T>, values: BaseValues[]): this;\n orWhereNotIn<S extends string>(\n column: SelectableColumn<S>,\n values: BaseValues[],\n ): this;\n orWhereNotIn(\n column: ModelKey<T> | SelectableColumn<string>,\n values:\n | BaseValues[]\n | QueryBuilder<T>\n | ((subQuery: QueryBuilder<T>) => void),\n ): this {\n if (Array.isArray(values)) {\n if (!values.length) {\n this.whereNodes.push(new WhereNode(\"true\", \"or\", true, \"=\", [], true));\n return this;\n }\n\n this.whereNodes.push(\n new WhereNode(column as string, \"or\", true, \"in\", values),\n );\n return this;\n }\n\n return this.orWhereSubQuery(\n column as string,\n \"not in\",\n values as QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n );\n }\n\n /**\n * @description Adds a WHERE NULL condition to the query.\n */\n whereNull(column: ModelKey<T>): this;\n whereNull<S extends string>(column: SelectableColumn<S>): this;\n whereNull(column: ModelKey<T> | SelectableColumn<string>): this {\n return this.andWhereNull(column as ModelKey<T>);\n }\n\n /**\n * @description Adds an AND WHERE NULL condition to the query.\n */\n andWhereNull(column: ModelKey<T>): this;\n andWhereNull<S extends string>(column: SelectableColumn<S>): this;\n andWhereNull(column: ModelKey<T> | SelectableColumn<string>): this {\n this.whereNodes.push(\n new WhereNode(column as string, \"and\", false, \"is null\", undefined),\n );\n return this;\n }\n\n /**\n * @description Adds an OR WHERE NULL condition to the query.\n */\n orWhereNull(column: ModelKey<T>): this;\n orWhereNull<S extends string>(column: SelectableColumn<S>): this;\n orWhereNull(column: ModelKey<T> | SelectableColumn<string>): this {\n this.whereNodes.push(\n new WhereNode(column as string, \"or\", false, \"is null\", undefined),\n );\n return this;\n }\n\n /**\n * @description Adds a WHERE NOT NULL condition to the query.\n */\n whereNotNull(column: ModelKey<T>): this;\n whereNotNull<S extends string>(column: SelectableColumn<S>): this;\n whereNotNull(column: ModelKey<T> | SelectableColumn<string>): this {\n return this.andWhereNotNull(column as ModelKey<T>);\n }\n\n /**\n * @description Adds an AND WHERE NOT NULL condition to the query.\n */\n andWhereNotNull(column: ModelKey<T>): this;\n andWhereNotNull<S extends string>(column: SelectableColumn<S>): this;\n andWhereNotNull(column: ModelKey<T> | SelectableColumn<string>): this {\n this.whereNodes.push(\n new WhereNode(column as string, \"and\", false, \"is not null\", undefined),\n );\n return this;\n }\n\n /**\n * @description Adds an OR WHERE NOT NULL condition to the query.\n */\n orWhereNotNull(column: ModelKey<T>): this;\n orWhereNotNull<S extends string>(column: SelectableColumn<S>): this;\n orWhereNotNull(column: ModelKey<T> | SelectableColumn<string>): this {\n this.whereNodes.push(\n new WhereNode(column as string, \"or\", false, \"is not null\", undefined),\n );\n return this;\n }\n\n /**\n * @description Adds a WHERE REGEXP condition to the query.\n */\n whereRegexp(column: ModelKey<T>, regexp: RegExp): this;\n whereRegexp<S extends string>(\n column: SelectableColumn<S>,\n regexp: RegExp,\n ): this;\n whereRegexp(\n column: ModelKey<T> | SelectableColumn<string>,\n regexp: RegExp,\n ): this {\n return this.andWhereRegexp(column as ModelKey<T>, regexp);\n }\n\n /**\n * @description Adds an AND WHERE REGEXP condition to the query.\n */\n andWhereRegexp(column: ModelKey<T>, regexp: RegExp): this;\n andWhereRegexp<S extends string>(\n column: SelectableColumn<S>,\n regexp: RegExp,\n ): this;\n andWhereRegexp(\n column: ModelKey<T> | SelectableColumn<string>,\n regexp: RegExp,\n ): this {\n const isPg =\n this.sqlDataSource.getDbType() === \"postgres\" ||\n this.sqlDataSource.getDbType() === \"cockroachdb\";\n\n this.whereNodes.push(\n new WhereNode(\n column as string,\n \"and\",\n false,\n isPg ? (\"~\" as BinaryOperatorType) : \"regexp\",\n regexp.source,\n ),\n );\n return this;\n }\n\n /**\n * @description Adds an OR WHERE REGEXP condition to the query.\n */\n orWhereRegexp(column: ModelKey<T>, regexp: RegExp): this;\n orWhereRegexp<S extends string>(\n column: SelectableColumn<S>,\n regexp: RegExp,\n ): this;\n orWhereRegexp(\n column: ModelKey<T> | SelectableColumn<string>,\n regexp: RegExp,\n ): this {\n const isPg =\n this.sqlDataSource.getDbType() === \"postgres\" ||\n this.sqlDataSource.getDbType() === \"cockroachdb\";\n\n this.whereNodes.push(\n new WhereNode(\n column as string,\n \"or\",\n false,\n isPg ? (\"~\" as BinaryOperatorType) : \"regexp\",\n regexp.source,\n ),\n );\n return this;\n }\n\n whereNotRegexp(column: ModelKey<T>, regexp: RegExp): this;\n whereNotRegexp<S extends string>(\n column: SelectableColumn<S>,\n regexp: RegExp,\n ): this;\n whereNotRegexp(\n column: ModelKey<T> | SelectableColumn<string>,\n regexp: RegExp,\n ): this {\n const isPg = this.sqlDataSource.getDbType() === \"postgres\";\n this.whereNodes.push(\n new WhereNode(\n column as string,\n \"and\",\n true,\n isPg ? (\"~\" as BinaryOperatorType) : \"regexp\",\n regexp.source,\n ),\n );\n return this;\n }\n\n andWhereNotRegexp(column: ModelKey<T>, regexp: RegExp): this;\n andWhereNotRegexp<S extends string>(\n column: SelectableColumn<S>,\n regexp: RegExp,\n ): this;\n andWhereNotRegexp(\n column: ModelKey<T> | SelectableColumn<string>,\n regexp: RegExp,\n ): this {\n const isPg = this.sqlDataSource.getDbType() === \"postgres\";\n this.whereNodes.push(\n new WhereNode(\n column as string,\n \"and\",\n true,\n isPg ? (\"~\" as BinaryOperatorType) : \"regexp\",\n regexp.source,\n ),\n );\n return this;\n }\n\n orWhereNotRegexp(column: ModelKey<T>, regexp: RegExp): this;\n orWhereNotRegexp<S extends string>(\n column: SelectableColumn<S>,\n regexp: RegExp,\n ): this;\n orWhereNotRegexp(\n column: ModelKey<T> | SelectableColumn<string>,\n regexp: RegExp,\n ): this {\n const isPg = this.sqlDataSource.getDbType() === \"postgres\";\n this.whereNodes.push(\n new WhereNode(\n column as string,\n \"or\",\n true,\n isPg ? (\"~\" as BinaryOperatorType) : \"regexp\",\n regexp.source,\n ),\n );\n return this;\n }\n\n /**\n * @description Adds a AND WHERE EXISTS condition to the query. By default uses the same table, you can use the `from` method to change the table.\n */\n whereExists(\n cbOrQueryBuilder: (queryBuilder: QueryBuilder<T>) => void | QueryBuilder<T>,\n ): this {\n return this.andWhereExists(cbOrQueryBuilder);\n }\n\n /**\n * @description Adds a AND WHERE EXISTS condition to the query. By default uses the same table, you can use the `from` method to change the table.\n */\n andWhereExists(\n cbOrQueryBuilder: (queryBuilder: QueryBuilder<T>) => void | QueryBuilder<T>,\n ): this {\n const nestedBuilder =\n cbOrQueryBuilder instanceof QueryBuilder\n ? cbOrQueryBuilder\n : new QueryBuilder(this.model, this.sqlDataSource);\n\n (nestedBuilder as WhereQueryBuilder<T>).isNestedCondition = true;\n if (typeof cbOrQueryBuilder === \"function\") {\n cbOrQueryBuilder(nestedBuilder as QueryBuilder<T>);\n }\n\n this.whereNodes.push(\n new WhereSubqueryNode(\n \"\",\n \"exists\",\n nestedBuilder.extractQueryNodes(),\n \"and\",\n ),\n );\n\n return this;\n }\n\n /**\n * @description Adds a OR WHERE EXISTS condition to the query. By default uses the same table, you can use the `from` method to change the table.\n */\n orWhereExists(\n cbOrQueryBuilder: (queryBuilder: QueryBuilder<T>) => void | QueryBuilder<T>,\n ): this {\n const nestedBuilder =\n cbOrQueryBuilder instanceof QueryBuilder\n ? cbOrQueryBuilder\n : new QueryBuilder(this.model, this.sqlDataSource);\n\n (nestedBuilder as WhereQueryBuilder<T>).isNestedCondition = true;\n if (typeof cbOrQueryBuilder === \"function\") {\n cbOrQueryBuilder(nestedBuilder as QueryBuilder<T>);\n }\n\n this.whereNodes.push(\n new WhereSubqueryNode(\n \"\",\n \"exists\",\n nestedBuilder.extractQueryNodes(),\n \"or\",\n ),\n );\n\n return this;\n }\n\n /**\n * @description Adds a WHERE NOT EXISTS condition to the query. By default uses the same table, you can use the `from` method to change the table.\n */\n whereNotExists(\n cbOrQueryBuilder: (queryBuilder: QueryBuilder<T>) => void | QueryBuilder<T>,\n ): this {\n return this.andWhereNotExists(cbOrQueryBuilder);\n }\n\n /**\n * @description Adds a WHERE NOT EXISTS condition to the query. By default uses the same table, you can use the `from` method to change the table.\n */\n andWhereNotExists(\n cbOrQueryBuilder: (queryBuilder: QueryBuilder<T>) => void | QueryBuilder<T>,\n ): this {\n const nestedBuilder =\n cbOrQueryBuilder instanceof QueryBuilder\n ? cbOrQueryBuilder\n : new QueryBuilder(this.model, this.sqlDataSource);\n\n (nestedBuilder as WhereQueryBuilder<T>).isNestedCondition = true;\n if (typeof cbOrQueryBuilder === \"function\") {\n cbOrQueryBuilder(nestedBuilder as QueryBuilder<T>);\n }\n\n this.whereNodes.push(\n new WhereSubqueryNode(\n \"\",\n \"not exists\",\n nestedBuilder.extractQueryNodes(),\n \"and\",\n ),\n );\n\n return this;\n }\n\n /**\n * @description Adds a WHERE NOT EXISTS condition to the query. By default uses the same table, you can use the `from` method to change the table.\n */\n orWhereNotExists(\n cbOrQueryBuilder: (queryBuilder: QueryBuilder<T>) => void | QueryBuilder<T>,\n ): this {\n const nestedBuilder =\n cbOrQueryBuilder instanceof QueryBuilder\n ? cbOrQueryBuilder\n : new QueryBuilder(this.model, this.sqlDataSource);\n\n (nestedBuilder as WhereQueryBuilder<T>).isNestedCondition = true;\n if (typeof cbOrQueryBuilder === \"function\") {\n cbOrQueryBuilder(nestedBuilder as QueryBuilder<T>);\n }\n\n this.whereNodes.push(\n new WhereSubqueryNode(\n \"\",\n \"not exists\",\n nestedBuilder.extractQueryNodes(),\n \"or\",\n ),\n );\n\n return this;\n }\n\n /**\n * @description Adds a raw WHERE condition to the query.\n */\n whereRaw(query: string, queryParams: any[] = []) {\n return this.andWhereRaw(query, queryParams);\n }\n\n /**\n * @description Adds a raw AND WHERE condition to the query.\n */\n andWhereRaw(query: string, queryParams: any[] = []) {\n this.whereNodes.push(\n new WhereNode(query, \"and\", false, \"=\", queryParams, true),\n );\n return this;\n }\n\n /**\n * @description Adds a raw OR WHERE condition to the query.\n */\n orWhereRaw(query: string, queryParams: any[] = []) {\n this.whereNodes.push(\n new WhereNode(query, \"or\", false, \"=\", queryParams, true),\n );\n return this;\n }\n\n /**\n * @description Adds a HAVING condition to the query.\n */\n having<S extends string>(column: SelectableColumn<S>, value: any): this;\n having(column: ModelKey<T>, operator: BinaryOperatorType, value: any): this;\n having(\n column: ModelKey<T> | SelectableColumn<string>,\n operatorOrValue: BinaryOperatorType | BaseValues,\n value?: BaseValues,\n ): this {\n return this.andHaving(\n column as ModelKey<T>,\n operatorOrValue as BinaryOperatorType,\n value,\n );\n }\n\n /**\n * @description Adds an AND HAVING condition to the query.\n */\n andHaving<S extends string>(column: SelectableColumn<S>, value: any): this;\n andHaving(\n column: ModelKey<T>,\n operator: BinaryOperatorType,\n value: any,\n ): this;\n andHaving(\n column: ModelKey<T> | SelectableColumn<string>,\n operatorOrValue: BinaryOperatorType | BaseValues,\n value?: BaseValues,\n ): this {\n let operator: BinaryOperatorType = \"=\";\n let actualValue: BaseValues;\n\n if (typeof operatorOrValue === \"string\" && value) {\n operator = operatorOrValue as BinaryOperatorType;\n actualValue = value as BaseValues;\n } else {\n actualValue = operatorOrValue as BaseValues;\n operator = \"=\";\n }\n\n this.havingNodes.push(\n new HavingNode(\n column as string,\n \"and\",\n false,\n operator as any,\n actualValue as any,\n ),\n );\n return this;\n }\n\n /**\n * @description Adds an OR HAVING condition to the query.\n */\n orHaving<S extends string>(column: SelectableColumn<S>, value: any): this;\n orHaving(column: ModelKey<T>, operator: BinaryOperatorType, value: any): this;\n orHaving(\n column: ModelKey<T> | SelectableColumn<string>,\n operatorOrValue: BinaryOperatorType | BaseValues,\n value?: BaseValues,\n ): this {\n let operator: BinaryOperatorType = \"=\";\n let actualValue: BaseValues;\n\n if (typeof operatorOrValue === \"string\" && value) {\n operator = operatorOrValue as BinaryOperatorType;\n actualValue = value;\n } else {\n actualValue = operatorOrValue as BaseValues;\n operator = \"=\";\n }\n\n this.havingNodes.push(\n new HavingNode(\n column as string,\n \"or\",\n false,\n operator as any,\n actualValue as any,\n ),\n );\n return this;\n }\n\n /**\n * @description Adds a raw HAVING condition to the query.\n */\n havingRaw(query: string): this {\n return this.andHavingRaw(query);\n }\n\n /**\n * @description Adds a raw OR HAVING condition to the query.\n */\n andHavingRaw(query: string): this {\n this.havingNodes.push(new HavingNode(query, \"and\", false, \"=\", [], true));\n\n return this;\n }\n\n /**\n * @description Adds a raw OR HAVING condition to the query.\n */\n orHavingRaw(query: string): this {\n this.havingNodes.push(new HavingNode(query, \"or\", false, \"=\", [], true));\n\n return this;\n }\n\n private buildSubQuery(\n subQueryOrCb: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): QueryBuilder<T> {\n if (subQueryOrCb instanceof QueryBuilder) {\n return subQueryOrCb;\n }\n const subQuery = new QueryBuilder(this.model, this.sqlDataSource);\n (subQueryOrCb as (qb: QueryBuilder<T>) => void)(subQuery);\n return subQuery;\n }\n\n private andWhereSubQuery(\n column: string,\n operator: SubqueryOperatorType,\n subQueryOrCb: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): this {\n const subQuery = this.buildSubQuery(subQueryOrCb);\n this.whereNodes.push(\n new WhereSubqueryNode(\n column,\n operator,\n (subQuery as any).extractQueryNodes(),\n \"and\",\n ),\n );\n return this;\n }\n\n private orWhereSubQuery(\n column: string,\n operator: SubqueryOperatorType,\n subQueryOrCb: QueryBuilder<T> | ((subQuery: QueryBuilder<T>) => void),\n ): this {\n const subQuery = this.buildSubQuery(subQueryOrCb);\n this.whereNodes.push(\n new WhereSubqueryNode(\n column,\n operator,\n (subQuery as any).extractQueryNodes(),\n \"or\",\n ),\n );\n return this;\n }\n\n private andWhereGroup(\n cb: (queryBuilder: WhereQueryBuilder<T>) => void,\n ): this {\n const nestedBuilder = new QueryBuilder(this.model, this.sqlDataSource);\n (nestedBuilder as any).isNestedCondition = true;\n cb(nestedBuilder as unknown as WhereQueryBuilder<T>);\n const whereGroupNode = new WhereGroupNode(\n (nestedBuilder as any).whereNodes,\n \"and\",\n );\n this.whereNodes.push(whereGroupNode);\n return this;\n }\n\n private orWhereGroup(cb: (queryBuilder: WhereQueryBuilder<T>) => void): this {\n const nestedBuilder = new QueryBuilder(this.model, this.sqlDataSource);\n (nestedBuilder as any).isNestedCondition = true;\n cb(nestedBuilder as unknown as WhereQueryBuilder<T>);\n const whereGroupNode = new WhereGroupNode(\n (nestedBuilder as any).whereNodes,\n \"or\",\n );\n this.whereNodes.push(whereGroupNode);\n return this;\n }\n}\n","import { WhereJsonNode } from \"../ast/query/node/where\";\nimport { Model } from \"../models/model\";\nimport { ModelKey } from \"../models/model_manager/model_manager_types\";\nimport { WhereQueryBuilder } from \"./where_query_builder\";\n\ntype JsonParam = Record<string, unknown> | any[];\n\nexport class JsonQueryBuilder<T extends Model> extends WhereQueryBuilder<T> {\n /**\n * @description Filters records matching exact JSON value.\n */\n whereJson(column: ModelKey<T>, value: JsonParam): this;\n whereJson(column: string, value: JsonParam): this;\n whereJson(column: ModelKey<T> | string, value: JsonParam): this {\n return this.andWhereJson(column as string, value);\n }\n\n /**\n * @description Filters records matching the given JSON value.\n */\n andWhereJson(column: ModelKey<T>, value: JsonParam): this;\n andWhereJson(column: string, value: JsonParam): this;\n andWhereJson(column: ModelKey<T> | string, value: JsonParam): this {\n this.whereNodes.push(\n new WhereJsonNode(\n column as string,\n \"and\",\n false,\n \"contains\",\n value as any,\n ),\n );\n return this;\n }\n\n /**\n * @description Filters records matching the given JSON value.\n */\n orWhereJson(column: ModelKey<T>, value: JsonParam): this;\n orWhereJson(column: string, value: JsonParam): this;\n orWhereJson(column: ModelKey<T> | string, value: JsonParam): this {\n this.whereNodes.push(\n new WhereJsonNode(\n column as string,\n \"or\",\n false,\n \"contains\",\n value as any,\n ),\n );\n return this;\n }\n\n /**\n * @description Filters records where JSON column does NOT contain the given value.\n * @sqlite might not work for all cases, suggest using the whereJsonRaw method instead\n */\n whereJsonNotContains(column: ModelKey<T>, value: JsonParam): this;\n whereJsonNotContains(column: string, value: JsonParam): this;\n whereJsonNotContains(column: ModelKey<T> | string, value: JsonParam): this {\n return this.andWhereJsonNotContains(column as string, value);\n }\n\n /**\n * @description Filters records where JSON column does NOT contain the given value (AND).\n * @sqlite might not work for all cases, suggest using the whereJsonRaw method instead\n */\n andWhereJsonNotContains(column: ModelKey<T>, value: JsonParam): this;\n andWhereJsonNotContains(column: string, value: JsonParam): this;\n andWhereJsonNotContains(\n column: ModelKey<T> | string,\n value: JsonParam,\n ): this {\n this.whereNodes.push(\n new WhereJsonNode(\n column as string,\n \"and\",\n true,\n \"not contains\",\n value as any,\n ),\n );\n return this;\n }\n\n /**\n * @description Filters records where JSON column does NOT contain the given value (OR).\n * @sqlite might not work for all cases, suggest using the whereJsonRaw method instead\n */\n orWhereJsonNotContains(column: ModelKey<T>, value: JsonParam): this;\n orWhereJsonNotContains(column: string, value: JsonParam): this;\n orWhereJsonNotContains(column: ModelKey<T> | string, value: JsonParam): this {\n this.whereNodes.push(\n new WhereJsonNode(\n column as string,\n \"or\",\n true,\n \"not contains\",\n value as any,\n ),\n );\n return this;\n }\n\n /**\n * @description Filters records where JSON column contains the given value.\n * @sqlite might not work for all cases, suggest using the whereJsonRaw method instead\n */\n whereJsonContains(column: ModelKey<T>, value: JsonParam): this;\n whereJsonContains(column: string, value: JsonParam): this;\n whereJsonContains(column: ModelKey<T> | string, value: JsonParam): this {\n return this.andWhereJsonContains(column as string, value);\n }\n\n /**\n * @description Filters records where JSON column contains the given value (AND).\n * @sqlite might not work for all cases, suggest using the whereJsonRaw method instead\n */\n andWhereJsonContains(column: ModelKey<T>, value: JsonParam): this;\n andWhereJsonContains(column: string, value: JsonParam): this;\n andWhereJsonContains(column: ModelKey<T> | string, value: JsonParam): this {\n this.whereNodes.push(\n new WhereJsonNode(\n column as string,\n \"and\",\n false,\n \"contains\",\n value as any,\n ),\n );\n return this;\n }\n\n /**\n * @description Filters records where JSON column contains the given value (OR).\n * @sqlite might not work for all cases, suggest using the whereJsonRaw method instead\n */\n orWhereJsonContains(column: ModelKey<T>, value: JsonParam): this;\n orWhereJsonContains(column: string, value: JsonParam): this;\n orWhereJsonContains(column: ModelKey<T> | string, value: JsonParam): this {\n this.whereNodes.push(\n new WhereJsonNode(\n column as string,\n \"or\",\n false,\n \"contains\",\n value as any,\n ),\n );\n return this;\n }\n\n /**\n * @description Filters records where JSON column does NOT match the given value.\n */\n whereNotJson(column: ModelKey<T>, value: JsonParam): this;\n whereNotJson(column: string, value: JsonParam): this;\n whereNotJson(column: ModelKey<T> | string, value: JsonParam): this {\n return this.andWhereNotJson(column as string, value);\n }\n\n /**\n * @description Filters records where JSON column does NOT match the given value (AND).\n */\n andWhereNotJson(column: ModelKey<T>, value: JsonParam): this;\n andWhereNotJson(column: string, value: JsonParam): this;\n andWhereNotJson(column: ModelKey<T> | string, value: JsonParam): this {\n this.whereNodes.push(\n new WhereJsonNode(\n column as string,\n \"and\",\n true,\n \"not contains\",\n value as any,\n ),\n );\n return this;\n }\n\n /**\n * @description Filters records where JSON column does NOT match the given value (OR).\n */\n orWhereNotJson(column: ModelKey<T>, value: JsonParam): this;\n orWhereNotJson(column: string, value: JsonParam): this;\n orWhereNotJson(column: ModelKey<T> | string, value: JsonParam): this {\n this.whereNodes.push(\n new WhereJsonNode(\n column as string,\n \"or\",\n true,\n \"not contains\",\n value as any,\n ),\n );\n return this;\n }\n\n /**\n * @description Add a raw JSON filter expression.\n */\n whereJsonRaw(raw: string, params?: any[]): this {\n return this.andWhereJsonRaw(raw, params);\n }\n\n /**\n * @description Add a raw JSON filter expression (AND).\n */\n andWhereJsonRaw(raw: string, params?: any[]): this {\n this.whereNodes.push(\n new WhereJsonNode(raw, \"and\", false, \"raw\", params as any),\n );\n return this;\n }\n\n /**\n * @description Add a raw JSON filter expression (OR).\n */\n orWhereJsonRaw(raw: string, params?: any[]): this {\n this.whereNodes.push(\n new WhereJsonNode(raw, \"or\", false, \"raw\", params as any),\n );\n return this;\n }\n}\n","import { PassThrough } from \"node:stream\";\nimport { HysteriaError } from \"../../errors/hysteria_error\";\nimport { baseSoftDeleteDate } from \"../../utils/date_utils\";\nimport logger from \"../../utils/logger\";\nimport { withPerformance } from \"../../utils/performance\";\nimport { bindParamsIntoQuery, formatQuery } from \"../../utils/query\";\nimport { coerceToNumber } from \"../../utils/types\";\nimport { AstParser } from \"../ast/parser\";\nimport { UnionNode, WithNode } from \"../ast/query/node\";\nimport { DeleteNode } from \"../ast/query/node/delete\";\nimport { FromNode } from \"../ast/query/node/from\";\nimport { InsertNode } from \"../ast/query/node/insert\";\nimport { LockNode } from \"../ast/query/node/lock/lock\";\nimport { OnDuplicateNode } from \"../ast/query/node/on_duplicate\";\nimport { SelectNode } from \"../ast/query/node/select/basic_select\";\nimport { UnionCallBack } from \"../ast/query/node/select/select_types\";\nimport { TruncateNode } from \"../ast/query/node/truncate\";\nimport { UpdateNode } from \"../ast/query/node/update\";\nimport { QueryNode } from \"../ast/query/query\";\nimport { InterpreterUtils } from \"../interpreter/interpreter_utils\";\nimport type { Model } from \"../models/model\";\nimport { ModelKey } from \"../models/model_manager/model_manager_types\";\nimport { AnnotatedModel } from \"../models/model_query_builder/model_query_builder_types\";\nimport type { NumberModelKey } from \"../models/model_types\";\nimport {\n CursorPaginatedData,\n getCursorPaginationMetadata,\n getPaginationMetadata,\n PaginatedData,\n} from \"../pagination\";\nimport { deepCloneNode } from \"../resources/utils\";\nimport { SqlDataSource } from \"../sql_data_source\";\nimport type { TableFormat } from \"../sql_data_source_types\";\nimport { execSql, execSqlStreaming } from \"../sql_runner/sql_runner\";\nimport { SoftDeleteOptions } from \"./delete_query_builder_type\";\nimport { JsonQueryBuilder } from \"./json_query_builder\";\nimport {\n Cursor,\n PaginateWithCursorOptions,\n PluckReturnType,\n StreamOptions,\n UpsertOptionsRawBuilder,\n} from \"./query_builder_types\";\n\nexport class QueryBuilder<T extends Model = any> extends JsonQueryBuilder<T> {\n model: typeof Model;\n protected astParser: AstParser;\n protected unionNodes: UnionNode[];\n protected withNodes: WithNode[];\n protected lockQueryNodes: LockNode[];\n protected isNestedCondition = false;\n protected mustRemoveAnnotations: boolean = false;\n protected interpreterUtils: InterpreterUtils;\n protected insertNode: InsertNode | null = null;\n protected onDuplicateNode: OnDuplicateNode | null = null;\n protected updateNode: UpdateNode | null = null;\n protected deleteNode: DeleteNode | null = null;\n protected truncateNode: TruncateNode | null = null;\n\n /**\n * @description Performance methods that return the time that took to execute the query with the result\n */\n performance = {\n many: this.manyWithPerformance.bind(this),\n one: this.oneWithPerformance.bind(this),\n oneOrFail: this.oneOrFailWithPerformance.bind(this),\n first: this.firstWithPerformance.bind(this),\n firstOrFail: this.firstOrFailWithPerformance.bind(this),\n paginate: this.paginateWithPerformance.bind(this),\n paginateWithCursor: this.paginateWithCursorWithPerformance.bind(this),\n exists: this.existsWithPerformance.bind(this),\n truncate: this.truncateWithPerformance.bind(this),\n delete: this.deleteWithPerformance.bind(this),\n insert: this.insertWithPerformance.bind(this),\n insertMany: this.insertManyWithPerformance.bind(this),\n update: this.updateWithPerformance.bind(this),\n softDelete: this.softDeleteWithPerformance.bind(this),\n pluck: this.pluckWithPerformance.bind(this),\n };\n\n constructor(\n model: typeof Model,\n sqlDataSource: SqlDataSource = SqlDataSource.getInstance(),\n ) {\n super(model, sqlDataSource);\n this.dbType = sqlDataSource.getDbType();\n this.isNestedCondition = false;\n this.model = model;\n this.unionNodes = [];\n this.lockQueryNodes = [];\n this.withNodes = [];\n this.astParser = new AstParser(this.model, this.dbType);\n this.interpreterUtils = new InterpreterUtils(this.model);\n }\n\n /**\n * @description Executes the query and returns true if the query returns at least one result, false otherwise.\n */\n async exists(): Promise<boolean> {\n return !!(await this.one());\n }\n\n /**\n * @description Executes the query and retrieves multiple results.\n */\n async many(): Promise<AnnotatedModel<T, any, any>[]> {\n const { sql, bindings } = this.unWrap();\n return execSql(sql, bindings, this.sqlDataSource, \"raw\", {\n sqlLiteOptions: {\n typeofModel: this.model,\n mode: \"fetch\",\n },\n });\n }\n\n /**\n * @description Executes the query and retrieves a single column from the results.\n * @param key - The column to retrieve from the results, must be a Model Column\n */\n async pluck<K extends ModelKey<T>>(key: K): Promise<PluckReturnType<T, K>> {\n const result = (await this.many()) as T[];\n return result.map(\n (item) => item[key as keyof typeof item],\n ) as PluckReturnType<T, K>;\n }\n\n /**\n * @description Executes the query and retrieves a single result.\n */\n async one(): Promise<AnnotatedModel<T, any, any> | null> {\n const result = (await this.limit(1).many()) as AnnotatedModel<T, {}>[];\n if (!result || !result.length) {\n return null;\n }\n\n return result[0];\n }\n\n /**\n * @alias one\n */\n async first(): Promise<AnnotatedModel<T, any, any> | null> {\n return this.one();\n }\n\n /**\n * @description Executes the query and retrieves the first result. Fail if no result is found.\n */\n async oneOrFail(): Promise<AnnotatedModel<T, any, any>> {\n const model = await this.one();\n if (!model) {\n throw new HysteriaError(\n \"SqlDataSource::query::oneOrFail\",\n \"ROW_NOT_FOUND\",\n );\n }\n\n return model;\n }\n\n /**\n * @alias oneOrFail\n */\n async firstOrFail(): Promise<AnnotatedModel<T, any, any>> {\n return this.oneOrFail();\n }\n\n /**\n * @description Executes the query and returns a node readable stream.\n * @description If used by a model query builder, it will serialize the models and apply the hooks and relations.\n * @postgres needs the pg-query-stream package in order to work\n * @throws If using postgres and the `pg-query-stream` package is not installed\n */\n async stream<M extends Model = T>(\n options: StreamOptions = {},\n ): Promise<PassThrough & AsyncGenerator<AnnotatedModel<M, {}, {}>>> {\n const { sql, bindings } = this.unWrap();\n const stream = await execSqlStreaming(\n sql,\n bindings,\n this.sqlDataSource,\n options,\n {\n onData: (passThrough, row) => {\n passThrough.write(row);\n },\n },\n );\n\n return stream as PassThrough & AsyncGenerator<AnnotatedModel<M, {}, {}>>;\n }\n\n /**\n * @description Chunks the query into smaller queries, it returns a generator of the chunks\n * @description It will continue to yield chunks until the query returns no results\n * @description Useful for large queries that need to be processed in chunks\n * @warning overrides limit and offset set before in the query builder\n * @param chunkSize - The size of the chunk\n * @returns a generator of the chunks\n * @example\n * const chunks = await queryBuilder.chunk(100);\n * // first chunk\n * const firstChunk = await chunks.next();\n * console.log(firstChunk.value);\n * // second chunk\n * const secondChunk = await chunks.next();\n * console.log(secondChunk.value);\n * // third chunk\n * const thirdChunk = await chunks.next();\n * console.log(thirdChunk.value);\n *\n * @example\n * const chunkSize = 3;\n * const chunks = [];\n * const query = sql.query(\"users\").orderBy(\"name\", \"asc\");\n * for await (const chunk of sql.chunk(chunkSize)) {\n * chunks.push(chunk);\n * }\n *\n * console.log(chunks);\n */\n async *chunk(chunkSize: number) {\n let offset = 0;\n\n while (true) {\n const models = await this.limit(chunkSize).offset(offset).many();\n if (!models.length) {\n break;\n }\n\n offset += models.length;\n yield models;\n }\n }\n\n /**\n * @description Executes the query and retrieves multiple paginated results.\n * @description Overrides the limit and offset clauses in order to paginate the results.\n * @description Allows to avoid offset clause that can be inefficient for large datasets\n * @description If using a model query builder, primary key is used as discriminator by default\n * @param options - The options for the paginate with cursor\n * @param options.discriminator - The discriminator to use for the paginate with Cursor pagination\n * @param options.operator - The operator to use for the paginate with Cursor pagination\n * @param options.orderBy - The order by to use for the paginate with Cursor pagination\n * @param cursor - The cursor to use for the paginate with Cursor pagination\n * @warning If no order by clause is present in the query, the query will add an order by clause to the query `orderBy(discriminator, \"asc\")`\n * @returns the pagination metadata and the cursor for the next page\n */\n async paginateWithCursor<K extends ModelKey<T>>(\n limit: number,\n options: PaginateWithCursorOptions<T, K>,\n cursor?: Cursor<T, K>,\n ): Promise<[CursorPaginatedData<T>, Cursor<T, K>]> {\n const countQueryBuilder = this.clone();\n\n if (!this.orderByNodes.length) {\n this.orderBy(options.discriminator, options.orderBy || \"asc\");\n }\n\n if (cursor) {\n this.where(cursor.key, options.operator || \">\", cursor.value);\n }\n\n this.limit(limit);\n\n const data = await this.many();\n const count = await countQueryBuilder.getCount();\n\n const lastItem = data[data.length - 1];\n const lastItemValue = lastItem ? lastItem[options.discriminator] : null;\n const paginationMetadata = getCursorPaginationMetadata(limit, count);\n\n return [\n {\n paginationMetadata: paginationMetadata,\n data,\n },\n {\n key: options.discriminator,\n value: lastItemValue,\n },\n ];\n }\n\n /**\n * @description Selects a subquery, subquery must return a single column\n */\n selectSubQuery(\n cbOrQueryBuilder: ((subQuery: QueryBuilder<T>) => void) | QueryBuilder<any>,\n alias: string,\n ): this {\n if (typeof cbOrQueryBuilder === \"function\") {\n const subQuery = new QueryBuilder<T>(this.model, this.sqlDataSource);\n cbOrQueryBuilder(subQuery);\n this.selectNodes.push(\n new SelectNode(subQuery.extractQueryNodes(), alias),\n );\n return this;\n }\n\n this.selectNodes.push(\n new SelectNode(cbOrQueryBuilder.extractQueryNodes(), alias),\n );\n return this;\n }\n\n /**\n * @description Locks the table for update\n * @param skipLocked - If true, the query will skip locked rows\n * @sqlite does not support skipping locked rows, it will be ignored\n */\n lockForUpdate(\n options: { skipLocked?: boolean; noWait?: boolean } = {},\n ): this {\n this.lockQueryNodes.push(\n new LockNode(\"for_update\", options.skipLocked, options.noWait),\n );\n return this;\n }\n\n /**\n * @description Locks the table for share\n * @param skipLocked - If true, the query will skip locked rows\n * @sqlite does not support skipping locked rows, it will be ignored\n */\n forShare(options: { skipLocked?: boolean; noWait?: boolean } = {}): this {\n this.lockQueryNodes.push(\n new LockNode(\"for_share\", options.skipLocked, options.noWait),\n );\n return this;\n }\n\n /**\n * @description Adds a UNION to the query.\n */\n union(query: string, bindings?: any[]): this;\n union(cb: UnionCallBack<T>): this;\n union(queryBuilderOrCb: UnionCallBack<any> | string): this {\n if (typeof queryBuilderOrCb === \"string\") {\n this.unionNodes.push(new UnionNode(queryBuilderOrCb));\n return this;\n }\n\n const queryBuilder =\n queryBuilderOrCb instanceof QueryBuilder\n ? queryBuilderOrCb\n : queryBuilderOrCb(new QueryBuilder(this.model, this.sqlDataSource));\n\n const nodes = queryBuilder.extractQueryNodes();\n this.unionNodes.push(new UnionNode(nodes));\n return this;\n }\n\n /**\n * @description Adds a UNION ALL to the query.\n */\n unionAll(query: string, bindings?: any[]): this;\n unionAll(cb: UnionCallBack<T>): this;\n unionAll(queryBuilder: QueryBuilder<any>): this;\n unionAll(\n queryBuilderOrCb: UnionCallBack<any> | QueryBuilder<any> | string,\n ): this {\n if (typeof queryBuilderOrCb === \"string\") {\n this.unionNodes.push(new UnionNode(queryBuilderOrCb, true));\n return this;\n }\n\n const queryBuilder =\n queryBuilderOrCb instanceof QueryBuilder\n ? queryBuilderOrCb\n : queryBuilderOrCb(new QueryBuilder(this.model, this.sqlDataSource));\n\n const nodes = queryBuilder.extractQueryNodes();\n this.unionNodes.push(new UnionNode(nodes, true));\n return this;\n }\n\n /**\n * @description Increments the value of a column by a given amount\n * @typeSafe - In typescript, only numeric columns of the model will be accepted if using a Model\n * @default value + 1\n * @returns the number of affected rows\n */\n async increment(column: string, value: number): Promise<number>;\n async increment(column: NumberModelKey<T>, value: number): Promise<number>;\n async increment(\n column: NumberModelKey<T> | string,\n value: number = 1,\n ): Promise<number> {\n return this.update({\n [column as string]: this.sqlDataSource.rawStatement(\n `${column as string} + ${value}`,\n ),\n });\n }\n\n /**\n * @description Decrements the value of a column by a given amount\n * @typeSafe - In typescript, only numeric columns of the model will be accepted if using a Model\n * @default value - 1\n * @returns the number of affected rows\n */\n async decrement(column: string, value: number): Promise<number>;\n async decrement(column: NumberModelKey<T>, value: number): Promise<number>;\n async decrement(\n column: NumberModelKey<T> | string,\n value: number = 1,\n ): Promise<number> {\n return this.update({\n [column as string]: this.sqlDataSource.rawStatement(\n `${column as string} - ${value}`,\n ),\n });\n }\n\n /**\n * @description Executes the query and retrieves the count of results, it ignores all select, group by, order by, limit and offset clauses if they are present.\n */\n async getCount(column: string = \"*\"): Promise<number> {\n this.clearForFunctions();\n this.annotate(\"count\", column, \"total\");\n const result = await this.one();\n return result ? coerceToNumber(result[\"total\" as keyof typeof result]) : 0;\n }\n\n /**\n * @description Executes the query and retrieves the maximum value of a column, it ignores all select, group by, order by, limit and offset clauses if they are present.\n */\n async getMax(column: string): Promise<number> {\n this.clearForFunctions();\n this.annotate(\"max\", column, \"total\");\n const result = await this.one();\n return result ? coerceToNumber(result[\"total\" as keyof typeof result]) : 0;\n }\n\n /**\n * @description Executes the query and retrieves the minimum value of a column, it ignores all select, group by, order by, limit and offset clauses if they are present.\n */\n async getMin(column: string): Promise<number> {\n this.clearForFunctions();\n this.annotate(\"min\", column, \"total\");\n const result = await this.one();\n return result ? coerceToNumber(result[\"total\" as keyof typeof result]) : 0;\n }\n\n /**\n * @description Executes the query and retrieves the average value of a column, it ignores all select, group by, order by, limit and offset clauses if they are present.\n */\n async getAvg(column: string): Promise<number> {\n this.clearForFunctions();\n this.annotate(\"avg\", column, \"total\");\n const result = await this.one();\n return result ? coerceToNumber(result[\"total\" as keyof typeof result]) : 0;\n }\n\n /**\n * @description Executes the query and retrieves the sum of a column, it ignores all select, group by, order by, limit and offset clauses if they are present.\n */\n async getSum(column: string): Promise<number> {\n this.clearForFunctions();\n this.annotate(\"sum\", column, \"total\");\n const result = await this.one();\n return result ? coerceToNumber(result[\"total\" as keyof typeof result]) : 0;\n }\n\n /**\n * @description Executes the query and retrieves multiple paginated results.\n * @description Overrides the limit and offset clauses in order to paginate the results.\n */\n async paginate(page: number, perPage: number): Promise<PaginatedData<T>> {\n if (typeof page !== \"number\" || typeof perPage !== \"number\") {\n logger.warn(\n `${this.model.name}::paginate Non numeric values provided to \\`paginate\\``,\n );\n }\n\n const countQueryBuilder = this.clone();\n\n // Original query is used to get the models with pagination data\n const [models, total] = await Promise.all([\n this.limit(perPage)\n .offset((page - 1) * perPage)\n .many(),\n countQueryBuilder.getCount(\"*\"),\n ]);\n\n const paginationMetadata = getPaginationMetadata(page, perPage, total);\n\n return {\n paginationMetadata,\n data: models,\n } as PaginatedData<T>;\n }\n\n /**\n * @description Overrides the from clause in the query.\n */\n from<S extends string>(table: TableFormat<S>, alias?: string): this;\n from(cb: (qb: QueryBuilder<T>) => void, alias: string): this;\n from<S extends string>(\n tableOrCb: TableFormat<S> | ((qb: QueryBuilder<T>) => void),\n maybeAlias?: string,\n ): this {\n if (typeof tableOrCb === \"function\") {\n if (!maybeAlias) {\n throw new HysteriaError(\n \"QueryBuilder::from\",\n \"MISSING_ALIAS_FOR_SUBQUERY\",\n );\n }\n\n const subQueryBuilder = new QueryBuilder<T>(\n this.model,\n this.sqlDataSource,\n );\n\n tableOrCb(subQueryBuilder);\n const subQueryNodes = subQueryBuilder.extractQueryNodes();\n this.fromNode = new FromNode(subQueryNodes, maybeAlias);\n return this;\n }\n\n this.fromNode = new FromNode(tableOrCb, maybeAlias);\n return this;\n }\n\n /**\n * @description Adds a CTE to the query using a callback to build the subquery.\n */\n with(alias: string, cb: (qb: QueryBuilder<T>) => void): this {\n const subQuery = new QueryBuilder<T>(this.model, this.sqlDataSource);\n cb(subQuery);\n const nodes = subQuery.extractQueryNodes();\n this.withNodes.push(new WithNode(\"normal\", alias, nodes));\n return this;\n }\n\n /**\n * @description Adds a recursive CTE to the query using a callback to build the subquery.\n */\n withRecursive(alias: string, cb: (qb: QueryBuilder<T>) => void): this {\n const subQuery = new QueryBuilder<T>(this.model, this.sqlDataSource);\n cb(subQuery);\n const nodes = subQuery.extractQueryNodes();\n this.withNodes.push(new WithNode(\"recursive\", alias, nodes));\n return this;\n }\n\n /**\n * @description Adds a materialized CTE to the query using a callback to build the subquery.\n * @postgres only\n * @throws HysteriaError if the database type is not postgres\n */\n withMaterialized(alias: string, cb: (qb: QueryBuilder<T>) => void): this {\n if (this.dbType !== \"postgres\" && this.dbType !== \"cockroachdb\") {\n throw new HysteriaError(\n \"QueryBuilder::withMaterialized\",\n \"MATERIALIZED_CTE_NOT_SUPPORTED\",\n new Error(\"MATERIALIZED CTE is only supported by postgres\"),\n );\n }\n\n const subQuery = new QueryBuilder<T>(this.model, this.sqlDataSource);\n cb(subQuery);\n const nodes = subQuery.extractQueryNodes();\n this.withNodes.push(new WithNode(\"materialized\", alias, nodes));\n return this;\n }\n\n /**\n * @description Insert record into a table\n * @param returning - The columns to return from the query, only supported by postgres and cockroachdb - default is \"*\"\n * @returns raw driver response\n */\n async insert(data: Record<string, any>, returning?: string[]): Promise<T> {\n const { columns: preparedColumns, values: preparedValues } =\n await this.interpreterUtils.prepareColumns(\n Object.keys(data),\n Object.values(data),\n \"insert\",\n );\n\n const insertObject = Object.fromEntries(\n preparedColumns.map((column, index) => [column, preparedValues[index]]),\n );\n\n this.insertNode = new InsertNode(this.fromNode, [insertObject], returning);\n const { sql, bindings } = this.astParser.parse([this.insertNode]);\n\n const rows = await execSql(sql, bindings, this.sqlDataSource, \"raw\", {\n sqlLiteOptions: {\n typeofModel: this.model,\n mode: \"insertOne\",\n models: [data as T],\n },\n });\n\n return Array.isArray(rows) && rows.length ? rows[0] : rows;\n }\n\n /**\n * @description Insert multiple records into a table\n * @param returning - The columns to return from the query, only supported by postgres and cockroachdb - default is \"*\"\n * @returns raw driver response\n */\n async insertMany(\n data: Record<string, any>[],\n returning?: string[],\n ): Promise<T[]> {\n if (!data.length) {\n return [];\n }\n\n const models = await Promise.all(\n data.map(async (model) => {\n const { columns: preparedColumns, values: preparedValues } =\n await this.interpreterUtils.prepareColumns(\n Object.keys(model),\n Object.values(model),\n \"insert\",\n );\n\n return Object.fromEntries(\n preparedColumns.map((column, index) => [\n column,\n preparedValues[index],\n ]),\n );\n }),\n );\n\n this.insertNode = new InsertNode(this.fromNode, models, returning);\n const { sql, bindings } = this.astParser.parse([this.insertNode]);\n\n return execSql(sql, bindings, this.sqlDataSource, \"raw\", {\n sqlLiteOptions: {\n typeofModel: this.model,\n mode: \"insertMany\",\n models: models as T[],\n },\n });\n }\n\n /**\n * @description Updates or creates a new record using upsert functionality\n * @param data The data to insert or update\n * @param searchCriteria The criteria to search for existing records\n * @param options Upsert options including updateOnConflict and returning columns\n * @returns The upserted record\n */\n async upsert<O extends Record<string, any>>(\n data: O,\n searchCriteria: Partial<O>,\n options: UpsertOptionsRawBuilder = {\n updateOnConflict: true,\n },\n ): Promise<T[]> {\n const columnsToUpdate = Object.keys(data);\n const conflictColumns = Object.keys(searchCriteria);\n const { columns: preparedColumns, values: preparedValues } =\n await this.interpreterUtils.prepareColumns(\n Object.keys(data),\n Object.values(data),\n \"insert\",\n );\n\n const insertObject = Object.fromEntries(\n preparedColumns.map((column, index) => [column, preparedValues[index]]),\n );\n\n const { sql, bindings } = this.astParser.parse([\n new InsertNode(\n new FromNode(this.model.table),\n [insertObject],\n undefined,\n true,\n ),\n new OnDuplicateNode(\n this.model.table,\n conflictColumns,\n columnsToUpdate,\n (options.updateOnConflict ?? true) ? \"update\" : \"ignore\",\n options.returning as string[],\n ),\n ]);\n\n const rawResult = await execSql(sql, bindings, this.sqlDataSource, \"raw\", {\n sqlLiteOptions: {\n typeofModel: this.model,\n mode: \"raw\",\n models: [data as unknown as T],\n },\n });\n\n return (Array.isArray(rawResult) ? rawResult : [rawResult]) as T[];\n }\n\n /**\n * @description Updates or creates multiple records using upsert functionality\n * @param conflictColumns The columns to check for conflicts\n * @param columnsToUpdate The columns to update on conflict\n * @param data Array of data objects to insert or update\n * @param options Upsert options including updateOnConflict and returning columns\n */\n async upsertMany<O extends Record<string, any>>(\n conflictColumns: string[],\n columnsToUpdate: string[],\n data: O[],\n options: UpsertOptionsRawBuilder = {\n updateOnConflict: true,\n },\n ): Promise<T[]> {\n const insertObjects: Record<string, any>[] = [];\n\n await Promise.all(\n data.map(async (record) => {\n const { columns: preparedColumns, values: preparedValues } =\n await this.interpreterUtils.prepareColumns(\n Object.keys(record),\n Object.values(record),\n \"insert\",\n );\n\n const insertObject = Object.fromEntries(\n preparedColumns.map((column, index) => [\n column,\n preparedValues[index],\n ]),\n );\n\n insertObjects.push(insertObject);\n }),\n );\n\n const { sql, bindings } = this.astParser.parse([\n new InsertNode(\n new FromNode(this.model.table),\n insertObjects,\n undefined,\n true,\n ),\n new OnDuplicateNode(\n this.model.table,\n conflictColumns,\n columnsToUpdate,\n (options.updateOnConflict ?? true) ? \"update\" : \"ignore\",\n options.returning as string[],\n ),\n ]);\n\n const rawResult = await execSql(sql, bindings, this.sqlDataSource, \"raw\", {\n sqlLiteOptions: {\n typeofModel: this.model,\n mode: \"raw\",\n models: data as unknown as T[],\n },\n });\n return (Array.isArray(rawResult)\n ? rawResult\n : [rawResult]) as unknown as T[];\n }\n\n /**\n * @description Updates records from a table\n * @returns the number of affected rows\n */\n async update(data: Record<string, any>): Promise<number> {\n const rawColumns = Object.keys(data);\n const rawValues = Object.values(data);\n\n const { columns, values } = await this.interpreterUtils.prepareColumns(\n rawColumns,\n rawValues,\n \"update\",\n );\n\n this.updateNode = new UpdateNode(this.fromNode, columns, values);\n const { sql, bindings } = this.astParser.parse([\n this.updateNode,\n ...this.whereNodes,\n ...this.joinNodes,\n ]);\n\n return execSql(sql, bindings, this.sqlDataSource, \"affectedRows\", {\n sqlLiteOptions: { typeofModel: this.model, mode: \"affectedRows\" },\n });\n }\n\n /**\n * @description Deletes all records from a table\n * @warning This operation does not trigger any hook\n */\n async truncate(): Promise<void> {\n this.truncateNode = new TruncateNode(this.fromNode);\n const { sql, bindings } = this.astParser.parse([this.truncateNode]);\n await execSql(sql, bindings, this.sqlDataSource, \"raw\");\n }\n\n /**\n * @description Deletes records from a table\n * @returns the number of affected rows\n */\n async delete(): Promise<number> {\n this.deleteNode = new DeleteNode(this.fromNode);\n const { sql, bindings } = this.astParser.parse([\n this.deleteNode,\n ...this.whereNodes,\n ...this.joinNodes,\n ]);\n\n return execSql(sql, bindings, this.sqlDataSource, \"affectedRows\", {\n sqlLiteOptions: {\n typeofModel: this.model,\n mode: \"affectedRows\",\n },\n });\n }\n\n /**\n * @description Soft deletes records from a table\n * @default column - 'deletedAt'\n * @default value - The current date and time in UTC timezone in the format \"YYYY-MM-DD HH:mm:ss\"\n * @returns the number of affected rows\n */\n async softDelete(\n options: Omit<SoftDeleteOptions<T>, \"ignoreBeforeDeleteHook\"> = {},\n ): Promise<number> {\n const { column = \"deletedAt\", value = baseSoftDeleteDate() } =\n options || {};\n\n const { columns, values } = await this.interpreterUtils.prepareColumns(\n [column as string],\n [value],\n \"update\",\n );\n\n this.updateNode = new UpdateNode(this.fromNode, columns, values);\n const { sql, bindings } = this.astParser.parse([\n this.updateNode,\n ...this.whereNodes,\n ...this.joinNodes,\n ]);\n\n return execSql(sql, bindings, this.sqlDataSource, \"affectedRows\", {\n sqlLiteOptions: {\n typeofModel: this.model,\n mode: \"affectedRows\",\n },\n });\n }\n\n /**\n * @description Returns the query with the parameters bound to the query\n */\n toQuery(): string {\n const { sql, bindings } = this.unWrap();\n return bindParamsIntoQuery(sql, bindings);\n }\n\n /**\n * @description Returns the query with database driver placeholders and the params\n */\n unWrap(): ReturnType<typeof AstParser.prototype.parse> {\n if (!this.selectNodes.length) {\n this.selectNodes = [new SelectNode(`*`)];\n }\n\n const { sql, bindings } = this.astParser.parse(this.extractQueryNodes());\n\n const formattedQuery = formatQuery(this.sqlDataSource, sql);\n\n const finalQuery = this.withQuery\n ? `${this.withQuery} ${formattedQuery}`\n : formattedQuery;\n\n return {\n sql: finalQuery,\n bindings: [...(bindings || [])],\n };\n }\n\n /**\n * @description Returns a deep clone of the query builder instance.\n */\n clone(): this {\n const qb = new QueryBuilder<T>(this.model, this.sqlDataSource) as any;\n\n // select / from / distinct (from SelectQueryBuilder)\n qb.dbType = this.dbType;\n qb.modelSelectedColumns = deepCloneNode(this.modelSelectedColumns);\n qb.modelAnnotatedColumns = deepCloneNode(this.modelAnnotatedColumns);\n qb.distinctNode = deepCloneNode(this.distinctNode);\n qb.distinctOnNode = deepCloneNode(this.distinctOnNode);\n qb.selectNodes = deepCloneNode(this.selectNodes);\n qb.withQuery = deepCloneNode(this.withQuery);\n\n // join / where / group / having / order\n qb.joinNodes = deepCloneNode(this.joinNodes);\n qb.whereNodes = deepCloneNode(this.whereNodes);\n qb.groupByNodes = deepCloneNode(this.groupByNodes);\n qb.havingNodes = deepCloneNode(this.havingNodes);\n qb.orderByNodes = deepCloneNode(this.orderByNodes);\n\n // locks / unions / with\n qb.lockQueryNodes = deepCloneNode(this.lockQueryNodes);\n qb.unionNodes = deepCloneNode(this.unionNodes);\n qb.withNodes = deepCloneNode(this.withNodes);\n\n // from / limit / offset / flags\n qb.fromNode = deepCloneNode(this.fromNode);\n qb.limitNode = deepCloneNode(this.limitNode);\n qb.offsetNode = deepCloneNode(this.offsetNode);\n\n // flags\n qb.isNestedCondition = this.isNestedCondition;\n qb.mustRemoveAnnotations = this.mustRemoveAnnotations;\n\n return qb as this;\n }\n\n /**\n * @description Gives a fresh instance of the query builder\n */\n clear() {\n const qb = new QueryBuilder(this.model, this.sqlDataSource);\n if (this.fromNode.alias) {\n qb.from(qb.model.table, this.fromNode.alias);\n }\n\n return qb;\n }\n\n /**\n * @description Removes the lock query\n */\n clearLockQuery(): this {\n this.lockQueryNodes = [];\n return this;\n }\n\n /**\n * @description Removes any union query\n */\n clearUnionQuery(): this {\n this.unionNodes = [];\n return this;\n }\n\n /**\n * @description Removes any with query\n */\n clearWithQuery(): this {\n this.withNodes = [];\n return this;\n }\n\n extractQueryNodes(): QueryNode[] {\n if (!this.selectNodes.length) {\n this.selectNodes = [new SelectNode(`*`)];\n }\n\n if (this.insertNode) {\n return [this.insertNode, this.onDuplicateNode].filter(\n Boolean,\n ) as QueryNode[];\n }\n\n if (this.updateNode) {\n return [\n this.updateNode,\n ...this.whereNodes,\n ...this.joinNodes,\n ...this.orderByNodes,\n this.limitNode,\n ].filter(Boolean) as QueryNode[];\n }\n\n if (this.deleteNode) {\n return [\n this.deleteNode,\n ...this.whereNodes,\n ...this.joinNodes,\n ...this.orderByNodes,\n this.limitNode,\n ].filter(Boolean) as QueryNode[];\n }\n\n if (this.truncateNode) {\n return [this.truncateNode];\n }\n\n // Read case\n return [\n ...this.withNodes,\n this.distinctNode,\n this.distinctOnNode,\n ...this.selectNodes,\n this.fromNode,\n ...this.joinNodes,\n ...this.whereNodes,\n ...this.groupByNodes,\n ...this.havingNodes,\n ...this.orderByNodes,\n this.limitNode,\n this.offsetNode,\n ...this.lockQueryNodes,\n ...this.unionNodes,\n ].filter(Boolean) as QueryNode[];\n }\n\n protected clearForFunctions(): this {\n this.clearSelect();\n this.clearGroupBy();\n this.clearOrderBy();\n this.clearLimit();\n this.clearOffset();\n return this;\n }\n\n /**\n * @description Makes a many query and returns the time that took to execute that query\n */\n private async manyWithPerformance(\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ): Promise<{\n data: AnnotatedModel<T, any, any>[];\n time: number;\n }> {\n const [time, data] = await withPerformance(\n this.many.bind(this),\n returnType,\n )();\n\n return {\n data,\n time: Number(time),\n };\n }\n\n /**\n * @description Makes a one query and returns the time that took to execute that query\n */\n private async oneWithPerformance(\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ): Promise<{\n data: AnnotatedModel<T, any, any> | null;\n time: number;\n }> {\n const [time, data] = await withPerformance(\n this.one.bind(this),\n returnType,\n )();\n\n return {\n data,\n time: Number(time),\n };\n }\n\n /**\n * @alias oneWithPerformance\n */\n private async firstWithPerformance(\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n return this.oneWithPerformance(returnType);\n }\n\n /**\n * @alias oneOrFailWithPerformance\n */\n private async firstOrFailWithPerformance(\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n return this.oneOrFailWithPerformance(returnType);\n }\n\n private async paginateWithPerformance(\n page: number,\n perPage: number,\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, data] = await withPerformance(\n this.paginate.bind(this, page, perPage),\n returnType,\n )();\n\n return {\n data,\n time: Number(time),\n };\n }\n\n private async paginateWithCursorWithPerformance(\n page: number,\n options: PaginateWithCursorOptions<T, ModelKey<T>>,\n cursor?: Cursor<T, ModelKey<T>>,\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, data] = await withPerformance(\n this.paginateWithCursor.bind(this, page, options, cursor),\n returnType,\n )();\n\n return {\n data,\n time: Number(time),\n };\n }\n\n /**\n * @description Makes a one or fail query and returns the time that took to execute that query\n */\n private async oneOrFailWithPerformance(\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, data] = await withPerformance(\n this.oneOrFail.bind(this),\n returnType,\n )();\n\n return {\n data,\n time: Number(time),\n };\n }\n\n /**\n * @description Executes the query and returns true if the query returns at least one result, false otherwise.\n * @description Returns the time that took to execute the query\n */\n private async existsWithPerformance(\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ): Promise<{\n data: boolean;\n time: number;\n }> {\n const [time, data] = await withPerformance(\n this.exists.bind(this),\n returnType,\n )();\n return { data, time: Number(time) };\n }\n\n private async pluckWithPerformance(\n key: ModelKey<T>,\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, data] = await withPerformance(\n this.pluck.bind(this, key),\n returnType,\n )();\n\n return {\n data,\n time: Number(time),\n };\n }\n\n private async updateWithPerformance(\n data: Record<string, any>,\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, result] = await withPerformance(\n this.update.bind(this, data),\n returnType,\n )();\n\n return {\n data: result,\n time: Number(time),\n };\n }\n\n private async insertWithPerformance(\n data: Record<string, any>,\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, result] = await withPerformance(\n this.insert.bind(this, data),\n returnType,\n )();\n\n return {\n data: result,\n time: Number(time),\n };\n }\n\n private async insertManyWithPerformance(\n data: Record<string, any>[],\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, result] = await withPerformance(\n this.insertMany.bind(this, data),\n returnType,\n )();\n\n return {\n data: result,\n time: Number(time),\n };\n }\n\n private async softDeleteWithPerformance(\n options: Omit<SoftDeleteOptions<T>, \"ignoreBeforeDeleteHook\"> = {},\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, data] = await withPerformance(\n this.softDelete.bind(this, options),\n returnType,\n )();\n\n return {\n data,\n time: Number(time),\n };\n }\n\n private async deleteWithPerformance(\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, data] = await withPerformance(\n this.delete.bind(this),\n returnType,\n )();\n\n return {\n data,\n time: Number(time),\n };\n }\n\n private async truncateWithPerformance(\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, result] = await withPerformance(\n this.truncate.bind(this),\n returnType,\n )();\n\n return {\n data: result,\n time: Number(time),\n };\n }\n}\n","import crypto from \"node:crypto\";\nimport { PassThrough } from \"node:stream\";\nimport { HysteriaError } from \"../../../errors/hysteria_error\";\nimport { convertCase } from \"../../../utils/case_utils\";\nimport { withPerformance } from \"../../../utils/performance\";\nimport { SelectNode } from \"../../ast/query/node/select/basic_select\";\nimport type { SqlMethod } from \"../../ast/query/node/select/select_types\";\nimport { BaseValues, BinaryOperatorType } from \"../../ast/query/node/where\";\nimport { InterpreterUtils } from \"../../interpreter/interpreter_utils\";\nimport { Model } from \"../../models/model\";\nimport type {\n ModelKey,\n ModelRelation,\n} from \"../../models/model_manager/model_manager_types\";\nimport SqlModelManagerUtils from \"../../models/model_manager/model_manager_utils\";\nimport {\n CursorPaginatedData,\n getPaginationMetadata,\n PaginatedData,\n} from \"../../pagination\";\nimport {\n DeleteOptions,\n SoftDeleteOptions,\n} from \"../../query_builder/delete_query_builder_type\";\nimport { QueryBuilder } from \"../../query_builder/query_builder\";\nimport {\n Cursor,\n PaginateWithCursorOptions,\n RelationRetrieveMethod,\n SelectableColumn,\n StreamOptions,\n} from \"../../query_builder/query_builder_types\";\nimport type { UpdateOptions } from \"../../query_builder/update_query_builder_types\";\nimport {\n deepCloneNode,\n remapSelectedColumnToFromAlias,\n} from \"../../resources/utils\";\nimport { serializeModel } from \"../../serializer\";\nimport { SqlDataSource } from \"../../sql_data_source\";\nimport { execSqlStreaming } from \"../../sql_runner/sql_runner\";\nimport { ColumnType } from \"../decorators/model_decorators_types\";\nimport { BaseModelMethodOptions, ModelWithoutRelations } from \"../model_types\";\nimport { ManyToMany } from \"../relations/many_to_many\";\nimport { Relation, RelationEnum } from \"../relations/relation\";\nimport type {\n AnnotatedModel,\n CommonSqlMethodReturnType,\n FetchHooks,\n ManyOptions,\n OneOptions,\n RelatedInstance,\n} from \"./model_query_builder_types\";\nimport type { RelationQueryBuilderType } from \"./relation_query_builder/relation_query_builder_types\";\n\nexport class ModelQueryBuilder<\n T extends Model,\n A extends Record<string, any> = {},\n R extends Record<string, any> = {},\n> extends QueryBuilder<T> {\n declare relation: Relation;\n protected sqlModelManagerUtils: SqlModelManagerUtils<T>;\n protected relationQueryBuilders: ModelQueryBuilder<any>[];\n protected modelSelectedColumns: string[];\n private modelColumnsMap: Map<string, ColumnType>;\n private modelColumnsDatabaseNames: Map<string, string>;\n protected limitValue?: number;\n protected offsetValue?: number;\n\n // @ts-expect-error\n override performance = {\n many: this.manyWithPerformance.bind(this),\n one: this.oneWithPerformance.bind(this),\n oneOrFail: this.oneOrFailWithPerformance.bind(this),\n first: this.firstWithPerformance.bind(this),\n firstOrFail: this.firstOrFailWithPerformance.bind(this),\n paginate: this.paginateWithPerformance.bind(this),\n exists: this.existsWithPerformance.bind(this),\n paginateWithCursor: this.paginateWithCursorWithPerformance.bind(this),\n truncate: this.truncateWithPerformance.bind(this),\n delete: this.deleteWithPerformance.bind(this),\n update: this.updateWithPerformance.bind(this),\n softDelete: this.softDeleteWithPerformance.bind(this),\n pluck: this.pluckWithPerformance.bind(this),\n };\n\n constructor(model: typeof Model, sqlDataSource: SqlDataSource) {\n super(model, sqlDataSource);\n this.sqlModelManagerUtils = new SqlModelManagerUtils<T>(\n model,\n this.dbType,\n sqlDataSource,\n );\n\n this.relationQueryBuilders = [];\n this.modelSelectedColumns = [];\n this.modelColumnsMap = new Map<string, ColumnType>();\n this.modelColumnsDatabaseNames = new Map<string, string>();\n const modelColumns = this.model.getColumns();\n modelColumns.forEach((column) => {\n this.modelColumnsMap.set(column.databaseName, column);\n this.modelColumnsDatabaseNames.set(\n column.databaseName,\n column.columnName,\n );\n });\n }\n\n /**\n * @description Returns true if the query builder is a relation query builder, this changes the behavior of the query builder like limit, offset, etc.\n * @internal\n */\n protected get isRelationQueryBuilder(): boolean {\n return !!this.relation;\n }\n\n /**\n * @description Creates a new ModelQueryBuilder instance from a model. Will use the main connection to the database by default.\n */\n static from(\n model: typeof Model,\n options: BaseModelMethodOptions = {},\n ): ModelQueryBuilder<InstanceType<typeof model>> {\n if (options.connection) {\n return new ModelQueryBuilder(model, options.connection as SqlDataSource);\n }\n\n if (options.trx) {\n return new ModelQueryBuilder(model, options.trx.sql as SqlDataSource);\n }\n\n return new ModelQueryBuilder(model, model.sqlInstance);\n }\n\n async one(options: OneOptions = {}): Promise<AnnotatedModel<T, A, R> | null> {\n const result = await this.limit(1).many(options);\n if (!result || !result.length) {\n return null;\n }\n\n return result[0];\n }\n\n async first(options?: OneOptions): Promise<AnnotatedModel<T, A, R> | null> {\n return this.one(options);\n }\n\n async oneOrFail(options?: {\n ignoreHooks?: OneOptions[\"ignoreHooks\"] & { customError?: Error };\n }): Promise<AnnotatedModel<T, A, R>> {\n const model = await this.one(options);\n if (!model) {\n throw new HysteriaError(this.model.name + \"::oneOrFail\", \"ROW_NOT_FOUND\");\n }\n\n return model as AnnotatedModel<T, A, R>;\n }\n\n async firstOrFail(options?: {\n ignoreHooks?: OneOptions[\"ignoreHooks\"] & { customError?: Error };\n }): Promise<AnnotatedModel<T, A, R>> {\n return this.oneOrFail(options);\n }\n\n override async many(\n options: ManyOptions = {},\n ): Promise<AnnotatedModel<T, A, R>[]> {\n !(options.ignoreHooks as string[])?.includes(\"beforeFetch\") &&\n (await this.model.beforeFetch?.(this));\n const rows = await super.many();\n const models = rows.map((row) => {\n return this.addAdditionalColumnsToModel(row, this.model);\n });\n\n if (!models.length) {\n return [];\n }\n\n const serializedModels = await serializeModel(\n models as T[],\n this.model,\n this.modelSelectedColumns,\n this.modelAnnotatedColumns,\n this.mustRemoveAnnotations,\n );\n\n if (!serializedModels) {\n return [];\n }\n\n const serializedModelsArray = Array.isArray(serializedModels)\n ? serializedModels\n : [serializedModels];\n\n if (!(options.ignoreHooks as string[])?.includes(\"afterFetch\")) {\n await this.model.afterFetch?.(serializedModelsArray);\n }\n\n if (this.relationQueryBuilders.length) {\n await this.processRelationsRecursively(serializedModelsArray);\n }\n\n return serializedModelsArray as unknown as AnnotatedModel<T, A, R>[];\n }\n\n override async *chunk(\n chunkSize: number,\n options: ManyOptions = {},\n ): AsyncGenerator<AnnotatedModel<T, A, R>[]> {\n let offset = 0;\n\n while (true) {\n const models = await this.limit(chunkSize).offset(offset).many(options);\n if (!models.length) {\n break;\n }\n\n yield models;\n offset += models.length;\n }\n }\n\n // @ts-expect-error\n override async stream(\n options: ManyOptions & StreamOptions = {},\n ): Promise<PassThrough & AsyncGenerator<AnnotatedModel<T, A, R>>> {\n !(options.ignoreHooks as string[])?.includes(\"beforeFetch\") &&\n (await this.model.beforeFetch?.(this));\n\n const { sql, bindings } = this.unWrap();\n const stream = await execSqlStreaming(\n sql,\n bindings,\n this.sqlDataSource,\n options,\n {\n onData: async (passThrough, row) => {\n const model = this.addAdditionalColumnsToModel(row, this.model);\n const serializedModel = await serializeModel(\n [model] as T[],\n this.model,\n this.modelSelectedColumns,\n this.modelAnnotatedColumns,\n this.mustRemoveAnnotations,\n );\n\n if (!serializedModel) {\n return;\n }\n\n if (!(options.ignoreHooks as string[])?.includes(\"afterFetch\")) {\n await this.model.afterFetch?.([serializedModel] as unknown as T[]);\n }\n\n if (this.relationQueryBuilders.length) {\n await this.processRelationsRecursively([serializedModel as T]);\n }\n\n passThrough.write(serializedModel);\n },\n },\n );\n\n return stream as PassThrough & AsyncGenerator<AnnotatedModel<T, A, R>>;\n }\n\n override async paginateWithCursor<K extends ModelKey<T>>(\n page: number,\n options?: PaginateWithCursorOptions<T, K>,\n cursor?: Cursor<T, K>,\n ): Promise<[CursorPaginatedData<T, A, R>, Cursor<T, K>]> {\n if (!options) {\n if (!this.model.primaryKey) {\n throw new HysteriaError(\n this.model.name + \"::paginateWithCursor\",\n \"PRIMARY_KEY_NOT_FOUND\",\n );\n }\n\n options = {\n discriminator: this.model.primaryKey as K,\n };\n }\n\n return super.paginateWithCursor(page, options, cursor) as Promise<\n [CursorPaginatedData<T, A, R>, Cursor<T, K>]\n >;\n }\n\n /**\n * @description Inserts a new record into the database, it is not advised to use this method directly from the query builder if using a ModelQueryBuilder (`Model.query()`), use the `Model.insert` method instead.\n */\n // @ts-expect-error\n override async insert(\n ...args: Parameters<typeof this.model.insert>\n ): ReturnType<typeof this.model.insert> {\n return (this.model as any).insert(...args);\n }\n\n /**\n * @description Inserts multiple records into the database, it is not advised to use this method directly from the query builder if using a ModelQueryBuilder (`Model.query()`), use the `Model.insertMany` method instead.\n */\n // @ts-expect-error\n override async insertMany(\n ...args: Parameters<typeof this.model.insertMany>\n ): ReturnType<typeof this.model.insertMany> {\n return (this.model as any).insertMany(...args);\n }\n\n override async update(\n data: Partial<ModelWithoutRelations<T>>,\n options: UpdateOptions = {},\n ): Promise<number> {\n if (!options.ignoreBeforeUpdateHook) {\n await this.model.beforeUpdate?.(this);\n }\n return super.update(data);\n }\n\n override async softDelete(\n options: SoftDeleteOptions<T> = {},\n ): Promise<number> {\n const { ignoreBeforeUpdateHook = false } = options || {};\n !ignoreBeforeUpdateHook && (await this.model.beforeUpdate?.(this));\n return super.softDelete(options);\n }\n\n async delete(options: DeleteOptions = {}): Promise<number> {\n if (!options.ignoreBeforeDeleteHook) {\n await this.model.beforeDelete?.(this);\n }\n return super.delete();\n }\n\n override async getCount(\n column: string = \"*\",\n options: { ignoreHooks: boolean } = { ignoreHooks: false },\n ): Promise<number> {\n this.clearForFunctions();\n this.annotate(\"count\", column, \"total\");\n const ignoredHooks: string[] = options.ignoreHooks ? [\"beforeFetch\"] : [];\n\n const result = (await this.one({\n ignoreHooks: ignoredHooks as FetchHooks,\n })) as { $annotations: { total: number } } | null;\n\n if (!result) {\n return 0;\n }\n\n return +result.$annotations.total;\n }\n\n override async getMax(\n column: string,\n options: { ignoreHooks: boolean } = { ignoreHooks: false },\n ): Promise<number> {\n this.clearForFunctions();\n this.annotate(\"max\", column, \"total\");\n const ignoredHooks: string[] = options.ignoreHooks\n ? [\"beforeFetch\", \"afterFetch\"]\n : [];\n\n const result = (await this.one({\n ignoreHooks: ignoredHooks as FetchHooks,\n })) as {\n $annotations: { total: number };\n } | null;\n\n if (!result) {\n return 0;\n }\n\n return +result.$annotations.total;\n }\n\n override async getMin(\n column: string,\n options: { ignoreHooks: boolean } = { ignoreHooks: false },\n ): Promise<number> {\n this.clearForFunctions();\n this.annotate(\"min\", column, \"total\");\n const ignoredHooks: string[] = options.ignoreHooks\n ? [\"beforeFetch\", \"afterFetch\"]\n : [];\n\n const result = (await this.one({\n ignoreHooks: ignoredHooks as FetchHooks,\n })) as {\n $annotations: { total: number };\n } | null;\n\n if (!result) {\n return 0;\n }\n\n return +result.$annotations.total;\n }\n\n override async getAvg(\n column: string,\n options: { ignoreHooks: boolean } = { ignoreHooks: false },\n ): Promise<number> {\n this.clearForFunctions();\n this.annotate(\"avg\", column, \"total\");\n const ignoredHooks: string[] = options.ignoreHooks\n ? [\"beforeFetch\", \"afterFetch\"]\n : [];\n\n const result = (await this.one({\n ignoreHooks: ignoredHooks as FetchHooks,\n })) as {\n $annotations: { total: number };\n } | null;\n\n if (!result) {\n return 0;\n }\n\n return +result.$annotations.total;\n }\n\n override async getSum(\n column: string,\n options: { ignoreHooks: boolean } = { ignoreHooks: false },\n ): Promise<number> {\n this.clearForFunctions();\n this.annotate(\"sum\", column, \"total\");\n const ignoredHooks: string[] = options.ignoreHooks\n ? [\"beforeFetch\", \"afterFetch\"]\n : [];\n\n const result = (await this.one({\n ignoreHooks: ignoredHooks as FetchHooks,\n })) as {\n $annotations: { total: number };\n } | null;\n\n if (!result) {\n return 0;\n }\n\n return +result.$annotations.total;\n }\n\n override async paginate(\n page: number,\n perPage: number,\n options: { ignoreHooks: boolean } = { ignoreHooks: false },\n ): Promise<PaginatedData<T, A, R>> {\n const clonedQuery = this.clone();\n\n const [models, total] = await Promise.all([\n this.limit(perPage)\n .offset((page - 1) * perPage)\n .many({\n ignoreHooks: options.ignoreHooks ? [\"beforeFetch\", \"afterFetch\"] : [],\n }),\n clonedQuery.getCount(\"*\", {\n ignoreHooks: options.ignoreHooks,\n }),\n ]);\n\n const paginationMetadata = getPaginationMetadata(page, perPage, total);\n\n return {\n paginationMetadata,\n data: models,\n };\n }\n\n override select<S extends string>(...columns: SelectableColumn<S>[]): this;\n override select(...columns: (ModelKey<T> | \"*\")[]): this;\n override select<S extends string>(\n ...columns: (ModelKey<T> | \"*\" | SelectableColumn<S>)[]\n ): this {\n this.modelSelectedColumns = [\n ...this.modelSelectedColumns,\n ...(columns as string[]),\n ];\n\n this.selectNodes = this.selectNodes.concat(\n columns.map((column) => new SelectNode(column as string)),\n );\n\n return this;\n }\n\n /**\n * @description Annotates a column with a SQL method or a simple alias\n * @description If using a model, the result will be available in the $annotations property of the model, else it will be available in the result of the query\n * @example\n * ```ts\n * const user = await User.query().annotate(\"max\", \"id\", \"maxId\").first(); // max(id) as maxId\n * const user = await User.query().annotate(\"id\", \"superId\").first(); // id as superId\n * ```\n */\n // @ts-expect-error\n override annotate<K extends string, V = any>(\n column: string,\n alias: K,\n ): ModelQueryBuilder<T, A & { [P in K]: V }, R>;\n // @ts-expect-error\n override annotate<\n K extends string,\n S extends SqlMethod,\n V = CommonSqlMethodReturnType<S>,\n >(\n sqlMethod: string,\n column: string,\n alias: K,\n ): ModelQueryBuilder<T, A & { [P in K]: V }, R>;\n // @ts-expect-error\n override annotate<\n K extends string,\n S extends SqlMethod,\n V = CommonSqlMethodReturnType<S>,\n >(\n sqlMethod: S,\n column: string,\n alias: K,\n ): ModelQueryBuilder<T, A & { [P in K]: V }, R>;\n // @ts-expect-error\n override annotate<\n K extends string,\n S extends SqlMethod,\n V = CommonSqlMethodReturnType<S>,\n >(\n sqlMethod: S,\n column: string,\n alias: K,\n ): ModelQueryBuilder<T, A & { [P in K]: V }, R>;\n\n // @ts-expect-error\n override annotate<\n K extends string,\n S extends SqlMethod,\n V = CommonSqlMethodReturnType<S>,\n >(\n sqlMethodOrColumn: string | S,\n columnOrAlias: string,\n maybeAlias?: string,\n ): ModelQueryBuilder<T, A & { [P in K]: V }, R> {\n let sqlMethod: string | undefined;\n let column: string;\n let alias: string;\n\n if (maybeAlias) {\n sqlMethod = sqlMethodOrColumn as string;\n column = columnOrAlias;\n alias = maybeAlias as string;\n } else {\n sqlMethod = undefined;\n column = sqlMethodOrColumn as string;\n alias = columnOrAlias as string;\n }\n\n this.selectNodes = this.selectNodes.concat(\n new SelectNode(column, alias, sqlMethod),\n );\n this.modelAnnotatedColumns.push(alias);\n\n return this;\n }\n\n /**\n * @description Removes annotations from the serialized model, by default, annotations are maintained in the serialized model if `annotate` is used\n */\n removeAnnotations(): ModelQueryBuilder<T, {}> {\n this.mustRemoveAnnotations = true;\n this.modelAnnotatedColumns = [];\n return this;\n }\n\n /**\n * @description Fills the relations in the model in the serialized response. Relation must be defined in the model.\n * @warning Many to many relations have special behavior, since they require a join, a join clause will always be added to the query.\n * @warning Many to many relations uses the model foreign key for mapping in the `$annotations` property, this property will be removed from the model after the relation is filled.\n * @warning Foreign keys should always be selected in the relation query builder, otherwise the relation will not be filled.\n */\n load<\n RelationKey extends ModelRelation<T>,\n IA extends Record<string, any> = {},\n IR extends Record<string, any> = {},\n >(\n relation: RelationKey,\n cb: (\n queryBuilder: RelationQueryBuilderType<RelatedInstance<T, RelationKey>>,\n ) => RelationQueryBuilderType<RelatedInstance<T, RelationKey>, IA, IR>,\n ): ModelQueryBuilder<\n T,\n A,\n R & {\n [K in RelationKey]: Awaited<\n ReturnType<\n ModelQueryBuilder<\n RelatedInstance<T, K>,\n IA,\n IR\n >[RelationRetrieveMethod<T[K]>]\n >\n >;\n }\n >;\n load<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n cb?: (\n queryBuilder: RelationQueryBuilderType<RelatedInstance<T, RelationKey>>,\n ) => void,\n ): ModelQueryBuilder<\n T,\n A,\n R & {\n [K in RelationKey]: Awaited<\n ReturnType<\n ModelQueryBuilder<\n RelatedInstance<T, K>,\n {},\n {}\n >[RelationRetrieveMethod<T[K]>]\n >\n >;\n }\n >;\n load<\n RelationKey extends ModelRelation<T>,\n IA extends Record<string, any> = {},\n IR extends Record<string, any> = {},\n >(\n relation: RelationKey,\n cb?: (\n queryBuilder: RelationQueryBuilderType<RelatedInstance<T, RelationKey>>,\n ) => RelationQueryBuilderType<\n RelatedInstance<T, RelationKey>,\n IA,\n IR\n > | void,\n ): ModelQueryBuilder<\n T,\n A,\n R & {\n [K in RelationKey]: Awaited<\n ReturnType<\n ModelQueryBuilder<\n RelatedInstance<T, K>,\n IA,\n IR\n >[RelationRetrieveMethod<T[K]>]\n >\n >;\n }\n > {\n const modelRelation =\n this.sqlModelManagerUtils.getRelationFromModel(relation);\n\n const relationQueryBuilder = new ModelQueryBuilder<\n RelatedInstance<T, RelationKey>\n >(modelRelation.model, this.sqlDataSource);\n\n relationQueryBuilder.relation = modelRelation;\n cb?.(\n relationQueryBuilder as unknown as RelationQueryBuilderType<\n RelatedInstance<T, RelationKey>\n >,\n );\n this.relationQueryBuilders.push(relationQueryBuilder);\n\n return this as unknown as ModelQueryBuilder<\n T,\n A,\n R & {\n [K in RelationKey]: Awaited<\n ReturnType<\n ModelQueryBuilder<\n RelatedInstance<T, K>,\n IA,\n IR\n >[RelationRetrieveMethod<T[K]>]\n >\n >;\n }\n >;\n }\n\n /**\n * @description Clears the relations from the query builder\n */\n clearRelations(): this {\n this.relationQueryBuilders = [];\n return this;\n }\n\n // #region Relation filters\n\n /**\n * @description Checks if the relation exists in the models and has the given filters, if no callback is provided, it only check if there is at least one record for the relation\n * @warning All select statements are ignored, since we're only checking if the relation exists, a \"select 1\" will be added to the Query\n */\n havingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n cb?: (\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void,\n ): this;\n havingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n operatorOrValue?: BinaryOperatorType | BaseValues,\n maybeValue?: BaseValues,\n ): this;\n havingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n cbOrOperatorOrValue?:\n | ((\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void)\n | BinaryOperatorType\n | BaseValues,\n maybeValue?: BaseValues,\n ): this {\n return this.andHavingRelated(\n relation,\n cbOrOperatorOrValue as any,\n maybeValue,\n );\n }\n\n /**\n * @description Checks if the relation exists in the models and has the given filters, if no callback is provided, it only check if there is at least one record for the relation\n * @warning All select statements are ignored, since we're only checking if the relation exists, a \"select 1\" will be added to the Query\n */\n andHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n cb?: (\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void,\n ): this;\n andHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n operatorOrValue?: BinaryOperatorType | BaseValues,\n maybeValue?: BaseValues,\n ): this;\n andHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n cbOrOperatorOrValue?:\n | ((\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void)\n | BinaryOperatorType\n | BaseValues,\n maybeValue?: BaseValues,\n ): this {\n let actualValue: BaseValues | undefined;\n let actualOperator: BinaryOperatorType | undefined;\n let cb:\n | ((\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void)\n | undefined;\n\n if (typeof cbOrOperatorOrValue === \"function\") {\n cb = cbOrOperatorOrValue as (\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void;\n } else if (\n typeof cbOrOperatorOrValue === \"string\" &&\n maybeValue !== undefined\n ) {\n actualOperator = cbOrOperatorOrValue as BinaryOperatorType;\n actualValue = maybeValue;\n } else if (cbOrOperatorOrValue !== undefined) {\n actualValue = cbOrOperatorOrValue as BaseValues;\n actualOperator = \"=\";\n }\n\n const modelRelation =\n this.sqlModelManagerUtils.getRelationFromModel(relation);\n const modelQueryBuilder = new ModelQueryBuilder<\n RelatedInstance<T, RelationKey>\n >(modelRelation.model, this.sqlDataSource);\n modelQueryBuilder.relation = modelRelation;\n\n const relationQueryBuilder = this.getRelatedModelsQueryForRelation(\n modelQueryBuilder,\n modelRelation,\n [],\n );\n\n // We clear where in order to apply having relation filter, since we're passing an empty array, by default will be a false condition so we need to clear it\n relationQueryBuilder.clearWhere();\n relationQueryBuilder.clearSelect();\n relationQueryBuilder.selectRaw(\"1\");\n\n cb?.(\n relationQueryBuilder as unknown as ModelQueryBuilder<\n RelatedInstance<T, RelationKey>\n >,\n );\n\n this.applyHavingRelatedFilter(\n relationQueryBuilder,\n modelRelation,\n actualOperator,\n actualValue,\n );\n\n this.whereExists(\n relationQueryBuilder as unknown as (\n queryBuilder: QueryBuilder<T>,\n ) => void | QueryBuilder<T>,\n );\n\n return this;\n }\n\n /**\n * @description Checks if the relation exists in the models and has the given filters, if no callback is provided, it only check if there is at least one record for the relation,\n * @warning All select statements are ignored, since we're only checking if the relation exists, a \"select 1\" will be added to the Query\n */\n orHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n cb?: (\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void,\n ): this;\n orHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n operatorOrValue?: BinaryOperatorType | BaseValues,\n maybeValue?: BaseValues,\n ): this;\n orHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n cbOrOperatorOrValue?:\n | ((\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void)\n | BinaryOperatorType\n | BaseValues,\n maybeValue?: BaseValues,\n ): this {\n let actualValue: BaseValues | undefined;\n let actualOperator: BinaryOperatorType | undefined;\n let cb:\n | ((\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void)\n | undefined;\n\n if (typeof cbOrOperatorOrValue === \"function\") {\n cb = cbOrOperatorOrValue as (\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void;\n } else if (\n typeof cbOrOperatorOrValue === \"string\" &&\n maybeValue !== undefined\n ) {\n actualOperator = cbOrOperatorOrValue as BinaryOperatorType;\n actualValue = maybeValue;\n } else if (cbOrOperatorOrValue !== undefined) {\n actualValue = cbOrOperatorOrValue as BaseValues;\n actualOperator = \"=\";\n }\n\n const modelRelation =\n this.sqlModelManagerUtils.getRelationFromModel(relation);\n const modelQueryBuilder = new ModelQueryBuilder<\n RelatedInstance<T, RelationKey>\n >(modelRelation.model, this.sqlDataSource);\n modelQueryBuilder.relation = modelRelation;\n\n const relationQueryBuilder = this.getRelatedModelsQueryForRelation(\n modelQueryBuilder,\n modelRelation,\n [],\n );\n\n // We clear where in order to apply having relation filter, since we're passing an empty array, by default will be a false condition so we need to clear it\n relationQueryBuilder.clearWhere();\n relationQueryBuilder.clearSelect();\n relationQueryBuilder.selectRaw(\"1\");\n\n cb?.(\n relationQueryBuilder as unknown as ModelQueryBuilder<\n RelatedInstance<T, RelationKey>\n >,\n );\n\n this.applyHavingRelatedFilter(\n relationQueryBuilder,\n modelRelation,\n actualOperator,\n actualValue,\n );\n\n this.orWhereExists(\n relationQueryBuilder as unknown as (\n queryBuilder: QueryBuilder<T>,\n ) => void | QueryBuilder<T>,\n );\n\n return this;\n }\n\n /**\n * @description Checks if the relation does not exist in the models and has the given filters, if no callback is provided, it only check if there is no record for the Relation\n * @warning All select statements are ignored, since we're only checking if the relation exists, a \"select 1\" will be added to the Query\n */\n notHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n cb?: (\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void,\n ): this;\n notHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n operatorOrValue?: BinaryOperatorType | BaseValues,\n maybeValue?: BaseValues,\n ): this;\n notHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n cbOrOperatorOrValue?:\n | ((\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void)\n | BinaryOperatorType\n | BaseValues,\n maybeValue?: BaseValues,\n ): this {\n return this.andNotHavingRelated(\n relation,\n cbOrOperatorOrValue as any,\n maybeValue,\n );\n }\n\n /**\n * @description Checks if the relation does not exist in the models and has the given filters, if no callback is provided, it only check if there is no record for the relation\n * @warning All select statements are ignored, since we're only checking if the relation exists, a \"select 1\" will be added to the Query\n */\n andNotHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n cb?: (\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void,\n ): this;\n andNotHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n operatorOrValue?: BinaryOperatorType | BaseValues,\n maybeValue?: BaseValues,\n ): this;\n andNotHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n cbOrOperatorOrValue?:\n | ((\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void)\n | BinaryOperatorType\n | BaseValues,\n maybeValue?: BaseValues,\n ): this {\n let actualValue: BaseValues | undefined;\n let actualOperator: BinaryOperatorType | undefined;\n let cb:\n | ((\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void)\n | undefined;\n\n if (typeof cbOrOperatorOrValue === \"function\") {\n cb = cbOrOperatorOrValue as (\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void;\n } else if (\n typeof cbOrOperatorOrValue === \"string\" &&\n maybeValue !== undefined\n ) {\n actualOperator = cbOrOperatorOrValue as BinaryOperatorType;\n actualValue = maybeValue;\n } else if (cbOrOperatorOrValue !== undefined) {\n actualValue = cbOrOperatorOrValue as BaseValues;\n actualOperator = \"=\";\n }\n\n const modelRelation =\n this.sqlModelManagerUtils.getRelationFromModel(relation);\n const modelQueryBuilder = new ModelQueryBuilder<\n RelatedInstance<T, RelationKey>\n >(modelRelation.model, this.sqlDataSource);\n modelQueryBuilder.relation = modelRelation;\n\n const relationQueryBuilder = this.getRelatedModelsQueryForRelation(\n modelQueryBuilder,\n modelRelation,\n [],\n );\n\n // We clear where in order to apply having relation filter, since we're passing an empty array, by default will be a false condition so we need to clear it\n relationQueryBuilder.clearWhere();\n relationQueryBuilder.clearSelect();\n relationQueryBuilder.selectRaw(\"1\");\n\n cb?.(\n relationQueryBuilder as unknown as ModelQueryBuilder<\n RelatedInstance<T, RelationKey>\n >,\n );\n\n this.applyHavingRelatedFilter(\n relationQueryBuilder,\n modelRelation,\n actualOperator,\n actualValue,\n );\n\n this.whereNotExists(\n relationQueryBuilder as unknown as (\n queryBuilder: QueryBuilder<T>,\n ) => void | QueryBuilder<T>,\n );\n\n return this;\n }\n\n /**\n * @description Checks if the relation does not exist in the models and has the given filters, if no callback is provided, it only check if there is no record for the Relation\n * @warning All select statements are ignored, since we're only checking if the relation exists, a \"select 1\" will be added to the Query\n */\n orNotHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n cb?: (\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void,\n ): this;\n orNotHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n operatorOrValue?: BinaryOperatorType | BaseValues,\n maybeValue?: BaseValues,\n ): this;\n orNotHavingRelated<RelationKey extends ModelRelation<T>>(\n relation: RelationKey,\n cbOrOperatorOrValue?:\n | ((\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void)\n | BinaryOperatorType\n | BaseValues,\n maybeValue?: BaseValues,\n ): this {\n let actualValue: BaseValues | undefined;\n let actualOperator: BinaryOperatorType | undefined;\n let cb:\n | ((\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void)\n | undefined;\n\n if (typeof cbOrOperatorOrValue === \"function\") {\n cb = cbOrOperatorOrValue as (\n queryBuilder: ModelQueryBuilder<RelatedInstance<T, RelationKey>>,\n ) => void;\n } else if (\n typeof cbOrOperatorOrValue === \"string\" &&\n maybeValue !== undefined\n ) {\n actualOperator = cbOrOperatorOrValue as BinaryOperatorType;\n actualValue = maybeValue;\n } else if (cbOrOperatorOrValue !== undefined) {\n actualValue = cbOrOperatorOrValue as BaseValues;\n actualOperator = \"=\";\n }\n\n const modelRelation =\n this.sqlModelManagerUtils.getRelationFromModel(relation);\n const modelQueryBuilder = new ModelQueryBuilder<\n RelatedInstance<T, RelationKey>\n >(modelRelation.model, this.sqlDataSource);\n modelQueryBuilder.relation = modelRelation;\n\n const relationQueryBuilder = this.getRelatedModelsQueryForRelation(\n modelQueryBuilder,\n modelRelation,\n [],\n );\n\n // We clear where in order to apply having relation filter, since we're passing an empty array, by default will be a false condition so we need to clear it\n relationQueryBuilder.clearWhere();\n relationQueryBuilder.clearSelect();\n relationQueryBuilder.selectRaw(\"1\");\n\n cb?.(\n relationQueryBuilder as unknown as ModelQueryBuilder<\n RelatedInstance<T, RelationKey>\n >,\n );\n\n this.applyHavingRelatedFilter(\n relationQueryBuilder,\n modelRelation,\n actualOperator,\n actualValue,\n );\n\n this.orWhereNotExists(\n relationQueryBuilder as unknown as (\n queryBuilder: QueryBuilder<T>,\n ) => void | QueryBuilder<T>,\n );\n\n return this;\n }\n\n // #endregion\n\n /**\n * @description Returns a copy of the query builder instance.\n */\n override clone(): this {\n const queryBuilder = super.clone();\n queryBuilder.relationQueryBuilders = deepCloneNode(\n this.relationQueryBuilders,\n );\n return queryBuilder;\n }\n\n /**\n * @description Recursively processes all relations, including nested ones\n */\n protected async processRelationsRecursively(models: T[]): Promise<void> {\n await Promise.all(\n this.relationQueryBuilders\n .filter(\n (relationQueryBuilder) => relationQueryBuilder.isRelationQueryBuilder,\n )\n .map(async (relationQueryBuilder) => {\n const relatedModels = await this.getRelatedModelsForRelation(\n relationQueryBuilder,\n relationQueryBuilder.relation,\n models,\n );\n\n this.mapRelatedModelsToModels(\n relationQueryBuilder.relation,\n models,\n relatedModels,\n );\n }),\n );\n }\n\n protected mapRelatedModelsToModels<R extends ModelWithoutRelations<T>>(\n relation: Relation,\n modelsToFillWithRelations: T[],\n relatedModels: R[],\n ): void {\n switch (relation.type) {\n case RelationEnum.hasOne:\n if (!this.model.primaryKey) {\n throw new HysteriaError(\n this.model.name + \"::mapRelatedModelsToModels::hasOne\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n const relatedModelsMap = new Map<string, R>();\n\n relatedModels.forEach((relatedModel) => {\n const foreignKeyValue = relatedModel[relation.foreignKey as keyof R];\n if (foreignKeyValue) {\n relatedModelsMap.set(String(foreignKeyValue), relatedModel);\n }\n });\n\n modelsToFillWithRelations.forEach((modelToFillWithRelation) => {\n const primaryKeyValue =\n modelToFillWithRelation[this.model.primaryKey as keyof T];\n if (!primaryKeyValue) {\n modelToFillWithRelation[relation.columnName as keyof T] =\n null as T[keyof T];\n return;\n }\n\n const relatedModel = relatedModelsMap.get(String(primaryKeyValue));\n modelToFillWithRelation[relation.columnName as keyof T] =\n (relatedModel || null) as T[keyof T];\n });\n\n break;\n case RelationEnum.belongsTo:\n const relatedModelsByKey = new Map<string, R>();\n\n relatedModels.forEach((relatedModel) => {\n if (!relation.model.primaryKey) {\n throw new HysteriaError(\n this.model.name + \"::mapRelatedModelsToModels::belongsTo\",\n `RELATED_MODEL_DOES_NOT_HAVE_A_PRIMARY_KEY_${relation.model.name}` as const,\n );\n }\n\n const primaryKeyValue =\n relatedModel[relation.model.primaryKey as keyof R];\n if (primaryKeyValue) {\n relatedModelsByKey.set(String(primaryKeyValue), relatedModel);\n }\n });\n\n modelsToFillWithRelations.forEach((modelToFillWithRelation) => {\n const foreignKeyValue =\n modelToFillWithRelation[relation.foreignKey as keyof T];\n if (!foreignKeyValue) {\n modelToFillWithRelation[relation.columnName as keyof T] =\n null as T[keyof T];\n return;\n }\n\n const relatedModel = relatedModelsByKey.get(String(foreignKeyValue));\n modelToFillWithRelation[relation.columnName as keyof T] =\n (relatedModel || null) as T[keyof T];\n });\n\n break;\n case RelationEnum.hasMany:\n if (!this.model.primaryKey) {\n throw new HysteriaError(\n this.model.name + \"::mapRelatedModelsToModels::hasMany\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n const relatedModelsGroupedByForeignKey = new Map<string, R[]>();\n\n relatedModels.forEach((relatedModel) => {\n const foreignKeyValue = relatedModel[relation.foreignKey as keyof R];\n if (!foreignKeyValue) return;\n\n const foreignKeyStr = String(foreignKeyValue);\n if (!relatedModelsGroupedByForeignKey.has(foreignKeyStr)) {\n relatedModelsGroupedByForeignKey.set(foreignKeyStr, []);\n }\n\n relatedModelsGroupedByForeignKey\n .get(foreignKeyStr)!\n .push(relatedModel);\n });\n\n modelsToFillWithRelations.forEach((modelToFillWithRelation) => {\n const primaryKeyValue =\n modelToFillWithRelation[this.model.primaryKey as keyof T];\n if (!primaryKeyValue) {\n modelToFillWithRelation[relation.columnName as keyof T] =\n [] as T[keyof T];\n return;\n }\n\n const relatedModelsList =\n relatedModelsGroupedByForeignKey.get(String(primaryKeyValue)) || [];\n modelToFillWithRelation[relation.columnName as keyof T] =\n relatedModelsList as T[keyof T];\n });\n\n break;\n case RelationEnum.manyToMany:\n if (!this.model.primaryKey || !relation.model.primaryKey) {\n throw new HysteriaError(\n this.model.name + \"::mapRelatedModelsToModels::manyToMany\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n const manyToManyRelation = relation as ManyToMany;\n const relatedModelsMapManyToMany = new Map<string, R[]>();\n const relatedPrimaryKey = manyToManyRelation.leftForeignKey;\n const casedRelatedPrimaryKey =\n this.modelColumnsMap.get(relatedPrimaryKey) ||\n this.modelColumnsDatabaseNames.get(relatedPrimaryKey) ||\n convertCase(relatedPrimaryKey, this.model.modelCaseConvention);\n\n relatedModels.forEach((relatedModel) => {\n const annotations = (relatedModel as any).$annotations || {};\n const foreignKeyValue = annotations[casedRelatedPrimaryKey];\n if (foreignKeyValue === undefined || foreignKeyValue === null) {\n return;\n }\n\n const foreignKeyStr = String(foreignKeyValue);\n if (!relatedModelsMapManyToMany.has(foreignKeyStr)) {\n relatedModelsMapManyToMany.set(foreignKeyStr, []);\n }\n\n if (!this.modelAnnotatedColumns.includes(casedRelatedPrimaryKey)) {\n delete annotations[casedRelatedPrimaryKey];\n if (!Object.keys(annotations).length) {\n delete (relatedModel as any).$annotations;\n }\n }\n\n relatedModelsMapManyToMany.get(foreignKeyStr)!.push(relatedModel);\n });\n\n modelsToFillWithRelations.forEach((modelToFillWithRelation) => {\n const primaryKeyValue =\n modelToFillWithRelation[this.model.primaryKey as keyof T];\n if (!primaryKeyValue) {\n modelToFillWithRelation[relation.columnName as keyof T] =\n [] as T[keyof T];\n return;\n }\n\n const relatedModelsList =\n relatedModelsMapManyToMany.get(String(primaryKeyValue)) || [];\n modelToFillWithRelation[relation.columnName as keyof T] =\n relatedModelsList as T[keyof T];\n });\n\n break;\n default:\n throw new HysteriaError(\n this.model.name + \"::mapRelatedModelsToModels\",\n \"UNSUPPORTED_RELATION_TYPE\",\n );\n }\n }\n\n protected async getRelatedModelsForRelation(\n relationQueryBuilder: ModelQueryBuilder<any>,\n relation: Relation,\n models: T[],\n ): Promise<ModelWithoutRelations<T>[]> {\n return this.getRelatedModelsQueryForRelation(\n relationQueryBuilder,\n relation,\n models,\n ).many();\n }\n\n protected getRelatedModelsQueryForRelation(\n relationQueryBuilder: ModelQueryBuilder<any>,\n relation: Relation,\n models: T[],\n ): ModelQueryBuilder<T> {\n const filterValues = this.getFilterValuesFromModelsForRelation(\n relation,\n models,\n );\n\n switch (relation.type) {\n case RelationEnum.belongsTo:\n case RelationEnum.hasOne:\n return relationQueryBuilder.whereIn(\n relationQueryBuilder.relation.type === RelationEnum.belongsTo\n ? relation.model.primaryKey!\n : (relation.foreignKey as string),\n filterValues,\n );\n case RelationEnum.hasMany:\n const limit = relationQueryBuilder.limitNode?.limit;\n const offset = relationQueryBuilder.offsetNode?.offset;\n if (!limit && !offset) {\n return relationQueryBuilder.whereIn(\n relationQueryBuilder.relation.type === RelationEnum.belongsTo\n ? relation.model.primaryKey!\n : (relation.foreignKey as string),\n filterValues,\n );\n }\n\n const rn = crypto.randomBytes(6).toString(\"hex\");\n const withTableName = `${relation.model.table}_cte_${rn}`;\n const orderByClause = relationQueryBuilder.orderByNodes\n .map((orderByNode) => {\n if (orderByNode.isRawValue) {\n return orderByNode.column;\n }\n\n return `${this.interpreterUtils.formatStringColumn(this.dbType, orderByNode.column)} ${orderByNode.direction}`;\n })\n .join(\", \") || [\"1\"];\n\n relationQueryBuilder.clearLimit();\n relationQueryBuilder.clearOffset();\n\n const qb = relationQueryBuilder.with(withTableName, (cteQb) =>\n cteQb\n .select(...relationQueryBuilder.modelSelectedColumns)\n .selectRaw(\n `ROW_NUMBER() OVER (PARTITION BY ${this.interpreterUtils.formatStringColumn(this.dbType, relation.foreignKey!)} ORDER BY ${orderByClause}) as rn_${rn}`,\n )\n .whereIn(relation.foreignKey as string, filterValues),\n );\n\n if (limit) {\n qb.whereRaw(`rn_${rn} <= ${limit + (offset || 0)}`);\n }\n\n if (offset) {\n qb.whereRaw(`rn_${rn} > ${offset}`);\n }\n\n const outerSelectedColumnsHasMany =\n relationQueryBuilder.modelSelectedColumns.map((column) =>\n remapSelectedColumnToFromAlias(\n column,\n withTableName,\n relationQueryBuilder.model.table,\n ),\n );\n\n return qb.select(...outerSelectedColumnsHasMany).from(withTableName);\n case RelationEnum.manyToMany:\n if (!this.model.primaryKey || !relation.model.primaryKey) {\n throw new HysteriaError(\n this.model.name + \"::getRelatedModelsForRelation\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n const manyToManyRelation = relation as ManyToMany;\n if (!models.length) {\n return relationQueryBuilder;\n }\n\n const m2mLimit = relationQueryBuilder.limitNode?.limit;\n const m2mOffset = relationQueryBuilder.offsetNode?.offset;\n const m2mSelectedColumns = relationQueryBuilder.modelSelectedColumns\n .length\n ? relationQueryBuilder.modelSelectedColumns.map((column) =>\n column.includes(\".\")\n ? column\n : `${relation.model.table}.${column}`,\n )\n : [`${relation.model.table}.*`];\n\n if (!m2mLimit && !m2mOffset) {\n return relationQueryBuilder\n .select(...m2mSelectedColumns)\n .annotate(\n `${manyToManyRelation.throughModel}.${manyToManyRelation.leftForeignKey}`,\n manyToManyRelation.leftForeignKey,\n )\n .leftJoin(\n manyToManyRelation.throughModel,\n `${manyToManyRelation.relatedModel}.${manyToManyRelation.model.primaryKey}`,\n `${manyToManyRelation.throughModel}.${manyToManyRelation.rightForeignKey}`,\n )\n .whereIn(\n `${manyToManyRelation.throughModel}.${manyToManyRelation.leftForeignKey}`,\n filterValues,\n );\n }\n\n const rnM2m = crypto.randomBytes(6).toString(\"hex\");\n const withTableNameM2m = `${relation.model.table}_cte_${rnM2m}`;\n const orderByClauseM2m = relationQueryBuilder.orderByNodes\n .map((orderByNode) => {\n if (orderByNode.isRawValue) {\n return orderByNode.column;\n }\n\n const column = orderByNode.column.includes(\".\")\n ? orderByNode.column\n : `${relation.model.table}.${orderByNode.column}`;\n return `${this.interpreterUtils.formatStringColumn(this.dbType, column)} ${orderByNode.direction}`;\n })\n .join(\", \") || [\"1\"];\n\n relationQueryBuilder.clearLimit();\n relationQueryBuilder.clearOffset();\n relationQueryBuilder.clearOrderBy();\n\n const cteLeftForeignKey = `${crypto.randomBytes(6).toString(\"hex\")}_left_foreign_key`;\n const qbM2m = relationQueryBuilder.with(withTableNameM2m, (innerQb) =>\n innerQb\n .select(...m2mSelectedColumns)\n .annotate(\n `${manyToManyRelation.throughModel}.${manyToManyRelation.leftForeignKey}`,\n cteLeftForeignKey,\n )\n .selectRaw(\n `ROW_NUMBER() OVER (PARTITION BY ${manyToManyRelation.throughModel}.${this.interpreterUtils.formatStringColumn(this.dbType, manyToManyRelation.leftForeignKey)} ORDER BY ${orderByClauseM2m}) as rn_${rnM2m}`,\n )\n .leftJoin(\n manyToManyRelation.throughModel,\n `${manyToManyRelation.relatedModel}.${manyToManyRelation.model.primaryKey}`,\n `${manyToManyRelation.throughModel}.${manyToManyRelation.rightForeignKey}`,\n )\n .whereIn(\n `${manyToManyRelation.throughModel}.${manyToManyRelation.leftForeignKey}`,\n filterValues,\n ),\n );\n\n if (m2mLimit) {\n qbM2m.whereRaw(`rn_${rnM2m} <= ${m2mLimit + (m2mOffset || 0)}`);\n }\n\n if (m2mOffset) {\n qbM2m.whereRaw(`rn_${rnM2m} > ${m2mOffset}`);\n }\n\n const outerSelectedColumns = m2mSelectedColumns.map((column) =>\n remapSelectedColumnToFromAlias(\n column,\n withTableNameM2m,\n relationQueryBuilder.model.table,\n ),\n );\n\n return qbM2m\n .select(...outerSelectedColumns)\n .annotate(\n `${withTableNameM2m}.${cteLeftForeignKey}`,\n manyToManyRelation.leftForeignKey,\n )\n .from(withTableNameM2m);\n default:\n throw new HysteriaError(\n this.model.name + \"::getRelatedModelsForRelation\",\n \"UNSUPPORTED_RELATION_TYPE\",\n );\n }\n }\n\n protected getFilterValuesFromModelsForRelation(\n relation: Relation,\n models: T[],\n ): any[] {\n switch (relation.type) {\n case RelationEnum.hasMany:\n case RelationEnum.hasOne:\n if (!this.model.primaryKey) {\n throw new HysteriaError(\n this.model.name + \"::getFilterValuesFromModelsForRelation\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n return models.map((model) => model[this.model.primaryKey as keyof T]);\n case RelationEnum.belongsTo:\n return models.map((model) => model[relation.foreignKey as keyof T]);\n case RelationEnum.manyToMany:\n if (!this.model.primaryKey) {\n throw new HysteriaError(\n this.model.name + \"::getFilterValuesFromModelsForRelation\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n return models.map((model) => model[this.model.primaryKey as keyof T]);\n default:\n throw new HysteriaError(\n this.model.name + \"::getFilterValuesFromModelsForRelation\",\n \"UNSUPPORTED_RELATION_TYPE\",\n );\n }\n }\n\n protected applyHavingRelatedFilter(\n relationQueryBuilder: ModelQueryBuilder<any>,\n relation: Relation,\n operator?: BinaryOperatorType,\n value?: BaseValues,\n ): void {\n const relatedInterpreter = new InterpreterUtils(relation.model);\n const outerInterpreter = new InterpreterUtils(this.model);\n const dbType = this.dbType;\n\n switch (relation.type) {\n case RelationEnum.hasOne:\n case RelationEnum.hasMany: {\n if (!this.model.primaryKey || !relation.foreignKey) {\n throw new HysteriaError(\n this.model.name + \"::applyHavingRelatedFilter\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n const left = relatedInterpreter.formatStringColumn(\n dbType,\n `${relation.model.table}.${relation.foreignKey}`,\n );\n\n const right = outerInterpreter.formatStringColumn(\n dbType,\n `${this.model.table}.${this.model.primaryKey}`,\n );\n\n relationQueryBuilder.whereRaw(`${left} = ${right}`);\n\n if (operator && typeof value === \"number\") {\n relationQueryBuilder\n .groupByRaw(left)\n .andHavingRaw(`count(*) ${operator} ${value}`);\n }\n return;\n }\n case RelationEnum.belongsTo: {\n if (!relation.model.primaryKey || !relation.foreignKey) {\n throw new HysteriaError(\n this.model.name + \"::applyHavingRelatedFilter\",\n `RELATED_MODEL_DOES_NOT_HAVE_A_PRIMARY_KEY_${relation.model.name}` as const,\n );\n }\n\n const left = relatedInterpreter.formatStringColumn(\n dbType,\n `${relation.model.table}.${relation.model.primaryKey}`,\n );\n const right = outerInterpreter.formatStringColumn(\n dbType,\n `${this.model.table}.${relation.foreignKey}`,\n );\n\n relationQueryBuilder.whereRaw(`${left} = ${right}`);\n\n if (operator && typeof value === \"number\") {\n relationQueryBuilder\n .groupByRaw(left)\n .andHavingRaw(`count(*) ${operator} ${value}`);\n }\n return;\n }\n case RelationEnum.manyToMany: {\n const m2m = relation as ManyToMany;\n if (!this.model.primaryKey || !relation.model.primaryKey) {\n throw new HysteriaError(\n this.model.name + \"::applyHavingRelatedFilter\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n const hasThroughJoin = relationQueryBuilder.joinNodes?.some(\n (jn) =>\n !jn.isRawValue &&\n jn.table === m2m.throughModel &&\n jn.type === \"left\",\n );\n\n if (!hasThroughJoin) {\n relationQueryBuilder.leftJoin(\n m2m.throughModel,\n `${m2m.relatedModel}.${relation.model.primaryKey}`,\n `${m2m.throughModel}.${m2m.rightForeignKey}`,\n );\n }\n\n const throughLeft = outerInterpreter.formatStringColumn(\n dbType,\n `${m2m.throughModel}.${m2m.leftForeignKey}`,\n );\n const outerPk = outerInterpreter.formatStringColumn(\n dbType,\n `${this.model.table}.${this.model.primaryKey}`,\n );\n\n relationQueryBuilder.whereRaw(`${throughLeft} = ${outerPk}`);\n\n if (operator && typeof value === \"number\") {\n relationQueryBuilder\n .groupByRaw(throughLeft)\n .andHavingRaw(`count(*) ${operator} ${value}`);\n }\n return;\n }\n default:\n throw new HysteriaError(\n this.model.name + \"::applyHavingRelatedFilter\",\n \"UNSUPPORTED_RELATION_TYPE\",\n );\n }\n }\n\n protected addAdditionalColumnsToModel(\n row: any,\n typeofModel: typeof Model,\n ): Record<string, any> {\n const model: Record<string, any> = {};\n const $annotations: Record<string, any> = {};\n Object.entries(row).forEach(([key, value]) => {\n if (key === \"$annotations\" || this.modelColumnsDatabaseNames.get(key)) {\n model[key] = value;\n return;\n }\n\n $annotations[convertCase(key, typeofModel.modelCaseConvention)] = value;\n });\n\n model.$annotations = $annotations;\n return model;\n }\n\n // @ts-expect-error\n private async manyWithPerformance(\n options: ManyOptions = {},\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ): Promise<{\n data: AnnotatedModel<T, A, R>[];\n time: number;\n }> {\n const [time, data] = await withPerformance(\n this.many.bind(this, options),\n returnType,\n )();\n\n return { data, time: Number(time) };\n }\n\n // @ts-expect-error\n private async oneWithPerformance(\n options: OneOptions = {},\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ): Promise<{\n data: AnnotatedModel<T, A, R> | null;\n time: number;\n }> {\n const [time, data] = await withPerformance(\n this.one.bind(this, options),\n returnType,\n )();\n\n return { data, time: Number(time) };\n }\n\n // @ts-expect-error\n private async oneOrFailWithPerformance(\n options: OneOptions = {},\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ): Promise<{\n data: AnnotatedModel<T, A, R>;\n time: number;\n }> {\n const [time, data] = await withPerformance(\n this.oneOrFail.bind(this, options),\n returnType,\n )();\n\n return { data, time: Number(time) };\n }\n\n // @ts-expect-error\n private async firstOrFailWithPerformance(\n options: OneOptions = {},\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ): Promise<{\n data: AnnotatedModel<T, A, R>;\n time: number;\n }> {\n return this.oneOrFailWithPerformance(options, returnType);\n }\n\n // @ts-expect-error\n private async firstWithPerformance(\n options: OneOptions = {},\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ): Promise<{\n data: AnnotatedModel<T, A, R> | null;\n time: number;\n }> {\n return this.oneWithPerformance(options, returnType);\n }\n\n // @ts-expect-error\n private async paginateWithPerformance(\n page: number,\n perPage: number,\n options?: { ignoreHooks?: boolean },\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ): Promise<{\n data: PaginatedData<T, A, R>;\n time: number;\n }> {\n const { ignoreHooks = false } = options || {};\n const [time, data] = await withPerformance(\n this.paginate.bind(this, page, perPage, { ignoreHooks }),\n returnType,\n )();\n\n return {\n data: {\n paginationMetadata: data.paginationMetadata,\n data: data.data,\n },\n time: Number(time),\n };\n }\n\n private async paginateWithCursorWithPerformance(\n page: number,\n options: PaginateWithCursorOptions<T, ModelKey<T>>,\n cursor?: Cursor<T, ModelKey<T>>,\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ): Promise<{\n data: [CursorPaginatedData<T, A, R>, Cursor<T, ModelKey<T>>];\n time: number;\n }> {\n const [time, data] = await withPerformance(\n this.paginateWithCursor.bind(this, page, options, cursor),\n returnType,\n )();\n\n return {\n data: data as [CursorPaginatedData<T, A, R>, Cursor<T, ModelKey<T>>],\n time: Number(time),\n };\n }\n\n private async existsWithPerformance(\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, data] = await withPerformance(\n this.exists.bind(this),\n returnType,\n )();\n\n return {\n data,\n time: Number(time),\n };\n }\n\n private async pluckWithPerformance(\n key: ModelKey<T>,\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, data] = await withPerformance(\n this.pluck.bind(this, key),\n returnType,\n )();\n\n return {\n data,\n time: Number(time),\n };\n }\n\n private async softDeleteWithPerformance(\n options: Omit<SoftDeleteOptions<T>, \"ignoreBeforeDeleteHook\"> = {},\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, data] = await withPerformance(\n this.softDelete.bind(this, options),\n returnType,\n )();\n\n return {\n data,\n time: Number(time),\n };\n }\n\n // @ts-expect-error\n private async updateWithPerformance(\n data: Partial<ModelWithoutRelations<T>>,\n options: UpdateOptions = {},\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, result] = await withPerformance(\n this.update.bind(this, data, options),\n returnType,\n )();\n\n return {\n data: result,\n time: Number(time),\n };\n }\n\n private async deleteWithPerformance(\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, result] = await withPerformance(\n this.delete.bind(this),\n returnType,\n )();\n\n return {\n data: result,\n time: Number(time),\n };\n }\n\n private async truncateWithPerformance(\n returnType: \"millis\" | \"seconds\" = \"millis\",\n ) {\n const [time, result] = await withPerformance(\n this.truncate.bind(this),\n returnType,\n )();\n\n return {\n data: result,\n time: Number(time),\n };\n }\n}\n","import { baseSoftDeleteDate } from \"../../../utils/date_utils\";\nimport { DeleteNode } from \"../../ast/query/node/delete\";\nimport { InsertNode } from \"../../ast/query/node/insert\";\nimport { TruncateNode } from \"../../ast/query/node/truncate\";\nimport { UpdateNode } from \"../../ast/query/node/update\";\nimport type { SqlDataSource } from \"../../sql_data_source\";\nimport type { Model } from \"../model\";\nimport { ModelQueryBuilder } from \"./model_query_builder\";\n\n/**\n * Allows to get model queries without executing them\n */\nexport class DryModelQueryBuilder<\n T extends Model,\n A extends Record<string, any> = {},\n R extends Record<string, any> = {},\n> extends ModelQueryBuilder<T, A, R> {\n constructor(model: typeof Model, sqlDataSource: SqlDataSource) {\n super(model, sqlDataSource);\n }\n\n // @ts-expect-error\n override many(): this {\n return this;\n }\n\n /**\n * @description Builds the insert query statement without executing it, use 'unWrap' or 'toQuery' to get the query statement\n * @param args The arguments to pass to the insert method\n * @warning This method does not run model or column hooks\n * @returns The query builder\n */\n // @ts-expect-error\n override insert(...args: Parameters<typeof this.model.insert<T>>): this {\n const [data, options] = args;\n const insertObject = Object.fromEntries(\n Object.keys(data).map((column) => [\n column,\n data[column as keyof typeof data],\n ]),\n );\n\n this.insertNode = new InsertNode(\n this.fromNode,\n [insertObject],\n options?.returning as string[],\n );\n return this;\n }\n\n /**\n * @description Builds the insert many query statement without executing it, use 'unWrap' or 'toQuery' to get the query statement\n * @param args The arguments to pass to the insert many method\n * @warning This method does not run model or column hooks\n * @returns The query builder\n */\n // @ts-expect-error\n override insertMany(\n ...args: Parameters<typeof this.model.insertMany<T>>\n ): this {\n const [data, options] = args;\n if (!data.length) {\n return this;\n }\n\n const models = data.map((model) => {\n return Object.fromEntries(\n Object.keys(model).map((column) => [\n column,\n model[column as keyof typeof model],\n ]),\n );\n });\n\n this.insertNode = new InsertNode(\n this.fromNode,\n models,\n options?.returning as string[],\n );\n return this;\n }\n\n /**\n * @description Builds the update query statement without executing it, use 'unWrap' or 'toQuery' to get the query statement\n * @param data The data to update\n * @warning This method does not run model or column hooks\n * @returns The query builder\n */\n // @ts-expect-error\n override update(\n ...args: Parameters<ReturnType<typeof this.model.query<T>>[\"update\"]>\n ): this {\n const [data] = args;\n this.updateNode = new UpdateNode(\n this.fromNode,\n Object.keys(data),\n Object.values(data),\n );\n return this;\n }\n\n /**\n * @description Builds the delete query statement without executing it, use 'unWrap' or 'toQuery' to get the query statement\n * @param options Delete options\n * @returns The query builder\n */\n // @ts-expect-error\n override delete(\n ...args: Parameters<ReturnType<typeof this.model.query<T>>[\"delete\"]>\n ): this {\n const [options] = args;\n\n if (!options?.ignoreBeforeDeleteHook) {\n this.model.beforeDelete?.(this as any);\n }\n\n this.deleteNode = new DeleteNode(this.fromNode);\n return this;\n }\n\n /**\n * @description Builds the truncate query statement without executing it, use 'unWrap' or 'toQuery' to get the query statement\n * @returns The query builder\n */\n // @ts-expect-error\n override truncate(): this {\n this.truncateNode = new TruncateNode(this.fromNode);\n return this;\n }\n\n /**\n * @description Builds the soft delete query statement without executing it, use 'unWrap' or 'toQuery' to get the query statement\n * @param options Soft delete options\n * @warning This method does not run model or column hooks\n * @returns The query builder\n */\n // @ts-expect-error\n override softDelete(\n ...args: Parameters<ReturnType<typeof this.model.query<T>>[\"softDelete\"]>\n ): this {\n const [options] = args;\n\n const { column = \"deletedAt\", value = baseSoftDeleteDate() } =\n options || {};\n\n this.updateNode = new UpdateNode(\n this.fromNode,\n [column as string],\n [value],\n );\n return this;\n }\n}\n","import { HysteriaError } from \"../../../errors/hysteria_error\";\nimport { AstParser } from \"../../ast/parser\";\nimport { DeleteNode } from \"../../ast/query/node/delete\";\nimport { FromNode } from \"../../ast/query/node/from\";\nimport { InsertNode } from \"../../ast/query/node/insert\";\nimport { OnDuplicateNode } from \"../../ast/query/node/on_duplicate\";\nimport { UpdateNode } from \"../../ast/query/node/update\";\nimport { WhereNode } from \"../../ast/query/node/where\";\nimport { InterpreterUtils } from \"../../interpreter/interpreter_utils\";\nimport { serializeModel } from \"../../serializer\";\nimport { SqlDataSource } from \"../../sql_data_source\";\nimport { SqlDataSourceType } from \"../../sql_data_source_types\";\nimport { execSql } from \"../../sql_runner/sql_runner\";\nimport { Model } from \"../model\";\nimport { DryModelQueryBuilder } from \"../model_query_builder/dry_model_query_builder\";\nimport { ModelQueryBuilder } from \"../model_query_builder/model_query_builder\";\nimport { AnnotatedModel } from \"../model_query_builder/model_query_builder_types\";\nimport { ModelWithoutRelations } from \"../model_types\";\nimport { getBaseModelInstance } from \"../model_utils\";\nimport {\n FindOneType,\n FindType,\n InsertOptions,\n ModelKey,\n ModelRelation,\n OrderByChoices,\n UnrestrictedFindOneType,\n UnrestrictedFindType,\n UpsertOptions,\n} from \"./model_manager_types\";\n\nexport class ModelManager<T extends Model> {\n protected sqlDataSource: SqlDataSource;\n protected sqlType: SqlDataSourceType;\n protected logs: boolean;\n protected model: typeof Model;\n protected modelInstance: T;\n protected astParser: AstParser;\n protected interpreterUtils: InterpreterUtils;\n\n /**\n * @description Constructor for ModelManager class.\n */\n constructor(model: typeof Model, sqlDataSource: SqlDataSource) {\n this.model = model;\n this.modelInstance = getBaseModelInstance<T>();\n this.sqlDataSource = sqlDataSource;\n this.logs = this.sqlDataSource.logs;\n this.sqlType = this.sqlDataSource.getDbType();\n this.astParser = new AstParser(this.model, this.sqlType);\n this.interpreterUtils = new InterpreterUtils(this.model);\n }\n\n /**\n * @description Finds all records that match the input\n */\n async find<\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(input?: FindType<T, S, R>): Promise<AnnotatedModel<T, {}>[]>;\n async find<\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(input?: UnrestrictedFindType<T, S, R>): Promise<AnnotatedModel<T, {}>[]>;\n async find<\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(\n input?: FindType<T, S, R> | UnrestrictedFindType<T, S, R>,\n ): Promise<AnnotatedModel<T, {}>[]> {\n if (!input) {\n return this.query().many();\n }\n\n const query = this.query();\n if (input.select) {\n query.select(...(input.select as string[]));\n }\n\n if (input.relations) {\n input.relations.forEach((relation) => {\n query.load(relation);\n });\n }\n\n if (input.where) {\n Object.entries(input.where).forEach(([key, value]) => {\n if (Array.isArray(value)) {\n query.whereIn(key, value);\n return;\n }\n\n query.where(key, value);\n });\n }\n\n if (input.orderBy) {\n Object.entries(input.orderBy).forEach(([key, value]) => {\n query.orderBy(key as ModelKey<T>, value as OrderByChoices);\n });\n }\n\n if (input.limit) {\n query.limit(input.limit);\n }\n\n if (input.offset) {\n query.offset(input.offset);\n }\n\n if (input.groupBy) {\n query.groupBy(...(input.groupBy as string[]));\n }\n\n return query.many({ ignoreHooks: input.ignoreHooks || [] });\n }\n\n /**\n * @description Finds the first record that matches the input\n */\n async findOne<\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(\n input: UnrestrictedFindOneType<T, S, R>,\n ): Promise<AnnotatedModel<T, {}> | null>;\n async findOne<\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(input: FindOneType<T, S, R>): Promise<AnnotatedModel<T, {}> | null>;\n async findOne<\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(\n input: FindOneType<T, S, R> | UnrestrictedFindOneType<T, S, R>,\n ): Promise<AnnotatedModel<T, {}> | null> {\n const results = await this.find({\n groupBy: input.groupBy,\n orderBy: input.orderBy,\n relations: input.relations,\n select: input.select,\n where: input.where,\n ignoreHooks: input.ignoreHooks,\n offset: input.offset,\n limit: 1,\n } as FindType<T, S, R>);\n\n if (!results.length) {\n return null;\n }\n\n return results[0];\n }\n\n /**\n * @description Finds the first record that matches the input or throws an error\n */\n async findOneOrFail<\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(input: FindOneType<T, S, R>): Promise<AnnotatedModel<T, {}>>;\n async findOneOrFail<\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(input: UnrestrictedFindOneType<T, S, R>): Promise<AnnotatedModel<T, {}>>;\n async findOneOrFail<\n S extends ModelKey<T>[] = never[],\n R extends ModelRelation<T>[] = never[],\n >(\n input: (FindOneType<T, S, R> | UnrestrictedFindOneType<T, S, R>) & {\n customError?: Error;\n },\n ): Promise<AnnotatedModel<T, {}>> {\n const result = await this.findOne({\n groupBy: input.groupBy,\n orderBy: input.orderBy,\n relations: input.relations,\n select: input.select,\n where: input.where,\n ignoreHooks: input.ignoreHooks,\n offset: input.offset,\n } as FindOneType<T, S, R>);\n\n if (result === null) {\n if (input.customError) {\n throw input.customError;\n }\n\n throw new HysteriaError(\n this.model.name + \"::findOneOrFail\",\n \"ROW_NOT_FOUND\",\n );\n }\n\n return result;\n }\n\n /**\n * @description Finds a record by its primary key\n * @description Ignores all model hooks\n * @throws {HysteriaError} if the model has no primary key\n */\n async findOneByPrimaryKey(\n value: string | number,\n returning?: ModelKey<T>[],\n ): Promise<AnnotatedModel<T, {}> | null> {\n if (!this.model.primaryKey) {\n throw new HysteriaError(\n this.model.name + \"::findOneByPrimaryKey\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n return this.query()\n .select(...(returning || []))\n .where(this.model.primaryKey as string, value)\n .one({ ignoreHooks: [\"afterFetch\", \"beforeFetch\"] });\n }\n\n /**\n * @description Creates a new record in the database\n */\n async insert(\n model: Partial<T>,\n options: InsertOptions<T> = {},\n ): Promise<AnnotatedModel<T, {}>> {\n !options.ignoreHooks && (await this.model.beforeInsert?.(model as T));\n const { columns: preparedColumns, values: preparedValues } =\n await this.interpreterUtils.prepareColumns(\n Object.keys(model),\n Object.values(model),\n \"insert\",\n );\n\n const insertObject: Record<string, any> = {};\n preparedColumns.forEach((column, index) => {\n const value = preparedValues[index];\n insertObject[column] = value;\n (model as any)[column] ??= value;\n });\n\n const { sql, bindings } = this.astParser.parse([\n new InsertNode(\n new FromNode(this.model.table),\n [insertObject],\n options.returning as string[],\n ),\n ]);\n\n const rows = await execSql(sql, bindings, this.sqlDataSource, \"raw\", {\n sqlLiteOptions: {\n typeofModel: this.model,\n mode: \"insertOne\",\n models: [model as T],\n },\n });\n\n if (this.sqlType === \"mysql\" || this.sqlType === \"mariadb\") {\n return this.handleMysqlInsert(\n rows,\n [model as T],\n \"one\",\n options.returning as string[],\n );\n }\n\n const insertedModel = rows[0] as T;\n if (!insertedModel) {\n return model as T;\n }\n\n await this.model.afterFetch?.([insertedModel]);\n const result = (await serializeModel([insertedModel], this.model)) as T;\n return result;\n }\n\n /**\n * @description Creates multiple records in the database\n */\n async insertMany(\n models: Partial<T>[],\n options: InsertOptions<T> = {},\n ): Promise<AnnotatedModel<T, {}>[]> {\n const insertObjects: Record<string, any>[] = [];\n await this.model.beforeInsertMany?.(models as T[]);\n for (const model of models) {\n const { columns: preparedColumns, values: preparedValues } =\n await this.interpreterUtils.prepareColumns(\n Object.keys(model),\n Object.values(model),\n \"insert\",\n );\n\n const insertObject: Record<string, any> = {};\n preparedColumns.forEach((column, index) => {\n const value = preparedValues[index];\n insertObject[column] = value;\n (model as any)[column] ??= value;\n });\n\n insertObjects.push(insertObject);\n }\n\n const { sql, bindings } = this.astParser.parse([\n new InsertNode(\n new FromNode(this.model.table),\n insertObjects,\n options.returning as string[],\n ),\n ]);\n\n const rows = await execSql(sql, bindings, this.sqlDataSource, \"raw\", {\n sqlLiteOptions: {\n typeofModel: this.model,\n mode: \"insertMany\",\n models: models as T[],\n },\n });\n\n if (this.sqlType === \"mysql\" || this.sqlType === \"mariadb\") {\n return (\n (await this.handleMysqlInsert(\n rows,\n models as T[],\n \"many\",\n options.returning as string[],\n )) || []\n );\n }\n\n const insertedModels = rows as T[];\n if (!insertedModels.length) {\n return [];\n }\n\n await this.model.afterFetch?.(insertedModels);\n\n const results = await serializeModel(insertedModels, this.model);\n return (results || []) as T[];\n }\n\n async upsertMany(\n conflictColumns: string[],\n columnsToUpdate: string[],\n data: ModelWithoutRelations<T>[],\n options: UpsertOptions<T> = {\n updateOnConflict: true,\n },\n ): Promise<AnnotatedModel<T, {}>[]> {\n const insertObjects: Record<string, any>[] = [];\n await this.model.beforeInsertMany?.(data as T[]);\n await Promise.all(\n data.map(async (model) => {\n const { columns: preparedColumns, values: preparedValues } =\n await this.interpreterUtils.prepareColumns(\n Object.keys(model),\n Object.values(model),\n \"insert\",\n );\n\n const insertObject = Object.fromEntries(\n preparedColumns.map((column, index) => [\n column,\n preparedValues[index],\n ]),\n );\n\n insertObjects.push(insertObject);\n }),\n );\n\n const { sql, bindings } = this.astParser.parse([\n new InsertNode(\n new FromNode(this.model.table),\n insertObjects,\n undefined,\n true,\n ),\n new OnDuplicateNode(\n this.model.table,\n conflictColumns,\n columnsToUpdate,\n (options.updateOnConflict ?? true) ? \"update\" : \"ignore\",\n options.returning as string[],\n ),\n ]);\n\n const rows = await execSql(sql, bindings, this.sqlDataSource, \"raw\", {\n sqlLiteOptions: {\n typeofModel: this.model,\n mode: \"raw\",\n models: data as T[],\n },\n });\n\n return rows as T[];\n }\n\n /**\n * @description Updates a record, returns the updated record\n * @description Model is retrieved from the database using the primary key regardless of any model hooks\n * @description Can only be used if the model has a primary key, use a massive update if the model has no primary key\n */\n async updateRecord(\n model: Partial<T>,\n options?: { returning?: ModelKey<T>[] },\n ): Promise<AnnotatedModel<T, {}>> {\n let { columns: preparedColumns, values: preparedValues } =\n await this.interpreterUtils.prepareColumns(\n Object.keys(model),\n Object.values(model),\n \"update\",\n );\n\n const { primaryKey } = this.model;\n if (!primaryKey) {\n throw new HysteriaError(\n this.model.name + \"::updateRecord\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n // Primary key is filtered out of the prepared columns and values\n preparedColumns = preparedColumns.filter((column) => column !== primaryKey);\n preparedValues = preparedValues.filter(\n (value) => value !== model[primaryKey as keyof T],\n );\n\n const { sql, bindings } = this.astParser.parse([\n new UpdateNode(\n new FromNode(this.model.table),\n preparedColumns,\n preparedValues,\n ),\n new WhereNode(\n primaryKey as string,\n \"and\",\n false,\n \"=\",\n model[primaryKey as keyof T] as string,\n ),\n ]);\n\n await execSql(sql, bindings, this.sqlDataSource, \"raw\");\n const updatedModel = await this.findOneByPrimaryKey(\n model[this.model.primaryKey as keyof T] as string,\n options?.returning ?? undefined,\n );\n\n if (!updatedModel) {\n throw new HysteriaError(\n this.model.name + \"::updateRecord\",\n \"ROW_NOT_FOUND\",\n );\n }\n\n return updatedModel;\n }\n\n /**\n * @description Deletes a record\n * @description Can only be used if the model has a primary key, use a massive delete if the model has no primary key\n */\n async deleteRecord(model: T): Promise<void> {\n if (!this.model.primaryKey) {\n throw new HysteriaError(\n this.model.name + \"::deleteRecord\",\n \"MODEL_HAS_NO_PRIMARY_KEY\",\n );\n }\n\n const whereNode = new WhereNode(\n this.model.primaryKey as string,\n \"and\",\n false,\n \"=\",\n model[this.model.primaryKey as keyof T] as string,\n );\n\n const { sql, bindings } = this.astParser.parse([\n new DeleteNode(new FromNode(this.model.table)),\n whereNode,\n ]);\n\n await execSql(sql, bindings, this.sqlDataSource, \"raw\");\n }\n\n /**\n * @description Returns a query builder instance\n */\n query(): Omit<ModelQueryBuilder<T>, \"insert\" | \"insertMany\"> {\n return new ModelQueryBuilder<T>(this.model, this.sqlDataSource);\n }\n\n /**\n * @description Returns a dry query builder instance\n * @description The dry query builder instance will not execute the query, it will return the query statement\n */\n dryQuery(): Omit<DryModelQueryBuilder<T>, \"insert\" | \"insertMany\"> {\n return new DryModelQueryBuilder<T>(this.model, this.sqlDataSource);\n }\n\n /**\n * @description Mysql does not return the inserted model, so we need to get the inserted model from the database\n */\n private async handleMysqlInsert<O extends \"one\" | \"many\">(\n rows: any,\n models: T[],\n returnType: O,\n retuning?: string[],\n ): Promise<O extends \"one\" ? T : T[] | null> {\n if (!this.model.primaryKey) {\n if (returnType === \"one\") {\n const returnModel = models.length ? models[0] : null;\n if (!returnModel) {\n return null as O extends \"one\" ? T : T[] | null;\n }\n\n return (await serializeModel(\n [returnModel],\n this.model,\n )) as O extends \"one\" ? T : T[];\n }\n\n return (await serializeModel(models, this.model)) as O extends \"one\"\n ? T\n : T[];\n }\n\n // UUID and before fetch defined primary keys\n if (this.model.primaryKey && models[0][this.model.primaryKey as keyof T]) {\n const idsToFetchList = models.map(\n (model) => model[this.model.primaryKey as keyof T],\n ) as string[];\n\n const primaryKeyList = idsToFetchList.map((key) => `'${key}'`).join(\",\");\n const fetchedModels = await this.query()\n .select(...(retuning ?? \"*\"))\n .whereIn(this.model.primaryKey as string, idsToFetchList)\n .orderByRaw(`FIELD(${this.model.primaryKey}, ${primaryKeyList})`)\n .many();\n\n if (returnType === \"one\") {\n return (\n fetchedModels.length ? fetchedModels[0] : null\n ) as O extends \"one\" ? T : T[];\n }\n\n return fetchedModels as O extends \"one\" ? T : T[];\n }\n\n // standard auto increment primary keys\n const idsToFetchList = Array.from(\n { length: rows.affectedRows },\n (_, i) => i + rows.insertId,\n );\n\n const fetchedModels = await this.query()\n .select(...(retuning || \"*\"))\n .whereIn(this.model.primaryKey as string, idsToFetchList)\n .many();\n\n if (returnType === \"one\") {\n return (fetchedModels.length ? fetchedModels[0] : null) as O extends \"one\"\n ? T\n : T[];\n }\n\n return fetchedModels as O extends \"one\" ? T : T[];\n }\n}\n","import { baseSoftDeleteDate } from \"../../utils/date_utils\";\nimport { DeleteNode } from \"../ast/query/node/delete\";\nimport { FromNode } from \"../ast/query/node/from\";\nimport { InsertNode } from \"../ast/query/node/insert\";\nimport { OnDuplicateNode } from \"../ast/query/node/on_duplicate\";\nimport { TruncateNode } from \"../ast/query/node/truncate\";\nimport { UpdateNode } from \"../ast/query/node/update\";\nimport type { Model } from \"../models/model\";\nimport type { SqlDataSource } from \"../sql_data_source\";\nimport { SoftDeleteOptions } from \"./delete_query_builder_type\";\nimport { QueryBuilder } from \"./query_builder\";\n\n/**\n * Allows to get queries without executing them\n */\nexport class DryQueryBuilder extends QueryBuilder {\n constructor(model: typeof Model, sqlDataSource: SqlDataSource) {\n super(model, sqlDataSource);\n }\n\n // @ts-expect-error\n override many(): this {\n return this;\n }\n\n /**\n * @description Builds the insert query statement without executing it, use 'unWrap' or 'toQuery' to get the query statement\n * @param args The arguments to pass to the insert method\n * @warning This method does not run model or column hooks\n * @returns The query builder\n */\n // @ts-expect-error\n override insert(\n ...args: Parameters<typeof QueryBuilder.prototype.insert>\n ): this {\n const [data, options] = args;\n const insertObject = Object.fromEntries(\n Object.keys(data).map((column) => [\n column,\n data[column as keyof typeof data],\n ]),\n );\n\n this.insertNode = new InsertNode(this.fromNode, [insertObject], options);\n return this;\n }\n\n /**\n * @description Builds the insert many query statement without executing it, use 'unWrap' or 'toQuery' to get the query statement\n * @param args The arguments to pass to the insert many method\n * @warning This method does not run model or column hooks\n * @returns The query builder\n */\n // @ts-expect-error\n override insertMany(\n ...args: Parameters<typeof QueryBuilder.prototype.insertMany>\n ): this {\n const [data, options] = args;\n if (!data.length) {\n return this;\n }\n\n const models = data.map((model) => {\n return Object.fromEntries(\n Object.keys(model).map((column) => [\n column,\n model[column as keyof typeof model],\n ]),\n );\n });\n\n this.insertNode = new InsertNode(this.fromNode, models, options);\n return this;\n }\n\n /**\n * @description Builds the upsert query statement without executing it, use 'unWrap' or 'toQuery' to get the query statement\n * @param args The arguments to pass to the upsert method\n * @warning This method does not run model or column hooks\n * @returns The query builder\n */\n // @ts-expect-error\n override upsert(\n ...args: Parameters<typeof QueryBuilder.prototype.upsert>\n ): this {\n const [data, searchCriteria, options] = args;\n const columnsToUpdate = Object.keys(data);\n const conflictColumns = Object.keys(searchCriteria);\n\n this.insertNode = new InsertNode(\n new FromNode(this.model.table),\n [data],\n undefined,\n true,\n );\n\n this.onDuplicateNode = new OnDuplicateNode(\n this.model.table,\n conflictColumns,\n columnsToUpdate,\n (options?.updateOnConflict ?? true) ? \"update\" : \"ignore\",\n options?.returning as string[],\n );\n\n return this;\n }\n\n // @ts-expect-error\n override upsertMany(\n ...args: Parameters<typeof QueryBuilder.prototype.upsertMany>\n ): this {\n const [conflictColumns, columnsToUpdate, data, options] = args;\n const insertObjects: Record<string, any>[] = data.map((record) => {\n return Object.fromEntries(\n Object.keys(record).map((column) => [\n column,\n record[column as keyof typeof record],\n ]),\n );\n });\n\n this.insertNode = new InsertNode(\n new FromNode(this.model.table),\n insertObjects,\n undefined,\n true,\n );\n\n this.onDuplicateNode = new OnDuplicateNode(\n this.model.table,\n conflictColumns,\n columnsToUpdate,\n (options?.updateOnConflict ?? true) ? \"update\" : \"ignore\",\n options?.returning as string[],\n );\n\n return this;\n }\n\n /**\n * @description Builds the update query statement without executing it, use 'unWrap' or 'toQuery' to get the query statement\n * @param data The data to update\n * @warning This method does not run model or column hooks\n * @returns The query builder\n */\n // @ts-expect-error\n override update(data: Record<string, any>): this {\n this.updateNode = new UpdateNode(\n this.fromNode,\n Object.keys(data),\n Object.values(data),\n );\n return this;\n }\n\n /**\n * @description Builds the delete query statement without executing it, use 'unWrap' or 'toQuery' to get the query statement\n * @warning This method does not run model or column hooks\n * @returns The query builder\n */\n // @ts-expect-error\n override delete(): this {\n this.deleteNode = new DeleteNode(this.fromNode);\n return this;\n }\n\n /**\n * @description Builds the truncate query statement without executing it, use 'unWrap' or 'toQuery' to get the query statement\n * @warning This method does not run model or column hooks\n * @returns The query builder\n */\n // @ts-expect-error\n override truncate(): this {\n this.truncateNode = new TruncateNode(this.fromNode);\n return this;\n }\n\n /**\n * @description Builds the soft delete query statement without executing it, use 'unWrap' or 'toQuery' to get the query statement\n * @param options Soft delete options\n * @warning This method does not run model or column hooks\n * @returns The query builder\n */\n // @ts-expect-error\n override softDelete(\n options: Omit<SoftDeleteOptions<any>, \"ignoreBeforeDeleteHook\"> = {},\n ): this {\n const { column = \"deletedAt\", value = baseSoftDeleteDate() } =\n options || {};\n\n this.updateNode = new UpdateNode(\n this.fromNode,\n [column as string],\n [value],\n );\n return this;\n }\n}\n","import { baseSoftDeleteDate } from \"../../utils/date_utils\";\nimport { Model } from \"../models/model\";\nimport { RawModelOptions } from \"../models/model_types\";\n\nexport const getRawQueryBuilderModel = (\n table: string,\n options?: RawModelOptions,\n): typeof Model => {\n return {\n table,\n modelCaseConvention: \"preserve\",\n databaseCaseConvention: options?.databaseCaseConvention ?? \"preserve\",\n softDeleteColumn: options?.softDeleteColumn ?? \"deleted_at\",\n softDeleteValue: options?.softDeleteValue ?? baseSoftDeleteDate(),\n } as typeof Model;\n};\n","// Transaction class does not use the ast parser nor nodes since it's not used in any query builder and the transaction only lives here\n\nimport crypto from \"node:crypto\";\nimport { HysteriaError } from \"../../errors/hysteria_error\";\nimport logger from \"../../utils/logger\";\nimport { SqlDataSource } from \"../sql_data_source\";\nimport {\n GetConnectionReturnType,\n SqlDataSourceWithoutTransaction,\n} from \"../sql_data_source_types\";\nimport {\n NestedTransactionCallback,\n NestedTransactionReturnType,\n TransactionExecutionOptions,\n TransactionIsolationLevel,\n} from \"./transaction_types\";\n\n/**\n * @description Transaction class, not meant to be used directly, use sql.startTransaction() instead\n */\nexport class Transaction {\n /**\n * @description The sql data source instance that the transaction is running on here you can both query or execute raw queries\n * @example\n * ```ts\n * import { sql } from \"hysteria-orm\";\n * import { User } from \"./models/user\";\n *\n * // Raw queries\n * const trx = await sql.startTransaction();\n * await trx.rawQuery(\"SELECT * FROM users\");\n *\n * // Model manager\n * const modelManager = trx.sql.getModelManager(User);\n * await modelManager.insert({ name: \"John Doe\" });\n *\n * // Query builder\n * await trx.query(User.table).insert({ name: \"John Doe\" });\n *\n * await trx.commit();\n * ```\n */\n sql: SqlDataSourceWithoutTransaction;\n /**\n * @description Whether the transaction is active\n */\n isActive: boolean;\n /**\n * @description The transaction unique identifier\n */\n transactionId: string;\n\n private connectionReleased = false;\n private isolationLevel?: TransactionIsolationLevel;\n private isNested: boolean;\n private nestingDepth: number;\n\n constructor(\n sql: SqlDataSource,\n isolationLevel?: TransactionIsolationLevel,\n isNested = false,\n nestingDepth = 0,\n ) {\n this.sql = sql;\n this.isActive = false;\n this.transactionId = crypto.randomBytes(16).toString(\"hex\");\n this.isolationLevel = isolationLevel;\n this.isNested = isNested;\n this.nestingDepth = nestingDepth;\n }\n\n /**\n * @description Creates a new transaction with the same isolation level and same connection using save points\n * @description If a callback is provided, it will execute the callback and commit or rollback the nested transaction save points based on the callback's success or failure\n */\n async nestedTransaction(): Promise<Transaction>;\n async nestedTransaction(\n cb: (trx: Transaction) => Promise<void>,\n ): Promise<void>;\n async nestedTransaction<T extends NestedTransactionCallback | undefined>(\n cb?: T,\n ): Promise<NestedTransactionReturnType<T>> {\n const trx = new Transaction(\n this.sql as SqlDataSource,\n this.isolationLevel,\n true,\n this.nestingDepth + 1,\n );\n\n await trx.startTransaction();\n\n if (cb) {\n try {\n await cb(trx);\n await trx.commit();\n } catch (error) {\n await trx.rollback();\n throw error;\n }\n }\n\n return trx as NestedTransactionReturnType<T>;\n }\n\n /**\n * @description Starts a transaction, automatically handled from the sql data source instance in the `startTransaction` method\n */\n async startTransaction(): Promise<void> {\n const levelQuery = this.getIsolationLevelQuery();\n // Nested transactions use SAVEPOINTs and do not begin a new transaction\n if (this.isNested) {\n const savepoint = this.getSavePointName();\n switch (this.sql.type) {\n case \"mysql\":\n case \"mariadb\":\n case \"postgres\":\n case \"cockroachdb\":\n await this.sql.rawQuery(`SAVEPOINT ${savepoint}`);\n this.isActive = true;\n return;\n case \"sqlite\":\n await this.sql.rawQuery(`SAVEPOINT ${savepoint}`);\n this.isActive = true;\n return;\n }\n }\n\n // Top-level transaction handling\n switch (this.sql.type) {\n case \"mysql\":\n case \"mariadb\":\n if (levelQuery) {\n await this.sql.rawQuery(levelQuery);\n }\n\n const mysqlConnection = this.sql\n .sqlConnection as GetConnectionReturnType<\"mysql\">;\n await mysqlConnection.beginTransaction();\n\n this.isActive = true;\n break;\n case \"postgres\":\n case \"cockroachdb\":\n await this.sql.rawQuery(\"BEGIN TRANSACTION\");\n if (levelQuery) {\n await this.sql.rawQuery(levelQuery);\n }\n\n this.isActive = true;\n break;\n case \"sqlite\":\n if (levelQuery) {\n await this.sql.rawQuery(levelQuery);\n }\n\n await this.sql.rawQuery(\"BEGIN TRANSACTION\");\n this.isActive = true;\n break;\n }\n }\n\n /**\n * @description Commit the transaction releasing the connection\n * @throws {HysteriaError} if the transaction is not active and options.throwErrorOnInactiveTransaction is true\n * @logs if the transaction is not active and options.throwErrorOnInactiveTransaction is false\n */\n async commit(options?: TransactionExecutionOptions): Promise<void> {\n if (!this.isActive) {\n if (options?.throwErrorOnInactiveTransaction) {\n throw new HysteriaError(\n \"TRANSACTION::commit\",\n \"TRANSACTION_NOT_ACTIVE\",\n );\n }\n logger.warn(\"Transaction::commit - TRANSACTION_NOT_ACTIVE\");\n return;\n }\n\n try {\n // Nested transactions should release their savepoint and keep the outer transaction/connection\n if (this.isNested) {\n const savepoint = this.getSavePointName();\n switch (this.sql.type) {\n case \"mysql\":\n case \"mariadb\":\n case \"postgres\":\n case \"cockroachdb\":\n case \"sqlite\":\n await this.sql.rawQuery(`RELEASE SAVEPOINT ${savepoint}`);\n break;\n }\n this.isActive = false;\n return;\n }\n\n switch (this.sql.type) {\n case \"mysql\":\n case \"mariadb\":\n const mysqlConnection = this.sql\n .sqlConnection as GetConnectionReturnType<\"mysql\">;\n await mysqlConnection.commit();\n break;\n case \"postgres\":\n case \"cockroachdb\":\n await this.sql.rawQuery(\"COMMIT\");\n break;\n case \"sqlite\":\n await this.sql.rawQuery(\"COMMIT\");\n break;\n }\n } catch (error: any) {\n logger.error(error);\n throw error;\n }\n\n await this.releaseConnection();\n this.isActive = false;\n }\n\n /**\n * @description Rollback the transaction releasing the connection\n * @throws {HysteriaError} if the transaction is not active and options.throwErrorOnInactiveTransaction is true\n * @logs if the transaction is not active and options.throwErrorOnInactiveTransaction is false\n */\n async rollback(options?: TransactionExecutionOptions): Promise<void> {\n if (!this.isActive) {\n if (options?.throwErrorOnInactiveTransaction) {\n throw new HysteriaError(\n \"TRANSACTION::rollback\",\n \"TRANSACTION_NOT_ACTIVE\",\n );\n }\n\n logger.warn(\"Transaction::rollback - TRANSACTION_NOT_ACTIVE\");\n return;\n }\n\n try {\n // Nested transactions should rollback to their savepoint and keep the outer transaction/connection\n if (this.isNested) {\n const savepoint = this.getSavePointName();\n switch (this.sql.type) {\n case \"mysql\":\n case \"mariadb\":\n case \"postgres\":\n case \"cockroachdb\":\n await this.sql.rawQuery(`ROLLBACK TO SAVEPOINT ${savepoint}`);\n break;\n case \"sqlite\":\n await this.sql.rawQuery(`ROLLBACK TO ${savepoint}`);\n break;\n default:\n throw new HysteriaError(\n \"TRANSACTION::rollback\",\n `UNSUPPORTED_DATABASE_TYPE_${this.sql.type}`,\n );\n }\n this.isActive = false;\n return;\n }\n\n switch (this.sql.type) {\n case \"mysql\":\n case \"mariadb\":\n const mysqlConnection = this.sql\n .sqlConnection as GetConnectionReturnType<\"mysql\">;\n await mysqlConnection.rollback();\n break;\n case \"postgres\":\n case \"cockroachdb\":\n await this.sql.rawQuery(\"ROLLBACK\");\n break;\n case \"sqlite\":\n await this.sql.rawQuery(\"ROLLBACK\");\n break;\n default:\n throw new HysteriaError(\n \"TRANSACTION::rollback\",\n `UNSUPPORTED_DATABASE_TYPE_${this.sql.type}`,\n );\n }\n } catch (error: any) {\n logger.error(error);\n throw error;\n }\n\n await this.releaseConnection();\n this.isActive = false;\n }\n\n /**\n * @description Release the connection, does nothing if the connection is already released\n */\n private async releaseConnection(): Promise<void> {\n if (this.connectionReleased) {\n return;\n }\n\n try {\n switch (this.sql.type) {\n case \"mysql\":\n case \"mariadb\":\n (\n this.sql.sqlConnection as GetConnectionReturnType<\"mysql\">\n ).release();\n break;\n case \"postgres\":\n case \"cockroachdb\":\n (\n this.sql.sqlConnection as GetConnectionReturnType<\"postgres\">\n ).release();\n break;\n case \"sqlite\":\n // Since we are living on a single connection, we don't need to release sqlite\n break;\n default:\n throw new HysteriaError(\n \"TRANSACTION::releaseConnection\",\n `UNSUPPORTED_DATABASE_TYPE_${this.sql.type}`,\n );\n }\n } catch (error: any) {\n logger.error(error);\n }\n\n await this.sql.closeConnection();\n this.sql.sqlConnection = null;\n this.connectionReleased = true;\n }\n\n private getIsolationLevelQuery(): string {\n if (!this.isolationLevel) {\n return \"\";\n }\n\n if (this.sql.type === \"sqlite\" && this.isolationLevel !== \"SERIALIZABLE\") {\n throw new HysteriaError(\n \"TRANSACTION::getIsolationLevelQuery\",\n \"SQLITE_ONLY_SUPPORTS_SERIALIZABLE_ISOLATION_LEVEL\",\n );\n }\n\n if (this.sql.type === \"mysql\" || this.sql.type === \"mariadb\") {\n return `SET TRANSACTION ISOLATION LEVEL ${this.isolationLevel}`;\n }\n\n if (this.sql.type === \"postgres\" || this.sql.type === \"cockroachdb\") {\n return `SET TRANSACTION ISOLATION LEVEL ${this.isolationLevel}`;\n }\n\n if (this.sql.type === \"sqlite\") {\n return \"\";\n }\n\n throw new HysteriaError(\n \"TRANSACTION::getIsolationLevelQuery\",\n `UNSUPPORTED_DATABASE_TYPE_${this.sql.type}`,\n );\n }\n\n private getSavePointName(): string {\n const shortId = this.transactionId.slice(0, 8).toUpperCase();\n return `sp_${this.nestingDepth}_${shortId}`;\n }\n}\n","import { InMemoryAdapter } from \"../cache/adapters/in_memory\";\nimport { CacheAdapter } from \"../cache/cache_adapter\";\nimport { CacheKeys, UseCacheReturnType } from \"../cache/cache_types\";\nimport { DataSource } from \"../data_source/data_source\";\nimport { HysteriaError } from \"../errors/hysteria_error\";\nimport { generateOpenApiModelWithMetadata } from \"../openapi/openapi\";\nimport { hashString } from \"../utils/hash\";\nimport logger, { log } from \"../utils/logger\";\nimport {\n formatQuery,\n getSqlDialect,\n isTableMissingError,\n} from \"../utils/query\";\nimport { AstParser } from \"./ast/parser\";\nimport { RawNode } from \"./ast/query/node/raw/raw_node\";\nimport { ForeignKeyInfoNode } from \"./ast/query/node/schema\";\nimport { IndexInfoNode } from \"./ast/query/node/schema/index_info\";\nimport { PrimaryKeyInfoNode } from \"./ast/query/node/schema/primary_key_info\";\nimport { TableInfoNode } from \"./ast/query/node/schema/table_info\";\nimport Schema from \"./migrations/schema/schema\";\nimport { SchemaDiff } from \"./migrations/schema_diff/schema_diff\";\nimport { normalizeColumnType } from \"./migrations/schema_diff/type_normalizer\";\nimport { Model } from \"./models/model\";\nimport { ModelManager } from \"./models/model_manager/model_manager\";\nimport { RawModelOptions } from \"./models/model_types\";\nimport { DryQueryBuilder } from \"./query_builder/dry_query_builder\";\nimport { QueryBuilder } from \"./query_builder/query_builder\";\nimport { DryQueryBuilderWithoutReadOperations } from \"./query_builder/query_builder_types\";\nimport { getRawQueryBuilderModel } from \"./query_builder/query_builder_utils\";\nimport type {\n TableColumnInfo,\n TableForeignKeyInfo,\n TableIndexInfo,\n TablePrimaryKeyInfo,\n TableSchemaInfo,\n} from \"./schema_introspection_types\";\nimport { createSqlPool } from \"./sql_connection_utils\";\nimport type {\n AugmentedSqlDataSource,\n ConnectionPolicies,\n GetConnectionReturnType,\n getPoolReturnType,\n MysqlConnectionInstance,\n PgPoolClientInstance,\n SqlCloneOptions,\n SqlDataSourceInput,\n SqlDataSourceModel,\n SqlDataSourceType,\n SqliteConnectionInstance,\n SqlPoolType,\n TableFormat,\n UseConnectionInput,\n} from \"./sql_data_source_types\";\nimport { execSql } from \"./sql_runner/sql_runner\";\nimport { Transaction } from \"./transactions/transaction\";\nimport {\n StartTransactionOptions,\n StartTransactionReturnType,\n TransactionExecutionOptions,\n TransactionOptionsOrCallback,\n} from \"./transactions/transaction_types\";\n\n/**\n * @description The SqlDataSource class is the main class for interacting with the database, it's used to create connections, execute queries, and manage transactions\n */\nexport class SqlDataSource extends DataSource {\n private static instance: SqlDataSource | null = null;\n private globalTransaction: Transaction | null = null;\n private sqlType: SqlDataSourceType;\n private models: Record<string, SqlDataSourceModel> = {};\n private ownsPool: boolean = false;\n\n /**\n * @description The pool of connections for the database\n */\n declare sqlPool: SqlPoolType | null;\n\n /**\n * @description Only used in transaction context to specify the connection, not meant to be used directly\n * @private\n */\n sqlConnection: GetConnectionReturnType<SqlDataSourceType> | null = null;\n\n /**\n * @description Options provided in the sql data source initialization\n */\n inputDetails: SqlDataSourceInput<SqlDataSourceType>;\n\n /**\n * @description Adapter for `useCache`, uses an in memory strategy by default\n */\n cacheAdapter: CacheAdapter = new InMemoryAdapter();\n\n /**\n * @description Maps global keys to specific handlers for cache handling\n */\n cacheKeys: CacheKeys = {};\n\n // Static Methods\n\n /**\n * @description Establishes the default singleton connection used by default by all the Models, if not configuration is passed, env variables will be used instead\n * @description You can continue to use the global sql class exported by hysteria after the connection without having to rely on the return of this function\n * @throws {HysteriaError} If using models in input, and the model key is already used by the sql data source instance e.g. a model called `connect` is already used by the sql data source instance and will throw an error\n * @example\n * ```ts\n * import { sql } from \"hysteria-orm\";\n * const connection = await sql.connect();\n * // You can use both connection and sql from now own, since `sql` will use the default connection after being connected\n * connection.query();\n * sql.query();\n *\n * // Models will use the default connection after being connected\n * User.query(); // Will use the default connection\n * ```\n */\n static async connect<\n U extends SqlDataSourceType,\n T extends Record<string, SqlDataSourceModel> = {},\n C extends CacheKeys = {},\n >(\n input: SqlDataSourceInput<U, T, C>,\n cb?: (sqlDataSource: AugmentedSqlDataSource<T, C>) => Promise<void> | void,\n ): Promise<AugmentedSqlDataSource<T, C>>;\n static async connect<\n T extends Record<string, SqlDataSourceModel> = {},\n C extends CacheKeys = {},\n >(\n cb?: (sqlDataSource: AugmentedSqlDataSource<T, C>) => Promise<void> | void,\n ): Promise<AugmentedSqlDataSource<T, C>>;\n static async connect<\n U extends SqlDataSourceType,\n T extends Record<string, SqlDataSourceModel> = {},\n C extends CacheKeys = {},\n >(\n inputOrCb?:\n | SqlDataSourceInput<U, T, C>\n | ((sqlDataSource: AugmentedSqlDataSource<T, C>) => Promise<void> | void),\n cb?: (sqlDataSource: AugmentedSqlDataSource<T, C>) => Promise<void> | void,\n ): Promise<AugmentedSqlDataSource<T, C>> {\n if (typeof inputOrCb === \"function\") {\n cb = inputOrCb;\n inputOrCb = undefined;\n }\n\n const sqlDataSource = new SqlDataSource(\n inputOrCb as SqlDataSourceInput<U, T, C>,\n );\n\n if (inputOrCb?.models) {\n const sanitizeModelKeys = sqlDataSource.sanitizeModelKeys(\n inputOrCb?.models || {},\n );\n\n Object.assign(sqlDataSource, sanitizeModelKeys);\n }\n\n sqlDataSource.models = inputOrCb?.models || {};\n sqlDataSource.sqlPool = await createSqlPool(sqlDataSource.sqlType, {\n type: sqlDataSource.sqlType,\n host: sqlDataSource.host,\n port: sqlDataSource.port,\n username: sqlDataSource.username,\n password: sqlDataSource.password,\n database: sqlDataSource.database,\n connectionPolicies: sqlDataSource.inputDetails\n .connectionPolicies as ConnectionPolicies,\n queryFormatOptions: sqlDataSource.inputDetails.queryFormatOptions,\n driverOptions: sqlDataSource.inputDetails.driverOptions,\n logs: sqlDataSource.logs,\n models: sqlDataSource.models,\n } as SqlDataSourceInput<U, T, C>);\n\n sqlDataSource.ownsPool = true;\n await sqlDataSource.testConnectionQuery(\"SELECT 1\");\n SqlDataSource.instance = sqlDataSource;\n\n await cb?.(sqlDataSource as unknown as AugmentedSqlDataSource<T, C>);\n return sqlDataSource as unknown as AugmentedSqlDataSource<T, C>;\n }\n\n /**\n * @description Get's another database connection and return it, this won't be marked as the default connection used by the Models, for that use the static method `connect`\n * @description By default not used by the Models, you have to pass it as a parameter to the Models to use it\n * @throws {HysteriaError} If using models in input, and the model key is already used by the sql data source instance e.g. a model called `connect` is already used by the sql data source instance and will throw an error\n * @example\n * ```ts\n * const anotherSql = await Sql.connectToSecondarySource({\n * ...connectionData\n * });\n *\n * const user = await User.query({ connection: anotherSql }).many();\n * ```\n */\n static async connectToSecondarySource<\n U extends SqlDataSourceType,\n T extends Record<string, SqlDataSourceModel> = {},\n C extends CacheKeys = {},\n >(\n input: SqlDataSourceInput<U, T, C>,\n cb?: (sqlDataSource: AugmentedSqlDataSource<T, C>) => Promise<void> | void,\n ): Promise<AugmentedSqlDataSource<T, C>>;\n static async connectToSecondarySource<\n T extends Record<string, SqlDataSourceModel> = {},\n C extends CacheKeys = {},\n >(\n cb?: (sqlDataSource: AugmentedSqlDataSource<T, C>) => Promise<void> | void,\n ): Promise<AugmentedSqlDataSource<T, C>>;\n static async connectToSecondarySource<\n U extends SqlDataSourceType,\n T extends Record<string, SqlDataSourceModel> = {},\n C extends CacheKeys = {},\n >(\n inputOrCb?:\n | SqlDataSourceInput<U, T, C>\n | ((sqlDataSource: AugmentedSqlDataSource<T, C>) => Promise<void> | void),\n cb?: (sqlDataSource: AugmentedSqlDataSource<T, C>) => Promise<void> | void,\n ): Promise<AugmentedSqlDataSource<T, C>> {\n if (typeof inputOrCb === \"function\") {\n cb = inputOrCb;\n inputOrCb = undefined;\n }\n\n const sqlDataSource = new SqlDataSource(\n inputOrCb as SqlDataSourceInput<U, T, C>,\n );\n\n if (inputOrCb?.models) {\n const sanitizeModelKeys = sqlDataSource.sanitizeModelKeys(\n inputOrCb.models,\n );\n\n Object.assign(sqlDataSource, sanitizeModelKeys);\n }\n\n sqlDataSource.models = inputOrCb?.models || {};\n sqlDataSource.sqlPool = await createSqlPool(sqlDataSource.sqlType, {\n type: sqlDataSource.sqlType,\n host: sqlDataSource.host,\n port: sqlDataSource.port,\n username: sqlDataSource.username,\n password: sqlDataSource.password,\n database: sqlDataSource.database,\n connectionPolicies: sqlDataSource.inputDetails\n .connectionPolicies as ConnectionPolicies,\n queryFormatOptions: sqlDataSource.inputDetails.queryFormatOptions,\n driverOptions: sqlDataSource.inputDetails.driverOptions,\n logs: sqlDataSource.logs,\n models: sqlDataSource.models,\n } as SqlDataSourceInput<U, T, C>);\n sqlDataSource.ownsPool = true;\n\n await sqlDataSource.testConnectionQuery(\"SELECT 1\");\n SqlDataSource.instance = sqlDataSource;\n\n await cb?.(sqlDataSource as unknown as AugmentedSqlDataSource<T, C>);\n return sqlDataSource as unknown as AugmentedSqlDataSource<T, C>;\n }\n\n /**\n * @description Creates a new connection and executes a callback with the new instance, the connection is automatically closed after the callback is executed, so it's lifespan is only inside the callback\n * @description By default not used by the Models, you have to pass it as a parameter to the Models to use it\n * @throws {HysteriaError} If using models in input, and the model key is already used by the sql data source instance e.g. a model called `connect` is already used by the sql data source instance and will throw an error\n * @example\n * ```ts\n * await Sql.useConnection({\n * ...connectionData\n * }, (sql) => {\n * const user = await User.query({ connection: sql }).many();\n * });\n * ```\n */\n static async useConnection<\n U extends SqlDataSourceType,\n T extends Record<string, SqlDataSourceModel> = {},\n C extends CacheKeys = {},\n >(\n connectionDetails: UseConnectionInput<U, T, C>,\n cb: (sqlDataSource: AugmentedSqlDataSource<T, C>) => Promise<void>,\n ): Promise<void> {\n const customSqlInstance = new SqlDataSource(\n connectionDetails as SqlDataSourceInput<U, T, C>,\n );\n\n if (connectionDetails.models) {\n const sanitizeModelKeys = customSqlInstance.sanitizeModelKeys(\n connectionDetails.models,\n );\n\n Object.assign(customSqlInstance, sanitizeModelKeys);\n }\n\n customSqlInstance.models = connectionDetails.models || {};\n customSqlInstance.sqlPool = await createSqlPool(customSqlInstance.sqlType, {\n type: customSqlInstance.sqlType,\n host: customSqlInstance.host,\n port: customSqlInstance.port,\n username: customSqlInstance.username,\n password: customSqlInstance.password,\n database: customSqlInstance.database,\n connectionPolicies: customSqlInstance.inputDetails\n .connectionPolicies as ConnectionPolicies,\n queryFormatOptions: customSqlInstance.inputDetails.queryFormatOptions,\n driverOptions: customSqlInstance.inputDetails.driverOptions,\n logs: customSqlInstance.logs,\n models: connectionDetails.models,\n } as SqlDataSourceInput<U, T, C>);\n\n customSqlInstance.ownsPool = true;\n await customSqlInstance.testConnectionQuery(\"SELECT 1\");\n\n try {\n await cb(\n customSqlInstance as unknown as AugmentedSqlDataSource<T, C>,\n ).then(async () => {\n if (!customSqlInstance.isConnected) {\n return;\n }\n\n await customSqlInstance.closeConnection();\n });\n } catch (error) {\n if (customSqlInstance.isConnected) {\n await customSqlInstance.closeConnection();\n }\n\n throw error;\n }\n }\n\n /**\n * @description Returns the instance of the SqlDataSource\n * @throws {HysteriaError} If the connection is not established\n */\n static getInstance(): SqlDataSource {\n if (!SqlDataSource.instance) {\n throw new HysteriaError(\n \"SqlDataSource::getInstance\",\n \"CONNECTION_NOT_ESTABLISHED\",\n );\n }\n\n return SqlDataSource.instance;\n }\n\n /**\n * @description Returns a QueryBuilder instance\n * @description Query builder from the SqlDataSource instance returns raw data from the database, the data is not parsed or serialized in any way\n * @description Optimal for performance-critical operations\n * @description Use Models to have type safety and serialization\n * @description Default soft delete column is \"deleted_at\" with stringed date value\n * @param table The table name to query from, must be in valid sql format `table` or `table as alias`\n */\n static query<S extends string>(\n table: TableFormat<S>,\n options?: RawModelOptions,\n ): QueryBuilder {\n const instance = this.getInstance();\n const sqlForQueryBuilder =\n instance.isInGlobalTransaction && instance.globalTransaction?.isActive\n ? instance.globalTransaction.sql\n : instance;\n\n const qb = new QueryBuilder(\n getRawQueryBuilderModel(table, options),\n sqlForQueryBuilder as SqlDataSource,\n );\n\n if (options?.alias) {\n qb.from(table, options.alias);\n }\n\n return qb;\n }\n\n /**\n * @description Returns a dry query builder instance\n * @description The dry query builder instance will not execute the query, it will return the query statement\n * @returns The dry query builder instance\n */\n static dryQuery<S extends string>(\n table: TableFormat<S>,\n options?: RawModelOptions,\n ): DryQueryBuilderWithoutReadOperations {\n const instance = this.getInstance();\n const sqlForQueryBuilder =\n instance.isInGlobalTransaction && instance.globalTransaction?.isActive\n ? instance.globalTransaction.sql\n : instance;\n\n const qb = new DryQueryBuilder(\n getRawQueryBuilderModel(table, options),\n sqlForQueryBuilder as SqlDataSource,\n );\n\n if (options?.alias) {\n qb.from(table, options.alias);\n }\n\n return qb;\n }\n\n /**\n * @description Creates a table on the database, return the query to be executed to create the table\n */\n static createTable(...args: Parameters<Schema[\"createTable\"]>): string {\n return this.getInstance().createTable(...args);\n }\n\n /**\n * @description Alters a table on the database, return the queries to be executed in order to alter the table\n */\n static alterTable(...args: Parameters<Schema[\"alterTable\"]>): string[] {\n return this.getInstance().alterTable(...args);\n }\n\n /**\n * @description Starts a global transaction on the database\n */\n static async startGlobalTransaction(\n options?: StartTransactionOptions,\n ): Promise<Transaction> {\n return this.getInstance().startGlobalTransaction(options);\n }\n\n /**\n * @description Commits a global transaction on the database\n * @throws {HysteriaError} If the global transaction is not started\n */\n static async commitGlobalTransaction(): Promise<void> {\n await this.getInstance().commitGlobalTransaction();\n }\n\n /**\n * @description Rolls back a global transaction on the database\n * @throws {HysteriaError} If the global transaction is not started\n */\n static async rollbackGlobalTransaction(): Promise<void> {\n await this.getInstance().rollbackGlobalTransaction();\n }\n\n /**\n * @description Starts a transaction on a dedicated connection from the pool and returns a Transaction instance\n * @param cb if a callback is provided, it will execute the callback and commit or rollback the transaction based on the callback's success or failure\n * @param options.isolationLevel The isolation level to use for the transaction\n * @param options.throwErrorOnInactiveTransaction Whether to throw an error if the transaction is not active\n * @param options.endConnection Whether to end the connection after the transaction is committed or rolled back (Default is true, better to leave it this way)\n * @sqlite ignores the isolation level\n */\n static async startTransaction(\n options?: StartTransactionOptions,\n ): Promise<Transaction>;\n static async startTransaction(\n cb: (trx: Transaction) => Promise<void>,\n options?: StartTransactionOptions,\n ): Promise<void>;\n static async startTransaction<T extends TransactionOptionsOrCallback>(\n optionsOrCb?: T,\n maybeOptions?: StartTransactionOptions,\n ): Promise<StartTransactionReturnType<T>> {\n return this.getInstance().startTransaction(\n optionsOrCb as any,\n maybeOptions,\n ) as unknown as StartTransactionReturnType<T>;\n }\n\n /**\n * @alias startTransaction\n * @param cb if a callback is provided, it will execute the callback and commit or rollback the transaction based on the callback's success or failure\n * @param options.isolationLevel The isolation level to use for the transaction\n * @param options.throwErrorOnInactiveTransaction Whether to throw an error if the transaction is not active\n * @param options.endConnection Whether to end the connection after the transaction is committed or rolled back (Default is true, better to leave it this way)\n * @sqlite ignores the isolation level\n */\n static async transaction(\n options?: StartTransactionOptions,\n ): Promise<Transaction>;\n static async transaction(\n cb: (trx: Transaction) => Promise<void>,\n options?: StartTransactionOptions,\n ): Promise<void>;\n static async transaction(\n optionsOrCb?:\n | StartTransactionOptions\n | ((trx: Transaction) => Promise<void>),\n maybeOptions?: StartTransactionOptions,\n ): Promise<StartTransactionReturnType<TransactionOptionsOrCallback>>;\n static async transaction<T extends TransactionOptionsOrCallback>(\n optionsOrCb?: T,\n maybeOptions?: StartTransactionOptions,\n ): Promise<StartTransactionReturnType<T>> {\n const options =\n typeof optionsOrCb === \"function\" ? maybeOptions : optionsOrCb;\n return this.getInstance().startTransaction(\n optionsOrCb as any,\n options as any,\n ) as unknown as StartTransactionReturnType<T>;\n }\n\n /**\n * @description Retrieves informations from the database for the given table\n */\n static async getTableSchema(table: string): Promise<TableSchemaInfo> {\n return this.getInstance().getTableSchema(table);\n }\n\n /**\n * @description Closes the current connection\n */\n static async closeConnection(): Promise<void> {\n if (!this.instance) {\n logger.warn(\"Connection already closed\");\n return;\n }\n\n await this.instance.closeConnection();\n this.instance = null;\n }\n\n /**\n * @alias closeConnection\n */\n static async disconnect(): Promise<void> {\n return this.closeConnection();\n }\n\n /**\n * @description Executes a raw query on the database\n */\n static async rawQuery<T = any>(\n query: string,\n params: any[] = [],\n ): Promise<T> {\n const instance = this.getInstance();\n const sqlForRawQuery =\n instance.isInGlobalTransaction && instance.globalTransaction?.isActive\n ? instance.globalTransaction.sql\n : instance;\n\n return sqlForRawQuery.rawQuery(query, params);\n }\n\n /**\n * @description Adds a raw statement to an operation like where or update, those raw values won't be used as bindings and will be used as the are\n * @example\n * ```ts\n * import { sql } from \"hysteria-orm\";\n *\n * await User.query().where(\"name\", sql.rawStatement(\"LOWER(name)\"));\n * ```\n */\n static rawStatement(value: string) {\n return this.getInstance().rawStatement(value);\n }\n\n // Instance Methods\n private constructor(input?: SqlDataSourceInput<SqlDataSourceType>) {\n super(input);\n this.sqlType = this.type as SqlDataSourceType;\n this.inputDetails = input || {\n connectionPolicies: {\n retry: {\n maxRetries: 0,\n delay: 0,\n },\n },\n queryFormatOptions: {\n language: getSqlDialect(this.sqlType),\n keywordCase: \"lower\",\n dataTypeCase: \"lower\",\n functionCase: \"lower\",\n },\n };\n\n this.inputDetails.connectionPolicies = input?.connectionPolicies || {\n retry: {\n maxRetries: 0,\n delay: 0,\n },\n };\n\n this.inputDetails.queryFormatOptions = input?.queryFormatOptions || {\n language: getSqlDialect(this.sqlType),\n keywordCase: \"lower\",\n dataTypeCase: \"lower\",\n functionCase: \"lower\",\n };\n\n this.cacheKeys = input?.cacheStrategy?.keys ?? {};\n this.cacheAdapter = input?.cacheStrategy?.cacheAdapter ?? this.cacheAdapter;\n }\n\n /**\n * @description Uses the cache adapter to get a value from the cache\n * @param key The key to get the value from\n * @param args The arguments to pass to the key handler\n */\n async useCache<\n M extends Record<string, typeof Model>,\n C extends CacheKeys,\n K extends keyof C,\n >(\n this: AugmentedSqlDataSource<M, C>,\n key: K,\n ...args: Parameters<C[K]>\n ): Promise<UseCacheReturnType<C, K>>;\n /**\n * @description Uses the cache adapter to get a value from the cache\n * @param key The key to get the value from\n * @param ttl The time to live for the value in milliseconds\n * @param args The arguments to pass to the key handler\n */\n async useCache<\n M extends Record<string, typeof Model>,\n C extends CacheKeys,\n K extends keyof C,\n >(\n this: AugmentedSqlDataSource<M, C>,\n key: K,\n ttl: number,\n ...args: Parameters<C[K]>\n ): Promise<UseCacheReturnType<C, K>>;\n async useCache<\n M extends Record<string, typeof Model>,\n C extends CacheKeys,\n K extends keyof C,\n >(\n this: AugmentedSqlDataSource<M, C>,\n key: K,\n ttlOrFirstArg?: number | any,\n ...restArgs: any[]\n ): Promise<UseCacheReturnType<C, K>> {\n if (!this.cacheAdapter) {\n throw new HysteriaError(\n \"SqlDataSource::useCache\",\n \"CACHE_ADAPTER_NOT_CONFIGURED\",\n );\n }\n\n const mappedKeyHandler = this.cacheKeys[key as keyof typeof this.cacheKeys];\n if (!mappedKeyHandler) {\n throw new HysteriaError(\n \"SqlDataSource::useCache\",\n `KEY_${key as string}_HAS_NO_HANDLER_IN_CACHE_KEYS_CONFIG`,\n );\n }\n\n const handlerArgsCount = mappedKeyHandler.length;\n const isTTLProvided =\n typeof ttlOrFirstArg === \"number\" && handlerArgsCount === restArgs.length;\n\n let ttl: number | undefined;\n let args: any[] = [];\n\n if (isTTLProvided) {\n ttl = ttlOrFirstArg;\n args = restArgs;\n }\n\n if (!isTTLProvided) {\n ttl = undefined;\n args =\n ttlOrFirstArg !== undefined ? [ttlOrFirstArg, ...restArgs] : restArgs;\n }\n\n const hashedArgs = hashString(JSON.stringify(args));\n const cachedKey = hashedArgs\n ? `${key as string}:${hashedArgs}`\n : (key as string);\n\n const cachedValue = await this.cacheAdapter.get<unknown>(cachedKey);\n if (cachedValue !== undefined) {\n return cachedValue as UseCacheReturnType<C, K>;\n }\n\n const retrievedValue = await mappedKeyHandler(...args);\n await this.cacheAdapter.set(cachedKey, retrievedValue, ttl);\n return retrievedValue;\n }\n\n /**\n * @description Invalidates a value from the cache\n * @param key The key to invalidate the value from\n * @param args The arguments to pass to the key handler\n */\n async invalidCache<\n M extends Record<string, typeof Model>,\n C extends CacheKeys,\n K extends keyof C,\n >(\n this: AugmentedSqlDataSource<M, C>,\n key: K,\n ...args: Parameters<C[K]>\n ): Promise<void> {\n if (!this.cacheAdapter) {\n throw new HysteriaError(\n \"SqlDataSource::useCache\",\n \"CACHE_ADAPTER_NOT_CONFIGURED\",\n );\n }\n\n const hashedArgs = hashString(JSON.stringify(args));\n const cachedKey = hashedArgs\n ? `${key as string}:${hashedArgs}`\n : (key as string);\n\n await this.cacheAdapter.invalidate(cachedKey);\n }\n\n /**\n * @description Returns true if the connection is established\n */\n get isConnected(): boolean {\n return !!this.sqlPool || !!this.sqlConnection;\n }\n\n /**\n * @description Clones the SqlDataSource instance\n * @param options.shouldRecreatePool Whether to recreate the pool of connections for the given driver, by default it's false\n * @sqlite ignores the shouldRecreatePool option\n * @returns A new SqlDataSource instance with the same input details\n */\n async clone(options?: SqlCloneOptions): Promise<this> {\n const cloned = new SqlDataSource(this.inputDetails) as this;\n const mustCreateNewPool =\n cloned.sqlType === \"sqlite\" || !!options?.shouldRecreatePool;\n if (mustCreateNewPool) {\n cloned.sqlPool = await createSqlPool(cloned.sqlType, {\n type: cloned.sqlType,\n host: cloned.host,\n port: cloned.port,\n username: cloned.username,\n password: cloned.password,\n database: cloned.database,\n connectionPolicies: cloned.inputDetails\n .connectionPolicies as ConnectionPolicies,\n queryFormatOptions: cloned.inputDetails.queryFormatOptions,\n driverOptions: cloned.inputDetails.driverOptions,\n logs: cloned.logs,\n models: cloned.models,\n } as SqlDataSourceInput<SqlDataSourceType>);\n\n cloned.ownsPool = true;\n\n if (Object.keys(this.models).length) {\n const sanitizeModelKeys = cloned.sanitizeModelKeys(this.models);\n Object.assign(cloned, sanitizeModelKeys);\n }\n\n return cloned;\n }\n\n cloned.sqlPool = this.sqlPool;\n cloned.ownsPool = false;\n\n if (Object.keys(this.models).length) {\n const sanitizeModelKeys = cloned.sanitizeModelKeys(this.models);\n Object.assign(cloned, sanitizeModelKeys);\n }\n\n return cloned;\n }\n\n /**\n * @description Returns the type of the database\n */\n getDbType(): SqlDataSourceType {\n return this.type as SqlDataSourceType;\n }\n\n /**\n * @description Returns a QueryBuilder instance\n * @description Query builder from the SqlDataSource instance uses raw data from the database so the data is not parsed or serialized in any way\n * @description Optimal for performance-critical operations\n * @description Use Models to have type safety and serialization\n * @description Default soft delete column is \"deleted_at\" with stringed date value\n * @param table The table name to query from, must be in valid sql format `table` or `table as alias`\n */\n query<S extends string>(\n table: TableFormat<S>,\n options?: RawModelOptions,\n ): QueryBuilder {\n const sqlForQueryBuilder =\n this.isInGlobalTransaction && this.globalTransaction?.isActive\n ? this.globalTransaction.sql\n : this;\n\n const qb = new QueryBuilder(\n getRawQueryBuilderModel(table, options),\n sqlForQueryBuilder as SqlDataSource,\n );\n\n if (options?.alias) {\n qb.from(table, options.alias);\n }\n\n return qb;\n }\n\n /**\n * @description Returns a DryQueryBuilder instance\n * @description The dry query builder instance will not execute the query, it will return the query statement\n * @returns The dry query builder instance\n */\n dryQuery<S extends string>(\n table: TableFormat<S>,\n options?: RawModelOptions,\n ): DryQueryBuilderWithoutReadOperations {\n return new DryQueryBuilder(getRawQueryBuilderModel(table, options), this);\n }\n\n /**\n * @description Return the query to alter the given table schema\n */\n alterTable(...args: Parameters<Schema[\"alterTable\"]>): string[] {\n const schema = new Schema(this.getDbType());\n schema.alterTable(...args);\n return schema.queryStatements;\n }\n\n /**\n * @description Return the query to create the given table schema\n */\n createTable(...args: Parameters<Schema[\"createTable\"]>): string {\n const schema = new Schema(this.getDbType());\n schema.createTable(...args);\n return schema.queryStatements[0] || \"\";\n }\n\n /**\n * @description Starts a global transaction on the database on the main connection pool, intended to for testing purposes only, don't use it in production\n */\n async startGlobalTransaction(\n options?: StartTransactionOptions,\n ): Promise<Transaction> {\n const cloned = await this.clone();\n cloned.sqlConnection = await cloned.getConnection();\n this.globalTransaction = new Transaction(cloned, options?.isolationLevel);\n await this.globalTransaction.startTransaction();\n return this.globalTransaction;\n }\n\n /**\n * @description Commits a global transaction on the database on the main connection pool, intended to for testing purposes only, don't use it in production\n * @throws {HysteriaError} If the global transaction is not started\n */\n async commitGlobalTransaction(\n options?: TransactionExecutionOptions,\n ): Promise<void> {\n if (!this.globalTransaction) {\n throw new HysteriaError(\n \"SqlDataSource::commitGlobalTransaction\",\n \"GLOBAL_TRANSACTION_NOT_STARTED\",\n );\n }\n\n await this.globalTransaction.commit({\n throwErrorOnInactiveTransaction: options?.throwErrorOnInactiveTransaction,\n });\n this.globalTransaction = null;\n }\n\n /**\n * @description Rolls back a global transaction on the database on the main connection pool, intended to for testing purposes only, don't use it in production\n * @throws {HysteriaError} If the global transaction is not started and options.throwErrorOnInactiveTransaction is true\n */\n async rollbackGlobalTransaction(\n options?: TransactionExecutionOptions,\n ): Promise<void> {\n if (!this.globalTransaction) {\n logger.warn(\n \"SqlDataSource::rollbackGlobalTransaction - GLOBAL_TRANSACTION_NOT_STARTED\",\n );\n return;\n }\n\n await this.globalTransaction.rollback({\n throwErrorOnInactiveTransaction: options?.throwErrorOnInactiveTransaction,\n });\n this.globalTransaction = null;\n }\n\n /**\n * @description Get's a connection from the pool and starts a transaction on the database and returns an already started transaction instance\n * @param cb if a callback is provided, it will execute the callback and commit or rollback the transaction based on the callback's success or failure\n * @param options.isolationLevel The isolation level to use for the transaction\n * @param options.throwErrorOnInactiveTransaction Whether to throw an error if the transaction is not active\n * @param options.endConnection Whether to end the connection after the transaction is committed or rolled back (Default is true, better to leave it this way)\n * @sqlite ignores the isolation level\n */\n async startTransaction(\n options?: StartTransactionOptions,\n ): Promise<Transaction>;\n async startTransaction(\n cb: (trx: Transaction) => Promise<void>,\n options?: StartTransactionOptions,\n ): Promise<void>;\n async startTransaction<T extends TransactionOptionsOrCallback>(\n optionsOrCb?:\n | StartTransactionOptions\n | ((trx: Transaction) => Promise<void>),\n maybeOptions?: StartTransactionOptions,\n ): Promise<StartTransactionReturnType<T>> {\n const options =\n typeof optionsOrCb === \"function\" ? maybeOptions : optionsOrCb;\n\n // If a global transaction is active, create a nested transaction on the same connection.\n // This avoids cross-connection locks with uncommitted rows during tests that run under a global transaction.\n if (this.globalTransaction?.isActive) {\n if (typeof optionsOrCb === \"function\") {\n try {\n await this.globalTransaction.nestedTransaction(optionsOrCb);\n return undefined as StartTransactionReturnType<T>;\n } catch (error) {\n throw error;\n }\n }\n\n const nested = await this.globalTransaction.nestedTransaction();\n return nested as StartTransactionReturnType<T>;\n }\n\n const cloned = await this.clone();\n cloned.sqlConnection = await cloned.getConnection();\n const sqlTrx = new Transaction(cloned, options?.isolationLevel);\n await sqlTrx.startTransaction();\n\n if (typeof optionsOrCb === \"function\") {\n try {\n await optionsOrCb(sqlTrx);\n await sqlTrx.commit({\n throwErrorOnInactiveTransaction: false,\n });\n return undefined as StartTransactionReturnType<T>;\n } catch (error) {\n await sqlTrx.rollback({\n throwErrorOnInactiveTransaction: false,\n });\n throw error;\n }\n }\n\n return sqlTrx as StartTransactionReturnType<T>;\n }\n\n /**\n * @alias startTransaction\n * @description Get's a connection from the pool and starts a transaction on the database and returns an already started transaction instance\n * @param cb if a callback is provided, it will execute the callback and commit or rollback the transaction based on the callback's success or failure\n * @param options.isolationLevel The isolation level to use for the transaction\n * @param options.throwErrorOnInactiveTransaction Whether to throw an error if the transaction is not active\n * @param options.endConnection Whether to end the connection after the transaction is committed or rolled back (Default is true, better to leave it this way)\n * @sqlite ignores the isolation level\n */\n async transaction(options?: StartTransactionOptions): Promise<Transaction>;\n async transaction(\n cb: (trx: Transaction) => Promise<void>,\n options?: StartTransactionOptions,\n ): Promise<void>;\n async transaction(\n optionsOrCb?:\n | StartTransactionOptions\n | ((trx: Transaction) => Promise<void>),\n maybeOptions?: StartTransactionOptions,\n ): Promise<Transaction | void> {\n return this.startTransaction(optionsOrCb as any, maybeOptions);\n }\n\n /**\n * @description Returns a ModelManager instance for the given model, it's advised to use Model static methods instead.\n * @description This is intended to use only if you do not want to use active record pattern\n */\n getModelManager<T extends Model>(\n model: { new (): T } | typeof Model,\n ): ModelManager<T> {\n if (!this.isConnected) {\n throw new HysteriaError(\n \"SqlDataSource::getModelManager\",\n \"CONNECTION_NOT_ESTABLISHED\",\n );\n }\n\n if (this.globalTransaction?.isActive) {\n return new ModelManager(\n model as typeof Model,\n this.globalTransaction.sql as SqlDataSource,\n );\n }\n\n return new ModelManager(model as typeof Model, this);\n }\n\n /**\n * @description Returns the current raw driver Pool, you can specify the type of connection you want to get to have better type safety\n * @throws {HysteriaError} If the connection pool is not established\n * @example\n * const mysqlConnection = sql.getPool(\"mysql\"); // mysql2 Pool\n * const pgConnection = sql.getPool(\"postgres\"); // pg Pool\n * const sqliteConnection = sql.getPool(\"sqlite\"); // sqlite3 Database\n */\n getPool<T extends SqlDataSourceType = typeof this.sqlType>(\n _specificType: T = this.sqlType as T,\n ): getPoolReturnType<T> {\n if (!this.sqlPool) {\n throw new HysteriaError(\n \"SqlDataSource::getPool\",\n \"CONNECTION_NOT_ESTABLISHED\",\n );\n }\n\n return this.sqlPool as getPoolReturnType<T>;\n }\n\n /**\n * @description Returns a connection from the pool, you can specify the type of connection you want to get to have better type safety\n * @throws {HysteriaError} If the connection is not established\n * @example\n * const mysqlConnection = sql.getConnection(\"mysql\"); // mysql2 PoolConnection\n * const pgConnection = sql.getConnection(\"postgres\"); // pg PoolClient\n * const sqliteConnection = sql.getConnection(\"sqlite\"); // sqlite3 Database\n */\n async getConnection<T extends SqlDataSourceType = typeof this.sqlType>(\n _specificType: T = this.sqlType as T,\n ): Promise<GetConnectionReturnType<T>> {\n if (this.sqlConnection) {\n return this.sqlConnection as GetConnectionReturnType<T>;\n }\n\n if (!this.sqlPool) {\n throw new HysteriaError(\n \"SqlDataSource::getConnection\",\n \"CONNECTION_NOT_ESTABLISHED\",\n );\n }\n\n switch (this.sqlType) {\n case \"mysql\":\n case \"mariadb\":\n const mysqlPool = this.sqlPool as MysqlConnectionInstance;\n return (await mysqlPool.getConnection()) as GetConnectionReturnType<T>;\n case \"postgres\":\n case \"cockroachdb\":\n const pgPool = this.sqlPool as PgPoolClientInstance;\n return (await pgPool.connect()) as GetConnectionReturnType<T>;\n case \"sqlite\":\n return this.sqlPool as GetConnectionReturnType<T>;\n default:\n throw new HysteriaError(\n \"SqlDataSource::getConnection\",\n `UNSUPPORTED_DATABASE_TYPE_${this.sqlType}`,\n );\n }\n }\n\n /**\n * @description Closes the current connection\n * @description If there is an active global transaction, it will be rolled back\n */\n async closeConnection(): Promise<void> {\n if (!this.isConnected) {\n log(\"Connection already closed or not established\", this.logs);\n return;\n }\n\n if (!this.ownsPool) {\n this.sqlConnection = null;\n return;\n }\n\n try {\n if (this.globalTransaction?.isActive) {\n await this.rollbackGlobalTransaction({\n throwErrorOnInactiveTransaction: false,\n });\n }\n } catch (err: any) {\n logger.warn(\n \"SqlDataSource::closeConnection - Error while rolling back global transaction\",\n );\n }\n\n if (this.cacheAdapter?.disconnect) {\n await this.cacheAdapter.disconnect();\n }\n\n log(\"Closing connection\", this.logs);\n switch (this.type) {\n case \"mysql\":\n case \"mariadb\":\n await (this.sqlPool as MysqlConnectionInstance).end();\n break;\n case \"postgres\":\n case \"cockroachdb\":\n await (this.sqlPool as PgPoolClientInstance).end();\n break;\n case \"sqlite\":\n await new Promise<void>((resolve, reject) => {\n (this.sqlPool as SqliteConnectionInstance).close((err) => {\n if (err) {\n reject(err);\n }\n resolve();\n });\n });\n break;\n default:\n throw new HysteriaError(\n \"SqlDataSource::closeConnection\",\n `UNSUPPORTED_DATABASE_TYPE_${this.type}`,\n );\n }\n\n this.sqlPool = null;\n this.sqlConnection = null;\n }\n\n getConnectionDetails(): SqlDataSourceInput<SqlDataSourceType> {\n return {\n type: this.getDbType(),\n host: this.host,\n port: this.port,\n username: this.username,\n password: this.password,\n database: this.database,\n connectionPolicies: this.inputDetails\n .connectionPolicies as ConnectionPolicies,\n queryFormatOptions: this.inputDetails.queryFormatOptions,\n };\n }\n\n /**\n * @alias closeConnection\n */\n async disconnect(): Promise<void> {\n return this.closeConnection();\n }\n\n /**\n * @description Syncs the schema of the database with the models metadata\n * @warning This will drop and recreate all the indexes and constraints, use with caution and not in production environments\n * @param options.transactional Whether to use a transaction to sync the schema, if true it will use a transaction for the entire sync operation, defaults to false\n * @sqlite Not supported but won't throw an error\n */\n async syncSchema(options?: { transactional: boolean }): Promise<void> {\n options = options || { transactional: false };\n\n if (this.sqlType === \"sqlite\") {\n logger.warn(\"Syncing schema with SQLite is not supported, skipping...\");\n return;\n }\n\n const diff = await SchemaDiff.makeDiff(this);\n const sqlStatements = diff.getSqlStatements();\n if (!sqlStatements.length) {\n logger.info(\n `No new changes detected between database schema and models metadata`,\n );\n return;\n }\n\n logger.info(\n `Generated ${sqlStatements.length} SQL statements to sync schema`,\n );\n\n if (!options?.transactional) {\n for (const sql of sqlStatements) {\n await this.rawQuery(sql);\n }\n\n logger.info(`Synced schema with ${sqlStatements.length} SQL statements`);\n return;\n }\n\n await this.transaction(async (trx) => {\n for (const sql of sqlStatements) {\n await trx.sql.rawQuery(sql);\n }\n });\n logger.info(`Synced schema with ${sqlStatements.length} SQL statements`);\n }\n\n /**\n * @description Executes a raw query on the database\n */\n async rawQuery<T = any>(query: string, params: any[] = []): Promise<T> {\n if (!this.isConnected) {\n throw new HysteriaError(\n \"SqlDataSource::rawQuery\",\n \"CONNECTION_NOT_ESTABLISHED\",\n );\n }\n\n const formattedQuery = formatQuery(this, query);\n return execSql(formattedQuery, params, this, \"raw\");\n }\n\n /**\n * @description Adds a raw statement to an operation like where or update, those raw values won't be used as bindings and will be used as the are\n * @example\n * ```ts\n * import { sql } from \"hysteria-orm\";\n *\n * await User.query().where(\"name\", sql.rawStatement(\"LOWER(name)\"));\n * ```\n */\n rawStatement(value: string) {\n return new RawNode(value);\n }\n\n /**\n * @description Retrieves information from the database for the given table\n */\n async getTableSchema(table: string): Promise<TableSchemaInfo> {\n const [columns, indexes, foreignKeys, primaryKey] = await Promise.all([\n this.getTableInfo(table),\n this.getIndexInfo(table),\n this.getForeignKeyInfo(table),\n this.getPrimaryKeyInfo(table),\n ]);\n\n return { columns, indexes, foreignKeys, primaryKey };\n }\n\n /**\n * @description Models provided inside the connection method will always be used for openapi schema generation\n * @experimental\n */\n getModelOpenApiSchema() {\n return generateOpenApiModelWithMetadata(\n Object.values(this.models) as unknown as (new () => Model)[],\n );\n }\n\n /**\n * @description Introspects table columns metadata\n */\n async getTableInfo(table: string): Promise<TableColumnInfo[]> {\n const ast = new AstParser(\n {\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model,\n this.getDbType(),\n );\n\n const sql = ast.parse([new TableInfoNode(table)]).sql;\n let rows: any[] = [];\n try {\n rows = await this.rawQuery(sql);\n } catch (err: any) {\n if (isTableMissingError(this.getDbType(), err)) {\n return [];\n }\n throw err;\n }\n const db = this.getDbType();\n if (db === \"sqlite\") {\n return rows.map((r: any) => {\n const rawType = String(r.type || \"\").toLowerCase();\n const dataType = normalizeColumnType(db, rawType);\n return {\n name: r.name,\n dataType,\n isNullable: r.notnull === 0,\n defaultValue: r.dflt_value ?? null,\n withTimezone: null,\n };\n });\n }\n\n return rows.map((r: any) => {\n const name = String(r.column_name || r.COLUMN_NAME || r.name || \"\");\n const rawType = String(\n r.data_type || r.DATA_TYPE || r.type || \"\",\n ).toLowerCase();\n const dataType = normalizeColumnType(db, rawType);\n const rawNullable =\n r.is_nullable !== undefined\n ? r.is_nullable\n : r.IS_NULLABLE !== undefined\n ? r.IS_NULLABLE\n : undefined;\n const isNullable = (() => {\n if (typeof rawNullable === \"string\") {\n return rawNullable.toLowerCase() !== \"no\";\n }\n if (typeof rawNullable === \"boolean\") {\n return rawNullable;\n }\n if (r.notnull !== undefined) {\n return r.notnull === 0;\n }\n return true;\n })();\n\n const defaultValue =\n r.column_default ??\n r.COLUMN_DEFAULT ??\n r.defaultValue ??\n r.dflt_value ??\n null;\n const length = r.char_length != null ? Number(r.char_length) : null;\n const precision =\n r.numeric_precision != null ? Number(r.numeric_precision) : null;\n const scale = r.numeric_scale != null ? Number(r.numeric_scale) : null;\n const withTimezone =\n r.timezone != null\n ? Boolean(r.timezone)\n : typeof r.datetime_precision === \"number\"\n ? /with time zone/.test(\n String(r.column_type || r.udt_name || \"\").toLowerCase(),\n )\n : /with time zone/.test(\n String(r.column_type || r.udt_name || \"\").toLowerCase(),\n );\n return {\n name,\n dataType,\n isNullable,\n defaultValue,\n length,\n precision,\n scale,\n withTimezone,\n };\n });\n }\n\n /**\n * @description Introspects table indexes metadata using AST-driven queries\n */\n async getIndexInfo(table: string): Promise<TableIndexInfo[]> {\n const ast = new AstParser(\n {\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model,\n this.getDbType(),\n );\n\n const sql = ast.parse([new IndexInfoNode(table)]).sql;\n const db = this.getDbType();\n let rows: any[] = [];\n try {\n rows = await this.rawQuery(sql);\n } catch (err: any) {\n if (isTableMissingError(this.getDbType(), err)) {\n return [];\n }\n throw err;\n }\n if (db === \"mysql\" || db === \"mariadb\") {\n const map = new Map<\n string,\n { name: string; columns: string[]; isUnique: boolean }\n >();\n for (const r of rows) {\n const key = r.Key_name;\n const isUnique = r.Non_unique === 0;\n const arr = map.get(key) || {\n name: key,\n columns: [] as string[],\n isUnique,\n };\n arr.columns.push(r.Column_name);\n map.set(key, arr);\n }\n return Array.from(map.values());\n }\n\n if (db === \"postgres\" || db === \"cockroachdb\") {\n const map = new Map<\n string,\n { name: string; columns: string[]; isUnique: boolean }\n >();\n for (const r of rows) {\n const key = r.index_name;\n const isUnique = !!r.is_unique;\n const arr = map.get(key) || {\n name: key,\n columns: [] as string[],\n isUnique,\n };\n arr.columns.push(r.column_name);\n map.set(key, arr);\n }\n return Array.from(map.values());\n }\n\n // sqlite: PRAGMA index_list returns name, unique; need per-index columns via PRAGMA index_info(name)\n const result: TableIndexInfo[] = [];\n for (const r of rows) {\n const name = r.name;\n const isUnique = !!r.unique;\n const colsRows: any[] = await this.rawQuery(`PRAGMA index_info(${name})`);\n const columns = colsRows.map((cr) => cr.name);\n result.push({ name, columns, isUnique });\n }\n return result;\n }\n\n async getForeignKeyInfo(table: string): Promise<TableForeignKeyInfo[]> {\n const ast = new AstParser(\n {\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model,\n this.getDbType(),\n );\n\n const sql = ast.parse([new ForeignKeyInfoNode(table)]).sql;\n let rows: any[] = [];\n try {\n rows = await this.rawQuery(sql);\n } catch (err: any) {\n if (isTableMissingError(this.getDbType(), err)) {\n return [];\n }\n throw err;\n }\n\n const db = this.getDbType();\n if (db === \"sqlite\") {\n const grouped = new Map<number, TableForeignKeyInfo>();\n for (const r of rows) {\n const id = Number(r.id);\n const fk = grouped.get(id) || {\n name: undefined,\n columns: [] as string[],\n referencedTable: String(r.table),\n referencedColumns: [] as string[],\n onDelete: r.on_delete ?? null,\n onUpdate: r.on_update ?? null,\n };\n\n fk.columns.push(String(r.from));\n fk.referencedColumns.push(String(r.to));\n grouped.set(id, fk);\n }\n return Array.from(grouped.values());\n }\n\n const map = new Map<string, TableForeignKeyInfo>();\n for (const row of rows) {\n const name = String(row.name || \"\");\n const key = name || `${row.referenced_table}_${row.column_name}`;\n const fk = map.get(key) || {\n name: name || undefined,\n columns: [] as string[],\n referencedTable: String(row.referenced_table),\n referencedColumns: [] as string[],\n onDelete: row.on_delete ?? null,\n onUpdate: row.on_update ?? null,\n };\n\n fk.columns.push(String(row.column_name));\n fk.referencedColumns.push(String(row.referenced_column));\n map.set(key, fk);\n }\n\n return Array.from(map.values());\n }\n\n /**\n * @description Introspects table primary key from the database\n */\n async getPrimaryKeyInfo(\n table: string,\n ): Promise<TablePrimaryKeyInfo | undefined> {\n const ast = new AstParser(\n {\n table,\n databaseCaseConvention: \"preserve\",\n modelCaseConvention: \"preserve\",\n } as typeof Model,\n this.getDbType(),\n );\n\n const sql = ast.parse([new PrimaryKeyInfoNode(table)]).sql;\n let rows: any[] = [];\n try {\n rows = await this.rawQuery(sql);\n } catch (err: any) {\n if (isTableMissingError(this.getDbType(), err)) {\n return undefined;\n }\n throw err;\n }\n\n if (!rows.length) {\n return undefined;\n }\n\n const columns = rows.map((row) => String(row.column_name));\n const name = rows[0].name;\n\n return {\n name: name || undefined,\n columns,\n };\n }\n\n private async testConnectionQuery(query: string): Promise<void> {\n await execSql(query, [], this, \"raw\", {\n shouldNotLog: true,\n });\n }\n\n private sanitizeModelKeys(\n models: Record<string, SqlDataSourceModel>,\n ): Record<string, SqlDataSourceModel> {\n const instanceKeys = Object.getOwnPropertyNames(this);\n const staticKeys = Object.getOwnPropertyNames(this.constructor);\n const allKeys = [...instanceKeys, ...staticKeys];\n\n if (Object.keys(models).some((key) => allKeys.includes(key))) {\n throw new HysteriaError(\n \"SqlDataSource::sanitizeModelKeys\",\n \"DUPLICATE_MODEL_KEYS_WHILE_INSTANTIATING_MODELS\",\n new Error(\n `Duplicate model keys while instantiating models inside the connection: ${Object.keys(\n models,\n )\n .filter((key) => allKeys.includes(key))\n .map((key) => `\"${key}\"`)\n .join(\", \")}`,\n ),\n );\n }\n\n return models;\n }\n\n static get isInGlobalTransaction(): boolean {\n return !!this.instance?.globalTransaction;\n }\n\n get isInGlobalTransaction(): boolean {\n return !!this.globalTransaction;\n }\n\n /**\n * @description Returns the models registered on this SqlDataSource instance (as provided in connect input)\n */\n get registeredModels(): Record<string, typeof Model> {\n return this.models;\n }\n}\n","import rollbackMigrationsConnector from \"../../cli/migration_rollback_connector\";\nimport runMigrationsConnector from \"../../cli/migration_run_connector\";\nimport { env } from \"../../env/env\";\nimport logger from \"../../utils/logger\";\nimport { SqlDataSource } from \"../sql_data_source\";\nimport {\n AugmentedSqlDataSource,\n SqlDataSourceInput,\n SqlDataSourceType,\n} from \"../sql_data_source_types\";\nimport { Migration } from \"./migration\";\n\n/**\n * @description Used internally from the CLI\n */\nexport class Migrator {\n private sql: SqlDataSource | AugmentedSqlDataSource;\n private readonly migrationTable = \"migrations\";\n\n constructor(sql?: SqlDataSource | AugmentedSqlDataSource) {\n this.sql = sql || SqlDataSource.getInstance();\n }\n\n async upMigrations(migrations: Migration[]): Promise<void> {\n for (const migration of migrations) {\n logger.info(`Running migration ${migration.migrationName}`);\n await migration.up();\n const statements = migration.schema.queryStatements;\n for (const statement of statements) {\n if (!statement) {\n continue;\n }\n\n await this.sql.rawQuery(statement);\n }\n\n await this.addMigrationToMigrationTable(migration);\n if (migration.afterMigration) {\n await migration.afterMigration(this.sql);\n }\n }\n }\n\n async downMigrations(migrations: Migration[]): Promise<void> {\n migrations = migrations.reverse();\n for (const migration of migrations) {\n logger.info(`Rolling back migration ${migration.migrationName}`);\n await migration.down();\n const statements = migration.schema.queryStatements;\n for (const statement of statements) {\n if (!statement) {\n continue;\n }\n\n await this.sql.rawQuery(statement);\n }\n\n await this.deleteMigrationFromMigrationTable(migration);\n if (migration.afterMigration) {\n await migration.afterMigration(this.sql);\n }\n }\n }\n\n private async addMigrationToMigrationTable(migration: Migration) {\n const completeUtcTimestamp = new Date();\n const timestamp = completeUtcTimestamp\n .toISOString()\n .replace(\"T\", \" \")\n .replace(/\\.\\d{3}Z$/, \"\");\n\n await this.sql.query(this.migrationTable).insert({\n name: migration.migrationName,\n timestamp,\n });\n }\n\n private async deleteMigrationFromMigrationTable(migration: Migration) {\n await this.sql\n .query(this.migrationTable)\n .where(\"name\", migration.migrationName)\n .delete();\n }\n}\n\n/**\n * @description Can be used to run migrations programmatically\n */\nexport class ClientMigrator {\n protected migrationPath: string;\n protected sqlDataSourceInput?: SqlDataSource[\"inputDetails\"] | SqlDataSource;\n\n constructor(\n migrationPath: string = env.MIGRATION_PATH || \"database/migrations\",\n sqlDataSourceInput?: SqlDataSource[\"inputDetails\"] | SqlDataSource,\n ) {\n this.migrationPath = migrationPath;\n this.sqlDataSourceInput = sqlDataSourceInput;\n }\n\n /**\n * @description Runs programmatic migrations up\n */\n async up(): Promise<void> {\n return this.migrate(\"up\");\n }\n\n /**\n * @description Runs programmatic migrations down\n */\n async down(): Promise<void> {\n return this.migrate(\"down\");\n }\n\n /**\n * @description Runs programmatic migrations up or down\n * @param direction - The direction to migrate, either \"up\" or \"down\"\n */\n private async migrate(direction: \"up\" | \"down\"): Promise<void> {\n env.MIGRATION_PATH = this.migrationPath;\n const sqlDataSource =\n this.sqlDataSourceInput instanceof SqlDataSource\n ? this.sqlDataSourceInput\n : await SqlDataSource.connect({\n ...(this\n .sqlDataSourceInput as SqlDataSourceInput<SqlDataSourceType>),\n });\n\n if (direction === \"up\") {\n return runMigrationsConnector(\n sqlDataSource,\n undefined,\n this.migrationPath,\n );\n }\n\n return rollbackMigrationsConnector(\n sqlDataSource,\n undefined,\n this.migrationPath,\n );\n }\n}\n\n/**\n * @description Defines a programmatic migrator, can be used to run migrations programmatically\n * @param migrationPath - The path to the migrations\n * @param sqlDataSourceInput - The sql data source input, if not provided, env variables will be used\n */\nexport const defineMigrator = (\n migrationPath: string,\n sqlDataSourceInput?: SqlDataSource[\"inputDetails\"] | SqlDataSource,\n): ClientMigrator => {\n return new ClientMigrator(migrationPath, sqlDataSourceInput);\n};\n","import { Migration } from \"../sql/migrations/migration\";\nimport { Migrator } from \"../sql/migrations/migrator\";\nimport { type SqlDataSource } from \"../sql/sql_data_source\";\nimport {\n AugmentedSqlDataSource,\n SqlDataSourceType,\n} from \"../sql/sql_data_source_types\";\nimport { Transaction } from \"../sql/transactions/transaction\";\nimport logger from \"../utils/logger\";\nimport { getMigrations, getMigrationTable } from \"./migration_utils\";\nimport { MigrationTableType } from \"./resources/migration_table_type\";\n\nexport default async function rollbackMigrationsConnector(\n sql: SqlDataSource | AugmentedSqlDataSource,\n rollBackUntil?: string,\n migrationPath?: string,\n tsconfigPath?: string,\n transactional?: boolean,\n) {\n const dbType = sql.getDbType();\n let trx: Transaction | null = null;\n logger.info(\"Rolling back migrations for database type: \" + dbType);\n\n try {\n const migrationTable: MigrationTableType[] = await getMigrationTable(\n dbType as SqlDataSourceType,\n sql.getPool(),\n );\n const migrations: Migration[] = await getMigrations(\n dbType as SqlDataSourceType,\n migrationPath,\n tsconfigPath,\n );\n\n const tableMigrations = migrationTable.map((migration) => migration.name);\n const pendingMigrations = migrations.filter((migration) =>\n tableMigrations.includes(migration.migrationName),\n );\n\n if (pendingMigrations.length === 0) {\n logger.info(\"No pending migrations.\");\n return;\n }\n\n if (rollBackUntil) {\n const rollBackUntilIndex = pendingMigrations.findIndex(\n (migration) => migration.migrationName === rollBackUntil,\n );\n\n if (rollBackUntilIndex === -1) {\n logger.error(`Rollback until migration not found: ${rollBackUntil}`);\n return;\n }\n\n const filteredMigrations = pendingMigrations.slice(rollBackUntilIndex);\n\n if (transactional) {\n trx = await sql.startTransaction();\n sql = trx.sql as SqlDataSource;\n }\n\n const migrator = new Migrator(sql);\n await migrator.downMigrations(filteredMigrations);\n\n if (transactional) {\n await trx?.commit();\n }\n\n logger.info(\"Migrations rolled back successfully\");\n return;\n }\n\n const migrator = new Migrator(sql);\n if (transactional) {\n trx = await sql.startTransaction();\n sql = trx.sql as SqlDataSource;\n }\n\n await migrator.downMigrations(pendingMigrations);\n\n if (transactional) {\n await trx?.commit();\n }\n } catch (error: any) {\n if (transactional) {\n await trx?.rollback();\n }\n\n throw error;\n }\n\n logger.info(\"Migrations rolled back successfully\");\n}\n","export class GenerateMigrationTemplate {\n static async generate(sqlStatements: string[]) {\n const template = `import { Migration } from \"hysteria-orm\";\n\nexport default class extends Migration {\n async up() {\n${sqlStatements\n .map((statement) => {\n const escapedStatement = statement\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/'/g, \"\\\\'\")\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/\\t/g, \"\\\\t\");\n return ` this.schema.rawQuery('${escapedStatement}');`;\n })\n .join(\"\\n\")}\n }\n\n async down() {}\n}`;\n return template;\n }\n}\n","export class InitTemplates {\n static initTemplate(type: string): string {\n const port = this.getDefaultPort(type);\n const database = type === \"sqlite\" ? \"database.db\" : \"database\";\n const importType =\n type === \"mongodb\" ? \"mongo\" : type === \"redis\" ? \"redis\" : \"sql\";\n\n if (type === \"mongodb\" || type === \"redis\") {\n return this.handleNoSqlConnection(type, importType);\n }\n\n return `\nimport { ${importType} } from \"hysteria-orm\";\n\nconst db = await ${importType}.connect({\n type: \"${type}\",\n database: \"${database}\"${\n type === \"sqlite\"\n ? \"\"\n : `,\n port: ${port},\n host: \"localhost\",\n username: \"root\",\n password: \"root\"`\n }\n})\n .catch((err) => {\n console.error(err);\n process.exit(1);\n });\n\nexport default db;\n`;\n }\n\n private static handleNoSqlConnection(\n type: string,\n importType: string,\n ): string {\n const config = this.getNoSqlConnectionConfig(type);\n if (config) {\n return `\nimport { ${importType} } from \"hysteria-orm\";\n\nconst db = await ${importType}.connect(${config}).catch((err) => {\n console.error(err);\n process.exit(1);\n});\n\nexport default db;`;\n }\n\n return \"\";\n }\n\n private static getNoSqlConnectionConfig(type: string): string {\n switch (type) {\n case \"mongodb\":\n return \"mongodb://localhost:27017/database?authSource=admin\";\n case \"redis\":\n return `{\n host: \"localhost\",\n port: 6379,\n password: \"root\",\n username: \"default\",\n db: 0,\n}`;\n default:\n return \"\";\n }\n }\n\n private static getDefaultPort(type: string): number {\n switch (type) {\n case \"mysql\":\n return 3306;\n case \"postgres\":\n return 5432;\n case \"mariadb\":\n return 3306;\n case \"cockroachdb\":\n return 26257;\n case \"mongodb\":\n return 27017;\n case \"redis\":\n return 6379;\n default:\n return 3306;\n }\n }\n}\n","import fs from \"node:fs\";\nimport { type SqlDataSource } from \"../sql/sql_data_source\";\nimport logger from \"../utils/logger\";\nimport path from \"node:path\";\n\nexport default async function runSqlConnector(\n sql: string,\n sqlDataSource: SqlDataSource,\n out?: string,\n): Promise<void> {\n const databaseType = sqlDataSource.getDbType();\n logger.info(`Running sql for ${databaseType}`);\n const result = await sqlDataSource.rawQuery(sql);\n logger.info(\"Sql ran successfully\");\n if (out) {\n const fileDir = path.dirname(out);\n if (!fs.existsSync(fileDir)) {\n fs.mkdirSync(fileDir, { recursive: true });\n }\n\n fs.writeFileSync(out, JSON.stringify(result, null, 2));\n logger.info(`Query result saved to ${out}`);\n return;\n }\n\n logger.info(JSON.stringify(result, null, 2));\n await sqlDataSource.disconnect();\n}\n","import { execSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { DataSourceType } from \"../data_source/data_source_types\";\nimport logger from \"./logger\";\n\nexport const getPackageManager = (): [string, string] => {\n const hasYarnLock = fs.existsSync(path.join(process.cwd(), \"yarn.lock\"));\n if (hasYarnLock) {\n return [\"yarn\", \"add\"];\n }\n const hasPnpmLock = fs.existsSync(path.join(process.cwd(), \"pnpm-lock.yaml\"));\n if (hasPnpmLock) {\n return [\"pnpm\", \"add\"];\n }\n const hasPackageLock = fs.existsSync(\n path.join(process.cwd(), \"package-lock.json\"),\n );\n if (hasPackageLock) {\n return [\"npm\", \"install\"];\n }\n const hasBunLock = fs.existsSync(path.join(process.cwd(), \"bun.lockb\"));\n if (hasBunLock) {\n return [\"bun\", \"add\"];\n }\n const hasDenoLock = fs.existsSync(path.join(process.cwd(), \"deno.lock\"));\n if (hasDenoLock) {\n return [\"deno\", \"add\"];\n }\n return [\"npm\", \"install\"];\n};\n\nexport const installBaseDependencies = (\n packageManager: string,\n packageManagerCommand: string,\n type: DataSourceType | \"redis\",\n) => {\n const devDependencies = [\"bundle-require\", \"typescript\", \"esbuild\"];\n\n let driverDependency = \"\";\n switch (type) {\n case \"mariadb\":\n case \"mysql\":\n driverDependency = \"mysql2\";\n break;\n case \"cockroachdb\":\n case \"postgres\":\n driverDependency = \"pg\";\n break;\n case \"sqlite\":\n driverDependency = \"sqlite3\";\n break;\n case \"mongo\":\n driverDependency = \"mongodb\";\n break;\n case \"redis\":\n driverDependency = \"ioredis\";\n break;\n default:\n throw new Error(`Invalid database type: ${type}`);\n }\n\n logger.info(`installing dev dependencies: ${devDependencies.join(\" \")}`);\n\n const devFlag = packageManager === \"deno\" ? \"--dev\" : \"-D\";\n\n execSync(\n `${packageManager} ${packageManagerCommand} ${devDependencies.join(\" \")} ${devFlag}`,\n { stdio: \"inherit\" },\n );\n\n if (driverDependency) {\n logger.info(`installing driver dependency: ${driverDependency}`);\n execSync(`${packageManager} ${packageManagerCommand} ${driverDependency}`, {\n stdio: \"inherit\",\n });\n }\n};\n","import { Command } from \"commander\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport dropAllTablesConnector from \"./cli/drop_all_tables_connector\";\nimport migrationCreateConnector from \"./cli/migration_create_connector\";\nimport rollbackMigrationsConnector from \"./cli/migration_rollback_connector\";\nimport runMigrationsConnector from \"./cli/migration_run_connector\";\nimport { GenerateMigrationTemplate } from \"./cli/resources/generate_migration_template\";\nimport { InitTemplates } from \"./cli/resources/init_templates\";\nimport runSqlConnector from \"./cli/run_sql_connector\";\nimport { SchemaDiff } from \"./sql/migrations/schema_diff/schema_diff\";\nimport { SqlDataSource } from \"./sql/sql_data_source\";\nimport { SqlDataSourceType } from \"./sql/sql_data_source_types\";\nimport { importTsUniversal } from \"./utils/importer\";\nimport logger from \"./utils/logger\";\nimport { getPackageManager, installBaseDependencies } from \"./utils/package\";\n\nconst sqlDatabaseTypes = [\n \"sqlite\",\n \"mysql\",\n \"postgres\",\n \"mariadb\",\n \"cockroachdb\",\n];\nconst allDatabaseTypes = sqlDatabaseTypes.concat(\"mongodb\", \"redis\");\n\nconst program = new Command();\n\nprogram\n .command(\"init\")\n .option(\n \"-t, --type [type]\",\n `Type of the database to connect to, available types: ${allDatabaseTypes.join(\", \")}`,\n undefined,\n )\n .description(\n \"Initialize the hysteria-orm with standard configuration, it will create a database if not exists and a migrations folder inside it if not exists, it will also create a index.ts file in the database folder\",\n )\n .action(async (option: { type: SqlDataSourceType }) => {\n if (!option.type) {\n logger.error(\"Database type is required\");\n process.exit(1);\n }\n\n if (!allDatabaseTypes.includes(option.type)) {\n logger.error(\n `Invalid database type: ${option.type}, available types: ${allDatabaseTypes.join(\", \")}`,\n );\n process.exit(1);\n }\n\n logger.info(\"Initializing hysteria-orm with standard configuration\");\n logger.info(\n `Database type: ${option.type || \"not specified (will use env DB_TYPE)\"}`,\n );\n\n const [packageManager, packageManagerCommand] = getPackageManager();\n logger.info(`Package manager: ${packageManager}`);\n\n logger.info(\"Installing base dependencies\");\n installBaseDependencies(packageManager, packageManagerCommand, option.type);\n\n const template = InitTemplates.initTemplate(option.type);\n if (!fs.existsSync(\"database\")) {\n fs.mkdirSync(\"database\", { recursive: true });\n } else {\n logger.info(\"database folder already exists, skipping\");\n }\n\n if (!fs.existsSync(\"database/index.ts\")) {\n fs.writeFileSync(\"database/index.ts\", template);\n } else {\n logger.info(\"database/index.ts file already exists, skipping\");\n }\n\n if (\n sqlDatabaseTypes.includes(option.type) &&\n !fs.existsSync(\"database/migrations\")\n ) {\n fs.mkdirSync(\"database/migrations\", { recursive: true });\n } else {\n logger.info(\n \"database/migrations folder already exists or is not a sql database, skipping\",\n );\n }\n\n logger.info(\"Initialization completed successfully\");\n });\n\nprogram\n .command(\"run:sql [sql]\")\n .option(\"-f, --file [path]\", \"Path to the sql file\", undefined)\n .option(\n \"-d, --datasource [path]\",\n \"Path to SqlDataSource (default export)\",\n undefined,\n )\n .option(\"-o, --out [query]\", \"File path to save the query result\", undefined)\n .option(\n \"-t, --tsconfig [tsconfigPath]\",\n \"Path to the tsconfig.json file, defaults to ./tsconfig.json\",\n undefined,\n )\n .description(\n \"Run a sql file or a sql query directly from the command line for the given connection defined in the env file\",\n )\n .action(\n async (\n sql?: string,\n option?: {\n file?: string;\n datasource?: string;\n out?: string;\n tsconfigPath?: string;\n },\n ) => {\n logger.info(\"Starting SQL execution\");\n if (!option?.datasource) {\n logger.error(\"SqlDataSource file path is required (-d|--datasource)\");\n process.exit(1);\n }\n\n let filePath = option?.file;\n if (!sql && !filePath) {\n logger.error(\"SQL query or file path is required\");\n process.exit(1);\n }\n\n if (sql && filePath) {\n logger.error(\"Cannot provide both sql query and file path\");\n process.exit(1);\n }\n\n const resolvedPath = path.resolve(process.cwd(), option.datasource);\n const { default: sqlDs } = await importTsUniversal<{\n default: SqlDataSource;\n }>(resolvedPath, option?.tsconfigPath);\n\n if (sql) {\n logger.info(\"Executing SQL query directly from command line\");\n try {\n await runSqlConnector(sql, sqlDs, option?.out);\n logger.info(\"SQL execution completed successfully\");\n process.exit(0);\n } catch (error) {\n logger.error(`SQL execution failed: ${error}`);\n process.exit(1);\n }\n }\n\n if (!filePath) {\n logger.error(\"No SQL statement or file provided\");\n process.exit(1);\n }\n\n logger.info(`Reading SQL from file: ${filePath}`);\n filePath = path.resolve(process.cwd(), filePath);\n if (!fs.existsSync(filePath)) {\n logger.error(`File not found: ${filePath}`);\n process.exit(1);\n }\n\n const sqlStatement = fs.readFileSync(filePath, \"utf-8\");\n logger.info(\n `SQL file loaded successfully (${sqlStatement.length} characters)`,\n );\n try {\n await runSqlConnector(sqlStatement, sqlDs, option?.out);\n logger.info(\"SQL file execution completed successfully\");\n process.exit(0);\n } catch (error) {\n logger.error(`SQL file execution failed: ${error}`);\n process.exit(1);\n }\n },\n );\n\nprogram\n .command(\"create:migration <name>\")\n .description(\n \"Create a new migration file, standard folder is migrations from the current directory you are now, you can change it in the env MIGRATION_PATH\",\n )\n .option(\n \"-j, --javascript\",\n \"Generate a javascript migration file instead of a default typescript one\",\n false,\n )\n .option(\n \"-a, --alter\",\n \"Generate a template for an alter table migration\",\n false,\n )\n .option(\n \"-c, --create\",\n \"Generate a template for a create table migration\",\n false,\n )\n .option(\n \"-t, --table <table>\",\n \"Specifies the target table name for the migration\",\n false,\n )\n .action(\n (\n name: string,\n option: {\n javascript: boolean;\n alter: boolean;\n create: boolean;\n table: string;\n },\n ) => {\n logger.info(`Creating migration: ${name}`);\n logger.info(\n `Migration options: javascript=${option.javascript}, alter=${option.alter}, create=${option.create}, table=${option.table || \"not specified\"}`,\n );\n\n if (!name) {\n logger.error(\"Migration name is required\");\n process.exit(1);\n }\n\n if (option.alter && option.create) {\n logger.error(\"Cannot use --alter and --create at the same time\");\n process.exit(1);\n }\n\n if (option.table && !(option.create || option.alter)) {\n logger.error(\"Cannot use --table without --create or --alter\");\n process.exit(1);\n }\n\n const migrationMode = option.alter\n ? \"alter\"\n : option.create\n ? \"create\"\n : \"basic\";\n\n logger.info(`Migration mode: ${migrationMode}`);\n migrationCreateConnector(\n name,\n option.javascript,\n migrationMode,\n option.table || name,\n );\n },\n );\n\nprogram\n .command(\"run:migrations [runUntil]\")\n .option(\n \"-c, --tsconfig [tsconfigPath]\",\n \"Path to the tsconfig.json file, defaults to ./tsconfig.json\",\n undefined,\n )\n .option(\n \"-d, --datasource [path]\",\n \"Path to SqlDataSource (default export)\",\n undefined,\n )\n .option(\n \"-m, --migration-path [migrationPath]\",\n \"Path to the migrations\",\n undefined,\n )\n .option(\n \"-t, --transactional\",\n \"Runs all the pending migrations in a single transaction, this does not apply to mysql since it does not support transactions inside schema changes\",\n true,\n )\n .description(\n \"Run pending migrations, if runUntil is provided, it will run all migrations until the provided migration name\",\n )\n .action(\n async (\n runUntil: string,\n option?: {\n migrationPath: string;\n tsconfigPath: string;\n datasource?: string;\n transactional: boolean;\n },\n ) => {\n if (!option?.datasource) {\n logger.error(\"SqlDataSource file path is required (-d|--datasource)\");\n process.exit(1);\n }\n const { default: sqlDs } = await importTsUniversal<{\n default: SqlDataSource;\n }>(path.resolve(process.cwd(), option.datasource), option?.tsconfigPath);\n\n try {\n await runMigrationsConnector(\n sqlDs,\n runUntil,\n option?.migrationPath,\n option?.tsconfigPath,\n option?.transactional,\n );\n\n await sqlDs.closeConnection();\n process.exit(0);\n } catch (error) {\n console.error(error);\n await sqlDs.closeConnection();\n process.exit(1);\n }\n },\n );\n\nprogram\n .command(\"rollback:migrations [rollbackUntil]\")\n .option(\n \"-c, --tsconfig [tsconfigPath]\",\n \"Path to the tsconfig.json file, defaults to ./tsconfig.json\",\n undefined,\n )\n .option(\n \"-d, --datasource [path]\",\n \"Path to SqlDataSource (default export)\",\n undefined,\n )\n .option(\n \"-m, --migration-path [migrationPath]\",\n \"Path to the migrations\",\n undefined,\n )\n .option(\n \"-t, --transactional\",\n \"Runs all the pending migrations in a single transaction, this does not apply to mysql since it does not support transactions inside schema changes\",\n true,\n )\n .description(\n \"Rollbacks every migration that has been run, if rollbackUntil is provided, it will rollback all migrations until the provided migration name\",\n )\n .action(\n async (\n rollbackUntil: string,\n option?: {\n migrationPath: string;\n tsconfigPath: string;\n datasource?: string;\n transactional: boolean;\n },\n ) => {\n if (!option?.datasource) {\n logger.error(\"SqlDataSource file path is required (-d|--datasource)\");\n process.exit(1);\n }\n const { default: sqlDs } = await importTsUniversal<{\n default: SqlDataSource;\n }>(path.resolve(process.cwd(), option.datasource), option?.tsconfigPath);\n\n try {\n await rollbackMigrationsConnector(\n sqlDs,\n rollbackUntil,\n option?.migrationPath,\n option?.tsconfigPath,\n option?.transactional,\n );\n\n await sqlDs.closeConnection();\n process.exit(0);\n } catch (error) {\n console.error(error);\n await sqlDs.closeConnection();\n process.exit(1);\n }\n },\n );\n\nprogram\n .command(\"refresh:migrations\")\n .option(\n \"-f, --force\",\n \"Drop all tables in the database before running the migrations instead of running the down migrations\",\n false,\n )\n .option(\n \"-c, --tsconfig [tsconfigPath]\",\n \"Path to the tsconfig.json file, defaults to ./tsconfig.json\",\n undefined,\n )\n .option(\n \"-d, --datasource [path]\",\n \"Path to SqlDataSource (default export)\",\n undefined,\n )\n .option(\n \"-t, --transactional\",\n \"Runs all the pending migrations in a single transaction, this does not apply to mysql since it does not support transactions inside schema changes\",\n true,\n )\n .option(\"-m, --migration-path [path]\", \"Path to the migrations\", undefined)\n .description(\n \"Rollbacks every migration that has been run and then run the migrations\",\n )\n .action(\n async (option?: {\n force: boolean;\n migrationPath: string;\n tsconfigPath: string;\n datasource?: string;\n transactional: boolean;\n }) => {\n const force = option?.force || false;\n if (!option?.datasource) {\n logger.error(\"SqlDataSource file path is required (-d|--datasource)\");\n process.exit(1);\n }\n const { default: sqlDs } = await importTsUniversal<{\n default: SqlDataSource;\n }>(path.resolve(process.cwd(), option.datasource), option?.tsconfigPath);\n\n try {\n force\n ? await dropAllTablesConnector(sqlDs, false, option?.transactional)\n : await rollbackMigrationsConnector(\n sqlDs,\n undefined,\n option?.migrationPath,\n option?.tsconfigPath,\n option?.transactional,\n );\n\n await runMigrationsConnector(\n sqlDs,\n undefined,\n option?.migrationPath,\n option?.tsconfigPath,\n option?.transactional,\n );\n\n await sqlDs.closeConnection();\n process.exit(0);\n } catch (error) {\n console.error(error);\n await sqlDs.closeConnection();\n process.exit(1);\n }\n },\n );\n\nprogram\n .command(\"generate:migrations\")\n .description(\n \"Generate a migration file based on the database schema and the models metadata, not supported for sqlite\",\n )\n .option(\n \"-c, --tsconfig [tsconfigPath]\",\n \"Path to the tsconfig.json file, defaults to ./tsconfig.json\",\n undefined,\n )\n .option(\n \"-d, --datasource [path]\",\n \"Path to SqlDataSource (default export)\",\n undefined,\n )\n .option(\n \"-f, --dry\",\n \"Does not create a migration file but only outputs sql statements\",\n false,\n )\n .option(\n \"-j, --javascript\",\n \"Generate a javascript migration file instead of a default typescript one\",\n false,\n )\n .option(\"-m, --migration-path [path]\", \"Path to the migrations\", undefined)\n .option(\"-n, --name [name]\", \"Name of the migration\", undefined)\n .action(\n async (option?: {\n tsconfigPath: string;\n datasource?: string;\n migrationPath: string;\n javascript: boolean;\n name: string;\n dry?: boolean;\n }) => {\n if (!option?.datasource) {\n logger.error(\"SqlDataSource file path is required (-d|--datasource)\");\n process.exit(1);\n }\n\n if (!option?.migrationPath) {\n option.migrationPath = path.resolve(\n process.cwd(),\n \"database/migrations\",\n );\n }\n\n if (!option?.name) {\n option.name = `auto_generated_migration`;\n }\n\n option.name = `${Date.now()}_${option.name}`;\n\n const { default: sqlDs } = await importTsUniversal<{\n default: SqlDataSource;\n }>(path.resolve(process.cwd(), option.datasource), option?.tsconfigPath);\n\n if (sqlDs.getDbType() === \"sqlite\") {\n logger.error(\n \"generate:migrations with sqlite is not supported, it's suggested to use manual migrations instead\",\n );\n process.exit(1);\n }\n\n try {\n const diff = await SchemaDiff.makeDiff(sqlDs);\n const sqlStatements = diff.getSqlStatements();\n if (!sqlStatements.length) {\n logger.info(\n `No new changes detected between database schema and models metadata`,\n );\n process.exit(0);\n }\n\n if (option.dry) {\n for (const sql of sqlStatements) {\n console.log(sql);\n }\n\n process.exit(0);\n }\n\n if (!fs.existsSync(option?.migrationPath)) {\n fs.mkdirSync(option?.migrationPath, { recursive: true });\n }\n\n const template =\n await GenerateMigrationTemplate.generate(sqlStatements);\n\n const extension = option?.javascript ? \".js\" : \".ts\";\n fs.writeFileSync(\n `${option?.migrationPath}/${option?.name}${extension}`,\n template,\n );\n logger.info(\n `Migration file created successfully: ${option?.name}${extension}`,\n );\n\n await sqlDs.closeConnection();\n process.exit(0);\n } catch (error) {\n console.error(error);\n await sqlDs.closeConnection();\n process.exit(1);\n }\n },\n );\n\nprogram.parse(process.argv);\n"]}