metal-orm 1.0.35 → 1.0.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/dist/index.cjs +31 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -5
- package/dist/index.d.ts +10 -5
- package/dist/index.js +31 -9
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/decorators/bootstrap.ts +3 -3
- package/src/decorators/column.ts +3 -1
- package/src/orm/entity-metadata.ts +16 -9
- package/src/orm/entity.ts +7 -4
- package/src/orm/orm-session.ts +36 -11
- package/src/schema/types.ts +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/ddl/schema-plan-executor.ts","../src/index.ts","../src/schema/table.ts","../src/schema/column.ts","../src/schema/relation.ts","../src/core/ast/expression-nodes.ts","../src/core/ast/expression-builders.ts","../src/core/ast/window-functions.ts","../src/core/sql/sql.ts","../src/core/ast/aggregate-functions.ts","../src/core/ast/expression-visitor.ts","../src/core/ast/adapters.ts","../src/core/ast/builders.ts","../src/core/functions/standard-strategy.ts","../src/core/dialect/abstract.ts","../src/core/dialect/base/function-table-formatter.ts","../src/core/dialect/base/pagination-strategy.ts","../src/core/dialect/base/cte-compiler.ts","../src/core/dialect/base/returning-strategy.ts","../src/core/dialect/base/join-compiler.ts","../src/core/dialect/base/groupby-compiler.ts","../src/core/dialect/base/orderby-compiler.ts","../src/core/dialect/base/sql-dialect.ts","../src/core/dialect/postgres/functions.ts","../src/core/dialect/postgres/index.ts","../src/core/dialect/mysql/functions.ts","../src/core/dialect/mysql/index.ts","../src/core/dialect/sqlite/functions.ts","../src/core/dialect/sqlite/index.ts","../src/core/dialect/mssql/functions.ts","../src/core/dialect/mssql/index.ts","../src/core/dialect/dialect-factory.ts","../src/query-builder/select-query-state.ts","../src/core/ast/join-node.ts","../src/query-builder/hydration-manager.ts","../src/query-builder/relation-alias.ts","../src/query-builder/relation-utils.ts","../src/query-builder/hydration-planner.ts","../src/query-builder/raw-column-parser.ts","../src/query-builder/query-ast-service.ts","../src/query-builder/relation-projection-helper.ts","../src/query-builder/relation-conditions.ts","../src/core/ast/join-metadata.ts","../src/query-builder/relation-service.ts","../src/query-builder/select-query-builder-deps.ts","../src/query-builder/column-selector.ts","../src/query-builder/relation-manager.ts","../src/orm/hydration.ts","../src/orm/entity-meta.ts","../src/orm/relations/has-many.ts","../src/orm/relations/has-one.ts","../src/orm/relations/belongs-to.ts","../src/orm/relations/many-to-many.ts","../src/orm/lazy-batch.ts","../src/orm/entity.ts","../src/orm/execute.ts","../src/query-builder/select.ts","../src/orm/entity-metadata.ts","../src/decorators/bootstrap.ts","../src/query-builder/select-helpers.ts","../src/query-builder/insert-query-state.ts","../src/query-builder/insert.ts","../src/query-builder/update-query-state.ts","../src/query-builder/update.ts","../src/query-builder/delete-query-state.ts","../src/query-builder/delete.ts","../src/core/ddl/sql-writing.ts","../src/core/ddl/schema-generator.ts","../src/core/ddl/naming-strategy.ts","../src/core/ddl/schema-diff.ts","../src/core/ddl/introspect/utils.ts","../src/core/ddl/introspect/catalogs/postgres.ts","../src/core/ddl/introspect/run-select.ts","../src/core/ddl/introspect/postgres.ts","../src/core/ddl/introspect/mysql.ts","../src/core/ddl/introspect/sqlite.ts","../src/core/ddl/introspect/mssql.ts","../src/core/ddl/introspect/registry.ts","../src/core/ddl/schema-introspect.ts","../src/core/functions/text.ts","../src/core/functions/numeric.ts","../src/core/functions/datetime.ts","../src/orm/als.ts","../src/core/sql/sql-operator-config.ts","../src/codegen/naming-strategy.ts","../src/codegen/typescript.ts","../src/orm/identity-map.ts","../src/orm/runtime-types.ts","../src/orm/unit-of-work.ts","../src/orm/domain-event-bus.ts","../src/orm/relation-change-processor.ts","../src/orm/query-logger.ts","../src/orm/transaction-runner.ts","../src/orm/orm-session.ts","../src/orm/interceptor-pipeline.ts","../src/orm/orm.ts","../src/decorators/decorator-metadata.ts","../src/decorators/entity.ts","../src/decorators/column.ts","../src/decorators/relations.ts","../src/core/execution/db-executor.ts","../src/core/execution/executors/postgres-executor.ts","../src/core/execution/executors/mysql-executor.ts","../src/core/execution/executors/sqlite-executor.ts","../src/core/execution/executors/mssql-executor.ts"],"sourcesContent":["import { DbExecutor } from '../execution/db-executor.js';\nimport type { SchemaPlan, SynchronizeOptions } from './schema-diff.js';\n\nexport const executeSchemaPlan = async (\n plan: SchemaPlan,\n executor: DbExecutor,\n options: SynchronizeOptions = {}\n): Promise<void> => {\n for (const change of plan.changes) {\n if (!change.statements.length) continue;\n if (!change.safe && !options.allowDestructive) continue;\n for (const stmt of change.statements) {\n if (!stmt.trim()) continue;\n await executor.executeSql(stmt);\n }\n }\n};\n","export * from './schema/table.js';\r\nexport * from './schema/column.js';\r\nexport * from './schema/relation.js';\r\nexport * from './schema/types.js';\r\nexport * from './query-builder/select.js';\r\nexport * from './query-builder/select-helpers.js';\r\nexport * from './query-builder/insert.js';\r\nexport * from './query-builder/update.js';\r\nexport * from './query-builder/delete.js';\r\nexport * from './core/ast/expression.js';\r\nexport * from './core/hydration/types.js';\r\nexport * from './core/dialect/mysql/index.js';\r\nexport * from './core/dialect/mssql/index.js';\r\nexport * from './core/dialect/sqlite/index.js';\r\nexport * from './core/dialect/postgres/index.js';\r\nexport * from './core/ddl/schema-generator.js';\r\nexport * from './core/ddl/schema-types.js';\r\nexport * from './core/ddl/schema-diff.js';\r\nexport * from './core/ddl/schema-introspect.js';\r\nexport * from './core/ddl/introspect/registry.js';\r\nexport * from './core/functions/text.js';\r\nexport * from './core/functions/numeric.js';\r\nexport * from './core/functions/datetime.js';\r\nexport * from './orm/als.js';\r\nexport * from './orm/hydration.js';\r\nexport * from './codegen/typescript.js';\r\nexport * from './orm/orm-session.js';\r\nexport * from './orm/orm.js';\r\nexport * from './orm/entity.js';\r\nexport * from './orm/lazy-batch.js';\r\nexport * from './orm/relations/has-many.js';\r\nexport * from './orm/relations/belongs-to.js';\r\nexport * from './orm/relations/many-to-many.js';\r\nexport * from './orm/execute.js';\r\nexport * from './orm/entity-context.js';\r\nexport * from './orm/execution-context.js';\r\nexport * from './orm/hydration-context.js';\r\nexport * from './orm/domain-event-bus.js';\r\nexport * from './orm/runtime-types.js';\r\nexport * from './orm/query-logger.js';\r\nexport * from './decorators/index.js';\r\n\r\n// NEW: execution abstraction + helpers\r\nexport * from './core/execution/db-executor.js';\r\nexport * from './core/execution/executors/postgres-executor.js';\r\nexport * from './core/execution/executors/mysql-executor.js';\r\nexport * from './core/execution/executors/sqlite-executor.js';\r\nexport * from './core/execution/executors/mssql-executor.js';\r\n","import type { ColumnDef } from './column.js';\nimport type { RelationDef } from './relation.js';\n\nexport interface IndexColumn {\n column: string;\n order?: 'ASC' | 'DESC';\n nulls?: 'FIRST' | 'LAST';\n}\n\nexport interface IndexDef {\n name?: string;\n columns: (string | IndexColumn)[];\n unique?: boolean;\n where?: string;\n}\n\nexport interface CheckConstraint {\n name?: string;\n expression: string;\n}\n\nexport interface TableOptions {\n schema?: string;\n primaryKey?: string[];\n indexes?: IndexDef[];\n checks?: CheckConstraint[];\n comment?: string;\n engine?: string;\n charset?: string;\n collation?: string;\n}\n\nexport interface TableHooks {\n beforeInsert?(ctx: unknown, entity: any): Promise<void> | void;\n afterInsert?(ctx: unknown, entity: any): Promise<void> | void;\n beforeUpdate?(ctx: unknown, entity: any): Promise<void> | void;\n afterUpdate?(ctx: unknown, entity: any): Promise<void> | void;\n beforeDelete?(ctx: unknown, entity: any): Promise<void> | void;\n afterDelete?(ctx: unknown, entity: any): Promise<void> | void;\n}\n\n/**\n * Definition of a database table with its columns and relationships\n * @typeParam T - Type of the columns record\n */\nexport interface TableDef<T extends Record<string, ColumnDef> = Record<string, ColumnDef>> {\n /** Name of the table */\n name: string;\n /** Optional schema/catalog name */\n schema?: string;\n /** Record of column definitions keyed by column name */\n columns: T;\n /** Record of relationship definitions keyed by relation name */\n relations: Record<string, RelationDef>;\n /** Optional lifecycle hooks */\n hooks?: TableHooks;\n /** Composite primary key definition (falls back to column.primary flags) */\n primaryKey?: string[];\n /** Secondary indexes */\n indexes?: IndexDef[];\n /** Table-level check constraints */\n checks?: CheckConstraint[];\n /** Table comment/description */\n comment?: string;\n /** Dialect-specific options */\n engine?: string;\n charset?: string;\n collation?: string;\n}\n\n/**\n * Creates a table definition with columns and relationships\n * @typeParam T - Type of the columns record\n * @param name - Name of the table\n * @param columns - Record of column definitions\n * @param relations - Record of relationship definitions (optional)\n * @returns Complete table definition with runtime-filled column metadata\n *\n * @example\n * ```typescript\n * const usersTable = defineTable('users', {\n * id: col.primaryKey(col.int()),\n * name: col.varchar(255),\n * email: col.varchar(255)\n * });\n * ```\n */\nexport const defineTable = <T extends Record<string, ColumnDef>>(\n name: string,\n columns: T,\n relations: Record<string, RelationDef> = {},\n hooks?: TableHooks,\n options: TableOptions = {}\n): TableDef<T> => {\n // Runtime mutability to assign names to column definitions for convenience\n const colsWithNames = Object.entries(columns).reduce((acc, [key, def]) => {\n (acc as any)[key] = { ...def, name: key, table: name };\n return acc;\n }, {} as T);\n\n return {\n name,\n schema: options.schema,\n columns: colsWithNames,\n relations,\n hooks,\n primaryKey: options.primaryKey,\n indexes: options.indexes,\n checks: options.checks,\n comment: options.comment,\n engine: options.engine,\n charset: options.charset,\n collation: options.collation\n };\n};\n","/**\n * Supported column data types for database schema definitions\n */\nexport type ColumnType =\n | 'INT'\n | 'INTEGER'\n | 'BIGINT'\n | 'VARCHAR'\n | 'TEXT'\n | 'JSON'\n | 'ENUM'\n | 'DECIMAL'\n | 'FLOAT'\n | 'DOUBLE'\n | 'UUID'\n | 'BINARY'\n | 'VARBINARY'\n | 'BLOB'\n | 'BYTEA'\n | 'DATE'\n | 'DATETIME'\n | 'TIMESTAMP'\n | 'TIMESTAMPTZ'\n | 'BOOLEAN'\n | 'int'\n | 'integer'\n | 'bigint'\n | 'varchar'\n | 'text'\n | 'json'\n | 'enum'\n | 'decimal'\n | 'float'\n | 'double'\n | 'uuid'\n | 'binary'\n | 'varbinary'\n | 'blob'\n | 'bytea'\n | 'date'\n | 'datetime'\n | 'timestamp'\n | 'timestamptz'\n | 'boolean';\n\nexport type ReferentialAction =\n | 'NO ACTION'\n | 'RESTRICT'\n | 'CASCADE'\n | 'SET NULL'\n | 'SET DEFAULT';\n\nexport interface RawDefaultValue {\n raw: string;\n}\n\nexport type DefaultValue = unknown | RawDefaultValue;\n\nexport interface ForeignKeyReference {\n /** Target table name */\n table: string;\n /** Target column name */\n column: string;\n /** Optional constraint name */\n name?: string;\n /** ON DELETE action */\n onDelete?: ReferentialAction;\n /** ON UPDATE action */\n onUpdate?: ReferentialAction;\n /** Whether the constraint is deferrable (Postgres) */\n deferrable?: boolean;\n}\n\n/**\n * Definition of a database column\n */\nexport interface ColumnDef<T extends ColumnType = ColumnType, TRuntime = unknown> {\n /** Column name (filled at runtime by defineTable) */\n name: string;\n /** Data type of the column */\n type: T;\n /** Optional override for the inferred TypeScript type */\n tsType?: TRuntime;\n /** Whether this column is a primary key */\n primary?: boolean;\n /** Whether this column cannot be null */\n notNull?: boolean;\n /** Whether this column must be unique (or name of the unique constraint) */\n unique?: boolean | string;\n /** Default value for the column */\n default?: DefaultValue;\n /** Whether the column auto-increments / identity */\n autoIncrement?: boolean;\n /** Identity strategy where supported */\n generated?: 'always' | 'byDefault';\n /** Inline check constraint expression */\n check?: string;\n /** Foreign key reference */\n references?: ForeignKeyReference;\n /** Column comment/description */\n comment?: string;\n /** Additional arguments for the column type (e.g., VARCHAR length) */\n args?: any[];\n /** Table name this column belongs to (filled at runtime by defineTable) */\n table?: string;\n}\n\n/**\n * Factory for creating column definitions with common data types\n */\nexport const col = {\n /**\n * Creates an integer column definition\n * @returns ColumnDef with INT type\n */\n int: (): ColumnDef<'INT'> => ({ name: '', type: 'INT' }),\n\n /**\n * Creates a big integer column definition\n */\n bigint: (): ColumnDef<'BIGINT'> => ({ name: '', type: 'BIGINT' }),\n\n /**\n * Creates a variable character column definition\n * @param length - Maximum length of the string\n * @returns ColumnDef with VARCHAR type\n */\n varchar: (length: number): ColumnDef<'VARCHAR'> => ({ name: '', type: 'VARCHAR', args: [length] }),\n\n /**\n * Creates a fixed precision decimal column definition\n */\n decimal: (precision: number, scale = 0): ColumnDef<'DECIMAL'> => ({\n name: '',\n type: 'DECIMAL',\n args: [precision, scale]\n }),\n\n /**\n * Creates a floating point column definition\n */\n float: (precision?: number): ColumnDef<'FLOAT'> => ({\n name: '',\n type: 'FLOAT',\n args: precision !== undefined ? [precision] : undefined\n }),\n\n /**\n * Creates a UUID column definition\n */\n uuid: (): ColumnDef<'UUID'> => ({ name: '', type: 'UUID' }),\n\n /**\n * Creates a binary large object column definition\n */\n blob: (): ColumnDef<'BLOB'> => ({ name: '', type: 'BLOB' }),\n\n /**\n * Creates a fixed-length binary column definition\n */\n binary: (length?: number): ColumnDef<'BINARY'> => ({\n name: '',\n type: 'BINARY',\n args: length !== undefined ? [length] : undefined\n }),\n\n /**\n * Creates a variable-length binary column definition\n */\n varbinary: (length?: number): ColumnDef<'VARBINARY'> => ({\n name: '',\n type: 'VARBINARY',\n args: length !== undefined ? [length] : undefined\n }),\n\n /**\n * Creates a Postgres bytea column definition\n */\n bytea: (): ColumnDef<'BYTEA'> => ({ name: '', type: 'BYTEA' }),\n\n /**\n * Creates a timestamp column definition\n */\n timestamp: <TRuntime = string>(): ColumnDef<'TIMESTAMP', TRuntime> => ({ name: '', type: 'TIMESTAMP' }),\n\n /**\n * Creates a timestamptz column definition\n */\n timestamptz: <TRuntime = string>(): ColumnDef<'TIMESTAMPTZ', TRuntime> => ({ name: '', type: 'TIMESTAMPTZ' }),\n\n /**\n * Creates a date column definition\n */\n date: <TRuntime = string>(): ColumnDef<'DATE', TRuntime> => ({ name: '', type: 'DATE' }),\n\n /**\n * Creates a datetime column definition\n */\n datetime: <TRuntime = string>(): ColumnDef<'DATETIME', TRuntime> => ({ name: '', type: 'DATETIME' }),\n\n /**\n * Creates a JSON column definition\n * @returns ColumnDef with JSON type\n */\n json: (): ColumnDef<'JSON'> => ({ name: '', type: 'JSON' }),\n\n /**\n * Creates a boolean column definition\n * @returns ColumnDef with BOOLEAN type\n */\n boolean: (): ColumnDef<'BOOLEAN'> => ({ name: '', type: 'BOOLEAN' }),\n\n /**\n * Creates an enum column definition\n * @param values - Enum values\n */\n enum: (values: string[]): ColumnDef<'ENUM'> => ({ name: '', type: 'ENUM', args: values }),\n\n /**\n * Marks a column definition as a primary key\n * @param def - Column definition to modify\n * @returns Modified ColumnDef with primary: true\n */\n primaryKey: <T extends ColumnType>(def: ColumnDef<T>): ColumnDef<T> =>\n ({ ...def, primary: true }),\n\n /**\n * Marks a column as NOT NULL\n */\n notNull: <T extends ColumnType>(def: ColumnDef<T>): ColumnDef<T> =>\n ({ ...def, notNull: true }),\n\n /**\n * Marks a column as UNIQUE\n */\n unique: <T extends ColumnType>(def: ColumnDef<T>, name?: string): ColumnDef<T> =>\n ({\n ...def,\n unique: name ?? true\n }),\n\n /**\n * Sets a default value for the column\n */\n default: <T extends ColumnType>(def: ColumnDef<T>, value: unknown): ColumnDef<T> =>\n ({\n ...def,\n default: value\n }),\n\n /**\n * Sets a raw SQL default value for the column\n */\n defaultRaw: <T extends ColumnType>(def: ColumnDef<T>, expression: string): ColumnDef<T> =>\n ({\n ...def,\n default: { raw: expression }\n }),\n\n /**\n * Marks a column as auto-increment / identity\n */\n autoIncrement: <T extends ColumnType>(\n def: ColumnDef<T>,\n strategy: ColumnDef['generated'] = 'byDefault'\n ): ColumnDef<T> =>\n ({\n ...def,\n autoIncrement: true,\n generated: strategy\n }),\n\n /**\n * Adds a foreign key reference\n */\n references: <T extends ColumnType>(def: ColumnDef<T>, ref: ForeignKeyReference): ColumnDef<T> =>\n ({\n ...def,\n references: ref\n }),\n\n /**\n * Adds a check constraint to the column\n */\n check: <T extends ColumnType>(def: ColumnDef<T>, expression: string): ColumnDef<T> =>\n ({\n ...def,\n check: expression\n })\n};\n","import type { TableDef } from './table.js';\r\n\r\n/**\r\n * Types of relationships supported between tables\r\n */\r\nexport const RelationKinds = {\r\n /** One-to-one relationship */\r\n HasOne: 'HAS_ONE',\r\n /** One-to-many relationship */\r\n HasMany: 'HAS_MANY',\r\n /** Many-to-one relationship */\r\n BelongsTo: 'BELONGS_TO',\r\n /** Many-to-many relationship with pivot metadata */\r\n BelongsToMany: 'BELONGS_TO_MANY'\r\n} as const;\r\n\r\n/**\r\n * Type representing the supported relationship kinds\r\n */\r\nexport type RelationType = (typeof RelationKinds)[keyof typeof RelationKinds];\r\n\r\nexport type CascadeMode = 'none' | 'all' | 'persist' | 'remove' | 'link';\r\n\r\n/**\r\n * One-to-many relationship definition\r\n */\r\nexport interface HasManyRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.HasMany;\r\n target: TTarget;\r\n foreignKey: string;\r\n localKey?: string;\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * One-to-one relationship definition\r\n */\r\nexport interface HasOneRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.HasOne;\r\n target: TTarget;\r\n foreignKey: string;\r\n localKey?: string;\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * Many-to-one relationship definition\r\n */\r\nexport interface BelongsToRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.BelongsTo;\r\n target: TTarget;\r\n foreignKey: string;\r\n localKey?: string;\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * Many-to-many relationship definition with rich pivot metadata\r\n */\r\nexport interface BelongsToManyRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.BelongsToMany;\r\n target: TTarget;\r\n pivotTable: TableDef;\r\n pivotForeignKeyToRoot: string;\r\n pivotForeignKeyToTarget: string;\r\n localKey?: string;\r\n targetKey?: string;\r\n pivotPrimaryKey?: string;\r\n defaultPivotColumns?: string[];\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * Union type representing any supported relationship definition\r\n */\r\nexport type RelationDef =\r\n | HasManyRelation\r\n | HasOneRelation\r\n | BelongsToRelation\r\n | BelongsToManyRelation;\r\n\r\n/**\r\n * Creates a one-to-many relationship definition\r\n * @param target - Target table of the relationship\r\n * @param foreignKey - Foreign key column name on the child table\r\n * @param localKey - Local key column name (optional)\r\n * @returns HasManyRelation definition\r\n *\r\n * @example\r\n * ```typescript\r\n * hasMany(usersTable, 'user_id')\r\n * ```\r\n */\r\nexport const hasMany = <TTarget extends TableDef>(\r\n target: TTarget,\r\n foreignKey: string,\r\n localKey?: string,\r\n cascade?: CascadeMode\r\n): HasManyRelation<TTarget> => ({\r\n type: RelationKinds.HasMany,\r\n target,\r\n foreignKey,\r\n localKey,\r\n cascade\r\n});\r\n\r\n/**\r\n * Creates a one-to-one relationship definition\r\n * @param target - Target table of the relationship\r\n * @param foreignKey - Foreign key column name on the child table\r\n * @param localKey - Local key column name (optional)\r\n * @returns HasOneRelation definition\r\n */\r\nexport const hasOne = <TTarget extends TableDef>(\r\n target: TTarget,\r\n foreignKey: string,\r\n localKey?: string,\r\n cascade?: CascadeMode\r\n): HasOneRelation<TTarget> => ({\r\n type: RelationKinds.HasOne,\r\n target,\r\n foreignKey,\r\n localKey,\r\n cascade\r\n});\r\n\r\n/**\r\n * Creates a many-to-one relationship definition\r\n * @param target - Target table of the relationship\r\n * @param foreignKey - Foreign key column name on the child table\r\n * @param localKey - Local key column name (optional)\r\n * @returns BelongsToRelation definition\r\n *\r\n * @example\r\n * ```typescript\r\n * belongsTo(usersTable, 'user_id')\r\n * ```\r\n */\r\nexport const belongsTo = <TTarget extends TableDef>(\r\n target: TTarget,\r\n foreignKey: string,\r\n localKey?: string,\r\n cascade?: CascadeMode\r\n): BelongsToRelation<TTarget> => ({\r\n type: RelationKinds.BelongsTo,\r\n target,\r\n foreignKey,\r\n localKey,\r\n cascade\r\n});\r\n\r\n/**\r\n * Creates a many-to-many relationship definition with pivot metadata\r\n * @param target - Target table\r\n * @param pivotTable - Intermediate pivot table definition\r\n * @param options - Pivot metadata configuration\r\n * @returns BelongsToManyRelation definition\r\n */\r\nexport const belongsToMany = <\r\n TTarget extends TableDef\r\n>(\r\n target: TTarget,\r\n pivotTable: TableDef,\r\n options: {\r\n pivotForeignKeyToRoot: string;\r\n pivotForeignKeyToTarget: string;\r\n localKey?: string;\r\n targetKey?: string;\r\n pivotPrimaryKey?: string;\r\n defaultPivotColumns?: string[];\r\n cascade?: CascadeMode;\r\n }\r\n): BelongsToManyRelation<TTarget> => ({\r\n type: RelationKinds.BelongsToMany,\r\n target,\r\n pivotTable,\r\n pivotForeignKeyToRoot: options.pivotForeignKeyToRoot,\r\n pivotForeignKeyToTarget: options.pivotForeignKeyToTarget,\r\n localKey: options.localKey,\r\n targetKey: options.targetKey,\r\n pivotPrimaryKey: options.pivotPrimaryKey,\r\n defaultPivotColumns: options.defaultPivotColumns,\r\n cascade: options.cascade\r\n});\r\n","import type { SelectQueryNode, OrderByNode } from './query.js';\nimport { SqlOperator } from '../sql/sql.js';\nimport { ColumnRef } from './types.js';\n\r\n/**\r\n * AST node representing a literal value\r\n */\r\nexport interface LiteralNode {\r\n type: 'Literal';\r\n /** The literal value (string, number, boolean, or null) */\r\n value: string | number | boolean | null;\r\n}\r\n\r\n/**\r\n * AST node representing a column reference\r\n */\r\nexport interface ColumnNode {\n type: 'Column';\n /** Table name the column belongs to */\n table: string;\n /** Column name */\n name: string;\n /** Optional alias for the column */\n alias?: string;\n /** Optional scope marker (e.g., 'outer' for correlated references) */\n scope?: 'outer' | 'default';\n}\n\r\n/**\r\n * AST node representing a function call\r\n */\r\nexport interface FunctionNode {\n type: 'Function';\n /** Function name (e.g., COUNT, SUM) */\n name: string;\n /** Optional canonical function key for dialect-aware rendering */\n fn?: string;\n /** Function arguments */\n args: OperandNode[];\n /** Optional alias for the function result */\n alias?: string;\n /** Optional ORDER BY clause used by aggregations like GROUP_CONCAT */\n orderBy?: OrderByNode[];\n /** Optional separator argument used by GROUP_CONCAT-like functions */\n separator?: OperandNode;\n /** Optional DISTINCT modifier */\n distinct?: boolean;\n}\n\r\n/**\r\n * AST node representing a JSON path expression\r\n */\r\nexport interface JsonPathNode {\r\n type: 'JsonPath';\r\n /** Source column */\r\n column: ColumnNode;\r\n /** JSON path expression */\r\n path: string;\r\n /** Optional alias for the result */\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * AST node representing a scalar subquery\r\n */\r\nexport interface ScalarSubqueryNode {\r\n type: 'ScalarSubquery';\r\n /** Subquery to execute */\r\n query: SelectQueryNode;\r\n /** Optional alias for the subquery result */\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * AST node representing a CASE expression\r\n */\r\nexport interface CaseExpressionNode {\r\n type: 'CaseExpression';\r\n /** WHEN-THEN conditions */\r\n conditions: { when: ExpressionNode; then: OperandNode }[];\r\n /** Optional ELSE clause */\r\n else?: OperandNode;\r\n /** Optional alias for the result */\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * AST node representing a window function\r\n */\r\nexport interface WindowFunctionNode {\r\n type: 'WindowFunction';\r\n /** Window function name (e.g., ROW_NUMBER, RANK) */\r\n name: string;\r\n /** Function arguments */\r\n args: (ColumnNode | LiteralNode | JsonPathNode)[];\r\n /** Optional PARTITION BY clause */\r\n partitionBy?: ColumnNode[];\r\n /** Optional ORDER BY clause */\r\n orderBy?: OrderByNode[];\r\n /** Optional alias for the result */\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * Union type representing any operand that can be used in expressions\r\n */\r\nexport type OperandNode =\r\n | ColumnNode\r\n | LiteralNode\r\n | FunctionNode\r\n | JsonPathNode\r\n | ScalarSubqueryNode\r\n | CaseExpressionNode\r\n | WindowFunctionNode;\r\n\r\nconst operandTypes = new Set<OperandNode['type']>([\r\n 'Column',\r\n 'Literal',\r\n 'Function',\r\n 'JsonPath',\r\n 'ScalarSubquery',\r\n 'CaseExpression',\r\n 'WindowFunction'\r\n]);\r\n\r\nexport const isOperandNode = (node: any): node is OperandNode => node && operandTypes.has(node.type);\r\n\r\nexport const isFunctionNode = (node: any): node is FunctionNode => node?.type === 'Function';\r\nexport const isCaseExpressionNode = (node: any): node is CaseExpressionNode => node?.type === 'CaseExpression';\r\nexport const isWindowFunctionNode = (node: any): node is WindowFunctionNode => node?.type === 'WindowFunction';\r\nexport const isExpressionSelectionNode = (\n node: ColumnRef | FunctionNode | CaseExpressionNode | WindowFunctionNode\n): node is FunctionNode | CaseExpressionNode | WindowFunctionNode =>\n isFunctionNode(node) || isCaseExpressionNode(node) || isWindowFunctionNode(node);\n\r\n/**\r\n * AST node representing a binary expression (e.g., column = value)\r\n */\r\nexport interface BinaryExpressionNode {\r\n type: 'BinaryExpression';\r\n /** Left operand */\r\n left: OperandNode;\r\n /** Comparison operator */\r\n operator: SqlOperator;\r\n /** Right operand */\r\n right: OperandNode;\r\n /** Optional escape character for LIKE expressions */\r\n escape?: LiteralNode;\r\n}\r\n\r\n/**\r\n * AST node representing a logical expression (AND/OR)\r\n */\r\nexport interface LogicalExpressionNode {\r\n type: 'LogicalExpression';\r\n /** Logical operator (AND or OR) */\r\n operator: 'AND' | 'OR';\r\n /** Operands to combine */\r\n operands: ExpressionNode[];\r\n}\r\n\r\n/**\r\n * AST node representing a null check expression\r\n */\r\nexport interface NullExpressionNode {\r\n type: 'NullExpression';\r\n /** Operand to check for null */\r\n left: OperandNode;\r\n /** Null check operator */\r\n operator: 'IS NULL' | 'IS NOT NULL';\r\n}\r\n\r\n/**\r\n * AST node representing an IN/NOT IN expression\r\n */\r\nexport interface InExpressionNode {\r\n type: 'InExpression';\r\n /** Left operand to check */\r\n left: OperandNode;\r\n /** IN/NOT IN operator */\r\n operator: 'IN' | 'NOT IN';\r\n /** Values to check against */\r\n right: OperandNode[];\r\n}\r\n\r\n/**\r\n * AST node representing an EXISTS/NOT EXISTS expression\r\n */\r\nexport interface ExistsExpressionNode {\r\n type: 'ExistsExpression';\r\n /** EXISTS/NOT EXISTS operator */\r\n operator: SqlOperator;\r\n /** Subquery to check */\r\n subquery: SelectQueryNode;\r\n}\r\n\r\n/**\r\n * AST node representing a BETWEEN/NOT BETWEEN expression\r\n */\r\nexport interface BetweenExpressionNode {\r\n type: 'BetweenExpression';\r\n /** Operand to check */\r\n left: OperandNode;\r\n /** BETWEEN/NOT BETWEEN operator */\r\n operator: 'BETWEEN' | 'NOT BETWEEN';\r\n /** Lower bound */\r\n lower: OperandNode;\r\n /** Upper bound */\r\n upper: OperandNode;\r\n}\r\n\r\n/**\r\n * Union type representing any supported expression node\r\n */\r\nexport type ExpressionNode =\r\n | BinaryExpressionNode\r\n | LogicalExpressionNode\r\n | NullExpressionNode\r\n | InExpressionNode\r\n | ExistsExpressionNode\r\n | BetweenExpressionNode;\r\n","import { SelectQueryNode } from './query.js';\r\nimport { SqlOperator } from '../sql/sql.js';\r\nimport { ColumnRef } from './types.js';\r\nimport {\r\n ColumnNode,\r\n FunctionNode,\r\n LiteralNode,\r\n JsonPathNode,\r\n OperandNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode,\r\n BinaryExpressionNode,\r\n ExpressionNode,\r\n LogicalExpressionNode,\r\n NullExpressionNode,\r\n InExpressionNode,\r\n ExistsExpressionNode,\r\n BetweenExpressionNode,\r\n isOperandNode\r\n} from './expression-nodes.js';\r\n\r\nexport type LiteralValue = LiteralNode['value'];\r\nexport type ValueOperandInput = OperandNode | LiteralValue;\r\n\r\n/**\r\n * Converts a primitive or existing operand into an operand node\r\n * @param value - Value or operand to normalize\r\n * @returns OperandNode representing the value\r\n */\r\nexport const valueToOperand = (value: ValueOperandInput): OperandNode => {\r\n if (isOperandNode(value)) {\r\n return value;\r\n }\r\n\r\n return {\r\n type: 'Literal',\r\n value\r\n } as LiteralNode;\r\n};\r\n\r\nconst toNode = (col: ColumnRef | OperandNode): OperandNode => {\r\n if (isOperandNode(col)) return col as OperandNode;\r\n const def = col as ColumnRef;\r\n return { type: 'Column', table: def.table || 'unknown', name: def.name };\r\n};\r\n\r\nconst toLiteralNode = (value: string | number | boolean | null): LiteralNode => ({\r\n type: 'Literal',\r\n value\r\n});\r\n\r\nconst isLiteralValue = (value: unknown): value is LiteralValue =>\r\n value === null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\r\n\r\nexport const isValueOperandInput = (value: unknown): value is ValueOperandInput =>\r\n isOperandNode(value) || isLiteralValue(value);\r\n\r\nconst toOperand = (val: OperandNode | ColumnRef | LiteralValue): OperandNode => {\r\n if (isLiteralValue(val)) {\r\n return valueToOperand(val);\r\n }\r\n\r\n return toNode(val);\r\n};\r\n\r\nexport const columnOperand = (col: ColumnRef | ColumnNode): ColumnNode => toNode(col) as ColumnNode;\n/**\n * Marks a column reference as an outer-scope reference for correlated subqueries.\n * Primarily semantic; SQL rendering still uses the provided table/alias name.\n */\nexport const outerRef = (col: ColumnRef | ColumnNode): ColumnNode => ({\n ...columnOperand(col),\n scope: 'outer'\n});\n\n/**\n * Creates an outer-scoped column reference using a specific table or alias name.\n */\nexport const correlateBy = (table: string, column: string): ColumnNode => outerRef({ name: column, table });\n\r\nconst createBinaryExpression = (\r\n operator: SqlOperator,\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number | boolean | null,\r\n escape?: string\r\n): BinaryExpressionNode => {\r\n const node: BinaryExpressionNode = {\r\n type: 'BinaryExpression',\r\n left: toNode(left),\r\n operator,\r\n right: toOperand(right)\r\n };\r\n\r\n if (escape !== undefined) {\r\n node.escape = toLiteralNode(escape);\r\n }\r\n\r\n return node;\r\n};\r\n\r\n/**\r\n * Creates an equality expression (left = right)\r\n * @param left - Left operand\r\n * @param right - Right operand\r\n * @returns Binary expression node with equality operator\r\n */\r\nexport const eq = (left: OperandNode | ColumnRef, right: OperandNode | ColumnRef | string | number | boolean): BinaryExpressionNode =>\r\n createBinaryExpression('=', left, right);\r\n\r\n/**\r\n * Creates a not equal expression (left != right)\r\n */\r\nexport const neq = (\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number | boolean\r\n): BinaryExpressionNode => createBinaryExpression('!=', left, right);\r\n\r\n/**\r\n * Creates a greater-than expression (left > right)\r\n * @param left - Left operand\r\n * @param right - Right operand\r\n * @returns Binary expression node with greater-than operator\r\n */\r\nexport const gt = (left: OperandNode | ColumnRef, right: OperandNode | ColumnRef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('>', left, right);\r\n\r\n/**\r\n * Creates a greater than or equal expression (left >= right)\r\n */\r\nexport const gte = (left: OperandNode | ColumnRef, right: OperandNode | ColumnRef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('>=', left, right);\r\n\r\n/**\r\n * Creates a less-than expression (left < right)\r\n * @param left - Left operand\r\n * @param right - Right operand\r\n * @returns Binary expression node with less-than operator\r\n */\r\nexport const lt = (left: OperandNode | ColumnRef, right: OperandNode | ColumnRef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('<', left, right);\r\n\r\n/**\r\n * Creates a less than or equal expression (left <= right)\r\n */\r\nexport const lte = (left: OperandNode | ColumnRef, right: OperandNode | ColumnRef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('<=', left, right);\r\n\r\n/**\r\n * Creates a LIKE pattern matching expression\r\n * @param left - Left operand\r\n * @param pattern - Pattern to match\r\n * @param escape - Optional escape character\r\n * @returns Binary expression node with LIKE operator\r\n */\r\nexport const like = (left: OperandNode | ColumnRef, pattern: string, escape?: string): BinaryExpressionNode =>\r\n createBinaryExpression('LIKE', left, pattern, escape);\r\n\r\n/**\r\n * Creates a NOT LIKE pattern matching expression\r\n * @param left - Left operand\r\n * @param pattern - Pattern to match\r\n * @param escape - Optional escape character\r\n * @returns Binary expression node with NOT LIKE operator\r\n */\r\nexport const notLike = (left: OperandNode | ColumnRef, pattern: string, escape?: string): BinaryExpressionNode =>\r\n createBinaryExpression('NOT LIKE', left, pattern, escape);\r\n\r\n/**\r\n * Creates a logical AND expression\r\n * @param operands - Expressions to combine with AND\r\n * @returns Logical expression node with AND operator\r\n */\r\nexport const and = (...operands: ExpressionNode[]): LogicalExpressionNode => ({\r\n type: 'LogicalExpression',\r\n operator: 'AND',\r\n operands\r\n});\r\n\r\n/**\r\n * Creates a logical OR expression\r\n * @param operands - Expressions to combine with OR\r\n * @returns Logical expression node with OR operator\r\n */\r\nexport const or = (...operands: ExpressionNode[]): LogicalExpressionNode => ({\r\n type: 'LogicalExpression',\r\n operator: 'OR',\r\n operands\r\n});\r\n\r\n/**\r\n * Creates an IS NULL expression\r\n * @param left - Operand to check for null\r\n * @returns Null expression node with IS NULL operator\r\n */\r\nexport const isNull = (left: OperandNode | ColumnRef): NullExpressionNode => ({\r\n type: 'NullExpression',\r\n left: toNode(left),\r\n operator: 'IS NULL'\r\n});\r\n\r\n/**\r\n * Creates an IS NOT NULL expression\r\n * @param left - Operand to check for non-null\r\n * @returns Null expression node with IS NOT NULL operator\r\n */\r\nexport const isNotNull = (left: OperandNode | ColumnRef): NullExpressionNode => ({\r\n type: 'NullExpression',\r\n left: toNode(left),\r\n operator: 'IS NOT NULL'\r\n});\r\n\r\nconst createInExpression = (\r\n operator: 'IN' | 'NOT IN',\r\n left: OperandNode | ColumnRef,\r\n values: (string | number | LiteralNode)[]\r\n): InExpressionNode => ({\r\n type: 'InExpression',\r\n left: toNode(left),\r\n operator,\r\n right: values.map(v => toOperand(v))\r\n});\r\n\r\n/**\r\n * Creates an IN expression (value IN list)\r\n * @param left - Operand to check\r\n * @param values - Values to check against\r\n * @returns IN expression node\r\n */\r\nexport const inList = (left: OperandNode | ColumnRef, values: (string | number | LiteralNode)[]): InExpressionNode =>\r\n createInExpression('IN', left, values);\r\n\r\n/**\r\n * Creates a NOT IN expression (value NOT IN list)\r\n * @param left - Operand to check\r\n * @param values - Values to check against\r\n * @returns NOT IN expression node\r\n */\r\nexport const notInList = (left: OperandNode | ColumnRef, values: (string | number | LiteralNode)[]): InExpressionNode =>\r\n createInExpression('NOT IN', left, values);\r\n\r\nconst createBetweenExpression = (\r\n operator: 'BETWEEN' | 'NOT BETWEEN',\r\n left: OperandNode | ColumnRef,\r\n lower: OperandNode | ColumnRef | string | number,\r\n upper: OperandNode | ColumnRef | string | number\r\n): BetweenExpressionNode => ({\r\n type: 'BetweenExpression',\r\n left: toNode(left),\r\n operator,\r\n lower: toOperand(lower),\r\n upper: toOperand(upper)\r\n});\r\n\r\n/**\r\n * Creates a BETWEEN expression (value BETWEEN lower AND upper)\r\n * @param left - Operand to check\r\n * @param lower - Lower bound\r\n * @param upper - Upper bound\r\n * @returns BETWEEN expression node\r\n */\r\nexport const between = (\r\n left: OperandNode | ColumnRef,\r\n lower: OperandNode | ColumnRef | string | number,\r\n upper: OperandNode | ColumnRef | string | number\r\n): BetweenExpressionNode => createBetweenExpression('BETWEEN', left, lower, upper);\r\n\r\n/**\r\n * Creates a NOT BETWEEN expression (value NOT BETWEEN lower AND upper)\r\n * @param left - Operand to check\r\n * @param lower - Lower bound\r\n * @param upper - Upper bound\r\n * @returns NOT BETWEEN expression node\r\n */\r\nexport const notBetween = (\r\n left: OperandNode | ColumnRef,\r\n lower: OperandNode | ColumnRef | string | number,\r\n upper: OperandNode | ColumnRef | string | number\r\n): BetweenExpressionNode => createBetweenExpression('NOT BETWEEN', left, lower, upper);\r\n\r\n/**\r\n * Creates a JSON path expression\r\n * @param col - Source column\r\n * @param path - JSON path expression\r\n * @returns JSON path node\r\n */\r\nexport const jsonPath = (col: ColumnRef | ColumnNode, path: string): JsonPathNode => ({\r\n type: 'JsonPath',\r\n column: columnOperand(col),\r\n path\r\n});\r\n\r\n/**\r\n * Creates a CASE expression\r\n * @param conditions - Array of WHEN-THEN conditions\r\n * @param elseValue - Optional ELSE value\r\n * @returns CASE expression node\r\n */\r\nexport const caseWhen = (\r\n conditions: { when: ExpressionNode; then: OperandNode | ColumnRef | string | number | boolean | null }[],\r\n elseValue?: OperandNode | ColumnRef | string | number | boolean | null\r\n): CaseExpressionNode => ({\r\n type: 'CaseExpression',\r\n conditions: conditions.map(c => ({\r\n when: c.when,\r\n then: toOperand(c.then)\r\n })),\r\n else: elseValue !== undefined ? toOperand(elseValue) : undefined\r\n});\r\n\r\n/**\r\n * Creates an EXISTS expression\r\n * @param subquery - Subquery to check for existence\r\n * @returns EXISTS expression node\r\n */\r\nexport const exists = (subquery: SelectQueryNode): ExistsExpressionNode => ({\r\n type: 'ExistsExpression',\r\n operator: 'EXISTS',\r\n subquery\r\n});\r\n\r\n/**\r\n * Creates a NOT EXISTS expression\r\n * @param subquery - Subquery to check for non-existence\r\n * @returns NOT EXISTS expression node\r\n */\r\nexport const notExists = (subquery: SelectQueryNode): ExistsExpressionNode => ({\r\n type: 'ExistsExpression',\r\n operator: 'NOT EXISTS',\r\n subquery\r\n});\r\n","import { ColumnNode, LiteralNode, JsonPathNode, WindowFunctionNode } from './expression-nodes.js';\nimport { columnOperand } from './expression-builders.js';\nimport { OrderDirection } from '../sql/sql.js';\nimport { OrderByNode } from './query.js';\nimport { ColumnRef } from './types.js';\n\r\nconst buildWindowFunction = (\r\n name: string,\r\n args: (ColumnNode | LiteralNode | JsonPathNode)[] = [],\r\n partitionBy?: ColumnNode[],\r\n orderBy?: OrderByNode[]\r\n): WindowFunctionNode => {\r\n const node: WindowFunctionNode = {\r\n type: 'WindowFunction',\r\n name,\r\n args\r\n };\r\n\r\n if (partitionBy && partitionBy.length) {\r\n node.partitionBy = partitionBy;\r\n }\r\n\r\n if (orderBy && orderBy.length) {\r\n node.orderBy = orderBy;\r\n }\r\n\r\n return node;\r\n};\r\n\r\n/**\r\n * Creates a ROW_NUMBER window function\r\n * @returns Window function node for ROW_NUMBER\r\n */\r\nexport const rowNumber = (): WindowFunctionNode => buildWindowFunction('ROW_NUMBER');\r\n\r\n/**\r\n * Creates a RANK window function\r\n * @returns Window function node for RANK\r\n */\r\nexport const rank = (): WindowFunctionNode => buildWindowFunction('RANK');\r\n\r\n/**\r\n * Creates a DENSE_RANK window function\r\n * @returns Window function node for DENSE_RANK\r\n */\r\nexport const denseRank = (): WindowFunctionNode => buildWindowFunction('DENSE_RANK');\r\n\r\n/**\r\n * Creates an NTILE window function\r\n * @param n - Number of buckets\r\n * @returns Window function node for NTILE\r\n */\r\nexport const ntile = (n: number): WindowFunctionNode =>\n buildWindowFunction('NTILE', [{ type: 'Literal', value: n }]);\n\r\n/**\r\n * Creates a LAG window function\r\n * @param col - Column to lag\r\n * @param offset - Offset (defaults to 1)\r\n * @param defaultValue - Default value if no row exists\n * @returns Window function node for LAG\n */\nexport const lag = (col: ColumnRef | ColumnNode, offset: number = 1, defaultValue?: any): WindowFunctionNode => {\n const args: (ColumnNode | LiteralNode | JsonPathNode)[] = [\n columnOperand(col),\n { type: 'Literal', value: offset }\n ];\n if (defaultValue !== undefined) {\r\n args.push({ type: 'Literal', value: defaultValue });\r\n }\r\n return buildWindowFunction('LAG', args);\r\n};\r\n\r\n/**\r\n * Creates a LEAD window function\r\n * @param col - Column to lead\r\n * @param offset - Offset (defaults to 1)\r\n * @param defaultValue - Default value if no row exists\n * @returns Window function node for LEAD\n */\nexport const lead = (col: ColumnRef | ColumnNode, offset: number = 1, defaultValue?: any): WindowFunctionNode => {\n const args: (ColumnNode | LiteralNode | JsonPathNode)[] = [\n columnOperand(col),\n { type: 'Literal', value: offset }\n ];\n if (defaultValue !== undefined) {\r\n args.push({ type: 'Literal', value: defaultValue });\r\n }\r\n return buildWindowFunction('LEAD', args);\r\n};\r\n\r\n/**\r\n * Creates a FIRST_VALUE window function\r\n * @param col - Column to get first value from\n * @returns Window function node for FIRST_VALUE\n */\nexport const firstValue = (col: ColumnRef | ColumnNode): WindowFunctionNode =>\n buildWindowFunction('FIRST_VALUE', [columnOperand(col)]);\n\r\n/**\r\n * Creates a LAST_VALUE window function\r\n * @param col - Column to get last value from\n * @returns Window function node for LAST_VALUE\n */\nexport const lastValue = (col: ColumnRef | ColumnNode): WindowFunctionNode =>\n buildWindowFunction('LAST_VALUE', [columnOperand(col)]);\n\r\n/**\r\n * Creates a custom window function\r\n * @param name - Window function name\r\n * @param args - Function arguments\r\n * @param partitionBy - Optional PARTITION BY columns\r\n * @param orderBy - Optional ORDER BY clauses\r\n * @returns Window function node\r\n */\r\nexport const windowFunction = (\n name: string,\n args: (ColumnRef | ColumnNode | LiteralNode | JsonPathNode)[] = [],\n partitionBy?: (ColumnRef | ColumnNode)[],\n orderBy?: { column: ColumnRef | ColumnNode; direction: OrderDirection }[]\n): WindowFunctionNode => {\n const nodeArgs = args.map(arg => {\n if (typeof (arg as LiteralNode).value !== 'undefined') {\n return arg as LiteralNode;\n }\n if ('path' in arg) {\n return arg as JsonPathNode;\n }\n return columnOperand(arg as ColumnRef | ColumnNode);\n });\n\n const partitionNodes = partitionBy?.map(col => columnOperand(col)) ?? undefined;\n const orderNodes: OrderByNode[] | undefined = orderBy?.map(o => ({\n type: 'OrderBy',\n column: columnOperand(o.column),\n direction: o.direction\n }));\n\r\n return buildWindowFunction(name, nodeArgs, partitionNodes, orderNodes);\r\n};\r\n","/**\r\n * SQL keywords used in query generation\r\n */\r\nexport const SQL_KEYWORDS = {\r\n /** SELECT clause keyword */\r\n SELECT: 'SELECT',\r\n /** FROM clause keyword */\r\n FROM: 'FROM',\r\n /** WHERE clause keyword */\r\n WHERE: 'WHERE',\r\n /** JOIN keyword */\r\n JOIN: 'JOIN',\r\n /** INNER JOIN keyword */\r\n INNER_JOIN: 'INNER JOIN',\r\n /** LEFT JOIN keyword */\r\n LEFT_JOIN: 'LEFT JOIN',\r\n /** RIGHT JOIN keyword */\r\n RIGHT_JOIN: 'RIGHT JOIN',\r\n /** ORDER BY clause keyword */\r\n ORDER_BY: 'ORDER BY',\r\n /** GROUP BY clause keyword */\r\n GROUP_BY: 'GROUP BY',\r\n /** HAVING clause keyword */\r\n HAVING: 'HAVING',\r\n /** DISTINCT keyword */\r\n DISTINCT: 'DISTINCT',\r\n /** EXISTS operator */\r\n EXISTS: 'EXISTS',\r\n /** NOT EXISTS operator */\r\n NOT_EXISTS: 'NOT EXISTS'\r\n} as const;\r\n\r\n/**\r\n * SQL operators used in query conditions\r\n */\r\nexport const SQL_OPERATORS = {\n /** Equality operator */\n EQUALS: '=',\n /** Not equals operator */\n NOT_EQUALS: '!=',\n /** Greater than operator */\n GREATER_THAN: '>',\n /** Greater than or equal operator */\n GREATER_OR_EQUAL: '>=',\n /** Less than operator */\n LESS_THAN: '<',\n /** Less than or equal operator */\n LESS_OR_EQUAL: '<=',\n /** LIKE pattern matching operator */\n LIKE: 'LIKE',\n /** NOT LIKE pattern matching operator */\n NOT_LIKE: 'NOT LIKE',\n /** IN membership operator */\n IN: 'IN',\n /** NOT IN membership operator */\n NOT_IN: 'NOT IN',\n /** BETWEEN range operator */\n BETWEEN: 'BETWEEN',\n /** NOT BETWEEN range operator */\n NOT_BETWEEN: 'NOT BETWEEN',\n /** IS NULL null check operator */\n IS_NULL: 'IS NULL',\n /** IS NOT NULL null check operator */\n IS_NOT_NULL: 'IS NOT NULL',\n /** Logical AND operator */\n AND: 'AND',\n /** Logical OR operator */\n OR: 'OR',\n /** EXISTS operator */\n EXISTS: 'EXISTS',\n /** NOT EXISTS operator */\n NOT_EXISTS: 'NOT EXISTS'\n} as const;\n\r\n/**\r\n * Type representing any supported SQL operator\r\n */\r\nexport type SqlOperator = (typeof SQL_OPERATORS)[keyof typeof SQL_OPERATORS];\r\n\r\n/**\r\n * Types of SQL joins supported\r\n */\r\nexport const JOIN_KINDS = {\r\n /** INNER JOIN type */\r\n INNER: 'INNER',\r\n /** LEFT JOIN type */\r\n LEFT: 'LEFT',\r\n /** RIGHT JOIN type */\r\n RIGHT: 'RIGHT',\r\n /** CROSS JOIN type */\r\n CROSS: 'CROSS'\r\n} as const;\r\n\r\n/**\r\n * Type representing any supported join kind\r\n */\r\nexport type JoinKind = (typeof JOIN_KINDS)[keyof typeof JOIN_KINDS];\r\n\r\n/**\r\n * Ordering directions for result sorting\r\n */\r\nexport const ORDER_DIRECTIONS = {\r\n /** Ascending order */\r\n ASC: 'ASC',\r\n /** Descending order */\r\n DESC: 'DESC'\r\n} as const;\r\n\r\n/**\r\n * Type representing any supported order direction\r\n */\r\nexport type OrderDirection = (typeof ORDER_DIRECTIONS)[keyof typeof ORDER_DIRECTIONS];\r\n\r\n/**\r\n * Supported database dialects\r\n */\r\nexport const SUPPORTED_DIALECTS = {\r\n /** MySQL database dialect */\r\n MYSQL: 'mysql',\r\n /** SQLite database dialect */\r\n SQLITE: 'sqlite',\r\n /** Microsoft SQL Server dialect */\r\n MSSQL: 'mssql',\r\n /** PostgreSQL database dialect */\r\n POSTGRES: 'postgres'\r\n} as const;\r\n\r\n/**\r\n * Type representing any supported database dialect\r\n */\r\nexport type DialectName = (typeof SUPPORTED_DIALECTS)[keyof typeof SUPPORTED_DIALECTS];\r\n","import { ColumnNode, FunctionNode } from './expression-nodes.js';\nimport { columnOperand, valueToOperand, ValueOperandInput } from './expression-builders.js';\nimport { ColumnRef } from './types.js';\nimport { OrderByNode } from './query.js';\nimport { ORDER_DIRECTIONS, OrderDirection } from '../sql/sql.js';\n\nconst buildAggregate = (name: string) => (col: ColumnRef | ColumnNode): FunctionNode => ({\n type: 'Function',\n name,\n args: [columnOperand(col)]\n});\n\r\n/**\r\n * Creates a COUNT function expression\r\n * @param col - Column to count\r\n * @returns Function node with COUNT\r\n */\r\nexport const count = buildAggregate('COUNT');\r\n\r\n/**\r\n * Creates a SUM function expression\r\n * @param col - Column to sum\n * @returns Function node with SUM\n */\nexport const sum = buildAggregate('SUM');\n\r\n/**\r\n * Creates an AVG function expression\r\n * @param col - Column to average\r\n * @returns Function node with AVG\n */\nexport const avg = buildAggregate('AVG');\n\n/**\n * Creates a MIN function expression\n * @param col - Column to take the minimum of\n * @returns Function node with MIN\n */\nexport const min = buildAggregate('MIN');\n\n/**\n * Creates a MAX function expression\n * @param col - Column to take the maximum of\n * @returns Function node with MAX\n */\nexport const max = buildAggregate('MAX');\n\ntype GroupConcatOrderByInput = {\n column: ColumnRef | ColumnNode;\n direction?: OrderDirection;\n};\n\nexport type GroupConcatOptions = {\n separator?: ValueOperandInput;\n orderBy?: GroupConcatOrderByInput[];\n};\n\nconst toOrderByNode = (order: GroupConcatOrderByInput): OrderByNode => ({\n type: 'OrderBy',\n column: columnOperand(order.column),\n direction: order.direction ?? ORDER_DIRECTIONS.ASC\n});\n\n/**\n * Aggregates grouped strings into a single value.\n */\nexport const groupConcat = (\n col: ColumnRef | ColumnNode,\n options?: GroupConcatOptions\n): FunctionNode => ({\n type: 'Function',\n name: 'GROUP_CONCAT',\n args: [columnOperand(col)],\n orderBy: options?.orderBy?.map(toOrderByNode),\n separator: options?.separator !== undefined ? valueToOperand(options.separator) : undefined\n});\n","import {\r\n BinaryExpressionNode,\r\n LogicalExpressionNode,\r\n NullExpressionNode,\r\n InExpressionNode,\r\n ExistsExpressionNode,\r\n BetweenExpressionNode,\r\n ExpressionNode,\r\n OperandNode,\r\n ColumnNode,\r\n LiteralNode,\r\n FunctionNode,\r\n JsonPathNode,\r\n ScalarSubqueryNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode\r\n} from './expression-nodes.js';\r\n\r\n/**\r\n * Visitor for expression nodes\r\n */\r\nexport interface ExpressionVisitor<R> {\n visitBinaryExpression?(node: BinaryExpressionNode): R;\n visitLogicalExpression?(node: LogicalExpressionNode): R;\n visitNullExpression?(node: NullExpressionNode): R;\n visitInExpression?(node: InExpressionNode): R;\n visitExistsExpression?(node: ExistsExpressionNode): R;\n visitBetweenExpression?(node: BetweenExpressionNode): R;\n otherwise?(node: ExpressionNode): R;\n}\n\n/**\n * Visitor for operand nodes\n */\nexport interface OperandVisitor<R> {\n visitColumn?(node: ColumnNode): R;\n visitLiteral?(node: LiteralNode): R;\n visitFunction?(node: FunctionNode): R;\n visitJsonPath?(node: JsonPathNode): R;\n visitScalarSubquery?(node: ScalarSubqueryNode): R;\n visitCaseExpression?(node: CaseExpressionNode): R;\n visitWindowFunction?(node: WindowFunctionNode): R;\n otherwise?(node: OperandNode): R;\n}\n\ntype ExpressionDispatch = <R>(node: any, visitor: ExpressionVisitor<R>) => R;\ntype OperandDispatch = <R>(node: any, visitor: OperandVisitor<R>) => R;\n\nconst expressionDispatchers = new Map<string, ExpressionDispatch>();\nconst operandDispatchers = new Map<string, OperandDispatch>();\n\n/**\n * Registers a dispatcher for a custom expression node type.\n * Allows new node kinds without modifying the core switch.\n */\nexport const registerExpressionDispatcher = (type: string, dispatcher: ExpressionDispatch): void => {\n expressionDispatchers.set(type, dispatcher);\n};\n\n/**\n * Registers a dispatcher for a custom operand node type.\n * Allows new node kinds without modifying the core switch.\n */\nexport const registerOperandDispatcher = (type: string, dispatcher: OperandDispatch): void => {\n operandDispatchers.set(type, dispatcher);\n};\n\n/**\n * Clears all registered dispatchers. Primarily for tests.\n */\nexport const clearExpressionDispatchers = (): void => expressionDispatchers.clear();\nexport const clearOperandDispatchers = (): void => operandDispatchers.clear();\n\nconst unsupportedExpression = (node: ExpressionNode): never => {\n throw new Error(`Unsupported expression type \"${(node as any)?.type ?? 'unknown'}\"`);\n};\n\r\nconst unsupportedOperand = (node: OperandNode): never => {\r\n throw new Error(`Unsupported operand type \"${(node as any)?.type ?? 'unknown'}\"`);\r\n};\r\n/**\r\n * Dispatches an expression node to the visitor\r\n * @param node - Expression node to visit\n * @param visitor - Visitor implementation\n */\nexport const visitExpression = <R>(node: ExpressionNode, visitor: ExpressionVisitor<R>): R => {\n const dynamic = expressionDispatchers.get((node as any)?.type);\n if (dynamic) return dynamic(node as any, visitor);\n\n switch (node.type) {\n case 'BinaryExpression':\n if (visitor.visitBinaryExpression) return visitor.visitBinaryExpression(node);\n break;\n case 'LogicalExpression':\n if (visitor.visitLogicalExpression) return visitor.visitLogicalExpression(node);\n break;\n case 'NullExpression':\n if (visitor.visitNullExpression) return visitor.visitNullExpression(node);\n break;\n case 'InExpression':\n if (visitor.visitInExpression) return visitor.visitInExpression(node);\n break;\n case 'ExistsExpression':\n if (visitor.visitExistsExpression) return visitor.visitExistsExpression(node);\n break;\n case 'BetweenExpression':\n if (visitor.visitBetweenExpression) return visitor.visitBetweenExpression(node);\n break;\n default:\n break;\n }\n if (visitor.otherwise) return visitor.otherwise(node);\n return unsupportedExpression(node);\n};\n\r\n/**\r\n * Dispatches an operand node to the visitor\r\n * @param node - Operand node to visit\n * @param visitor - Visitor implementation\n */\nexport const visitOperand = <R>(node: OperandNode, visitor: OperandVisitor<R>): R => {\n const dynamic = operandDispatchers.get((node as any)?.type);\n if (dynamic) return dynamic(node as any, visitor);\n\n switch (node.type) {\n case 'Column':\n if (visitor.visitColumn) return visitor.visitColumn(node);\n break;\n case 'Literal':\n if (visitor.visitLiteral) return visitor.visitLiteral(node);\n break;\n case 'Function':\n if (visitor.visitFunction) return visitor.visitFunction(node);\n break;\n case 'JsonPath':\n if (visitor.visitJsonPath) return visitor.visitJsonPath(node);\n break;\n case 'ScalarSubquery':\n if (visitor.visitScalarSubquery) return visitor.visitScalarSubquery(node);\n break;\n case 'CaseExpression':\n if (visitor.visitCaseExpression) return visitor.visitCaseExpression(node);\n break;\n case 'WindowFunction':\n if (visitor.visitWindowFunction) return visitor.visitWindowFunction(node);\n break;\n default:\n break;\n }\n if (visitor.otherwise) return visitor.otherwise(node);\n return unsupportedOperand(node);\n};\n","import { ColumnDef } from '../../schema/column.js';\nimport { TableDef } from '../../schema/table.js';\nimport { ColumnRef, TableRef } from './types.js';\n\n/**\n * Adapts a schema ColumnDef to an AST-friendly ColumnRef.\n */\nexport const toColumnRef = (col: ColumnRef | ColumnDef): ColumnRef => ({\n name: col.name,\n table: col.table,\n alias: (col as ColumnRef).alias\n});\n\n/**\n * Adapts a schema TableDef to an AST-friendly TableRef.\n */\nexport const toTableRef = (table: TableRef | TableDef): TableRef => ({\n name: table.name,\n schema: table.schema,\n alias: (table as TableRef).alias\n});\n","import { ColumnNode } from './expression-nodes.js';\nimport { TableNode, FunctionTableNode, DerivedTableNode } from './query.js';\nimport { ColumnRef, TableRef } from './types.js';\n\n/**\n * Builds or normalizes a column AST node from a column definition or existing node\n * @param table - Table definition providing a default table name\n * @param column - Column definition or existing column node\n */\nexport const buildColumnNode = (table: TableRef, column: ColumnRef | ColumnNode): ColumnNode => {\n if ((column as ColumnNode).type === 'Column') {\n return column as ColumnNode;\n }\n\n const def = column as ColumnRef;\n const baseTable = def.table\n ? table.alias && def.table === table.name\n ? table.alias\n : def.table\n : table.alias || table.name;\n\n return {\n type: 'Column',\n table: baseTable,\n name: def.name\n };\n};\n\n/**\n * Builds column AST nodes for a list of column names\n * @param table - Table definition providing the table name\n * @param names - Column names\n */\nexport const buildColumnNodes = (table: TableRef, names: string[]): ColumnNode[] =>\n names.map(name => ({\n type: 'Column',\n table: table.alias || table.name,\n name\n }));\n\n/**\n * Builds a table AST node for the provided table definition\n * @param table - Table definition\n */\nexport const createTableNode = (table: TableRef): TableNode => ({\n type: 'Table',\n name: table.name\n});\n\n/**\n * Creates a FunctionTable node for expressions like `function_name(args...)` used in FROM\n */\nexport const fnTable = (name: string, args: any[] = [], alias?: string, opts?: { lateral?: boolean; withOrdinality?: boolean; columnAliases?: string[]; schema?: string }): FunctionTableNode => ({\n type: 'FunctionTable',\n name,\n args,\n alias,\n lateral: opts?.lateral,\n withOrdinality: opts?.withOrdinality,\n columnAliases: opts?.columnAliases,\n schema: opts?.schema\n});\n\n/**\n * Creates a derived table node wrapping a subquery.\n */\nexport const derivedTable = (\n query: import('./query.js').SelectQueryNode,\n alias: string,\n columnAliases?: string[]\n): DerivedTableNode => ({\n type: 'DerivedTable',\n query,\n alias,\n columnAliases\n});\n","import { FunctionStrategy, FunctionRenderer, FunctionRenderContext } from './types.js';\nimport { LiteralNode, OperandNode } from '../ast/expression.js';\n\r\nexport class StandardFunctionStrategy implements FunctionStrategy {\r\n protected renderers: Map<string, FunctionRenderer> = new Map();\r\n\r\n constructor() {\r\n this.registerStandard();\r\n }\r\n\r\n protected registerStandard() {\n // Register ANSI standard implementations\n this.add('COUNT', ({ compiledArgs }) => `COUNT(${compiledArgs.join(', ')})`);\n this.add('SUM', ({ compiledArgs }) => `SUM(${compiledArgs[0]})`);\n this.add('AVG', ({ compiledArgs }) => `AVG(${compiledArgs[0]})`);\n this.add('MIN', ({ compiledArgs }) => `MIN(${compiledArgs[0]})`);\n this.add('MAX', ({ compiledArgs }) => `MAX(${compiledArgs[0]})`);\n this.add('ABS', ({ compiledArgs }) => `ABS(${compiledArgs[0]})`);\n this.add('UPPER', ({ compiledArgs }) => `UPPER(${compiledArgs[0]})`);\n this.add('LOWER', ({ compiledArgs }) => `LOWER(${compiledArgs[0]})`);\n this.add('LENGTH', ({ compiledArgs }) => `LENGTH(${compiledArgs[0]})`);\r\n this.add('TRIM', ({ compiledArgs }) => `TRIM(${compiledArgs[0]})`);\r\n this.add('LTRIM', ({ compiledArgs }) => `LTRIM(${compiledArgs[0]})`);\r\n this.add('RTRIM', ({ compiledArgs }) => `RTRIM(${compiledArgs[0]})`);\r\n this.add('SUBSTRING', ({ compiledArgs }) => `SUBSTRING(${compiledArgs.join(', ')})`);\r\n this.add('CONCAT', ({ compiledArgs }) => `CONCAT(${compiledArgs.join(', ')})`);\r\n this.add('NOW', () => `NOW()`);\r\n this.add('CURRENT_DATE', () => `CURRENT_DATE`);\r\n this.add('CURRENT_TIME', () => `CURRENT_TIME`);\r\n this.add('EXTRACT', ({ compiledArgs }) => `EXTRACT(${compiledArgs[0]} FROM ${compiledArgs[1]})`);\r\n this.add('YEAR', ({ compiledArgs }) => `EXTRACT(YEAR FROM ${compiledArgs[0]})`);\r\n this.add('MONTH', ({ compiledArgs }) => `EXTRACT(MONTH FROM ${compiledArgs[0]})`);\r\n this.add('DAY', ({ compiledArgs }) => `EXTRACT(DAY FROM ${compiledArgs[0]})`);\r\n this.add('DATE_ADD', ({ compiledArgs }) => `(${compiledArgs[0]} + INTERVAL ${compiledArgs[1]} ${compiledArgs[2]})`);\r\n this.add('DATE_SUB', ({ compiledArgs }) => `(${compiledArgs[0]} - INTERVAL ${compiledArgs[1]} ${compiledArgs[2]})`);\r\n this.add('DATE_DIFF', ({ compiledArgs }) => `DATEDIFF(${compiledArgs[0]}, ${compiledArgs[1]})`);\r\n this.add('DATE_FORMAT', ({ compiledArgs }) => `DATE_FORMAT(${compiledArgs[0]}, ${compiledArgs[1]})`);\r\n this.add('UNIX_TIMESTAMP', () => `UNIX_TIMESTAMP()`);\r\n this.add('FROM_UNIXTIME', ({ compiledArgs }) => `FROM_UNIXTIME(${compiledArgs[0]})`);\r\n this.add('END_OF_MONTH', ({ compiledArgs }) => `LAST_DAY(${compiledArgs[0]})`);\r\n this.add('DAY_OF_WEEK', ({ compiledArgs }) => `DAYOFWEEK(${compiledArgs[0]})`);\r\n this.add('WEEK_OF_YEAR', ({ compiledArgs }) => `WEEKOFYEAR(${compiledArgs[0]})`);\n this.add('DATE_TRUNC', ({ compiledArgs }) => `DATE_TRUNC(${compiledArgs[0]}, ${compiledArgs[1]})`);\n this.add('GROUP_CONCAT', ctx => this.renderGroupConcat(ctx));\n }\r\n\r\n protected add(name: string, renderer: FunctionRenderer) {\r\n this.renderers.set(name, renderer);\r\n }\r\n\r\n getRenderer(name: string): FunctionRenderer | undefined {\n return this.renderers.get(name);\n }\n\n private renderGroupConcat(ctx: FunctionRenderContext): string {\n const arg = ctx.compiledArgs[0];\n const orderClause = this.buildOrderByExpression(ctx);\n const orderSegment = orderClause ? ` ${orderClause}` : '';\n const separatorClause = this.formatGroupConcatSeparator(ctx);\n return `GROUP_CONCAT(${arg}${orderSegment}${separatorClause})`;\n }\n\n protected buildOrderByExpression(ctx: FunctionRenderContext): string {\n const orderBy = ctx.node.orderBy;\n if (!orderBy || orderBy.length === 0) {\n return '';\n }\n const parts = orderBy.map(order => `${ctx.compileOperand(order.column)} ${order.direction}`);\n return `ORDER BY ${parts.join(', ')}`;\n }\n\n protected formatGroupConcatSeparator(ctx: FunctionRenderContext): string {\n if (!ctx.node.separator) {\n return '';\n }\n return ` SEPARATOR ${ctx.compileOperand(ctx.node.separator)}`;\n }\n\n protected getGroupConcatSeparatorOperand(ctx: FunctionRenderContext): OperandNode {\n return ctx.node.separator ?? StandardFunctionStrategy.DEFAULT_GROUP_CONCAT_SEPARATOR;\n }\n\n protected static readonly DEFAULT_GROUP_CONCAT_SEPARATOR: LiteralNode = {\n type: 'Literal',\n value: ','\n };\n}\n","import {\r\n SelectQueryNode,\r\n InsertQueryNode,\r\n UpdateQueryNode,\r\n DeleteQueryNode,\r\n SetOperationKind,\r\n CommonTableExpressionNode\r\n} from '../ast/query.js';\r\nimport {\r\n ExpressionNode,\r\n BinaryExpressionNode,\r\n LogicalExpressionNode,\r\n NullExpressionNode,\r\n InExpressionNode,\r\n ExistsExpressionNode,\r\n LiteralNode,\r\n ColumnNode,\r\n OperandNode,\r\n FunctionNode,\r\n JsonPathNode,\r\n ScalarSubqueryNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode,\r\n BetweenExpressionNode\r\n} from '../ast/expression.js';\r\nimport { DialectName } from '../sql/sql.js';\r\nimport type { FunctionStrategy } from '../functions/types.js';\r\nimport { StandardFunctionStrategy } from '../functions/standard-strategy.js';\r\n\r\n/**\r\n * Context for SQL compilation with parameter management\r\n */\r\nexport interface CompilerContext {\r\n /** Array of parameters */\r\n params: unknown[];\r\n /** Function to add a parameter and get its placeholder */\r\n addParameter(value: unknown): string;\r\n}\r\n\r\n/**\r\n * Result of SQL compilation\r\n */\r\nexport interface CompiledQuery {\r\n /** Generated SQL string */\r\n sql: string;\r\n /** Parameters for the query */\r\n params: unknown[];\r\n}\r\n\r\nexport interface SelectCompiler {\r\n compileSelect(ast: SelectQueryNode): CompiledQuery;\r\n}\r\n\r\nexport interface InsertCompiler {\r\n compileInsert(ast: InsertQueryNode): CompiledQuery;\r\n}\r\n\r\nexport interface UpdateCompiler {\r\n compileUpdate(ast: UpdateQueryNode): CompiledQuery;\r\n}\r\n\r\nexport interface DeleteCompiler {\r\n compileDelete(ast: DeleteQueryNode): CompiledQuery;\r\n}\r\n\r\n/**\r\n * Abstract base class for SQL dialect implementations\r\n */\r\nexport abstract class Dialect\r\n implements SelectCompiler, InsertCompiler, UpdateCompiler, DeleteCompiler {\r\n /** Dialect identifier used for function rendering and formatting */\r\n protected abstract readonly dialect: DialectName;\r\n\r\n /**\r\n * Compiles a SELECT query AST to SQL\r\n * @param ast - Query AST to compile\r\n * @returns Compiled query with SQL and parameters\r\n */\r\n compileSelect(ast: SelectQueryNode): CompiledQuery {\r\n const ctx = this.createCompilerContext();\r\n const normalized = this.normalizeSelectAst(ast);\r\n const rawSql = this.compileSelectAst(normalized, ctx).trim();\r\n const sql = rawSql.endsWith(';') ? rawSql : `${rawSql};`;\r\n return {\r\n sql,\r\n params: [...ctx.params]\r\n };\r\n }\r\n\r\n compileInsert(ast: InsertQueryNode): CompiledQuery {\r\n const ctx = this.createCompilerContext();\r\n const rawSql = this.compileInsertAst(ast, ctx).trim();\r\n const sql = rawSql.endsWith(';') ? rawSql : `${rawSql};`;\r\n return {\r\n sql,\r\n params: [...ctx.params]\r\n };\r\n }\r\n\r\n compileUpdate(ast: UpdateQueryNode): CompiledQuery {\r\n const ctx = this.createCompilerContext();\r\n const rawSql = this.compileUpdateAst(ast, ctx).trim();\r\n const sql = rawSql.endsWith(';') ? rawSql : `${rawSql};`;\r\n return {\r\n sql,\r\n params: [...ctx.params]\r\n };\r\n }\r\n\r\n compileDelete(ast: DeleteQueryNode): CompiledQuery {\r\n const ctx = this.createCompilerContext();\r\n const rawSql = this.compileDeleteAst(ast, ctx).trim();\r\n const sql = rawSql.endsWith(';') ? rawSql : `${rawSql};`;\r\n return {\r\n sql,\r\n params: [...ctx.params]\r\n };\r\n }\r\n\r\n supportsReturning(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Compiles SELECT query AST to SQL (to be implemented by concrete dialects)\r\n * @param ast - Query AST\r\n * @param ctx - Compiler context\r\n * @returns SQL string\r\n */\r\n protected abstract compileSelectAst(ast: SelectQueryNode, ctx: CompilerContext): string;\r\n\r\n protected abstract compileInsertAst(ast: InsertQueryNode, ctx: CompilerContext): string;\r\n protected abstract compileUpdateAst(ast: UpdateQueryNode, ctx: CompilerContext): string;\r\n protected abstract compileDeleteAst(ast: DeleteQueryNode, ctx: CompilerContext): string;\r\n\r\n /**\r\n * Quotes an SQL identifier (to be implemented by concrete dialects)\r\n * @param id - Identifier to quote\r\n * @returns Quoted identifier\r\n */\r\n abstract quoteIdentifier(id: string): string;\r\n\r\n /**\r\n * Compiles a WHERE clause\r\n * @param where - WHERE expression\r\n * @param ctx - Compiler context\r\n * @returns SQL WHERE clause or empty string\r\n */\r\n protected compileWhere(where: ExpressionNode | undefined, ctx: CompilerContext): string {\r\n if (!where) return '';\r\n return ` WHERE ${this.compileExpression(where, ctx)}`;\r\n }\r\n\r\n protected compileReturning(\r\n returning: ColumnNode[] | undefined,\r\n ctx: CompilerContext\r\n ): string {\r\n if (!returning || returning.length === 0) return '';\r\n throw new Error('RETURNING is not supported by this dialect.');\r\n }\r\n\r\n /**\r\n * Generates subquery for EXISTS expressions\r\n * Rule: Always forces SELECT 1, ignoring column list\r\n * Maintains FROM, JOINs, WHERE, GROUP BY, ORDER BY, LIMIT/OFFSET\r\n * Does not add ';' at the end\r\n * @param ast - Query AST\r\n * @param ctx - Compiler context\r\n * @returns SQL for EXISTS subquery\r\n */\r\n protected compileSelectForExists(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n const normalized = this.normalizeSelectAst(ast);\r\n const full = this.compileSelectAst(normalized, ctx).trim().replace(/;$/, '');\r\n\r\n // When the subquery is a set operation, wrap it as a derived table to keep valid syntax.\r\n if (normalized.setOps && normalized.setOps.length > 0) {\r\n return `SELECT 1 FROM (${full}) AS _exists`;\r\n }\r\n\r\n const upper = full.toUpperCase();\r\n const fromIndex = upper.indexOf(' FROM ');\r\n if (fromIndex === -1) {\r\n return full;\r\n }\r\n\r\n const tail = full.slice(fromIndex);\r\n return `SELECT 1${tail}`;\r\n }\r\n\r\n /**\r\n * Creates a new compiler context\r\n * @returns Compiler context with parameter management\r\n */\r\n protected createCompilerContext(): CompilerContext {\r\n const params: unknown[] = [];\r\n let counter = 0;\r\n return {\r\n params,\r\n addParameter: (value: unknown) => {\r\n counter += 1;\r\n params.push(value);\r\n return this.formatPlaceholder(counter);\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Formats a parameter placeholder\r\n * @param index - Parameter index\r\n * @returns Formatted placeholder string\r\n */\r\n protected formatPlaceholder(index: number): string {\r\n return '?';\r\n }\r\n\r\n /**\r\n * Whether the current dialect supports a given set operation.\r\n * Override in concrete dialects to restrict support.\r\n */\r\n protected supportsSetOperation(kind: SetOperationKind): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * Validates set-operation semantics:\r\n * - Ensures the dialect supports requested operators.\r\n * - Enforces that only the outermost compound query may have ORDER/LIMIT/OFFSET.\r\n * @param ast - Query to validate\r\n * @param isOutermost - Whether this node is the outermost compound query\r\n */\r\n protected validateSetOperations(ast: SelectQueryNode, isOutermost = true): void {\r\n const hasSetOps = !!(ast.setOps && ast.setOps.length);\r\n if (!isOutermost && (ast.orderBy || ast.limit !== undefined || ast.offset !== undefined)) {\r\n throw new Error('ORDER BY / LIMIT / OFFSET are only allowed on the outermost compound query.');\r\n }\r\n\r\n if (hasSetOps) {\r\n for (const op of ast.setOps!) {\r\n if (!this.supportsSetOperation(op.operator)) {\r\n throw new Error(`Set operation ${op.operator} is not supported by this dialect.`);\r\n }\r\n this.validateSetOperations(op.query, false);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Hoists CTEs from set-operation operands to the outermost query so WITH appears once.\r\n * @param ast - Query AST\r\n * @returns Normalized AST without inner CTEs and a list of hoisted CTEs\r\n */\r\n private hoistCtes(ast: SelectQueryNode): { normalized: SelectQueryNode; hoistedCtes: CommonTableExpressionNode[] } {\r\n let hoisted: CommonTableExpressionNode[] = [];\r\n\r\n const normalizedSetOps = ast.setOps?.map(op => {\r\n const { normalized: child, hoistedCtes: childHoisted } = this.hoistCtes(op.query);\r\n const childCtes = child.ctes ?? [];\r\n if (childCtes.length) {\r\n hoisted = hoisted.concat(childCtes);\r\n }\r\n hoisted = hoisted.concat(childHoisted);\r\n const queryWithoutCtes = childCtes.length ? { ...child, ctes: undefined } : child;\r\n return { ...op, query: queryWithoutCtes };\r\n });\r\n\r\n const normalized: SelectQueryNode = normalizedSetOps ? { ...ast, setOps: normalizedSetOps } : ast;\r\n return { normalized, hoistedCtes: hoisted };\r\n }\r\n\r\n /**\r\n * Normalizes a SELECT AST before compilation (validation + CTE hoisting).\r\n * @param ast - Query AST\r\n * @returns Normalized query AST\r\n */\r\n protected normalizeSelectAst(ast: SelectQueryNode): SelectQueryNode {\r\n this.validateSetOperations(ast, true);\r\n const { normalized, hoistedCtes } = this.hoistCtes(ast);\r\n const combinedCtes = [...(normalized.ctes ?? []), ...hoistedCtes];\r\n return combinedCtes.length ? { ...normalized, ctes: combinedCtes } : normalized;\r\n }\r\n\r\n private readonly expressionCompilers: Map<string, (node: ExpressionNode, ctx: CompilerContext) => string>;\r\n private readonly operandCompilers: Map<string, (node: OperandNode, ctx: CompilerContext) => string>;\r\n protected readonly functionStrategy: FunctionStrategy;\r\n\r\n protected constructor(functionStrategy?: FunctionStrategy) {\r\n this.expressionCompilers = new Map();\r\n this.operandCompilers = new Map();\r\n this.functionStrategy = functionStrategy || new StandardFunctionStrategy();\r\n this.registerDefaultOperandCompilers();\r\n this.registerDefaultExpressionCompilers();\r\n }\r\n\r\n /**\r\n * Creates a new Dialect instance (for testing purposes)\r\n * @param functionStrategy - Optional function strategy\r\n * @returns New Dialect instance\r\n */\r\n static create(functionStrategy?: FunctionStrategy): Dialect {\r\n // Create a minimal concrete implementation for testing\r\n class TestDialect extends Dialect {\r\n protected readonly dialect: DialectName = 'sqlite';\r\n quoteIdentifier(id: string): string {\r\n return `\"${id}\"`;\r\n }\r\n protected compileSelectAst(): never {\r\n throw new Error('Not implemented');\r\n }\r\n protected compileInsertAst(): never {\r\n throw new Error('Not implemented');\r\n }\r\n protected compileUpdateAst(): never {\r\n throw new Error('Not implemented');\r\n }\r\n protected compileDeleteAst(): never {\r\n throw new Error('Not implemented');\r\n }\r\n }\r\n return new TestDialect(functionStrategy);\r\n }\r\n\r\n /**\r\n * Registers an expression compiler for a specific node type\r\n * @param type - Expression node type\r\n * @param compiler - Compiler function\r\n */\r\n protected registerExpressionCompiler<T extends ExpressionNode>(type: T['type'], compiler: (node: T, ctx: CompilerContext) => string): void {\r\n this.expressionCompilers.set(type, compiler as (node: ExpressionNode, ctx: CompilerContext) => string);\r\n }\r\n\r\n /**\r\n * Registers an operand compiler for a specific node type\r\n * @param type - Operand node type\r\n * @param compiler - Compiler function\r\n */\r\n protected registerOperandCompiler<T extends OperandNode>(type: T['type'], compiler: (node: T, ctx: CompilerContext) => string): void {\r\n this.operandCompilers.set(type, compiler as (node: OperandNode, ctx: CompilerContext) => string);\r\n }\r\n\r\n /**\r\n * Compiles an expression node\r\n * @param node - Expression node to compile\r\n * @param ctx - Compiler context\r\n * @returns Compiled SQL expression\r\n */\r\n protected compileExpression(node: ExpressionNode, ctx: CompilerContext): string {\r\n const compiler = this.expressionCompilers.get(node.type);\r\n if (!compiler) {\r\n throw new Error(`Unsupported expression node type \"${node.type}\" for ${this.constructor.name}`);\r\n }\r\n return compiler(node, ctx);\r\n }\r\n\r\n /**\r\n * Compiles an operand node\r\n * @param node - Operand node to compile\r\n * @param ctx - Compiler context\r\n * @returns Compiled SQL operand\r\n */\r\n protected compileOperand(node: OperandNode, ctx: CompilerContext): string {\r\n const compiler = this.operandCompilers.get(node.type);\r\n if (!compiler) {\r\n throw new Error(`Unsupported operand node type \"${node.type}\" for ${this.constructor.name}`);\r\n }\r\n return compiler(node, ctx);\r\n }\r\n\r\n private registerDefaultExpressionCompilers(): void {\r\n this.registerExpressionCompiler('BinaryExpression', (binary: BinaryExpressionNode, ctx) => {\r\n const left = this.compileOperand(binary.left, ctx);\r\n const right = this.compileOperand(binary.right, ctx);\r\n const base = `${left} ${binary.operator} ${right}`;\r\n if (binary.escape) {\r\n const escapeOperand = this.compileOperand(binary.escape, ctx);\r\n return `${base} ESCAPE ${escapeOperand}`;\r\n }\r\n return base;\r\n });\r\n\r\n this.registerExpressionCompiler('LogicalExpression', (logical: LogicalExpressionNode, ctx) => {\r\n if (logical.operands.length === 0) return '';\r\n const parts = logical.operands.map(op => {\r\n const compiled = this.compileExpression(op, ctx);\r\n return op.type === 'LogicalExpression' ? `(${compiled})` : compiled;\r\n });\r\n return parts.join(` ${logical.operator} `);\r\n });\r\n\r\n this.registerExpressionCompiler('NullExpression', (nullExpr: NullExpressionNode, ctx) => {\r\n const left = this.compileOperand(nullExpr.left, ctx);\r\n return `${left} ${nullExpr.operator}`;\r\n });\r\n\r\n this.registerExpressionCompiler('InExpression', (inExpr: InExpressionNode, ctx) => {\r\n const left = this.compileOperand(inExpr.left, ctx);\r\n const values = inExpr.right.map(v => this.compileOperand(v, ctx)).join(', ');\r\n return `${left} ${inExpr.operator} (${values})`;\r\n });\r\n\r\n this.registerExpressionCompiler('ExistsExpression', (existsExpr: ExistsExpressionNode, ctx) => {\r\n const subquerySql = this.compileSelectForExists(existsExpr.subquery, ctx);\r\n return `${existsExpr.operator} (${subquerySql})`;\r\n });\r\n\r\n this.registerExpressionCompiler('BetweenExpression', (betweenExpr: BetweenExpressionNode, ctx) => {\r\n const left = this.compileOperand(betweenExpr.left, ctx);\r\n const lower = this.compileOperand(betweenExpr.lower, ctx);\r\n const upper = this.compileOperand(betweenExpr.upper, ctx);\r\n return `${left} ${betweenExpr.operator} ${lower} AND ${upper}`;\r\n });\r\n }\r\n\r\n private registerDefaultOperandCompilers(): void {\r\n this.registerOperandCompiler('Literal', (literal: LiteralNode, ctx) => ctx.addParameter(literal.value));\r\n\r\n this.registerOperandCompiler('Column', (column: ColumnNode, _ctx) => {\r\n return `${this.quoteIdentifier(column.table)}.${this.quoteIdentifier(column.name)}`;\r\n });\r\n this.registerOperandCompiler('Function', (fnNode: FunctionNode, ctx) =>\r\n this.compileFunctionOperand(fnNode, ctx)\r\n );\r\n this.registerOperandCompiler('JsonPath', (path: JsonPathNode, _ctx) => this.compileJsonPath(path));\r\n\r\n this.registerOperandCompiler('ScalarSubquery', (node: ScalarSubqueryNode, ctx) => {\r\n const sql = this.compileSelectAst(node.query, ctx).trim().replace(/;$/, '');\r\n return `(${sql})`;\r\n });\r\n\r\n this.registerOperandCompiler('CaseExpression', (node: CaseExpressionNode, ctx) => {\r\n const parts = ['CASE'];\r\n for (const { when, then } of node.conditions) {\r\n parts.push(`WHEN ${this.compileExpression(when, ctx)} THEN ${this.compileOperand(then, ctx)}`);\r\n }\r\n if (node.else) {\r\n parts.push(`ELSE ${this.compileOperand(node.else, ctx)}`);\r\n }\r\n parts.push('END');\r\n return parts.join(' ');\r\n });\r\n\r\n this.registerOperandCompiler('WindowFunction', (node: WindowFunctionNode, ctx) => {\r\n let result = `${node.name}(`;\r\n if (node.args.length > 0) {\r\n result += node.args.map(arg => this.compileOperand(arg, ctx)).join(', ');\r\n }\r\n result += ') OVER (';\r\n\r\n const parts: string[] = [];\r\n\r\n if (node.partitionBy && node.partitionBy.length > 0) {\r\n const partitionClause = 'PARTITION BY ' + node.partitionBy.map(col =>\r\n `${this.quoteIdentifier(col.table)}.${this.quoteIdentifier(col.name)}`\r\n ).join(', ');\r\n parts.push(partitionClause);\r\n }\r\n\r\n if (node.orderBy && node.orderBy.length > 0) {\r\n const orderClause = 'ORDER BY ' + node.orderBy.map(o =>\r\n `${this.quoteIdentifier(o.column.table)}.${this.quoteIdentifier(o.column.name)} ${o.direction}`\r\n ).join(', ');\r\n parts.push(orderClause);\r\n }\r\n\r\n result += parts.join(' ');\r\n result += ')';\r\n\r\n return result;\r\n });\r\n }\r\n\r\n // Default fallback, should be overridden by dialects if supported\r\n protected compileJsonPath(node: JsonPathNode): string {\r\n throw new Error(\"JSON Path not supported by this dialect\");\r\n }\r\n\r\n /**\r\n * Compiles a function operand, using the dialect's function strategy.\r\n */\r\n protected compileFunctionOperand(fnNode: FunctionNode, ctx: CompilerContext): string {\n const compiledArgs = fnNode.args.map(arg => this.compileOperand(arg, ctx));\n const renderer = this.functionStrategy.getRenderer(fnNode.name);\n if (renderer) {\n return renderer({\n node: fnNode,\n compiledArgs,\n compileOperand: operand => this.compileOperand(operand, ctx)\n });\n }\n return `${fnNode.name}(${compiledArgs.join(', ')})`;\n }\n}\r\n","import { CompilerContext } from '../abstract.js';\r\nimport { SqlDialectBase } from './sql-dialect.js';\r\n\r\nexport interface FunctionTableNode {\r\n type: 'FunctionTable';\r\n schema?: string;\r\n name: string;\r\n args?: unknown[];\r\n lateral?: boolean;\r\n withOrdinality?: boolean;\r\n alias?: string;\r\n columnAliases?: string[];\r\n}\r\n\r\n/**\r\n * Formatter for function table expressions (e.g., LATERAL unnest(...) WITH ORDINALITY).\r\n * Encapsulates logic for generating SQL function table syntax including LATERAL, aliases, and column lists.\r\n */\r\nexport class FunctionTableFormatter {\r\n /**\r\n * Formats a function table node into SQL syntax.\r\n * @param fn - The function table node containing schema, name, args, and aliases.\r\n * @param ctx - Optional compiler context for operand compilation.\r\n * @param dialect - The dialect instance for compiling operands.\r\n * @returns SQL function table expression (e.g., \"LATERAL schema.func(args) WITH ORDINALITY AS alias(col1, col2)\").\r\n */\r\n static format(fn: FunctionTableNode, ctx?: CompilerContext, dialect?: SqlDialectBase): string {\r\n const schemaPart = this.formatSchema(fn, dialect);\r\n const args = this.formatArgs(fn, ctx, dialect);\r\n const base = this.formatBase(fn, schemaPart, args, dialect);\r\n const lateral = this.formatLateral(fn);\r\n const alias = this.formatAlias(fn, dialect);\r\n const colAliases = this.formatColumnAliases(fn, dialect);\r\n return `${lateral}${base}${alias}${colAliases}`;\r\n }\r\n\r\n /**\r\n * Formats the schema prefix for the function name.\r\n * @param fn - The function table node.\r\n * @param dialect - The dialect instance for quoting identifiers.\r\n * @returns Schema prefix (e.g., \"schema.\") or empty string.\r\n * @internal\r\n */\r\n private static formatSchema(fn: FunctionTableNode, dialect?: SqlDialectBase): string {\r\n if (!fn.schema) return '';\r\n const quoted = dialect ? dialect.quoteIdentifier(fn.schema) : fn.schema;\r\n return `${quoted}.`;\r\n }\r\n\r\n /**\r\n * Formats function arguments into SQL syntax.\r\n * @param fn - The function table node containing arguments.\r\n * @param ctx - Optional compiler context for operand compilation.\r\n * @param dialect - The dialect instance for compiling operands.\r\n * @returns Comma-separated function arguments.\r\n * @internal\r\n */\r\n private static formatArgs(fn: FunctionTableNode, ctx?: CompilerContext, dialect?: SqlDialectBase): string {\r\n return (fn.args || [])\r\n .map((a: any) => {\r\n if (ctx && dialect) {\r\n return (dialect as any).compileOperand(a, ctx);\r\n }\r\n return String(a);\r\n })\r\n .join(', ');\r\n }\r\n\r\n /**\r\n * Formats the base function call with WITH ORDINALITY if present.\r\n * @param fn - The function table node.\r\n * @param schemaPart - Formatted schema prefix.\r\n * @param args - Formatted function arguments.\r\n * @param dialect - The dialect instance for quoting identifiers.\r\n * @returns Base function call expression (e.g., \"schema.func(args) WITH ORDINALITY\").\r\n * @internal\r\n */\r\n private static formatBase(fn: FunctionTableNode, schemaPart: string, args: string, dialect?: SqlDialectBase): string {\r\n const ordinality = fn.withOrdinality ? ' WITH ORDINALITY' : '';\r\n const quoted = dialect ? dialect.quoteIdentifier(fn.name) : fn.name;\r\n return `${schemaPart}${quoted}(${args})${ordinality}`;\r\n }\r\n\r\n /**\r\n * Formats the LATERAL keyword if present.\r\n * @param fn - The function table node.\r\n * @returns \"LATERAL \" or empty string.\r\n * @internal\r\n */\r\n private static formatLateral(fn: FunctionTableNode): string {\r\n return fn.lateral ? 'LATERAL ' : '';\r\n }\r\n\r\n /**\r\n * Formats the table alias for the function table.\r\n * @param fn - The function table node.\r\n * @param dialect - The dialect instance for quoting identifiers.\r\n * @returns \" AS alias\" or empty string.\r\n * @internal\r\n */\r\n private static formatAlias(fn: FunctionTableNode, dialect?: SqlDialectBase): string {\r\n if (!fn.alias) return '';\r\n const quoted = dialect ? dialect.quoteIdentifier(fn.alias) : fn.alias;\r\n return ` AS ${quoted}`;\r\n }\r\n\r\n /**\r\n * Formats column aliases for the function table result columns.\r\n * @param fn - The function table node containing column aliases.\r\n * @param dialect - The dialect instance for quoting identifiers.\r\n * @returns \"(col1, col2, ...)\" or empty string.\r\n * @internal\r\n */\r\n private static formatColumnAliases(fn: FunctionTableNode, dialect?: SqlDialectBase): string {\r\n if (!fn.columnAliases || !fn.columnAliases.length) return '';\r\n const aliases = fn.columnAliases\r\n .map(col => dialect ? dialect.quoteIdentifier(col) : col)\r\n .join(', ');\r\n return `(${aliases})`;\r\n }\r\n}\r\n\r\nexport interface FunctionTableNode {\r\n type: 'FunctionTable';\r\n schema?: string;\r\n name: string;\r\n args?: unknown[];\r\n lateral?: boolean;\r\n withOrdinality?: boolean;\r\n alias?: string;\r\n columnAliases?: string[];\r\n}\r\n","/**\r\n * Strategy interface for compiling pagination clauses.\r\n * Allows dialects to customize how pagination (LIMIT/OFFSET, ROWS FETCH, etc.) is generated.\r\n */\r\nexport interface PaginationStrategy {\r\n /**\r\n * Compiles pagination logic into SQL clause.\r\n * @param limit - The limit value, if present.\r\n * @param offset - The offset value, if present.\r\n * @returns SQL pagination clause (e.g., \" LIMIT 10 OFFSET 0\") or empty string if no pagination.\r\n */\r\n compilePagination(limit?: number, offset?: number): string;\r\n}\r\n\r\n/**\r\n * Standard SQL pagination using LIMIT and OFFSET.\r\n * Implements the ANSI SQL-style pagination with LIMIT/OFFSET syntax.\r\n */\r\nexport class StandardLimitOffsetPagination implements PaginationStrategy {\r\n /**\r\n * Compiles LIMIT/OFFSET pagination clause.\r\n * @param limit - The maximum number of rows to return.\r\n * @param offset - The number of rows to skip.\r\n * @returns SQL pagination clause with LIMIT and/or OFFSET.\r\n */\r\n compilePagination(limit?: number, offset?: number): string {\r\n const parts: string[] = [];\r\n if (limit !== undefined) parts.push(`LIMIT ${limit}`);\r\n if (offset !== undefined) parts.push(`OFFSET ${offset}`);\r\n return parts.length ? ` ${parts.join(' ')}` : '';\r\n }\r\n}\r\n","import { SelectQueryNode } from '../../ast/query.js';\r\nimport { CompilerContext } from '../abstract.js';\r\n\r\n/**\r\n * Compiler for Common Table Expressions (CTEs).\r\n * Handles compilation of WITH and WITH RECURSIVE clauses.\r\n */\r\nexport class CteCompiler {\r\n /**\r\n * Compiles CTEs (WITH clauses) including recursive CTEs.\r\n * @param ast - The SELECT query AST containing CTE definitions.\r\n * @param ctx - The compiler context for expression compilation.\r\n * @param quoteIdentifier - Function to quote identifiers according to dialect rules.\r\n * @param compileSelectAst - Function to recursively compile SELECT query ASTs.\r\n * @param normalizeSelectAst - Function to normalize SELECT query ASTs before compilation.\r\n * @param stripTrailingSemicolon - Function to remove trailing semicolons from SQL.\r\n * @returns SQL WITH clause string (e.g., \"WITH cte_name AS (...) \") or empty string if no CTEs.\r\n */\r\n static compileCtes(ast: SelectQueryNode, ctx: CompilerContext, quoteIdentifier: (id: string) => string, compileSelectAst: (ast: SelectQueryNode, ctx: CompilerContext) => string, normalizeSelectAst: (ast: SelectQueryNode) => SelectQueryNode, stripTrailingSemicolon: (sql: string) => string): string {\r\n if (!ast.ctes || ast.ctes.length === 0) return '';\r\n const hasRecursive = ast.ctes.some(cte => cte.recursive);\r\n const prefix = hasRecursive ? 'WITH RECURSIVE ' : 'WITH ';\r\n const cteDefs = ast.ctes.map(cte => {\r\n const name = quoteIdentifier(cte.name);\r\n const cols = cte.columns && cte.columns.length\r\n ? `(${cte.columns.map(c => quoteIdentifier(c)).join(', ')})`\r\n : '';\r\n const query = stripTrailingSemicolon(compileSelectAst(normalizeSelectAst(cte.query), ctx));\r\n return `${name}${cols} AS (${query})`;\r\n }).join(', ');\r\n return `${prefix}${cteDefs} `;\r\n }\r\n}\r\n","import { ColumnNode } from '../../ast/expression.js';\r\nimport { CompilerContext } from '../abstract.js';\r\n\r\n/**\r\n * Strategy interface for handling RETURNING clauses in DML statements (INSERT, UPDATE, DELETE).\r\n * Different SQL dialects have varying levels of support for RETURNING clauses.\r\n */\r\nexport interface ReturningStrategy {\r\n /**\r\n * Compiles a RETURNING clause for DML statements.\r\n * @param returning - Array of columns to return, or undefined if none.\r\n * @param ctx - The compiler context for expression compilation.\r\n * @returns SQL RETURNING clause or empty string if not supported.\r\n * @throws Error if RETURNING is not supported by this dialect.\r\n */\r\n compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string;\r\n /**\r\n * Formats column list for RETURNING clause.\r\n * @param returning - Array of columns to format.\r\n * @param quoteIdentifier - Function to quote identifiers according to dialect rules.\r\n * @returns Formatted column list (e.g., \"table.col1, table.col2\").\r\n */\r\n formatReturningColumns(returning: ColumnNode[], quoteIdentifier: (id: string) => string): string;\r\n}\r\n\r\n/**\r\n * Default RETURNING strategy that throws an error when RETURNING is used.\r\n * Use this for dialects that don't support RETURNING clauses.\r\n */\r\nexport class NoReturningStrategy implements ReturningStrategy {\r\n /**\r\n * Throws an error as RETURNING is not supported.\r\n * @param returning - Columns to return (causes error if non-empty).\r\n * @param _ctx - Compiler context (unused).\r\n * @throws Error indicating RETURNING is not supported.\r\n */\r\n compileReturning(returning: ColumnNode[] | undefined, _ctx: CompilerContext): string {\r\n if (!returning || returning.length === 0) return '';\r\n throw new Error('RETURNING is not supported by this dialect.');\r\n }\r\n /**\r\n * Formats column names for RETURNING clause.\r\n * @param returning - Columns to format.\r\n * @param quoteIdentifier - Function to quote identifiers according to dialect rules.\r\n * @returns Simple comma-separated column names.\r\n */\r\n formatReturningColumns(returning: ColumnNode[], quoteIdentifier: (id: string) => string): string {\r\n return returning\r\n .map(column => {\r\n const tablePart = column.table ? `${quoteIdentifier(column.table)}.` : '';\r\n const aliasPart = column.alias ? ` AS ${quoteIdentifier(column.alias)}` : '';\r\n return `${tablePart}${quoteIdentifier(column.name)}${aliasPart}`;\r\n })\r\n .join(', ');\r\n }\r\n}\r\n","import { SelectQueryNode } from '../../ast/query.js';\r\nimport { CompilerContext } from '../abstract.js';\r\n\r\n/**\r\n * Compiler for JOIN clauses in SELECT statements.\r\n * Handles compilation of all join types (INNER, LEFT, RIGHT, FULL, CROSS).\r\n */\r\nexport class JoinCompiler {\r\n /**\r\n * Compiles all JOIN clauses from a SELECT query AST.\r\n * @param ast - The SELECT query AST containing join definitions.\r\n * @param ctx - The compiler context for expression compilation.\r\n * @param compileFrom - Function to compile table sources (tables or subqueries).\r\n * @param compileExpression - Function to compile join condition expressions.\r\n * @returns SQL JOIN clauses (e.g., \" LEFT JOIN table ON condition\") or empty string if no joins.\r\n */\r\n static compileJoins(ast: SelectQueryNode, ctx: CompilerContext, compileFrom: (from: any, ctx: CompilerContext) => string, compileExpression: (expr: any, ctx: CompilerContext) => string): string {\r\n if (!ast.joins || ast.joins.length === 0) return '';\r\n const parts = ast.joins.map(j => {\r\n const table = compileFrom(j.table as any, ctx);\r\n const cond = compileExpression(j.condition, ctx);\r\n return `${j.kind} JOIN ${table} ON ${cond}`;\r\n });\r\n return ` ${parts.join(' ')}`;\r\n }\r\n}\r\n","import { SelectQueryNode } from '../../ast/query.js';\r\n\r\n/**\r\n * Compiler for GROUP BY clauses in SELECT statements.\r\n * Handles compilation of column grouping expressions.\r\n */\r\nexport class GroupByCompiler {\r\n /**\r\n * Compiles GROUP BY clause from a SELECT query AST.\r\n * @param ast - The SELECT query AST containing grouping columns.\r\n * @param quoteIdentifier - Function to quote identifiers according to dialect rules.\r\n * @returns SQL GROUP BY clause (e.g., \" GROUP BY table.col1, table.col2\") or empty string if no grouping.\r\n */\r\n static compileGroupBy(ast: SelectQueryNode, quoteIdentifier: (id: string) => string): string {\r\n if (!ast.groupBy || ast.groupBy.length === 0) return '';\r\n const cols = ast.groupBy\r\n .map(c => `${quoteIdentifier(c.table)}.${quoteIdentifier(c.name)}`)\r\n .join(', ');\r\n return ` GROUP BY ${cols}`;\r\n }\r\n}\r\n","import { SelectQueryNode } from '../../ast/query.js';\r\n\r\n/**\r\n * Compiler for ORDER BY clauses in SELECT statements.\r\n * Handles compilation of sorting expressions with direction (ASC/DESC).\r\n */\r\nexport class OrderByCompiler {\r\n /**\r\n * Compiles ORDER BY clause from a SELECT query AST.\r\n * @param ast - The SELECT query AST containing sort specifications.\r\n * @param quoteIdentifier - Function to quote identifiers according to dialect rules.\r\n * @returns SQL ORDER BY clause (e.g., \" ORDER BY table.col1 ASC, table.col2 DESC\") or empty string if no ordering.\r\n */\r\n static compileOrderBy(ast: SelectQueryNode, quoteIdentifier: (id: string) => string): string {\r\n if (!ast.orderBy || ast.orderBy.length === 0) return '';\r\n const parts = ast.orderBy\r\n .map(o => `${quoteIdentifier(o.column.table)}.${quoteIdentifier(o.column.name)} ${o.direction}`)\r\n .join(', ');\r\n return ` ORDER BY ${parts}`;\r\n }\r\n}\r\n","import { CompilerContext, Dialect } from '../abstract.js';\r\nimport { SelectQueryNode, InsertQueryNode, UpdateQueryNode, DeleteQueryNode, TableSourceNode, DerivedTableNode, FunctionTableNode } from '../../ast/query.js';\nimport { ColumnNode } from '../../ast/expression.js';\r\nimport { FunctionTableFormatter } from './function-table-formatter.js';\nimport { PaginationStrategy, StandardLimitOffsetPagination } from './pagination-strategy.js';\r\nimport { CteCompiler } from './cte-compiler.js';\r\nimport { ReturningStrategy, NoReturningStrategy } from './returning-strategy.js';\r\nimport { JoinCompiler } from './join-compiler.js';\r\nimport { GroupByCompiler } from './groupby-compiler.js';\r\nimport { OrderByCompiler } from './orderby-compiler.js';\r\n\r\n\r\nexport abstract class SqlDialectBase extends Dialect {\r\n abstract quoteIdentifier(id: string): string;\r\n\r\n protected paginationStrategy: PaginationStrategy = new StandardLimitOffsetPagination();\r\n protected returningStrategy: ReturningStrategy = new NoReturningStrategy();\r\n\r\n protected compileSelectAst(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n const hasSetOps = !!(ast.setOps && ast.setOps.length);\r\n const ctes = CteCompiler.compileCtes(\r\n ast,\r\n ctx,\r\n this.quoteIdentifier.bind(this),\r\n this.compileSelectAst.bind(this),\r\n this.normalizeSelectAst?.bind(this) ?? ((a) => a),\r\n this.stripTrailingSemicolon.bind(this)\r\n );\r\n const baseAst: SelectQueryNode = hasSetOps\r\n ? { ...ast, setOps: undefined, orderBy: undefined, limit: undefined, offset: undefined }\r\n : ast;\r\n const baseSelect = this.compileSelectCore(baseAst, ctx);\r\n if (!hasSetOps) {\r\n return `${ctes}${baseSelect}`;\r\n }\r\n return this.compileSelectWithSetOps(ast, baseSelect, ctes, ctx);\r\n }\r\n\r\n private compileSelectWithSetOps(\r\n ast: SelectQueryNode,\r\n baseSelect: string,\r\n ctes: string,\r\n ctx: CompilerContext\r\n ): string {\r\n const compound = ast.setOps!\r\n .map(op => `${op.operator} ${this.wrapSetOperand(this.compileSelectAst(op.query, ctx))}`)\r\n .join(' ');\r\n const orderBy = OrderByCompiler.compileOrderBy(ast, this.quoteIdentifier.bind(this));\r\n const pagination = this.paginationStrategy.compilePagination(ast.limit, ast.offset);\r\n const combined = `${this.wrapSetOperand(baseSelect)} ${compound}`;\r\n return `${ctes}${combined}${orderBy}${pagination}`;\r\n }\r\n\r\n protected compileInsertAst(ast: InsertQueryNode, ctx: CompilerContext): string {\r\n const table = this.compileTableName(ast.into);\r\n const columnList = this.compileInsertColumnList(ast.columns);\r\n const values = this.compileInsertValues(ast.values, ctx);\r\n const returning = this.compileReturning(ast.returning, ctx);\r\n return `INSERT INTO ${table} (${columnList}) VALUES ${values}${returning}`;\r\n }\r\n\r\n protected compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string {\r\n return this.returningStrategy.compileReturning(returning, ctx);\r\n }\r\n\r\n private compileInsertColumnList(columns: ColumnNode[]): string {\n return columns.map(column => this.quoteIdentifier(column.name)).join(', ');\n }\n\r\n private compileInsertValues(values: any[][], ctx: CompilerContext): string {\r\n return values\r\n .map(row => `(${row.map(value => this.compileOperand(value, ctx)).join(', ')})`)\r\n .join(', ');\r\n }\r\n\r\n private compileSelectCore(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n const columns = this.compileSelectColumns(ast, ctx);\r\n const from = this.compileFrom(ast.from, ctx);\r\n const joins = JoinCompiler.compileJoins(ast, ctx, this.compileFrom.bind(this), this.compileExpression.bind(this));\r\n const whereClause = this.compileWhere(ast.where, ctx);\r\n const groupBy = GroupByCompiler.compileGroupBy(ast, this.quoteIdentifier.bind(this));\r\n const having = this.compileHaving(ast, ctx);\r\n const orderBy = OrderByCompiler.compileOrderBy(ast, this.quoteIdentifier.bind(this));\r\n const pagination = this.paginationStrategy.compilePagination(ast.limit, ast.offset);\r\n return `SELECT ${this.compileDistinct(ast)}${columns} FROM ${from}${joins}${whereClause}${groupBy}${having}${orderBy}${pagination}`;\r\n }\r\n\r\n protected compileUpdateAst(ast: UpdateQueryNode, ctx: CompilerContext): string {\r\n const table = this.compileTableName(ast.table);\r\n const assignments = this.compileUpdateAssignments(ast.set, ctx);\r\n const whereClause = this.compileWhere(ast.where, ctx);\r\n const returning = this.compileReturning(ast.returning, ctx);\r\n return `UPDATE ${table} SET ${assignments}${whereClause}${returning}`;\r\n }\r\n\r\n private compileUpdateAssignments(\r\n assignments: { column: ColumnNode; value: any }[],\r\n ctx: CompilerContext\r\n ): string {\r\n return assignments\n .map(assignment => {\n const col = assignment.column;\n const target = this.quoteIdentifier(col.name);\n const value = this.compileOperand(assignment.value, ctx);\n return `${target} = ${value}`;\n })\n .join(', ');\n }\n\r\n protected compileDeleteAst(ast: DeleteQueryNode, ctx: CompilerContext): string {\r\n const table = this.compileTableName(ast.from);\r\n const whereClause = this.compileWhere(ast.where, ctx);\r\n const returning = this.compileReturning(ast.returning, ctx);\r\n return `DELETE FROM ${table}${whereClause}${returning}`;\r\n }\r\n\r\n protected formatReturningColumns(returning: ColumnNode[]): string {\r\n return this.returningStrategy.formatReturningColumns(returning, this.quoteIdentifier.bind(this));\r\n }\r\n\r\n protected compileDistinct(ast: SelectQueryNode): string {\r\n return ast.distinct ? 'DISTINCT ' : '';\r\n }\r\n\r\n protected compileSelectColumns(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n return ast.columns.map(c => {\r\n const expr = this.compileOperand(c, ctx);\r\n if (c.alias) {\r\n if (c.alias.includes('(')) return c.alias;\r\n return `${expr} AS ${this.quoteIdentifier(c.alias)}`;\r\n }\r\n return expr;\r\n }).join(', ');\r\n }\r\n\r\n protected compileFrom(ast: SelectQueryNode['from'], ctx?: CompilerContext): string {\n const tableSource = ast as any;\n if (tableSource.type === 'FunctionTable') {\n return this.compileFunctionTable(tableSource, ctx);\n }\n if (tableSource.type === 'DerivedTable') {\n return this.compileDerivedTable(tableSource, ctx);\n }\n return this.compileTableSource(tableSource);\n }\n\n protected compileFunctionTable(fn: FunctionTableNode, ctx?: CompilerContext): string {\n return FunctionTableFormatter.format(fn, ctx, this);\n }\n\n protected compileDerivedTable(table: DerivedTableNode, ctx?: CompilerContext): string {\n if (!table.alias) {\n throw new Error('Derived tables must have an alias.');\n }\n const subquery = this.compileSelectAst(this.normalizeSelectAst(table.query), ctx!).trim().replace(/;$/, '');\n const columns = table.columnAliases?.length\n ? ` (${table.columnAliases.map(c => this.quoteIdentifier(c)).join(', ')})`\n : '';\n return `(${subquery}) AS ${this.quoteIdentifier(table.alias)}${columns}`;\n }\n\n protected compileTableSource(table: TableSourceNode): string {\n if (table.type === 'FunctionTable') {\n return this.compileFunctionTable(table as FunctionTableNode);\n }\n if (table.type === 'DerivedTable') {\n return this.compileDerivedTable(table as DerivedTableNode);\n }\n const base = this.compileTableName(table);\n return table.alias ? `${base} AS ${this.quoteIdentifier(table.alias)}` : base;\n }\n\n protected compileTableName(table: { name: string; schema?: string }): string {\n if (table.schema) {\n return `${this.quoteIdentifier(table.schema)}.${this.quoteIdentifier(table.name)}`;\n }\n return this.quoteIdentifier(table.name);\n }\n\r\n protected compileHaving(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n if (!ast.having) return '';\r\n return ` HAVING ${this.compileExpression(ast.having, ctx)}`;\r\n }\r\n\r\n protected stripTrailingSemicolon(sql: string): string {\r\n return sql.trim().replace(/;$/, '');\r\n }\r\n\r\n protected wrapSetOperand(sql: string): string {\r\n const trimmed = this.stripTrailingSemicolon(sql);\r\n return `(${trimmed})`;\r\n }\r\n}\n","import { StandardFunctionStrategy } from '../../functions/standard-strategy.js';\r\nimport { FunctionRenderContext } from '../../functions/types.js';\r\nimport { LiteralNode } from '../../ast/expression.js';\r\n\r\nexport class PostgresFunctionStrategy extends StandardFunctionStrategy {\r\n constructor() {\r\n super();\r\n this.registerOverrides();\r\n }\r\n\r\n private registerOverrides() {\r\n // Override Standard/Abstract definitions with PostgreSQL specifics\r\n\r\n // Date/Time functions\r\n this.add('UTC_NOW', () => `(NOW() AT TIME ZONE 'UTC')`);\r\n this.add('UNIX_TIMESTAMP', () => `EXTRACT(EPOCH FROM NOW())::INTEGER`);\r\n this.add('FROM_UNIXTIME', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('FROM_UNIXTIME expects 1 argument');\r\n return `to_timestamp(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('EXTRACT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('EXTRACT expects 2 arguments (part, date)');\r\n const [part, date] = compiledArgs;\r\n const partClean = part.replace(/['\"]/g, '');\r\n return `EXTRACT(${partClean} FROM ${date})`;\r\n });\r\n\r\n this.add('YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('YEAR expects 1 argument');\r\n return `EXTRACT(YEAR FROM ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('MONTH expects 1 argument');\r\n return `EXTRACT(MONTH FROM ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY expects 1 argument');\r\n return `EXTRACT(DAY FROM ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DATE_ADD', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_ADD expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `(${date} + (${interval} || ' ${unitClean}')::INTERVAL)`;\r\n });\r\n\r\n this.add('DATE_SUB', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_SUB expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `(${date} - (${interval} || ' ${unitClean}')::INTERVAL)`;\r\n });\r\n\r\n this.add('DATE_DIFF', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_DIFF expects 2 arguments');\r\n const [date1, date2] = compiledArgs;\r\n return `(${date1}::DATE - ${date2}::DATE)`;\r\n });\r\n\r\n this.add('DATE_FORMAT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_FORMAT expects 2 arguments');\r\n const [date, format] = compiledArgs;\r\n return `TO_CHAR(${date}, ${format})`;\r\n });\r\n\r\n this.add('END_OF_MONTH', ({ compiledArgs }) => {\n if (compiledArgs.length !== 1) throw new Error('END_OF_MONTH expects 1 argument');\n return `(date_trunc('month', ${compiledArgs[0]}) + interval '1 month' - interval '1 day')::DATE`;\n });\n\n this.add('DAY_OF_WEEK', ({ compiledArgs }) => {\n if (compiledArgs.length !== 1) throw new Error('DAY_OF_WEEK expects 1 argument');\n return `EXTRACT(DOW FROM ${compiledArgs[0]})`;\n });\n\n this.add('WEEK_OF_YEAR', ({ compiledArgs }) => {\n if (compiledArgs.length !== 1) throw new Error('WEEK_OF_YEAR expects 1 argument');\n return `EXTRACT(WEEK FROM ${compiledArgs[0]})`;\n });\n\n this.add('DATE_TRUNC', ({ node, compiledArgs }) => {\n if (compiledArgs.length !== 2) throw new Error('DATE_TRUNC expects 2 arguments (part, date)');\n const [, date] = compiledArgs;\n const partArg = node.args[0] as LiteralNode;\n const partClean = String(partArg.value).replace(/['\"]/g, '').toLowerCase();\n return `DATE_TRUNC('${partClean}', ${date})`;\n });\n\n this.add('GROUP_CONCAT', ctx => {\n const arg = ctx.compiledArgs[0];\n const orderClause = this.buildOrderByExpression(ctx);\n const orderSegment = orderClause ? ` ${orderClause}` : '';\n const separatorOperand = this.getGroupConcatSeparatorOperand(ctx);\n const separator = ctx.compileOperand(separatorOperand);\n return `STRING_AGG(${arg}, ${separator}${orderSegment})`;\n });\n }\n}\n","import { CompilerContext } from '../abstract.js';\r\nimport { JsonPathNode, ColumnNode } from '../../ast/expression.js';\r\nimport { SqlDialectBase } from '../base/sql-dialect.js';\r\nimport { PostgresFunctionStrategy } from './functions.js';\r\n\r\n/**\r\n * PostgreSQL dialect implementation\r\n */\r\nexport class PostgresDialect extends SqlDialectBase {\r\n protected readonly dialect = 'postgres';\r\n /**\r\n * Creates a new PostgresDialect instance\r\n */\r\n public constructor() {\r\n super(new PostgresFunctionStrategy());\r\n }\r\n\r\n /**\r\n * Quotes an identifier using PostgreSQL double-quote syntax\r\n * @param id - Identifier to quote\r\n * @returns Quoted identifier\r\n */\r\n quoteIdentifier(id: string): string {\r\n return `\"${id}\"`;\r\n }\r\n\r\n /**\r\n * Compiles JSON path expression using PostgreSQL syntax\r\n * @param node - JSON path node\r\n * @returns PostgreSQL JSON path expression\r\n */\r\n protected compileJsonPath(node: JsonPathNode): string {\r\n const col = `${this.quoteIdentifier(node.column.table)}.${this.quoteIdentifier(node.column.name)}`;\r\n // Postgres uses col->>'path' for text extraction\r\n return `${col}->>'${node.path}'`;\r\n }\r\n\r\n protected compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string {\r\n if (!returning || returning.length === 0) return '';\r\n const columns = this.formatReturningColumns(returning);\r\n return ` RETURNING ${columns}`;\r\n }\r\n\r\n supportsReturning(): boolean {\r\n return true;\r\n }\r\n}\r\n","import { StandardFunctionStrategy } from '../../functions/standard-strategy.js';\r\nimport { FunctionRenderContext } from '../../functions/types.js';\r\nimport { LiteralNode } from '../../ast/expression.js';\r\n\r\nexport class MysqlFunctionStrategy extends StandardFunctionStrategy {\r\n constructor() {\r\n super();\r\n this.registerOverrides();\r\n }\r\n\r\n private registerOverrides() {\r\n // Override Standard/Abstract definitions with MySQL specifics\r\n\r\n // Date/Time functions\r\n this.add('NOW', () => `NOW()`);\r\n this.add('CURRENT_DATE', () => `CURDATE()`);\r\n this.add('CURRENT_TIME', () => `CURTIME()`);\r\n this.add('UTC_NOW', () => `UTC_TIMESTAMP()`);\r\n\r\n this.add('EXTRACT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('EXTRACT expects 2 arguments (part, date)');\r\n const [part, date] = compiledArgs;\r\n const partClean = part.replace(/['\"]/g, '');\r\n return `EXTRACT(${partClean} FROM ${date})`;\r\n });\r\n\r\n this.add('YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('YEAR expects 1 argument');\r\n return `YEAR(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('MONTH expects 1 argument');\r\n return `MONTH(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY expects 1 argument');\r\n return `DAY(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DATE_ADD', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_ADD expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toUpperCase();\r\n return `DATE_ADD(${date}, INTERVAL ${interval} ${unitClean})`;\r\n });\r\n\r\n this.add('DATE_SUB', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_SUB expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toUpperCase();\r\n return `DATE_SUB(${date}, INTERVAL ${interval} ${unitClean})`;\r\n });\r\n\r\n this.add('DATE_DIFF', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_DIFF expects 2 arguments');\r\n const [date1, date2] = compiledArgs;\r\n return `DATEDIFF(${date1}, ${date2})`;\r\n });\r\n\r\n this.add('DATE_FORMAT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_FORMAT expects 2 arguments');\r\n const [date, format] = compiledArgs;\r\n return `DATE_FORMAT(${date}, ${format})`;\r\n });\r\n\r\n this.add('END_OF_MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('END_OF_MONTH expects 1 argument');\r\n return `LAST_DAY(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY_OF_WEEK', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY_OF_WEEK expects 1 argument');\r\n return `DAYOFWEEK(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('WEEK_OF_YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('WEEK_OF_YEAR expects 1 argument');\r\n return `WEEKOFYEAR(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DATE_TRUNC', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_TRUNC expects 2 arguments (part, date)');\r\n const [, date] = compiledArgs;\r\n const partArg = node.args[0] as LiteralNode;\r\n const partClean = String(partArg.value).replace(/['\"]/g, '').toLowerCase();\r\n // MySQL doesn't have DATE_TRUNC, use DATE_FORMAT workaround\r\n if (partClean === 'year') {\r\n return `DATE_FORMAT(${date}, '%Y-01-01')`;\r\n } else if (partClean === 'month') {\r\n return `DATE_FORMAT(${date}, '%Y-%m-01')`;\r\n } else if (partClean === 'day') {\r\n return `DATE(${date})`;\r\n }\r\n return `DATE(${date})`;\r\n });\r\n }\r\n}\r\n","import { JsonPathNode } from '../../ast/expression.js';\r\nimport { SqlDialectBase } from '../base/sql-dialect.js';\r\nimport { MysqlFunctionStrategy } from './functions.js';\r\n\r\n/**\r\n * MySQL dialect implementation\r\n */\r\nexport class MySqlDialect extends SqlDialectBase {\r\n protected readonly dialect = 'mysql';\r\n /**\r\n * Creates a new MySqlDialect instance\r\n */\r\n public constructor() {\r\n super(new MysqlFunctionStrategy());\r\n }\r\n\r\n /**\r\n * Quotes an identifier using MySQL backtick syntax\r\n * @param id - Identifier to quote\r\n * @returns Quoted identifier\r\n */\r\n quoteIdentifier(id: string): string {\r\n return `\\`${id}\\``;\r\n }\r\n\r\n /**\r\n * Compiles JSON path expression using MySQL syntax\r\n * @param node - JSON path node\r\n * @returns MySQL JSON path expression\r\n */\r\n protected compileJsonPath(node: JsonPathNode): string {\r\n const col = `${this.quoteIdentifier(node.column.table)}.${this.quoteIdentifier(node.column.name)}`;\r\n // MySQL 5.7+ uses col->'$.path'\r\n return `${col}->'${node.path}'`;\r\n }\r\n}\r\n","import { StandardFunctionStrategy } from '../../functions/standard-strategy.js';\nimport { FunctionRenderContext } from '../../functions/types.js';\nimport { LiteralNode } from '../../ast/expression.js';\n\nexport class SqliteFunctionStrategy extends StandardFunctionStrategy {\n constructor() {\n super();\n this.registerOverrides();\n }\n\r\n private registerOverrides() {\r\n // Override Standard/Abstract definitions with SQLite specifics\r\n\r\n // Date/Time functions\r\n this.add('NOW', () => `datetime('now', 'localtime')`);\r\n this.add('CURRENT_DATE', () => `date('now', 'localtime')`);\r\n this.add('CURRENT_TIME', () => `time('now', 'localtime')`);\r\n this.add('UTC_NOW', () => `datetime('now')`);\r\n\r\n this.add('EXTRACT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('EXTRACT expects 2 arguments (part, date)');\r\n const [part, date] = compiledArgs;\r\n // Map common parts to strftime format\r\n const partUpper = part.replace(/['\"]/g, '').toUpperCase();\r\n const formatMap: Record<string, string> = {\r\n 'YEAR': '%Y', 'MONTH': '%m', 'DAY': '%d',\r\n 'HOUR': '%H', 'MINUTE': '%M', 'SECOND': '%S',\r\n 'DOW': '%w', 'WEEK': '%W'\r\n };\r\n const format = formatMap[partUpper] || '%Y';\r\n return `CAST(strftime('${format}', ${date}) AS INTEGER)`;\r\n });\r\n\r\n this.add('YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('YEAR expects 1 argument');\r\n return `CAST(strftime('%Y', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('MONTH expects 1 argument');\r\n return `CAST(strftime('%m', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('DAY', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY expects 1 argument');\r\n return `CAST(strftime('%d', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('DATE_ADD', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_ADD expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `datetime(${date}, '+' || ${interval} || ' ${unitClean}')`;\r\n });\r\n\r\n this.add('DATE_SUB', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_SUB expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `datetime(${date}, '-' || ${interval} || ' ${unitClean}')`;\r\n });\r\n\r\n this.add('DATE_DIFF', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_DIFF expects 2 arguments');\r\n const [date1, date2] = compiledArgs;\r\n return `CAST(julianday(${date1}) - julianday(${date2}) AS INTEGER)`;\r\n });\r\n\r\n this.add('DATE_FORMAT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_FORMAT expects 2 arguments');\r\n const [date, format] = compiledArgs;\r\n return `strftime(${format}, ${date})`;\r\n });\r\n\r\n this.add('UNIX_TIMESTAMP', () => `CAST(strftime('%s', 'now') AS INTEGER)`);\r\n\r\n this.add('FROM_UNIXTIME', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('FROM_UNIXTIME expects 1 argument');\r\n return `datetime(${compiledArgs[0]}, 'unixepoch')`;\r\n });\r\n\r\n this.add('END_OF_MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('END_OF_MONTH expects 1 argument');\r\n return `date(${compiledArgs[0]}, 'start of month', '+1 month', '-1 day')`;\r\n });\r\n\r\n this.add('DAY_OF_WEEK', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY_OF_WEEK expects 1 argument');\r\n return `CAST(strftime('%w', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('WEEK_OF_YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('WEEK_OF_YEAR expects 1 argument');\r\n return `CAST(strftime('%W', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('DATE_TRUNC', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_TRUNC expects 2 arguments (part, date)');\r\n const [, date] = compiledArgs;\r\n const partArg = node.args[0] as LiteralNode;\r\n const partClean = String(partArg.value).replace(/['\"]/g, '').toLowerCase();\r\n // SQLite uses date modifiers\r\n if (partClean === 'year') {\r\n return `date(${date}, 'start of year')`;\r\n } else if (partClean === 'month') {\r\n return `date(${date}, 'start of month')`;\r\n } else if (partClean === 'day') {\r\n return `date(${date})`;\r\n }\r\n return `date(${date}, 'start of ${partClean}')`;\r\n });\n\n this.add('GROUP_CONCAT', ctx => {\n const arg = ctx.compiledArgs[0];\n const separatorOperand = this.getGroupConcatSeparatorOperand(ctx);\n const separator = ctx.compileOperand(separatorOperand);\n return `GROUP_CONCAT(${arg}, ${separator})`;\n });\n }\n}\n","import { CompilerContext } from '../abstract.js';\r\nimport { JsonPathNode, ColumnNode } from '../../ast/expression.js';\r\nimport { SqlDialectBase } from '../base/sql-dialect.js';\r\nimport { SqliteFunctionStrategy } from './functions.js';\r\n\r\n/**\r\n * SQLite dialect implementation\r\n */\r\nexport class SqliteDialect extends SqlDialectBase {\n protected readonly dialect = 'sqlite';\n /**\n * Creates a new SqliteDialect instance\n */\n public constructor() {\n super(new SqliteFunctionStrategy());\n }\n\r\n /**\r\n * Quotes an identifier using SQLite double-quote syntax\r\n * @param id - Identifier to quote\r\n * @returns Quoted identifier\r\n */\r\n quoteIdentifier(id: string): string {\r\n return `\"${id}\"`;\r\n }\r\n\r\n /**\r\n * Compiles JSON path expression using SQLite syntax\r\n * @param node - JSON path node\r\n * @returns SQLite JSON path expression\r\n */\r\n protected compileJsonPath(node: JsonPathNode): string {\r\n const col = `${this.quoteIdentifier(node.column.table)}.${this.quoteIdentifier(node.column.name)}`;\r\n // SQLite uses json_extract(col, '$.path')\r\n return `json_extract(${col}, '${node.path}')`;\r\n }\r\n\r\n protected compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string {\n if (!returning || returning.length === 0) return '';\n const columns = this.formatReturningColumns(returning);\n return ` RETURNING ${columns}`;\n }\n\n protected formatReturningColumns(returning: ColumnNode[]): string {\n return returning\n .map(column => {\n const alias = column.alias ? ` AS ${this.quoteIdentifier(column.alias)}` : '';\n return `${this.quoteIdentifier(column.name)}${alias}`;\n })\n .join(', ');\n }\n\r\n supportsReturning(): boolean {\r\n return true;\r\n }\r\n}\r\n","import { StandardFunctionStrategy } from '../../functions/standard-strategy.js';\r\nimport { FunctionRenderContext } from '../../functions/types.js';\r\nimport { LiteralNode } from '../../ast/expression.js';\r\n\r\nexport class MssqlFunctionStrategy extends StandardFunctionStrategy {\r\n constructor() {\r\n super();\r\n this.registerOverrides();\r\n }\r\n\r\n private registerOverrides() {\r\n // Override Standard/Abstract definitions with MSSQL specifics\r\n\r\n // Date/Time functions\r\n this.add('NOW', () => `GETDATE()`);\r\n this.add('CURRENT_DATE', () => `CAST(GETDATE() AS DATE)`);\r\n this.add('CURRENT_TIME', () => `CAST(GETDATE() AS TIME)`);\r\n this.add('UTC_NOW', () => `GETUTCDATE()`);\r\n\r\n this.add('EXTRACT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('EXTRACT expects 2 arguments (part, date)');\r\n const [part, date] = compiledArgs;\r\n const partClean = part.replace(/['\"]/g, '').toLowerCase();\r\n return `DATEPART(${partClean}, ${date})`;\r\n });\r\n\r\n this.add('YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('YEAR expects 1 argument');\r\n return `YEAR(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('MONTH expects 1 argument');\r\n return `MONTH(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY expects 1 argument');\r\n return `DAY(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DATE_ADD', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_ADD expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `DATEADD(${unitClean}, ${interval}, ${date})`;\r\n });\r\n\r\n this.add('DATE_SUB', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_SUB expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `DATEADD(${unitClean}, -${interval}, ${date})`;\r\n });\r\n\r\n this.add('DATE_DIFF', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_DIFF expects 2 arguments');\r\n const [date1, date2] = compiledArgs;\r\n return `DATEDIFF(day, ${date2}, ${date1})`;\r\n });\r\n\r\n this.add('DATE_FORMAT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_FORMAT expects 2 arguments');\r\n const [date, format] = compiledArgs;\r\n return `FORMAT(${date}, ${format})`;\r\n });\r\n\r\n this.add('UNIX_TIMESTAMP', () => `DATEDIFF(SECOND, '1970-01-01', GETUTCDATE())`);\r\n\r\n this.add('FROM_UNIXTIME', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('FROM_UNIXTIME expects 1 argument');\r\n return `DATEADD(SECOND, ${compiledArgs[0]}, '1970-01-01')`;\r\n });\r\n\r\n this.add('END_OF_MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('END_OF_MONTH expects 1 argument');\r\n return `EOMONTH(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY_OF_WEEK', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY_OF_WEEK expects 1 argument');\r\n return `DATEPART(dw, ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('WEEK_OF_YEAR', ({ compiledArgs }) => {\n if (compiledArgs.length !== 1) throw new Error('WEEK_OF_YEAR expects 1 argument');\n return `DATEPART(wk, ${compiledArgs[0]})`;\n });\n\n this.add('DATE_TRUNC', ({ node, compiledArgs }) => {\n if (compiledArgs.length !== 2) throw new Error('DATE_TRUNC expects 2 arguments (part, date)');\n const [, date] = compiledArgs;\n const partArg = node.args[0] as LiteralNode;\n const partClean = String(partArg.value).replace(/['\"]/g, '').toLowerCase();\n // SQL Server 2022+ has DATETRUNC\n return `DATETRUNC(${partClean}, ${date})`;\n });\n\n this.add('GROUP_CONCAT', ctx => {\n const arg = ctx.compiledArgs[0];\n const separatorOperand = this.getGroupConcatSeparatorOperand(ctx);\n const separator = ctx.compileOperand(separatorOperand);\n const orderClause = this.buildOrderByExpression(ctx);\n const withinGroup = orderClause ? ` WITHIN GROUP (${orderClause})` : '';\n return `STRING_AGG(${arg}, ${separator})${withinGroup}`;\n });\n }\n}\n","import { CompilerContext, Dialect } from '../abstract.js';\r\nimport { SelectQueryNode, InsertQueryNode, UpdateQueryNode, DeleteQueryNode, TableSourceNode, DerivedTableNode } from '../../ast/query.js';\nimport { JsonPathNode } from '../../ast/expression.js';\nimport { MssqlFunctionStrategy } from './functions.js';\nimport { FunctionTableFormatter } from '../base/function-table-formatter.js';\n\r\n/**\r\n * Microsoft SQL Server dialect implementation\r\n */\r\nexport class SqlServerDialect extends Dialect {\r\n protected readonly dialect = 'mssql';\r\n /**\r\n * Creates a new SqlServerDialect instance\r\n */\r\n public constructor() {\r\n super(new MssqlFunctionStrategy());\r\n }\r\n\r\n /**\r\n * Quotes an identifier using SQL Server bracket syntax\r\n * @param id - Identifier to quote\r\n * @returns Quoted identifier\r\n */\r\n quoteIdentifier(id: string): string {\r\n return `[${id}]`;\r\n }\r\n\r\n /**\r\n * Compiles JSON path expression using SQL Server syntax\r\n * @param node - JSON path node\r\n * @returns SQL Server JSON path expression\r\n */\r\n protected compileJsonPath(node: JsonPathNode): string {\r\n const col = `${this.quoteIdentifier(node.column.table)}.${this.quoteIdentifier(node.column.name)}`;\r\n // SQL Server uses JSON_VALUE(col, '$.path')\r\n return `JSON_VALUE(${col}, '${node.path}')`;\r\n }\r\n\r\n /**\r\n * Formats parameter placeholders using SQL Server named parameter syntax\r\n * @param index - Parameter index\r\n * @returns Named parameter placeholder\r\n */\r\n protected formatPlaceholder(index: number): string {\r\n return `@p${index}`;\r\n }\r\n\r\n /**\r\n * Compiles SELECT query AST to SQL Server SQL\r\n * @param ast - Query AST\r\n * @param ctx - Compiler context\r\n * @returns SQL Server SQL string\r\n */\r\n protected compileSelectAst(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n const hasSetOps = !!(ast.setOps && ast.setOps.length);\r\n const ctes = this.compileCtes(ast, ctx);\r\n\r\n const baseAst: SelectQueryNode = hasSetOps\r\n ? { ...ast, setOps: undefined, orderBy: undefined, limit: undefined, offset: undefined }\r\n : ast;\r\n\r\n const baseSelect = this.compileSelectCore(baseAst, ctx);\r\n\r\n if (!hasSetOps) {\r\n return `${ctes}${baseSelect}`;\r\n }\r\n\r\n const compound = ast.setOps!\r\n .map(op => `${op.operator} ${this.wrapSetOperand(this.compileSelectAst(op.query, ctx))}`)\r\n .join(' ');\r\n\r\n const orderBy = this.compileOrderBy(ast);\r\n const pagination = this.compilePagination(ast, orderBy);\r\n const combined = `${this.wrapSetOperand(baseSelect)} ${compound}`;\r\n const tail = pagination || orderBy;\r\n return `${ctes}${combined}${tail}`;\r\n }\r\n\r\n protected compileInsertAst(ast: InsertQueryNode, ctx: CompilerContext): string {\r\n const table = this.quoteIdentifier(ast.into.name);\r\n const columnList = ast.columns.map(column => `${this.quoteIdentifier(column.table)}.${this.quoteIdentifier(column.name)}`).join(', ');\r\n const values = ast.values.map(row => `(${row.map(value => this.compileOperand(value, ctx)).join(', ')})`).join(', ');\r\n return `INSERT INTO ${table} (${columnList}) VALUES ${values};`;\r\n }\r\n\r\n protected compileUpdateAst(ast: UpdateQueryNode, ctx: CompilerContext): string {\r\n const table = this.quoteIdentifier(ast.table.name);\r\n const assignments = ast.set.map(assignment => {\r\n const col = assignment.column;\r\n const target = `${this.quoteIdentifier(col.table)}.${this.quoteIdentifier(col.name)}`;\r\n const value = this.compileOperand(assignment.value, ctx);\r\n return `${target} = ${value}`;\r\n }).join(', ');\r\n const whereClause = this.compileWhere(ast.where, ctx);\r\n return `UPDATE ${table} SET ${assignments}${whereClause};`;\r\n }\r\n\r\n protected compileDeleteAst(ast: DeleteQueryNode, ctx: CompilerContext): string {\n if (ast.from.type !== 'Table') {\n throw new Error('DELETE only supports base tables in the MSSQL dialect.');\n }\n const table = this.quoteIdentifier(ast.from.name);\n const whereClause = this.compileWhere(ast.where, ctx);\n return `DELETE FROM ${table}${whereClause};`;\n }\n\n private compileSelectCore(ast: SelectQueryNode, ctx: CompilerContext): string {\n const columns = ast.columns.map(c => {\r\n let expr = '';\r\n if (c.type === 'Function') {\r\n expr = this.compileOperand(c, ctx);\r\n } else if (c.type === 'Column') {\r\n expr = `${this.quoteIdentifier(c.table)}.${this.quoteIdentifier(c.name)}`;\r\n } else if (c.type === 'ScalarSubquery') {\r\n expr = this.compileOperand(c, ctx);\r\n } else if (c.type === 'WindowFunction') {\r\n expr = this.compileOperand(c, ctx);\r\n }\r\n\r\n if (c.alias) {\r\n if (c.alias.includes('(')) return c.alias;\r\n return `${expr} AS ${this.quoteIdentifier(c.alias)}`;\r\n }\r\n return expr;\r\n }).join(', ');\r\n\n const distinct = ast.distinct ? 'DISTINCT ' : '';\n const from = this.compileTableSource(ast.from, ctx);\n\n const joins = ast.joins.map(j => {\n const table = this.compileTableSource(j.table, ctx);\n const cond = this.compileExpression(j.condition, ctx);\n return `${j.kind} JOIN ${table} ON ${cond}`;\n }).join(' ');\n const whereClause = this.compileWhere(ast.where, ctx);\r\n\r\n const groupBy = ast.groupBy && ast.groupBy.length > 0\r\n ? ' GROUP BY ' + ast.groupBy.map(c => `${this.quoteIdentifier(c.table)}.${this.quoteIdentifier(c.name)}`).join(', ')\r\n : '';\r\n\r\n const having = ast.having\r\n ? ` HAVING ${this.compileExpression(ast.having, ctx)}`\r\n : '';\r\n\r\n const orderBy = this.compileOrderBy(ast);\r\n const pagination = this.compilePagination(ast, orderBy);\r\n\r\n if (pagination) {\r\n return `SELECT ${distinct}${columns} FROM ${from}${joins ? ' ' + joins : ''}${whereClause}${groupBy}${having}${pagination}`;\r\n }\r\n\r\n return `SELECT ${distinct}${columns} FROM ${from}${joins ? ' ' + joins : ''}${whereClause}${groupBy}${having}${orderBy}`;\r\n }\r\n\r\n private compileOrderBy(ast: SelectQueryNode): string {\r\n if (!ast.orderBy || ast.orderBy.length === 0) return '';\r\n return ' ORDER BY ' + ast.orderBy\r\n .map(o => `${this.quoteIdentifier(o.column.table)}.${this.quoteIdentifier(o.column.name)} ${o.direction}`)\r\n .join(', ');\r\n }\r\n\r\n private compilePagination(ast: SelectQueryNode, orderBy: string): string {\n const hasLimit = ast.limit !== undefined;\n const hasOffset = ast.offset !== undefined;\n if (!hasLimit && !hasOffset) return '';\n\r\n const off = ast.offset ?? 0;\r\n const orderClause = orderBy || ' ORDER BY (SELECT NULL)';\r\n let pagination = `${orderClause} OFFSET ${off} ROWS`;\r\n if (hasLimit) {\n pagination += ` FETCH NEXT ${ast.limit} ROWS ONLY`;\n }\n return pagination;\n }\n\n private compileTableSource(table: TableSourceNode, ctx: CompilerContext): string {\n if (table.type === 'FunctionTable') {\n return FunctionTableFormatter.format(table, ctx, this as any);\n }\n if (table.type === 'DerivedTable') {\n return this.compileDerivedTable(table, ctx);\n }\n const base = table.schema\n ? `${this.quoteIdentifier(table.schema)}.${this.quoteIdentifier(table.name)}`\n : this.quoteIdentifier(table.name);\n return table.alias ? `${base} AS ${this.quoteIdentifier(table.alias)}` : base;\n }\n\n private compileDerivedTable(table: DerivedTableNode, ctx: CompilerContext): string {\n const sub = this.compileSelectAst(this.normalizeSelectAst(table.query), ctx).trim().replace(/;$/, '');\n const cols = table.columnAliases?.length\n ? ` (${table.columnAliases.map(c => this.quoteIdentifier(c)).join(', ')})`\n : '';\n return `(${sub}) AS ${this.quoteIdentifier(table.alias)}${cols}`;\n }\n\r\n private compileCtes(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n if (!ast.ctes || ast.ctes.length === 0) return '';\r\n // MSSQL does not use RECURSIVE keyword, but supports recursion when CTE references itself.\r\n const defs = ast.ctes.map(cte => {\r\n const name = this.quoteIdentifier(cte.name);\r\n const cols = cte.columns ? `(${cte.columns.map(c => this.quoteIdentifier(c)).join(', ')})` : '';\r\n const query = this.compileSelectAst(this.normalizeSelectAst(cte.query), ctx).trim().replace(/;$/, '');\r\n return `${name}${cols} AS (${query})`;\r\n }).join(', ');\r\n return `WITH ${defs} `;\r\n }\r\n\r\n private wrapSetOperand(sql: string): string {\r\n const trimmed = sql.trim().replace(/;$/, '');\r\n return `(${trimmed})`;\r\n }\r\n}\r\n","// Dialect factory for the SQL DSL.\r\n// Centralizes how we go from a symbolic name (\"sqlite\") to a concrete Dialect instance.\r\n\r\nimport { Dialect } from './abstract.js';\r\nimport { PostgresDialect } from './postgres/index.js';\r\nimport { MySqlDialect } from './mysql/index.js';\r\nimport { SqliteDialect } from './sqlite/index.js';\r\nimport { SqlServerDialect } from './mssql/index.js';\r\n\r\nexport type DialectKey =\r\n | 'postgres'\r\n | 'mysql'\r\n | 'sqlite'\r\n | 'mssql'\r\n | (string & {}); // allow user-defined keys without constraining too much\r\n\r\ntype DialectFactoryFn = () => Dialect;\r\n\r\nexport class DialectFactory {\r\n private static registry = new Map<DialectKey, DialectFactoryFn>();\r\n private static defaultsInitialized = false;\r\n\r\n private static ensureDefaults(): void {\r\n if (this.defaultsInitialized) return;\r\n this.defaultsInitialized = true;\r\n\r\n // Register built-in dialects only if no override exists yet.\r\n if (!this.registry.has('postgres')) {\r\n this.registry.set('postgres', () => new PostgresDialect());\r\n }\r\n if (!this.registry.has('mysql')) {\r\n this.registry.set('mysql', () => new MySqlDialect());\r\n }\r\n if (!this.registry.has('sqlite')) {\r\n this.registry.set('sqlite', () => new SqliteDialect());\r\n }\r\n if (!this.registry.has('mssql')) {\r\n this.registry.set('mssql', () => new SqlServerDialect());\r\n }\r\n }\r\n\r\n /**\r\n * Register (or override) a dialect factory for a key.\r\n *\r\n * Examples:\r\n * DialectFactory.register('sqlite', () => new SqliteDialect());\r\n * DialectFactory.register('my-tenant-dialect', () => new CustomDialect());\r\n */\r\n public static register(key: DialectKey, factory: DialectFactoryFn): void {\r\n this.registry.set(key, factory);\r\n }\r\n\r\n /**\r\n * Resolve a key into a Dialect instance.\r\n * Throws if the key is not registered.\r\n */\r\n public static create(key: DialectKey): Dialect {\r\n this.ensureDefaults();\r\n const factory = this.registry.get(key);\r\n if (!factory) {\r\n throw new Error(\r\n `Dialect \"${String(\r\n key\r\n )}\" is not registered. Use DialectFactory.register(...) to register it.`\r\n );\r\n }\r\n return factory();\r\n }\r\n\r\n /**\r\n * Clear all registrations (mainly for tests).\r\n * Built-ins will be re-registered lazily on the next create().\r\n */\r\n public static clear(): void {\r\n this.registry.clear();\r\n this.defaultsInitialized = false;\r\n }\r\n}\r\n\r\n/**\r\n * Helper to normalize either a Dialect instance OR a key into a Dialect instance.\r\n * This is what query builders will use.\r\n */\r\nexport const resolveDialectInput = (\r\n dialect: Dialect | DialectKey\r\n): Dialect => {\r\n if (typeof dialect === 'string') {\r\n return DialectFactory.create(dialect);\r\n }\r\n return dialect;\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { SelectQueryNode, CommonTableExpressionNode, OrderByNode, SetOperationNode, TableSourceNode } from '../core/ast/query.js';\nimport {\r\n ColumnNode,\r\n ExpressionNode,\r\n FunctionNode,\r\n ScalarSubqueryNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode\r\n} from '../core/ast/expression.js';\r\nimport { JoinNode } from '../core/ast/join.js';\r\n\r\n/**\r\n * Node types that can be used in query projections\r\n */\r\nexport type ProjectionNode =\r\n | ColumnNode\r\n | FunctionNode\r\n | ScalarSubqueryNode\r\n | CaseExpressionNode\r\n | WindowFunctionNode;\r\n\r\n/**\r\n * Manages the state of a SELECT query being built\r\n */\r\nexport class SelectQueryState {\r\n /**\r\n * Table definition for the query\r\n */\r\n public readonly table: TableDef;\r\n /**\r\n * Abstract Syntax Tree (AST) representation of the query\r\n */\r\n public readonly ast: SelectQueryNode;\r\n\r\n /**\r\n * Creates a new SelectQueryState instance\r\n * @param table - Table definition\r\n * @param ast - Optional existing AST\r\n */\r\n constructor(table: TableDef, ast?: SelectQueryNode) {\r\n this.table = table;\r\n this.ast = ast ?? {\r\n type: 'SelectQuery',\r\n from: { type: 'Table', name: table.name },\r\n columns: [],\r\n joins: []\r\n };\r\n }\r\n\r\n /**\r\n * Creates a new SelectQueryState with updated AST\r\n * @param nextAst - Updated AST\r\n * @returns New SelectQueryState instance\r\n */\r\n private clone(nextAst: SelectQueryNode): SelectQueryState {\r\n return new SelectQueryState(this.table, nextAst);\r\n }\r\n\r\n /**\r\n * Adds columns to the query\r\n * @param newCols - Columns to add\r\n * @returns New SelectQueryState with added columns\r\n */\r\n withColumns(newCols: ProjectionNode[]): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n columns: [...(this.ast.columns ?? []), ...newCols]\r\n });\r\n }\r\n\r\n /**\r\n * Adds a join to the query\r\n * @param join - Join node to add\r\n * @returns New SelectQueryState with added join\r\n */\r\n withJoin(join: JoinNode): SelectQueryState {\n return this.clone({\n ...this.ast,\n joins: [...(this.ast.joins ?? []), join]\n });\n }\n\n /**\n * Replaces the FROM clause.\n * @param from - Table source for the FROM clause\n * @returns New SelectQueryState with updated FROM\n */\n withFrom(from: TableSourceNode): SelectQueryState {\n return this.clone({\n ...this.ast,\n from\n });\n }\n\r\n /**\r\n * Adds a WHERE clause to the query\r\n * @param predicate - WHERE predicate expression\r\n * @returns New SelectQueryState with WHERE clause\r\n */\r\n withWhere(predicate: ExpressionNode): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n where: predicate\r\n });\r\n }\r\n\r\n /**\r\n * Adds a HAVING clause to the query\r\n * @param predicate - HAVING predicate expression\r\n * @returns New SelectQueryState with HAVING clause\r\n */\r\n withHaving(predicate: ExpressionNode): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n having: predicate\r\n });\r\n }\r\n\r\n /**\r\n * Adds GROUP BY columns to the query\r\n * @param columns - Columns to group by\r\n * @returns New SelectQueryState with GROUP BY clause\r\n */\r\n withGroupBy(columns: ColumnNode[]): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n groupBy: [...(this.ast.groupBy ?? []), ...columns]\r\n });\r\n }\r\n\r\n /**\r\n * Adds ORDER BY clauses to the query\r\n * @param orderBy - ORDER BY nodes\r\n * @returns New SelectQueryState with ORDER BY clause\r\n */\r\n withOrderBy(orderBy: OrderByNode[]): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n orderBy: [...(this.ast.orderBy ?? []), ...orderBy]\r\n });\r\n }\r\n\r\n /**\r\n * Adds DISTINCT columns to the query\r\n * @param columns - Columns to make distinct\r\n * @returns New SelectQueryState with DISTINCT clause\r\n */\r\n withDistinct(columns: ColumnNode[]): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n distinct: [...(this.ast.distinct ?? []), ...columns]\r\n });\r\n }\r\n\r\n /**\r\n * Adds a LIMIT clause to the query\r\n * @param limit - Maximum number of rows to return\r\n * @returns New SelectQueryState with LIMIT clause\r\n */\r\n withLimit(limit: number): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n limit\r\n });\r\n }\r\n\r\n /**\r\n * Adds an OFFSET clause to the query\r\n * @param offset - Number of rows to skip\r\n * @returns New SelectQueryState with OFFSET clause\r\n */\r\n withOffset(offset: number): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n offset\r\n });\r\n }\r\n\r\n /**\r\n * Adds a Common Table Expression (CTE) to the query\n * @param cte - CTE node to add\n * @returns New SelectQueryState with CTE\n */\n withCte(cte: CommonTableExpressionNode): SelectQueryState {\n return this.clone({\n ...this.ast,\n ctes: [...(this.ast.ctes ?? []), cte]\n });\n }\n\n /**\n * Adds a set operation (UNION/INTERSECT/EXCEPT) to the query\n * @param op - Set operation node to add\n * @returns New SelectQueryState with set operation\n */\n withSetOperation(op: SetOperationNode): SelectQueryState {\n return this.clone({\n ...this.ast,\n setOps: [...(this.ast.setOps ?? []), op]\n });\n }\n}\n","import { JoinNode } from './join.js';\nimport { ExpressionNode } from './expression.js';\nimport { JoinKind } from '../sql/sql.js';\nimport { JoinMetadata } from './join-metadata.js';\nimport { TableSourceNode, TableNode, FunctionTableNode } from './query.js';\n\n/**\n * Creates a JoinNode ready for AST insertion.\n * Centralizing this avoids copy/pasted object literals when multiple services need to synthesize joins.\n */\nexport const createJoinNode = (\n kind: JoinKind,\n tableName: string | TableSourceNode,\n condition: ExpressionNode,\n relationName?: string\n): JoinNode => ({\n type: 'Join',\n kind,\n table: typeof tableName === 'string'\n ? ({ type: 'Table', name: tableName } as TableNode)\n : (tableName as TableSourceNode),\n condition,\n meta: relationName ? ({ relationName } as JoinMetadata) : undefined\n});\n","import { TableDef } from '../schema/table.js';\nimport { RelationDef, RelationKinds } from '../schema/relation.js';\nimport { CommonTableExpressionNode, OrderByNode, SelectQueryNode } from '../core/ast/query.js';\nimport { HydrationPlan } from '../core/hydration/types.js';\nimport { HydrationPlanner } from './hydration-planner.js';\nimport { ProjectionNode, SelectQueryState } from './select-query-state.js';\nimport { ColumnNode, eq } from '../core/ast/expression.js';\nimport { createJoinNode } from '../core/ast/join-node.js';\nimport { JOIN_KINDS } from '../core/sql/sql.js';\n\r\n/**\r\n * Manages hydration planning for query results\r\n */\r\nexport class HydrationManager {\r\n /**\r\n * Creates a new HydrationManager instance\r\n * @param table - Table definition\r\n * @param planner - Hydration planner\r\n */\r\n constructor(\r\n private readonly table: TableDef,\r\n private readonly planner: HydrationPlanner\r\n ) {}\r\n\r\n /**\r\n * Creates a new HydrationManager with updated planner\r\n * @param nextPlanner - Updated hydration planner\r\n * @returns New HydrationManager instance\r\n */\r\n private clone(nextPlanner: HydrationPlanner): HydrationManager {\r\n return new HydrationManager(this.table, nextPlanner);\r\n }\r\n\r\n /**\r\n * Handles column selection for hydration planning\r\n * @param state - Current query state\r\n * @param newColumns - Newly selected columns\r\n * @returns Updated HydrationManager with captured columns\r\n */\r\n onColumnsSelected(state: SelectQueryState, newColumns: ProjectionNode[]): HydrationManager {\r\n const updated = this.planner.captureRootColumns(newColumns);\r\n return this.clone(updated);\r\n }\r\n\r\n /**\r\n * Handles relation inclusion for hydration planning\r\n * @param state - Current query state\r\n * @param relation - Relation definition\r\n * @param relationName - Name of the relation\r\n * @param aliasPrefix - Alias prefix for the relation\r\n * @param targetColumns - Target columns to include\r\n * @returns Updated HydrationManager with included relation\r\n */\r\n onRelationIncluded(\r\n state: SelectQueryState,\r\n relation: RelationDef,\r\n relationName: string,\r\n aliasPrefix: string,\r\n targetColumns: string[],\r\n pivot?: { aliasPrefix: string; columns: string[] }\r\n ): HydrationManager {\r\n const withRoots = this.planner.captureRootColumns(state.ast.columns);\r\n const next = withRoots.includeRelation(relation, relationName, aliasPrefix, targetColumns, pivot);\r\n return this.clone(next);\r\n }\r\n\r\n /**\n * Applies hydration plan to the AST\n * @param ast - Query AST to modify\n * @returns AST with hydration metadata\n */\n applyToAst(ast: SelectQueryNode): SelectQueryNode {\n // Hydration is not applied to compound set queries since row identity is ambiguous.\n if (ast.setOps && ast.setOps.length > 0) {\n return ast;\n }\n\n const plan = this.planner.getPlan();\n if (!plan) return ast;\n\n const needsPaginationGuard = this.requiresParentPagination(ast, plan);\n const rewritten = needsPaginationGuard ? this.wrapForParentPagination(ast, plan) : ast;\n return this.attachHydrationMeta(rewritten, plan);\n }\n\r\n /**\r\n * Gets the current hydration plan\r\n * @returns Hydration plan or undefined if none exists\r\n */\r\n getPlan(): HydrationPlan | undefined {\n return this.planner.getPlan();\n }\n\n /**\n * Attaches hydration metadata to a query AST node.\n */\n private attachHydrationMeta(ast: SelectQueryNode, plan: HydrationPlan): SelectQueryNode {\n return {\n ...ast,\n meta: {\n ...(ast.meta || {}),\n hydration: plan\n }\n };\n }\n\n /**\n * Determines whether the query needs pagination rewriting to keep LIMIT/OFFSET\n * applied to parent rows when eager-loading multiplicative relations.\n */\n private requiresParentPagination(ast: SelectQueryNode, plan: HydrationPlan): boolean {\n const hasPagination = ast.limit !== undefined || ast.offset !== undefined;\n return hasPagination && this.hasMultiplyingRelations(plan);\n }\n\n private hasMultiplyingRelations(plan: HydrationPlan): boolean {\n return plan.relations.some(\n rel => rel.type === RelationKinds.HasMany || rel.type === RelationKinds.BelongsToMany\n );\n }\n\n /**\n * Rewrites the query using CTEs so LIMIT/OFFSET target distinct parent rows\n * instead of the joined result set.\n *\n * The strategy:\n * - Hoist the original query (minus limit/offset) into a base CTE.\n * - Select distinct parent ids from that base CTE with the original ordering and pagination.\n * - Join the base CTE against the paged ids to retrieve the joined rows for just that page.\n */\n private wrapForParentPagination(ast: SelectQueryNode, plan: HydrationPlan): SelectQueryNode {\n const projectionNames = this.getProjectionNames(ast.columns);\n if (!projectionNames) {\n return ast;\n }\n\n const projectionAliases = this.buildProjectionAliasMap(ast.columns);\n const projectionSet = new Set(projectionNames);\n const rootPkAlias = projectionAliases.get(`${plan.rootTable}.${plan.rootPrimaryKey}`) ?? plan.rootPrimaryKey;\n\n const baseCteName = this.nextCteName(ast.ctes, '__metal_pagination_base');\n const baseQuery: SelectQueryNode = {\n ...ast,\n ctes: undefined,\n limit: undefined,\n offset: undefined,\n orderBy: undefined,\n meta: undefined\n };\n\n const baseCte: CommonTableExpressionNode = {\n type: 'CommonTableExpression',\n name: baseCteName,\n query: baseQuery,\n recursive: false\n };\n\n const orderBy = this.mapOrderBy(ast.orderBy, plan, projectionAliases, baseCteName, projectionSet);\n // When an order-by uses child-table columns we cannot safely rewrite pagination,\n // so preserve the original query to avoid changing semantics.\n if (orderBy === null) {\n return ast;\n }\n\n const pageCteName = this.nextCteName([...(ast.ctes ?? []), baseCte], '__metal_pagination_page');\n const pagingColumns = this.buildPagingColumns(rootPkAlias, orderBy, baseCteName);\n\n const pageCte: CommonTableExpressionNode = {\n type: 'CommonTableExpression',\n name: pageCteName,\n query: {\n type: 'SelectQuery',\n from: { type: 'Table', name: baseCteName },\n columns: pagingColumns,\n joins: [],\n distinct: [{ type: 'Column', table: baseCteName, name: rootPkAlias }],\n orderBy,\n limit: ast.limit,\n offset: ast.offset\n },\n recursive: false\n };\n\n const joinCondition = eq(\n { type: 'Column', table: baseCteName, name: rootPkAlias },\n { type: 'Column', table: pageCteName, name: rootPkAlias }\n );\n\n const outerColumns: ColumnNode[] = projectionNames.map(name => ({\n type: 'Column',\n table: baseCteName,\n name,\n alias: name\n }));\n\n return {\n type: 'SelectQuery',\n from: { type: 'Table', name: baseCteName },\n columns: outerColumns,\n joins: [createJoinNode(JOIN_KINDS.INNER, pageCteName, joinCondition)],\n orderBy,\n ctes: [...(ast.ctes ?? []), baseCte, pageCte]\n };\n }\n\n private nextCteName(existing: CommonTableExpressionNode[] | undefined, baseName: string): string {\n const names = new Set((existing ?? []).map(cte => cte.name));\n let candidate = baseName;\n let suffix = 1;\n\n while (names.has(candidate)) {\n suffix += 1;\n candidate = `${baseName}_${suffix}`;\n }\n\n return candidate;\n }\n\n private getProjectionNames(columns: ProjectionNode[]): string[] | undefined {\n const names: string[] = [];\n for (const col of columns) {\n const alias = (col as any).alias ?? (col as any).name;\n if (!alias) return undefined;\n names.push(alias);\n }\n return names;\n }\n\n private buildProjectionAliasMap(columns: ProjectionNode[]): Map<string, string> {\n const map = new Map<string, string>();\n for (const col of columns) {\n if ((col as ColumnNode).type !== 'Column') continue;\n const node = col as ColumnNode;\n const key = `${node.table}.${node.name}`;\n map.set(key, node.alias ?? node.name);\n }\n return map;\n }\n\n private mapOrderBy(\n orderBy: OrderByNode[] | undefined,\n plan: HydrationPlan,\n projectionAliases: Map<string, string>,\n baseAlias: string,\n availableColumns: Set<string>\n ): OrderByNode[] | undefined | null {\n if (!orderBy || orderBy.length === 0) {\n return undefined;\n }\n\n const mapped: OrderByNode[] = [];\n\n for (const ob of orderBy) {\n // Only rewrite when ordering by root columns; child columns would reintroduce the pagination bug.\n if (ob.column.table !== plan.rootTable) {\n return null;\n }\n\n const alias = projectionAliases.get(`${ob.column.table}.${ob.column.name}`) ?? ob.column.name;\n if (!availableColumns.has(alias)) {\n return null;\n }\n\n mapped.push({\n type: 'OrderBy',\n column: { type: 'Column', table: baseAlias, name: alias },\n direction: ob.direction\n });\n }\n\n return mapped;\n }\n\n private buildPagingColumns(primaryKey: string, orderBy: OrderByNode[] | undefined, tableAlias: string): ColumnNode[] {\n const columns: ColumnNode[] = [{ type: 'Column', table: tableAlias, name: primaryKey, alias: primaryKey }];\n\n if (!orderBy) return columns;\n\n for (const ob of orderBy) {\n if (!columns.some(col => col.name === ob.column.name)) {\n columns.push({\n type: 'Column',\n table: tableAlias,\n name: ob.column.name,\n alias: ob.column.name\n });\n }\n }\n\n return columns;\n }\n}\n","/**\n * Separator used when projecting relational columns\n */\nconst RELATION_SEPARATOR = '__';\n\n/**\n * Parts of a relation alias\n */\nexport interface RelationAliasParts {\n /**\n * Relation name (left side of the separator)\n */\n relationName: string;\n /**\n * Column name (right side of the separator)\n */\n columnName: string;\n}\n\n/**\n * Builds a relation alias from the relation name and column name components.\n */\nexport const makeRelationAlias = (relationName: string, columnName: string): string =>\n `${relationName}${RELATION_SEPARATOR}${columnName}`;\n\n/**\n * Parses a relation alias into its relation/column components.\n * Returns `null` when the alias does not follow the `relation__column` pattern.\n */\nexport const parseRelationAlias = (alias: string): RelationAliasParts | null => {\n const idx = alias.indexOf(RELATION_SEPARATOR);\n if (idx === -1) return null;\n return {\n relationName: alias.slice(0, idx),\n columnName: alias.slice(idx + RELATION_SEPARATOR.length)\n };\n};\n\n/**\n * Determines whether an alias represents a relation column by checking the `__` convention.\n */\nexport const isRelationAlias = (alias?: string): boolean =>\n !!alias && alias.includes(RELATION_SEPARATOR);\n","import { BelongsToManyRelation } from '../schema/relation.js';\r\n\r\n/**\r\n * Builds a default set of pivot columns, excluding keys used for joins.\r\n */\r\nexport const buildDefaultPivotColumns = (\r\n rel: BelongsToManyRelation,\r\n pivotPk: string\r\n): string[] => {\r\n const excluded = new Set([pivotPk, rel.pivotForeignKeyToRoot, rel.pivotForeignKeyToTarget]);\r\n return Object.keys(rel.pivotTable.columns).filter(col => !excluded.has(col));\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { RelationDef, RelationKinds, BelongsToManyRelation } from '../schema/relation.js';\r\nimport { ProjectionNode } from './select-query-state.js';\r\nimport { HydrationPlan, HydrationRelationPlan } from '../core/hydration/types.js';\nimport { isRelationAlias } from './relation-alias.js';\r\nimport { buildDefaultPivotColumns } from './relation-utils.js';\r\n\r\n/**\r\n * Finds the primary key column name for a table\r\n * @param table - Table definition\r\n * @returns Name of the primary key column, defaults to 'id'\r\n */\r\nexport const findPrimaryKey = (table: TableDef): string => {\r\n const pk = Object.values(table.columns).find(c => c.primary);\r\n return pk?.name || 'id';\r\n};\r\n\r\n/**\r\n * Manages hydration planning for query results\r\n */\r\nexport class HydrationPlanner {\r\n /**\r\n * Creates a new HydrationPlanner instance\r\n * @param table - Table definition\r\n * @param plan - Optional existing hydration plan\r\n */\r\n constructor(private readonly table: TableDef, private readonly plan?: HydrationPlan) { }\r\n\r\n /**\r\n * Captures root table columns for hydration planning\r\n * @param columns - Columns to capture\r\n * @returns Updated HydrationPlanner with captured columns\r\n */\r\n captureRootColumns(columns: ProjectionNode[]): HydrationPlanner {\r\n const currentPlan = this.getPlanOrDefault();\r\n const rootCols = new Set(currentPlan.rootColumns);\r\n let changed = false;\r\n\r\n columns.forEach(node => {\r\n if (node.type !== 'Column') return;\r\n if (node.table !== this.table.name) return;\r\n\r\n const alias = node.alias || node.name;\r\n if (isRelationAlias(alias)) return;\r\n if (!rootCols.has(alias)) {\r\n rootCols.add(alias);\r\n changed = true;\r\n }\r\n });\r\n\r\n if (!changed) return this;\r\n return new HydrationPlanner(this.table, {\r\n ...currentPlan,\r\n rootColumns: Array.from(rootCols)\r\n });\r\n }\r\n\r\n /**\r\n * Includes a relation in the hydration plan\r\n * @param rel - Relation definition\r\n * @param relationName - Name of the relation\r\n * @param aliasPrefix - Alias prefix for relation columns\r\n * @param columns - Columns to include from the relation\r\n * @returns Updated HydrationPlanner with included relation\r\n */\r\n includeRelation(\r\n rel: RelationDef,\r\n relationName: string,\r\n aliasPrefix: string,\r\n columns: string[],\r\n pivot?: { aliasPrefix: string; columns: string[] }\r\n ): HydrationPlanner {\r\n const currentPlan = this.getPlanOrDefault();\r\n const relations = currentPlan.relations.filter(r => r.name !== relationName);\r\n relations.push(this.buildRelationPlan(rel, relationName, aliasPrefix, columns, pivot));\r\n return new HydrationPlanner(this.table, {\r\n ...currentPlan,\r\n relations\r\n });\r\n }\r\n\r\n /**\r\n * Gets the current hydration plan\r\n * @returns Current hydration plan or undefined\r\n */\r\n getPlan(): HydrationPlan | undefined {\r\n return this.plan;\r\n }\r\n\r\n /**\r\n * Gets the current hydration plan or creates a default one\r\n * @returns Current hydration plan or default plan\r\n */\r\n private getPlanOrDefault(): HydrationPlan {\r\n return this.plan ?? buildDefaultHydrationPlan(this.table);\r\n }\r\n\r\n /**\r\n * Builds a relation plan for hydration\r\n * @param rel - Relation definition\r\n * @param relationName - Name of the relation\r\n * @param aliasPrefix - Alias prefix for relation columns\r\n * @param columns - Columns to include from the relation\r\n * @returns Hydration relation plan\r\n */\r\n private buildRelationPlan(\r\n rel: RelationDef,\r\n relationName: string,\r\n aliasPrefix: string,\r\n columns: string[],\r\n pivot?: { aliasPrefix: string; columns: string[] }\r\n ): HydrationRelationPlan {\r\n switch (rel.type) {\r\n case RelationKinds.HasMany:\n case RelationKinds.HasOne: {\n const localKey = rel.localKey || findPrimaryKey(this.table);\n return {\n name: relationName,\n aliasPrefix,\n type: rel.type,\n targetTable: rel.target.name,\r\n targetPrimaryKey: findPrimaryKey(rel.target),\r\n foreignKey: rel.foreignKey,\r\n localKey,\r\n columns\r\n };\r\n }\r\n case RelationKinds.BelongsTo: {\r\n const localKey = rel.localKey || findPrimaryKey(rel.target);\r\n return {\r\n name: relationName,\r\n aliasPrefix,\r\n type: rel.type,\r\n targetTable: rel.target.name,\r\n targetPrimaryKey: findPrimaryKey(rel.target),\r\n foreignKey: rel.foreignKey,\r\n localKey,\r\n columns\r\n };\r\n }\r\n case RelationKinds.BelongsToMany: {\r\n const many = rel as BelongsToManyRelation;\r\n const localKey = many.localKey || findPrimaryKey(this.table);\r\n const targetPk = many.targetKey || findPrimaryKey(many.target);\r\n const pivotPk = many.pivotPrimaryKey || findPrimaryKey(many.pivotTable);\r\n const pivotAliasPrefix = pivot?.aliasPrefix ?? `${aliasPrefix}_pivot`;\r\n const pivotColumns =\r\n pivot?.columns ??\r\n many.defaultPivotColumns ??\r\n buildDefaultPivotColumns(many, pivotPk);\r\n\r\n return {\r\n name: relationName,\r\n aliasPrefix,\r\n type: rel.type,\r\n targetTable: many.target.name,\r\n targetPrimaryKey: targetPk,\r\n foreignKey: many.pivotForeignKeyToRoot,\r\n localKey,\r\n columns,\r\n pivot: {\r\n table: many.pivotTable.name,\r\n primaryKey: pivotPk,\r\n aliasPrefix: pivotAliasPrefix,\r\n columns: pivotColumns\r\n }\r\n };\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Builds a default hydration plan for a table\r\n * @param table - Table definition\r\n * @returns Default hydration plan\r\n */\r\nconst buildDefaultHydrationPlan = (table: TableDef): HydrationPlan => ({\r\n rootTable: table.name,\r\n rootPrimaryKey: findPrimaryKey(table),\r\n rootColumns: [],\r\n relations: []\r\n});\r\n","import { ColumnNode } from '../core/ast/expression.js';\r\nimport { CommonTableExpressionNode } from '../core/ast/query.js';\r\n\r\n/**\r\n * Best-effort helper that tries to convert a raw column expression into a `ColumnNode`.\r\n * This parser is intentionally limited; use it only for simple references or function calls.\r\n */\r\nexport const parseRawColumn = (\r\n col: string,\r\n tableName: string,\r\n ctes?: CommonTableExpressionNode[]\r\n): ColumnNode => {\r\n if (col.includes('(')) {\r\n const [fn, rest] = col.split('(');\r\n const colName = rest.replace(')', '');\r\n const [table, name] = colName.includes('.') ? colName.split('.') : [tableName, colName];\r\n return { type: 'Column', table, name, alias: col };\r\n }\r\n\r\n if (col.includes('.')) {\r\n const [potentialCteName, columnName] = col.split('.');\r\n const hasCte = ctes?.some(cte => cte.name === potentialCteName);\r\n\r\n if (hasCte) {\r\n return { type: 'Column', table: tableName, name: col };\r\n }\r\n\r\n return { type: 'Column', table: potentialCteName, name: columnName };\r\n }\r\n\r\n return { type: 'Column', table: tableName, name: col };\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { SelectQueryNode, CommonTableExpressionNode, SetOperationKind, SetOperationNode, TableSourceNode } from '../core/ast/query.js';\nimport { buildColumnNode } from '../core/ast/builders.js';\r\nimport {\r\n ColumnNode,\r\n ExpressionNode,\r\n FunctionNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode,\r\n ScalarSubqueryNode,\r\n and,\r\n isExpressionSelectionNode\r\n} from '../core/ast/expression.js';\r\nimport { JoinNode } from '../core/ast/join.js';\r\nimport { SelectQueryState, ProjectionNode } from './select-query-state.js';\r\nimport { OrderDirection } from '../core/sql/sql.js';\r\nimport { parseRawColumn } from './raw-column-parser.js';\r\n\r\n/**\r\n * Result of column selection operation\r\n */\r\nexport interface ColumnSelectionResult {\r\n /**\r\n * Updated query state\r\n */\r\n state: SelectQueryState;\r\n /**\r\n * Columns that were added\r\n */\r\n addedColumns: ProjectionNode[];\r\n}\r\n\r\n/**\r\n * Service for manipulating query AST (Abstract Syntax Tree)\r\n */\r\nexport class QueryAstService {\r\n /**\r\n * Creates a new QueryAstService instance\r\n * @param table - Table definition\r\n * @param state - Current query state\r\n */\r\n constructor(private readonly table: TableDef, private readonly state: SelectQueryState) {}\r\n\r\n /**\r\n * Selects columns for the query\r\n * @param columns - Columns to select (key: alias, value: column definition or expression)\r\n * @returns Column selection result with updated state and added columns\r\n */\r\n select(\n columns: Record<string, ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode>\n ): ColumnSelectionResult {\n const existingAliases = new Set(\n this.state.ast.columns.map(c => (c as ColumnNode).alias || (c as ColumnNode).name)\n );\n const from = this.state.ast.from;\n const rootTableName = from.type === 'Table' && from.alias ? from.alias : this.table.name;\n\n const newCols = Object.entries(columns).reduce<ProjectionNode[]>((acc, [alias, val]) => {\n if (existingAliases.has(alias)) return acc;\n\n if (isExpressionSelectionNode(val)) {\n acc.push({ ...(val as FunctionNode | CaseExpressionNode | WindowFunctionNode), alias } as ProjectionNode);\n return acc;\n }\n\n const colDef = val as ColumnDef;\n const resolvedTable =\n colDef.table && colDef.table === this.table.name && from.type === 'Table' && from.alias\n ? from.alias\n : colDef.table || rootTableName;\n acc.push({\n type: 'Column',\n table: resolvedTable,\n name: colDef.name,\n alias\n } as ColumnNode);\n return acc;\n }, []);\n\r\n const nextState = this.state.withColumns(newCols);\r\n return { state: nextState, addedColumns: newCols };\r\n }\r\n\r\n /**\r\n * Selects raw column expressions (best-effort parser for simple references/functions)\r\n * @param cols - Raw column expressions\r\n * @returns Column selection result with updated state and added columns\r\n */\r\n selectRaw(cols: string[]): ColumnSelectionResult {\n const from = this.state.ast.from;\n const defaultTable = from.type === 'Table' && from.alias ? from.alias : this.table.name;\n const newCols = cols.map(col => parseRawColumn(col, defaultTable, this.state.ast.ctes));\n const nextState = this.state.withColumns(newCols);\n return { state: nextState, addedColumns: newCols };\n }\n\r\n /**\r\n * Adds a Common Table Expression (CTE) to the query\r\n * @param name - Name of the CTE\r\n * @param query - Query for the CTE\r\n * @param columns - Optional column names for the CTE\r\n * @param recursive - Whether the CTE is recursive\r\n * @returns Updated query state with CTE\r\n */\r\n withCte(name: string, query: SelectQueryNode, columns?: string[], recursive = false): SelectQueryState {\n const cte: CommonTableExpressionNode = {\n type: 'CommonTableExpression',\n name,\n query,\n columns,\n recursive\n };\n\n return this.state.withCte(cte);\n }\n\n /**\n * Adds a set operation (UNION/UNION ALL/INTERSECT/EXCEPT) to the query\n * @param operator - Set operator\n * @param query - Right-hand side query\n * @returns Updated query state with set operation\n */\n withSetOperation(operator: SetOperationKind, query: SelectQueryNode): SelectQueryState {\n const op: SetOperationNode = {\n type: 'SetOperation',\n operator,\n query\n };\n return this.state.withSetOperation(op);\n }\n\n /**\n * Replaces the FROM clause for the current query.\n * @param from - Table source to use in the FROM clause\n * @returns Updated query state with new FROM\n */\n withFrom(from: TableSourceNode): SelectQueryState {\n return this.state.withFrom(from);\n }\n\r\n /**\r\n * Selects a subquery as a column\r\n * @param alias - Alias for the subquery\r\n * @param query - Subquery to select\r\n * @returns Updated query state with subquery selection\r\n */\r\n selectSubquery(alias: string, query: SelectQueryNode): SelectQueryState {\r\n const node: ScalarSubqueryNode = { type: 'ScalarSubquery', query, alias };\r\n return this.state.withColumns([node]);\r\n }\r\n\r\n /**\r\n * Adds a JOIN clause to the query\r\n * @param join - Join node to add\r\n * @returns Updated query state with JOIN\r\n */\r\n withJoin(join: JoinNode): SelectQueryState {\r\n return this.state.withJoin(join);\r\n }\r\n\r\n /**\r\n * Adds a WHERE clause to the query\r\n * @param expr - Expression for the WHERE clause\r\n * @returns Updated query state with WHERE clause\r\n */\r\n withWhere(expr: ExpressionNode): SelectQueryState {\r\n const combined = this.combineExpressions(this.state.ast.where, expr);\r\n return this.state.withWhere(combined);\r\n }\r\n\r\n /**\r\n * Adds a GROUP BY clause to the query\r\n * @param col - Column to group by\r\n * @returns Updated query state with GROUP BY clause\r\n */\r\n withGroupBy(col: ColumnDef | ColumnNode): SelectQueryState {\n const from = this.state.ast.from;\n const tableRef = from.type === 'Table' && from.alias ? { ...this.table, alias: from.alias } : this.table;\n const node = buildColumnNode(tableRef, col);\n return this.state.withGroupBy([node]);\n }\n\r\n /**\r\n * Adds a HAVING clause to the query\r\n * @param expr - Expression for the HAVING clause\r\n * @returns Updated query state with HAVING clause\r\n */\r\n withHaving(expr: ExpressionNode): SelectQueryState {\r\n const combined = this.combineExpressions(this.state.ast.having, expr);\r\n return this.state.withHaving(combined);\r\n }\r\n\r\n /**\r\n * Adds an ORDER BY clause to the query\r\n * @param col - Column to order by\r\n * @param direction - Order direction (ASC/DESC)\r\n * @returns Updated query state with ORDER BY clause\r\n */\r\n withOrderBy(col: ColumnDef | ColumnNode, direction: OrderDirection): SelectQueryState {\n const from = this.state.ast.from;\n const tableRef = from.type === 'Table' && from.alias ? { ...this.table, alias: from.alias } : this.table;\n const node = buildColumnNode(tableRef, col);\n return this.state.withOrderBy([{ type: 'OrderBy', column: node, direction }]);\n }\n\r\n /**\r\n * Adds a DISTINCT clause to the query\r\n * @param cols - Columns to make distinct\r\n * @returns Updated query state with DISTINCT clause\r\n */\r\n withDistinct(cols: ColumnNode[]): SelectQueryState {\r\n return this.state.withDistinct(cols);\r\n }\r\n\r\n /**\r\n * Adds a LIMIT clause to the query\r\n * @param limit - Maximum number of rows to return\r\n * @returns Updated query state with LIMIT clause\r\n */\r\n withLimit(limit: number): SelectQueryState {\r\n return this.state.withLimit(limit);\r\n }\r\n\r\n /**\r\n * Adds an OFFSET clause to the query\r\n * @param offset - Number of rows to skip\r\n * @returns Updated query state with OFFSET clause\r\n */\r\n withOffset(offset: number): SelectQueryState {\r\n return this.state.withOffset(offset);\r\n }\r\n\r\n /**\r\n * Combines expressions with AND operator\r\n * @param existing - Existing expression\r\n * @param next - New expression to combine\r\n * @returns Combined expression\r\n */\r\n private combineExpressions(existing: ExpressionNode | undefined, next: ExpressionNode): ExpressionNode {\r\n return existing ? and(existing, next) : next;\r\n }\r\n\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { SelectQueryState } from './select-query-state.js';\r\nimport { HydrationManager } from './hydration-manager.js';\r\nimport { ColumnNode } from '../core/ast/expression.js';\r\nimport { findPrimaryKey } from './hydration-planner.js';\r\nimport { isRelationAlias } from './relation-alias.js';\r\n\r\n/**\r\n * Result of a relation operation\r\n */\r\nexport interface RelationResult {\r\n /**\r\n * Updated query state\r\n */\r\n state: SelectQueryState;\r\n /**\r\n * Updated hydration manager\r\n */\r\n hydration: HydrationManager;\r\n}\r\n\r\n/**\r\n * Callback function for selecting columns\r\n */\r\ntype SelectColumnsCallback = (\r\n state: SelectQueryState,\r\n hydration: HydrationManager,\r\n columns: Record<string, ColumnDef>\r\n) => RelationResult;\r\n\r\n/**\r\n * Helper class for managing relation projections in queries\r\n */\r\nexport class RelationProjectionHelper {\r\n /**\r\n * Creates a new RelationProjectionHelper instance\r\n * @param table - Table definition\r\n * @param selectColumns - Callback for selecting columns\r\n */\r\n constructor(\r\n private readonly table: TableDef,\r\n private readonly selectColumns: SelectColumnsCallback\r\n ) {}\r\n\r\n /**\r\n * Ensures base projection is included in the query\r\n * @param state - Current query state\r\n * @param hydration - Hydration manager\r\n * @returns Relation result with updated state and hydration\r\n */\r\n ensureBaseProjection(state: SelectQueryState, hydration: HydrationManager): RelationResult {\r\n const primaryKey = findPrimaryKey(this.table);\r\n\r\n if (!this.hasBaseProjection(state)) {\r\n return this.selectColumns(state, hydration, this.getBaseColumns());\r\n }\r\n\r\n if (primaryKey && !this.hasPrimarySelected(state, primaryKey) && this.table.columns[primaryKey]) {\r\n return this.selectColumns(state, hydration, {\r\n [primaryKey]: this.table.columns[primaryKey]\r\n });\r\n }\r\n\r\n return { state, hydration };\r\n }\r\n\r\n /**\r\n * Checks if base projection exists in the query\r\n * @param state - Current query state\r\n * @returns True if base projection exists\r\n */\r\n private hasBaseProjection(state: SelectQueryState): boolean {\r\n return state.ast.columns.some(col => !isRelationAlias((col as ColumnNode).alias));\r\n }\r\n\r\n /**\r\n * Checks if primary key is selected in the query\r\n * @param state - Current query state\r\n * @param primaryKey - Primary key name\r\n * @returns True if primary key is selected\r\n */\r\n private hasPrimarySelected(state: SelectQueryState, primaryKey: string): boolean {\r\n return state.ast.columns.some(col => {\r\n const alias = (col as ColumnNode).alias;\r\n const name = alias || (col as ColumnNode).name;\r\n return !isRelationAlias(alias) && name === primaryKey;\r\n });\r\n }\r\n\r\n /**\r\n * Gets all base columns for the table\r\n * @returns Record of all table columns\r\n */\r\n private getBaseColumns(): Record<string, ColumnDef> {\r\n return Object.keys(this.table.columns).reduce((acc, key) => {\r\n acc[key] = (this.table.columns as Record<string, ColumnDef>)[key];\r\n return acc;\r\n }, {} as Record<string, ColumnDef>);\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { RelationDef, RelationKinds, BelongsToManyRelation } from '../schema/relation.js';\r\nimport { ExpressionNode, eq, and } from '../core/ast/expression.js';\r\nimport { findPrimaryKey } from './hydration-planner.js';\r\nimport { JoinNode } from '../core/ast/join.js';\r\nimport { JoinKind } from '../core/sql/sql.js';\r\nimport { createJoinNode } from '../core/ast/join-node.js';\r\n\r\n/**\r\n * Utility function to handle unreachable code paths\r\n * @param value - Value that should never occur\r\n * @throws Error indicating unhandled relation type\r\n */\r\nconst assertNever = (value: never): never => {\r\n throw new Error(`Unhandled relation type: ${JSON.stringify(value)}`);\r\n};\r\n\r\n/**\r\n * Builds the base condition for a relation join\r\n * @param root - Root table definition\r\n * @param relation - Relation definition\r\n * @returns Expression node representing the join condition\r\n */\r\nconst baseRelationCondition = (root: TableDef, relation: RelationDef, rootAlias?: string): ExpressionNode => {\n const rootTable = rootAlias || root.name;\n const defaultLocalKey =\n relation.type === RelationKinds.HasMany || relation.type === RelationKinds.HasOne\n ? findPrimaryKey(root)\n : findPrimaryKey(relation.target);\n const localKey = relation.localKey || defaultLocalKey;\n\r\n switch (relation.type) {\r\n case RelationKinds.HasMany:\n case RelationKinds.HasOne:\n return eq(\n { type: 'Column', table: relation.target.name, name: relation.foreignKey },\n { type: 'Column', table: rootTable, name: localKey }\n );\n case RelationKinds.BelongsTo:\n return eq(\n { type: 'Column', table: relation.target.name, name: localKey },\n { type: 'Column', table: rootTable, name: relation.foreignKey }\n );\n case RelationKinds.BelongsToMany:\r\n throw new Error('BelongsToMany relations do not support the standard join condition builder');\r\n default:\r\n return assertNever(relation);\r\n }\r\n};\r\n\r\n/**\r\n * Builds the join nodes required to include a BelongsToMany relation.\r\n */\r\nexport const buildBelongsToManyJoins = (\n root: TableDef,\n relationName: string,\n relation: BelongsToManyRelation,\n joinKind: JoinKind,\n extra?: ExpressionNode,\n rootAlias?: string\n): JoinNode[] => {\n const rootKey = relation.localKey || findPrimaryKey(root);\n const targetKey = relation.targetKey || findPrimaryKey(relation.target);\n const rootTable = rootAlias || root.name;\n\n const pivotCondition = eq(\n { type: 'Column', table: relation.pivotTable.name, name: relation.pivotForeignKeyToRoot },\n { type: 'Column', table: rootTable, name: rootKey }\n );\n\r\n const pivotJoin = createJoinNode(joinKind, relation.pivotTable.name, pivotCondition);\r\n\r\n let targetCondition: ExpressionNode = eq(\r\n { type: 'Column', table: relation.target.name, name: targetKey },\r\n { type: 'Column', table: relation.pivotTable.name, name: relation.pivotForeignKeyToTarget }\r\n );\r\n\r\n if (extra) {\r\n targetCondition = and(targetCondition, extra);\r\n }\r\n\r\n const targetJoin = createJoinNode(\r\n joinKind,\r\n relation.target.name,\r\n targetCondition,\r\n relationName\r\n );\r\n\r\n return [pivotJoin, targetJoin];\r\n};\r\n\r\n/**\r\n * Builds a relation join condition with optional extra conditions\r\n * @param root - Root table definition\r\n * @param relation - Relation definition\r\n * @param extra - Optional additional expression to combine with AND\r\n * @returns Expression node representing the complete join condition\r\n */\r\nexport const buildRelationJoinCondition = (\n root: TableDef,\n relation: RelationDef,\n extra?: ExpressionNode,\n rootAlias?: string\n): ExpressionNode => {\n const base = baseRelationCondition(root, relation, rootAlias);\n return extra ? and(base, extra) : base;\n};\n\r\n/**\r\n * Builds a relation correlation condition for subqueries\r\n * @param root - Root table definition\r\n * @param relation - Relation definition\r\n * @returns Expression node representing the correlation condition\r\n */\r\nexport const buildRelationCorrelation = (root: TableDef, relation: RelationDef, rootAlias?: string): ExpressionNode => {\n return baseRelationCondition(root, relation, rootAlias);\n};\n","import { JoinNode } from './join.js';\n\n/**\n * Metadata stored on JoinNode.meta for higher-level concerns.\n */\nexport interface JoinMetadata {\n relationName?: string;\n [key: string]: unknown;\n}\n\n/**\n * Retrieves the relation name from join metadata if present.\n */\nexport const getJoinRelationName = (join: JoinNode): string | undefined =>\n (join.meta as JoinMetadata | undefined)?.relationName;\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { RelationDef, RelationKinds, BelongsToManyRelation } from '../schema/relation.js';\r\nimport { SelectQueryNode } from '../core/ast/query.js';\r\nimport {\r\n ColumnNode,\r\n ExpressionNode,\r\n and\r\n} from '../core/ast/expression.js';\r\nimport { SelectQueryState } from './select-query-state.js';\r\nimport { HydrationManager } from './hydration-manager.js';\r\nimport { QueryAstService } from './query-ast-service.js';\r\nimport { findPrimaryKey } from './hydration-planner.js';\r\nimport { RelationProjectionHelper } from './relation-projection-helper.js';\r\nimport type { RelationResult } from './relation-projection-helper.js';\r\nimport {\r\n buildRelationJoinCondition,\r\n buildRelationCorrelation,\r\n buildBelongsToManyJoins\r\n} from './relation-conditions.js';\r\nimport { JoinKind, JOIN_KINDS } from '../core/sql/sql.js';\r\nimport { RelationIncludeOptions } from './relation-types.js';\r\nimport { createJoinNode } from '../core/ast/join-node.js';\nimport { getJoinRelationName } from '../core/ast/join-metadata.js';\nimport { makeRelationAlias } from './relation-alias.js';\r\nimport { buildDefaultPivotColumns } from './relation-utils.js';\r\n\r\n/**\r\n * Service for handling relation operations (joins, includes, etc.)\r\n */\r\nexport class RelationService {\r\n private readonly projectionHelper: RelationProjectionHelper;\r\n\r\n /**\r\n * Creates a new RelationService instance\r\n * @param table - Table definition\r\n * @param state - Current query state\r\n * @param hydration - Hydration manager\r\n */\r\n constructor(\r\n private readonly table: TableDef,\r\n private readonly state: SelectQueryState,\r\n private readonly hydration: HydrationManager,\r\n private readonly createQueryAstService: (table: TableDef, state: SelectQueryState) => QueryAstService\r\n ) {\r\n this.projectionHelper = new RelationProjectionHelper(table, (state, hydration, columns) =>\r\n this.selectColumns(state, hydration, columns)\r\n );\r\n }\r\n\r\n /**\r\n * Joins a relation to the query\r\n * @param relationName - Name of the relation to join\r\n * @param joinKind - Type of join to use\r\n * @param extraCondition - Additional join condition\r\n * @returns Relation result with updated state and hydration\r\n */\r\n joinRelation(\r\n relationName: string,\r\n joinKind: JoinKind,\r\n extraCondition?: ExpressionNode\r\n ): RelationResult {\r\n const nextState = this.withJoin(this.state, relationName, joinKind, extraCondition);\r\n return { state: nextState, hydration: this.hydration };\r\n }\r\n\r\n /**\r\n * Matches records based on a relation with an optional predicate\r\n * @param relationName - Name of the relation to match\r\n * @param predicate - Optional predicate expression\r\n * @returns Relation result with updated state and hydration\r\n */\r\n match(\n relationName: string,\n predicate?: ExpressionNode\n ): RelationResult {\n const joined = this.joinRelation(relationName, JOIN_KINDS.INNER, predicate);\n const pk = findPrimaryKey(this.table);\n const distinctCols: ColumnNode[] = [{ type: 'Column', table: this.rootTableName(), name: pk }];\n const existingDistinct = joined.state.ast.distinct ? joined.state.ast.distinct : [];\n const nextState = this.astService(joined.state).withDistinct([...existingDistinct, ...distinctCols]);\n return { state: nextState, hydration: joined.hydration };\n }\n\r\n /**\r\n * Includes a relation in the query result\r\n * @param relationName - Name of the relation to include\r\n * @param options - Options for relation inclusion\r\n * @returns Relation result with updated state and hydration\r\n */\r\n include(relationName: string, options?: RelationIncludeOptions): RelationResult {\r\n let state = this.state;\r\n let hydration = this.hydration;\r\n\r\n const relation = this.getRelation(relationName);\r\n const aliasPrefix = options?.aliasPrefix ?? relationName;\r\n const alreadyJoined = state.ast.joins.some(j => getJoinRelationName(j) === relationName);\n\r\n if (!alreadyJoined) {\r\n const joined = this.joinRelation(relationName, options?.joinKind ?? JOIN_KINDS.LEFT, options?.filter);\r\n state = joined.state;\r\n }\r\n\r\n const projectionResult = this.projectionHelper.ensureBaseProjection(state, hydration);\r\n state = projectionResult.state;\r\n hydration = projectionResult.hydration;\r\n\r\n const targetColumns = options?.columns?.length\r\n ? options.columns\r\n : Object.keys(relation.target.columns);\r\n\r\n const buildTypedSelection = (\r\n columns: Record<string, ColumnDef>,\r\n prefix: string,\r\n keys: string[],\r\n missingMsg: (col: string) => string\r\n ) : Record<string, ColumnDef> => {\r\n return keys.reduce((acc, key) => {\r\n const def = columns[key];\r\n if (!def) {\r\n throw new Error(missingMsg(key));\r\n }\r\n acc[makeRelationAlias(prefix, key)] = def;\r\n return acc;\r\n }, {} as Record<string, ColumnDef>);\r\n };\r\n\r\n const targetSelection = buildTypedSelection(\r\n relation.target.columns as Record<string, ColumnDef>,\r\n aliasPrefix,\r\n targetColumns,\r\n key => `Column '${key}' not found on relation '${relationName}'`\r\n );\r\n\r\n if (relation.type !== RelationKinds.BelongsToMany) {\r\n const relationSelectionResult = this.selectColumns(state, hydration, targetSelection);\r\n state = relationSelectionResult.state;\r\n hydration = relationSelectionResult.hydration;\r\n\r\n hydration = hydration.onRelationIncluded(\r\n state,\r\n relation,\r\n relationName,\r\n aliasPrefix,\r\n targetColumns\r\n );\r\n\r\n return { state, hydration };\r\n }\r\n\r\n const many = relation as BelongsToManyRelation;\r\n const pivotAliasPrefix = options?.pivot?.aliasPrefix ?? `${aliasPrefix}_pivot`;\r\n const pivotPk = many.pivotPrimaryKey || findPrimaryKey(many.pivotTable);\r\n const pivotColumns =\r\n options?.pivot?.columns ??\r\n many.defaultPivotColumns ??\r\n buildDefaultPivotColumns(many, pivotPk);\r\n\r\n const pivotSelection = buildTypedSelection(\r\n many.pivotTable.columns as Record<string, ColumnDef>,\r\n pivotAliasPrefix,\r\n pivotColumns,\r\n key => `Column '${key}' not found on pivot table '${many.pivotTable.name}'`\r\n );\r\n\r\n const combinedSelection = {\r\n ...targetSelection,\r\n ...pivotSelection\r\n };\r\n\r\n const relationSelectionResult = this.selectColumns(state, hydration, combinedSelection);\r\n state = relationSelectionResult.state;\r\n hydration = relationSelectionResult.hydration;\r\n\r\n hydration = hydration.onRelationIncluded(\r\n state,\r\n relation,\r\n relationName,\r\n aliasPrefix,\r\n targetColumns,\r\n { aliasPrefix: pivotAliasPrefix, columns: pivotColumns }\r\n );\r\n\r\n return { state, hydration };\r\n }\r\n\r\n /**\r\n * Applies relation correlation to a query AST\r\n * @param relationName - Name of the relation\r\n * @param ast - Query AST to modify\r\n * @returns Modified query AST with relation correlation\r\n */\r\n applyRelationCorrelation(\n relationName: string,\n ast: SelectQueryNode,\n additionalCorrelation?: ExpressionNode\n ): SelectQueryNode {\n const relation = this.getRelation(relationName);\n const rootAlias = this.state.ast.from.type === 'Table' ? this.state.ast.from.alias : undefined;\n let correlation = buildRelationCorrelation(this.table, relation, rootAlias);\n if (additionalCorrelation) {\n correlation = and(correlation, additionalCorrelation);\n }\n const whereInSubquery = ast.where\n ? and(correlation, ast.where)\n : correlation;\n\n return {\n ...ast,\r\n where: whereInSubquery\r\n };\r\n }\r\n\r\n /**\r\n * Creates a join node for a relation\r\n * @param state - Current query state\r\n * @param relationName - Name of the relation\r\n * @param joinKind - Type of join to use\r\n * @param extraCondition - Additional join condition\r\n * @returns Updated query state with join\r\n */\r\n private withJoin(\n state: SelectQueryState,\n relationName: string,\n joinKind: JoinKind,\n extraCondition?: ExpressionNode\n ): SelectQueryState {\n const relation = this.getRelation(relationName);\n const rootAlias = state.ast.from.type === 'Table' ? state.ast.from.alias : undefined;\n if (relation.type === RelationKinds.BelongsToMany) {\n const joins = buildBelongsToManyJoins(\n this.table,\n relationName,\n relation as BelongsToManyRelation,\n joinKind,\n extraCondition,\n rootAlias\n );\n return joins.reduce((current, join) => this.astService(current).withJoin(join), state);\n }\n\n const condition = buildRelationJoinCondition(this.table, relation, extraCondition, rootAlias);\n const joinNode = createJoinNode(joinKind, relation.target.name, condition, relationName);\n\r\n return this.astService(state).withJoin(joinNode);\r\n }\r\n\r\n /**\r\n * Selects columns for a relation\r\n * @param state - Current query state\r\n * @param hydration - Hydration manager\r\n * @param columns - Columns to select\r\n * @returns Relation result with updated state and hydration\r\n */\r\n private selectColumns(\r\n state: SelectQueryState,\r\n hydration: HydrationManager,\r\n columns: Record<string, ColumnDef>\r\n ): RelationResult {\r\n const { state: nextState, addedColumns } = this.astService(state).select(columns);\r\n return {\r\n state: nextState,\r\n hydration: hydration.onColumnsSelected(nextState, addedColumns)\r\n };\r\n }\r\n\r\n /**\r\n * Gets a relation definition by name\r\n * @param relationName - Name of the relation\r\n * @returns Relation definition\r\n * @throws Error if relation is not found\r\n */\r\n private getRelation(relationName: string): RelationDef {\r\n const relation = this.table.relations[relationName];\r\n if (!relation) {\r\n throw new Error(`Relation '${relationName}' not found on table '${this.table.name}'`);\r\n }\r\n\r\n return relation;\r\n }\r\n\r\n /**\r\n * Creates a QueryAstService instance\r\n * @param state - Current query state\r\n * @returns QueryAstService instance\r\n */\r\n private astService(state: SelectQueryState = this.state): QueryAstService {\n return this.createQueryAstService(this.table, state);\n }\n\n private rootTableName(): string {\n const from = this.state.ast.from;\n if (from.type === 'Table' && from.alias) return from.alias;\n return this.table.name;\n }\n}\n\r\nexport type { RelationResult } from './relation-projection-helper.js';\r\n","import { TableDef } from '../schema/table.js';\r\nimport { SelectQueryState } from './select-query-state.js';\r\nimport { HydrationManager } from './hydration-manager.js';\r\nimport { HydrationPlanner } from './hydration-planner.js';\r\nimport { QueryAstService } from './query-ast-service.js';\r\nimport { RelationService } from './relation-service.js';\r\n\r\n/**\r\n * Context for query building operations\r\n */\r\nexport interface SelectQueryBuilderContext {\r\n /**\r\n * Current query state\r\n */\r\n readonly state: SelectQueryState;\r\n /**\r\n * Hydration manager for the query\r\n */\r\n readonly hydration: HydrationManager;\r\n}\r\n\r\n/**\r\n * Dependencies for query builder operations\r\n */\r\nexport interface SelectQueryBuilderDependencies {\r\n /**\r\n * Creates a new query state\r\n * @param table - Table definition\r\n * @returns New query state\r\n */\r\n createState: (table: TableDef) => SelectQueryState;\r\n /**\r\n * Creates a new hydration manager\r\n * @param table - Table definition\r\n * @returns New hydration manager\r\n */\r\n createHydration: (table: TableDef) => HydrationManager;\r\n /**\r\n * Creates a new hydration planner\r\n * @param table - Table definition\r\n * @returns Hydration planner\r\n */\r\n createHydrationPlanner: (table: TableDef) => HydrationPlanner;\r\n /**\r\n * Creates a new query AST service\r\n * @param table - Table definition\r\n * @param state - Query state\r\n * @returns New query AST service\r\n */\r\n createQueryAstService: (table: TableDef, state: SelectQueryState) => QueryAstService;\r\n /**\r\n * Creates a new relation service\r\n * @param table - Table definition\r\n * @param state - Query state\r\n * @param hydration - Hydration manager\r\n * @returns New relation service\r\n */\r\n createRelationService: (\r\n table: TableDef,\r\n state: SelectQueryState,\r\n hydration: HydrationManager\r\n ) => RelationService;\r\n}\r\n\r\n/**\r\n * Environment for query builder operations\r\n */\r\nexport interface SelectQueryBuilderEnvironment {\r\n /**\r\n * Table definition\r\n */\r\n readonly table: TableDef;\r\n /**\r\n * Query builder dependencies\r\n */\r\n readonly deps: SelectQueryBuilderDependencies;\r\n}\r\n\r\n/**\r\n * Default implementations for query builder dependencies\r\n */\r\nconst defaultCreateQueryAstService = (table: TableDef, state: SelectQueryState) => new QueryAstService(table, state);\r\nconst defaultCreateHydrationPlanner = (table: TableDef) => new HydrationPlanner(table);\r\n\r\nconst defaultCreateHydration = (table: TableDef, plannerFactory: (table: TableDef) => HydrationPlanner) =>\r\n new HydrationManager(table, plannerFactory(table));\r\n\r\n/**\r\n * Resolves query builder dependencies by merging overrides with internal defaults\r\n * @param overrides - Partial overrides for dependency factories\r\n */\r\nexport const resolveSelectQueryBuilderDependencies = (\r\n overrides: Partial<SelectQueryBuilderDependencies> = {}\r\n): SelectQueryBuilderDependencies => {\r\n const createQueryAstService = overrides.createQueryAstService ?? defaultCreateQueryAstService;\r\n const createHydrationPlanner = overrides.createHydrationPlanner ?? defaultCreateHydrationPlanner;\r\n const createHydration =\r\n overrides.createHydration ?? (table => defaultCreateHydration(table, createHydrationPlanner));\r\n const createRelationService =\r\n overrides.createRelationService ??\r\n ((table, state, hydration) => new RelationService(table, state, hydration, createQueryAstService));\r\n\r\n return {\r\n createState: overrides.createState ?? (table => new SelectQueryState(table)),\r\n createHydration,\r\n createHydrationPlanner,\r\n createQueryAstService,\r\n createRelationService\r\n };\r\n};\r\n\r\nexport const defaultSelectQueryBuilderDependencies = resolveSelectQueryBuilderDependencies();\r\n","import { ColumnDef } from '../schema/column.js';\r\nimport { CaseExpressionNode, ColumnNode, FunctionNode, WindowFunctionNode } from '../core/ast/expression.js';\r\nimport { SelectQueryNode } from '../core/ast/query.js';\r\nimport { buildColumnNode } from '../core/ast/builders.js';\r\nimport { SelectQueryBuilderContext, SelectQueryBuilderEnvironment } from './select-query-builder-deps.js';\r\n\r\n/**\r\n * Type for column selection input\r\n */\r\ntype ColumnSelectionInput = Record<string, ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode>;\r\n\r\n/**\r\n * Handles column selection operations for the query builder\r\n */\r\nexport class ColumnSelector {\r\n /**\r\n * Creates a new ColumnSelector instance\r\n * @param env - Query builder environment\r\n */\r\n constructor(private readonly env: SelectQueryBuilderEnvironment) {}\r\n\r\n /**\r\n * Selects columns for the query\r\n * @param context - Current query context\r\n * @param columns - Columns to select\r\n * @returns Updated query context with selected columns\r\n */\r\n select(context: SelectQueryBuilderContext, columns: ColumnSelectionInput): SelectQueryBuilderContext {\r\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\r\n const { state: nextState, addedColumns } = astService.select(columns);\r\n return {\r\n state: nextState,\r\n hydration: context.hydration.onColumnsSelected(nextState, addedColumns)\r\n };\r\n }\r\n\r\n /**\r\n * Selects raw column expressions\r\n * @param context - Current query context\r\n * @param columns - Raw column expressions\r\n * @returns Updated query context with raw column selections\r\n */\r\n selectRaw(context: SelectQueryBuilderContext, columns: string[]): SelectQueryBuilderContext {\r\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\r\n const nextState = astService.selectRaw(columns).state;\r\n return { state: nextState, hydration: context.hydration };\r\n }\r\n\r\n /**\r\n * Selects a subquery as a column\r\n * @param context - Current query context\r\n * @param alias - Alias for the subquery\r\n * @param query - Subquery to select\r\n * @returns Updated query context with subquery selection\r\n */\r\n selectSubquery(\r\n context: SelectQueryBuilderContext,\r\n alias: string,\r\n query: SelectQueryNode\r\n ): SelectQueryBuilderContext {\r\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\r\n const nextState = astService.selectSubquery(alias, query);\r\n return { state: nextState, hydration: context.hydration };\r\n }\r\n\r\n /**\r\n * Adds DISTINCT clause to the query\r\n * @param context - Current query context\r\n * @param columns - Columns to make distinct\r\n * @returns Updated query context with DISTINCT clause\r\n */\r\n distinct(context: SelectQueryBuilderContext, columns: (ColumnDef | ColumnNode)[]): SelectQueryBuilderContext {\n const from = context.state.ast.from;\n const tableRef = from.type === 'Table' && from.alias ? { ...this.env.table, alias: from.alias } : this.env.table;\n const nodes = columns.map(col => buildColumnNode(tableRef, col));\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\n const nextState = astService.withDistinct(nodes);\n return { state: nextState, hydration: context.hydration };\n }\n}\n","import { ExpressionNode } from '../core/ast/expression.js';\r\nimport { SelectQueryNode } from '../core/ast/query.js';\r\nimport { SelectQueryBuilderContext, SelectQueryBuilderEnvironment } from './select-query-builder-deps.js';\r\nimport { JoinKind } from '../core/sql/sql.js';\r\nimport { RelationIncludeOptions } from './relation-types.js';\r\n\r\n/**\r\n * Manages relation operations (joins, includes, etc.) for query building\r\n */\r\nexport class RelationManager {\r\n /**\r\n * Creates a new RelationManager instance\r\n * @param env - Query builder environment\r\n */\r\n constructor(private readonly env: SelectQueryBuilderEnvironment) {}\r\n\r\n /**\r\n * Matches records based on a relation with an optional predicate\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation to match\r\n * @param predicate - Optional predicate expression\r\n * @returns Updated query context with relation match\r\n */\r\n match(context: SelectQueryBuilderContext, relationName: string, predicate?: ExpressionNode): SelectQueryBuilderContext {\r\n const result = this.createService(context).match(relationName, predicate);\r\n return { state: result.state, hydration: result.hydration };\r\n }\r\n\r\n /**\r\n * Joins a relation to the query\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation to join\r\n * @param joinKind - Type of join to use\r\n * @param extraCondition - Additional join condition\r\n * @returns Updated query context with relation join\r\n */\r\n joinRelation(\r\n context: SelectQueryBuilderContext,\r\n relationName: string,\r\n joinKind: JoinKind,\r\n extraCondition?: ExpressionNode\r\n ): SelectQueryBuilderContext {\r\n const result = this.createService(context).joinRelation(relationName, joinKind, extraCondition);\r\n return { state: result.state, hydration: result.hydration };\r\n }\r\n\r\n /**\r\n * Includes a relation in the query result\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation to include\r\n * @param options - Options for relation inclusion\r\n * @returns Updated query context with included relation\r\n */\r\n include(\r\n context: SelectQueryBuilderContext,\r\n relationName: string,\r\n options?: RelationIncludeOptions\r\n ): SelectQueryBuilderContext {\r\n const result = this.createService(context).include(relationName, options);\r\n return { state: result.state, hydration: result.hydration };\r\n }\r\n\r\n /**\r\n * Applies relation correlation to a query AST\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation\r\n * @param ast - Query AST to modify\r\n * @returns Modified query AST with relation correlation\r\n */\r\n applyRelationCorrelation(\n context: SelectQueryBuilderContext,\n relationName: string,\n ast: SelectQueryNode,\n additionalCorrelation?: ExpressionNode\n ): SelectQueryNode {\n return this.createService(context).applyRelationCorrelation(relationName, ast, additionalCorrelation);\n }\n\r\n /**\r\n * Creates a relation service instance\r\n * @param context - Current query context\r\n * @returns Relation service instance\r\n */\r\n private createService(context: SelectQueryBuilderContext) {\r\n return this.env.deps.createRelationService(this.env.table, context.state, context.hydration);\r\n }\r\n}\r\n","import { HydrationPlan, HydrationRelationPlan } from '../core/hydration/types.js';\nimport { RelationKinds } from '../schema/relation.js';\nimport { isRelationAlias, makeRelationAlias } from '../query-builder/relation-alias.js';\n\r\n/**\r\n * Hydrates query results according to a hydration plan\r\n * @param rows - Raw database rows\r\n * @param plan - Hydration plan\r\n * @returns Hydrated result objects with nested relations\r\n */\r\nexport const hydrateRows = (rows: Record<string, any>[], plan?: HydrationPlan): Record<string, any>[] => {\r\n if (!plan || !rows.length) return rows;\r\n\r\n const rootMap = new Map<any, Record<string, any>>();\r\n const relationIndex = new Map<any, Record<string, Set<any>>>();\r\n\r\n const getOrCreateParent = (row: Record<string, any>) => {\r\n const rootId = row[plan.rootPrimaryKey];\r\n if (rootId === undefined) return undefined;\r\n\r\n if (!rootMap.has(rootId)) {\r\n rootMap.set(rootId, createBaseRow(row, plan));\r\n }\r\n\r\n return rootMap.get(rootId);\r\n };\r\n\r\n const getRelationSeenSet = (rootId: any, relationName: string): Set<any> => {\r\n let byRelation = relationIndex.get(rootId);\r\n if (!byRelation) {\r\n byRelation = {};\r\n relationIndex.set(rootId, byRelation);\r\n }\r\n\r\n let seen = byRelation[relationName];\r\n if (!seen) {\r\n seen = new Set<any>();\r\n byRelation[relationName] = seen;\r\n }\r\n\r\n return seen;\r\n };\r\n\r\n for (const row of rows) {\r\n const rootId = row[plan.rootPrimaryKey];\r\n if (rootId === undefined) continue;\r\n\r\n const parent = getOrCreateParent(row);\r\n if (!parent) continue;\r\n\r\n for (const rel of plan.relations) {\n const childPkKey = makeRelationAlias(rel.aliasPrefix, rel.targetPrimaryKey);\n const childPk = row[childPkKey];\n if (childPk === null || childPk === undefined) continue;\n\n const seen = getRelationSeenSet(rootId, rel.name);\n if (seen.has(childPk)) continue;\n seen.add(childPk);\n\n if (rel.type === RelationKinds.HasOne) {\n if (!parent[rel.name]) {\n parent[rel.name] = buildChild(row, rel);\n }\n continue;\n }\n\n const bucket = parent[rel.name] as any[];\n bucket.push(buildChild(row, rel));\n }\n }\r\n\r\n return Array.from(rootMap.values());\r\n};\r\n\r\nconst createBaseRow = (row: Record<string, any>, plan: HydrationPlan): Record<string, any> => {\r\n const base: Record<string, any> = {};\r\n const baseKeys = plan.rootColumns.length\r\n ? plan.rootColumns\r\n : Object.keys(row).filter(k => !isRelationAlias(k));\r\n\r\n for (const key of baseKeys) {\r\n base[key] = row[key];\r\n }\r\n\r\n for (const rel of plan.relations) {\n base[rel.name] = rel.type === RelationKinds.HasOne ? null : [];\n }\n\r\n return base;\r\n};\r\n\r\nconst buildChild = (row: Record<string, any>, rel: HydrationRelationPlan): Record<string, any> => {\r\n const child: Record<string, any> = {};\r\n for (const col of rel.columns) {\r\n const key = makeRelationAlias(rel.aliasPrefix, col);\r\n child[col] = row[key];\r\n }\r\n\r\n const pivot = buildPivot(row, rel);\r\n if (pivot) {\r\n (child as any)._pivot = pivot;\r\n }\r\n\r\n return child;\r\n};\r\n\r\nconst buildPivot = (row: Record<string, any>, rel: HydrationRelationPlan): Record<string, any> | undefined => {\r\n if (!rel.pivot) return undefined;\r\n\r\n const pivot: Record<string, any> = {};\r\n for (const col of rel.pivot.columns) {\r\n const key = makeRelationAlias(rel.pivot.aliasPrefix, col);\r\n pivot[col] = row[key];\r\n }\r\n\r\n const hasValue = Object.values(pivot).some(v => v !== null && v !== undefined);\r\n return hasValue ? pivot : undefined;\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { EntityContext } from './entity-context.js';\r\nimport { RelationMap } from '../schema/types.js';\r\n\r\n/**\r\n * Symbol used to store entity metadata on entity instances\r\n */\r\nexport const ENTITY_META = Symbol('EntityMeta');\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\n/**\r\n * Metadata stored on entity instances for ORM internal use\r\n * @typeParam TTable - Table definition type\r\n */\r\nexport interface EntityMeta<TTable extends TableDef> {\r\n /** Entity context */\r\n ctx: EntityContext;\r\n /** Table definition */\r\n table: TTable;\r\n /** Relations that should be loaded lazily */\r\n lazyRelations: (keyof RelationMap<TTable>)[];\r\n /** Cache for relation promises */\r\n relationCache: Map<string, Promise<any>>;\r\n /** Hydration data for relations */\r\n relationHydration: Map<string, Map<string, any>>;\r\n /** Relation wrapper instances */\r\n relationWrappers: Map<string, unknown>;\r\n}\r\n\r\n/**\r\n * Gets hydration rows for a specific relation and key\r\n * @param meta - Entity metadata\r\n * @param relationName - Name of the relation\r\n * @param key - Key to look up in the hydration map\r\n * @returns Array of hydration rows or undefined if not found\r\n * @typeParam TTable - Table definition type\r\n */\r\nexport const getHydrationRows = <TTable extends TableDef>(\r\n meta: EntityMeta<TTable>,\r\n relationName: string,\r\n key: unknown\r\n): Record<string, any>[] | undefined => {\r\n const map = meta.relationHydration.get(relationName);\r\n if (!map) return undefined;\r\n const rows = map.get(toKey(key));\r\n if (!rows) return undefined;\r\n return Array.isArray(rows) ? rows : undefined;\r\n};\r\n\r\n/**\r\n * Gets a single hydration record for a specific relation and key\r\n * @param meta - Entity metadata\r\n * @param relationName - Name of the relation\r\n * @param key - Key to look up in the hydration map\r\n * @returns Single hydration record or undefined if not found\r\n * @typeParam TTable - Table definition type\r\n */\r\nexport const getHydrationRecord = <TTable extends TableDef>(\r\n meta: EntityMeta<TTable>,\r\n relationName: string,\r\n key: unknown\r\n): Record<string, any> | undefined => {\r\n const map = meta.relationHydration.get(relationName);\r\n if (!map) return undefined;\r\n const value = map.get(toKey(key));\r\n if (!value) return undefined;\r\n if (Array.isArray(value)) {\r\n return value[0];\r\n }\r\n return value;\r\n};\r\n\r\n/**\r\n * Gets entity metadata from an entity instance\r\n * @param entity - Entity instance to get metadata from\r\n * @returns Entity metadata or undefined if not found\r\n * @typeParam TTable - Table definition type\r\n */\r\nexport const getEntityMeta = <TTable extends TableDef>(entity: any): EntityMeta<TTable> | undefined => {\r\n if (!entity || typeof entity !== 'object') return undefined;\r\n return (entity as any)[ENTITY_META];\r\n};\r\n\r\n/**\r\n * Checks if an entity has metadata attached\r\n * @param entity - Entity instance to check\r\n * @returns True if the entity has metadata, false otherwise\r\n */\r\nexport const hasEntityMeta = (entity: any): entity is { [ENTITY_META]: EntityMeta<TableDef> } => {\r\n return Boolean(getEntityMeta(entity));\r\n};\r\n","import { HasManyCollection } from '../../schema/types.js';\r\nimport { EntityContext } from '../entity-context.js';\r\nimport { RelationKey } from '../runtime-types.js';\r\nimport { HasManyRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { EntityMeta, getHydrationRows } from '../entity-meta.js';\r\n\r\ntype Rows = Record<string, any>[];\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nconst hideInternal = (obj: any, keys: string[]): void => {\r\n for (const key of keys) {\r\n Object.defineProperty(obj, key, {\r\n value: obj[key],\r\n writable: false,\r\n configurable: false,\r\n enumerable: false\r\n });\r\n }\r\n};\r\n\r\nexport class DefaultHasManyCollection<TChild> implements HasManyCollection<TChild> {\r\n private loaded = false;\r\n private items: TChild[] = [];\r\n private readonly added = new Set<TChild>();\r\n private readonly removed = new Set<TChild>();\r\n\r\n constructor(\r\n private readonly ctx: EntityContext,\r\n private readonly meta: EntityMeta<any>,\r\n private readonly root: any,\r\n private readonly relationName: string,\r\n private readonly relation: HasManyRelation,\r\n private readonly rootTable: TableDef,\r\n private readonly loader: () => Promise<Map<string, Rows>>,\r\n private readonly createEntity: (row: Record<string, any>) => TChild,\r\n private readonly localKey: string\r\n ) {\r\n hideInternal(this, ['ctx', 'meta', 'root', 'relationName', 'relation', 'rootTable', 'loader', 'createEntity', 'localKey']);\r\n this.hydrateFromCache();\r\n }\r\n\r\n async load(): Promise<TChild[]> {\r\n if (this.loaded) return this.items;\r\n const map = await this.loader();\r\n const key = toKey(this.root[this.localKey]);\r\n const rows = map.get(key) ?? [];\r\n this.items = rows.map(row => this.createEntity(row));\r\n this.loaded = true;\r\n return this.items;\r\n }\r\n\r\n getItems(): TChild[] {\r\n return this.items;\r\n }\r\n\r\n add(data: Partial<TChild>): TChild {\r\n const keyValue = this.root[this.localKey];\r\n const childRow: Record<string, any> = {\r\n ...data,\r\n [this.relation.foreignKey]: keyValue\r\n };\r\n const entity = this.createEntity(childRow);\r\n this.added.add(entity);\r\n this.items.push(entity);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'add', entity }\r\n );\r\n return entity;\r\n }\r\n\r\n attach(entity: TChild): void {\r\n const keyValue = this.root[this.localKey];\r\n (entity as Record<string, any>)[this.relation.foreignKey] = keyValue;\r\n this.ctx.markDirty(entity);\r\n this.items.push(entity);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'attach', entity }\r\n );\r\n }\r\n\r\n remove(entity: TChild): void {\r\n this.items = this.items.filter(item => item !== entity);\r\n this.removed.add(entity);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'remove', entity }\r\n );\r\n }\r\n\r\n clear(): void {\r\n for (const entity of [...this.items]) {\r\n this.remove(entity);\r\n }\r\n }\r\n\r\n private get relationKey(): RelationKey {\r\n return `${this.rootTable.name}.${this.relationName}`;\r\n }\r\n\r\n private hydrateFromCache(): void {\r\n const keyValue = this.root[this.localKey];\r\n if (keyValue === undefined || keyValue === null) return;\r\n const rows = getHydrationRows(this.meta, this.relationName, keyValue);\r\n if (!rows?.length) return;\r\n this.items = rows.map(row => this.createEntity(row));\r\n this.loaded = true;\r\n }\r\n\r\n toJSON(): TChild[] {\r\n return this.items;\r\n }\r\n}\r\n","import { HasOneReference } from '../../schema/types.js';\r\nimport { EntityContext } from '../entity-context.js';\r\nimport { RelationKey } from '../runtime-types.js';\r\nimport { HasOneRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { EntityMeta, getHydrationRecord, hasEntityMeta } from '../entity-meta.js';\r\n\r\ntype Row = Record<string, any>;\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nconst hideInternal = (obj: any, keys: string[]): void => {\r\n for (const key of keys) {\r\n Object.defineProperty(obj, key, {\r\n value: obj[key],\r\n writable: false,\r\n configurable: false,\r\n enumerable: false\r\n });\r\n }\r\n};\r\n\r\nexport class DefaultHasOneReference<TChild> implements HasOneReference<TChild> {\r\n private loaded = false;\r\n private current: TChild | null = null;\r\n\r\n constructor(\r\n private readonly ctx: EntityContext,\r\n private readonly meta: EntityMeta<any>,\r\n private readonly root: any,\r\n private readonly relationName: string,\r\n private readonly relation: HasOneRelation,\r\n private readonly rootTable: TableDef,\r\n private readonly loader: () => Promise<Map<string, Row>>,\r\n private readonly createEntity: (row: Row) => TChild,\r\n private readonly localKey: string\r\n ) {\r\n hideInternal(this, [\r\n 'ctx',\r\n 'meta',\r\n 'root',\r\n 'relationName',\r\n 'relation',\r\n 'rootTable',\r\n 'loader',\r\n 'createEntity',\r\n 'localKey'\r\n ]);\r\n this.populateFromHydrationCache();\r\n }\r\n\r\n async load(): Promise<TChild | null> {\r\n if (this.loaded) return this.current;\r\n const map = await this.loader();\r\n const keyValue = this.root[this.localKey];\r\n if (keyValue === undefined || keyValue === null) {\r\n this.loaded = true;\r\n return this.current;\r\n }\r\n const row = map.get(toKey(keyValue));\r\n this.current = row ? this.createEntity(row) : null;\r\n this.loaded = true;\r\n return this.current;\r\n }\r\n\r\n get(): TChild | null {\r\n return this.current;\r\n }\r\n\r\n set(data: Partial<TChild> | TChild | null): TChild | null {\r\n if (data === null) {\r\n return this.detachCurrent();\r\n }\r\n\r\n const entity = hasEntityMeta(data) ? (data as TChild) : this.createEntity(data as Row);\r\n if (this.current && this.current !== entity) {\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'remove', entity: this.current }\r\n );\r\n }\r\n\r\n this.assignForeignKey(entity);\r\n this.current = entity;\r\n this.loaded = true;\r\n\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'attach', entity }\r\n );\r\n\r\n return entity;\r\n }\r\n\r\n toJSON(): TChild | null {\r\n return this.current;\r\n }\r\n\r\n private detachCurrent(): TChild | null {\r\n const previous = this.current;\r\n if (!previous) return null;\r\n this.current = null;\r\n this.loaded = true;\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'remove', entity: previous }\r\n );\r\n return null;\r\n }\r\n\r\n private assignForeignKey(entity: TChild): void {\r\n const keyValue = this.root[this.localKey];\r\n (entity as Row)[this.relation.foreignKey] = keyValue;\r\n }\r\n\r\n private get relationKey(): RelationKey {\r\n return `${this.rootTable.name}.${this.relationName}`;\r\n }\r\n\r\n private populateFromHydrationCache(): void {\r\n const keyValue = this.root[this.localKey];\r\n if (keyValue === undefined || keyValue === null) return;\r\n const row = getHydrationRecord(this.meta, this.relationName, keyValue);\r\n if (!row) return;\r\n this.current = this.createEntity(row);\r\n this.loaded = true;\r\n }\r\n}\r\n","import { BelongsToReference } from '../../schema/types.js';\r\nimport { EntityContext } from '../entity-context.js';\r\nimport { RelationKey } from '../runtime-types.js';\r\nimport { BelongsToRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { EntityMeta, getHydrationRecord, hasEntityMeta } from '../entity-meta.js';\r\n\r\ntype Rows = Record<string, any>;\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nconst hideInternal = (obj: any, keys: string[]): void => {\r\n for (const key of keys) {\r\n Object.defineProperty(obj, key, {\r\n value: obj[key],\r\n writable: false,\r\n configurable: false,\r\n enumerable: false\r\n });\r\n }\r\n};\r\n\r\nexport class DefaultBelongsToReference<TParent> implements BelongsToReference<TParent> {\r\n private loaded = false;\r\n private current: TParent | null = null;\r\n\r\n constructor(\r\n private readonly ctx: EntityContext,\r\n private readonly meta: EntityMeta<any>,\r\n private readonly root: any,\r\n private readonly relationName: string,\r\n private readonly relation: BelongsToRelation,\r\n private readonly rootTable: TableDef,\r\n private readonly loader: () => Promise<Map<string, Rows>>,\r\n private readonly createEntity: (row: Record<string, any>) => TParent,\r\n private readonly targetKey: string\r\n ) {\r\n hideInternal(this, ['ctx', 'meta', 'root', 'relationName', 'relation', 'rootTable', 'loader', 'createEntity', 'targetKey']);\r\n this.populateFromHydrationCache();\r\n }\r\n\r\n async load(): Promise<TParent | null> {\r\n if (this.loaded) return this.current;\r\n const map = await this.loader();\r\n const fkValue = this.root[this.relation.foreignKey];\r\n if (fkValue === null || fkValue === undefined) {\r\n this.current = null;\r\n } else {\r\n const row = map.get(toKey(fkValue));\r\n this.current = row ? this.createEntity(row) : null;\r\n }\r\n this.loaded = true;\r\n return this.current;\r\n }\r\n\r\n get(): TParent | null {\r\n return this.current;\r\n }\r\n\r\n set(data: Partial<TParent> | TParent | null): TParent | null {\r\n if (data === null) {\r\n const previous = this.current;\r\n this.root[this.relation.foreignKey] = null;\r\n this.current = null;\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'remove', entity: previous }\r\n );\r\n return null;\r\n }\r\n\r\n const entity = hasEntityMeta(data) ? (data as TParent) : this.createEntity(data as Record<string, any>);\r\n const pkValue = (entity as any)[this.targetKey];\r\n if (pkValue !== undefined) {\r\n this.root[this.relation.foreignKey] = pkValue;\r\n }\r\n this.current = entity;\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'attach', entity }\r\n );\r\n return entity;\r\n }\r\n\r\n private get relationKey(): RelationKey {\r\n return `${this.rootTable.name}.${this.relationName}`;\r\n }\r\n\r\n private populateFromHydrationCache(): void {\r\n const fkValue = this.root[this.relation.foreignKey];\r\n if (fkValue === undefined || fkValue === null) return;\r\n const row = getHydrationRecord(this.meta, this.relationName, fkValue);\r\n if (!row) return;\r\n this.current = this.createEntity(row);\r\n this.loaded = true;\r\n }\r\n\r\n toJSON(): TParent | null {\r\n return this.current;\r\n }\r\n}\r\n","import { ManyToManyCollection } from '../../schema/types.js';\r\nimport { EntityContext } from '../entity-context.js';\r\nimport { RelationKey } from '../runtime-types.js';\r\nimport { BelongsToManyRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { findPrimaryKey } from '../../query-builder/hydration-planner.js';\r\nimport { EntityMeta, getHydrationRows } from '../entity-meta.js';\r\n\r\ntype Rows = Record<string, any>[];\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nconst hideInternal = (obj: any, keys: string[]): void => {\r\n for (const key of keys) {\r\n Object.defineProperty(obj, key, {\r\n value: obj[key],\r\n writable: false,\r\n configurable: false,\r\n enumerable: false\r\n });\r\n }\r\n};\r\n\r\nexport class DefaultManyToManyCollection<TTarget> implements ManyToManyCollection<TTarget> {\r\n private loaded = false;\r\n private items: TTarget[] = [];\r\n\r\n constructor(\r\n private readonly ctx: EntityContext,\r\n private readonly meta: EntityMeta<any>,\r\n private readonly root: any,\r\n private readonly relationName: string,\r\n private readonly relation: BelongsToManyRelation,\r\n private readonly rootTable: TableDef,\r\n private readonly loader: () => Promise<Map<string, Rows>>,\r\n private readonly createEntity: (row: Record<string, any>) => TTarget,\r\n private readonly localKey: string\r\n ) {\r\n hideInternal(this, ['ctx', 'meta', 'root', 'relationName', 'relation', 'rootTable', 'loader', 'createEntity', 'localKey']);\r\n this.hydrateFromCache();\r\n }\r\n\r\n async load(): Promise<TTarget[]> {\r\n if (this.loaded) return this.items;\r\n const map = await this.loader();\r\n const key = toKey(this.root[this.localKey]);\r\n const rows = map.get(key) ?? [];\r\n this.items = rows.map(row => {\r\n const entity = this.createEntity(row);\r\n if ((row as any)._pivot) {\r\n (entity as any)._pivot = row._pivot;\r\n }\r\n return entity;\r\n });\r\n this.loaded = true;\r\n return this.items;\r\n }\r\n\r\n getItems(): TTarget[] {\r\n return this.items;\r\n }\r\n\r\n attach(target: TTarget | number | string): void {\r\n const entity = this.ensureEntity(target);\r\n const id = this.extractId(entity);\r\n if (id == null) return;\r\n if (this.items.some(item => this.extractId(item) === id)) {\r\n return;\r\n }\r\n this.items.push(entity);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'attach', entity }\r\n );\r\n }\r\n\r\n detach(target: TTarget | number | string): void {\r\n const id = typeof target === 'number' || typeof target === 'string'\r\n ? target\r\n : this.extractId(target);\r\n\r\n if (id == null) return;\r\n\r\n const existing = this.items.find(item => this.extractId(item) === id);\r\n if (!existing) return;\r\n\r\n this.items = this.items.filter(item => this.extractId(item) !== id);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'detach', entity: existing }\r\n );\r\n }\r\n\r\n async syncByIds(ids: (number | string)[]): Promise<void> {\r\n await this.load();\r\n const targetKey = this.relation.targetKey || findPrimaryKey(this.relation.target);\r\n const normalized = new Set(ids.map(id => toKey(id)));\r\n const currentIds = new Set(this.items.map(item => toKey(this.extractId(item))));\r\n\r\n for (const id of normalized) {\r\n if (!currentIds.has(id)) {\r\n this.attach(id);\r\n }\r\n }\r\n\r\n for (const item of [...this.items]) {\r\n const itemId = toKey(this.extractId(item));\r\n if (!normalized.has(itemId)) {\r\n this.detach(item);\r\n }\r\n }\r\n }\r\n\r\n private ensureEntity(target: TTarget | number | string): TTarget {\r\n if (typeof target === 'number' || typeof target === 'string') {\r\n const stub: Record<string, any> = {\r\n [this.targetKey]: target\r\n };\r\n return this.createEntity(stub);\r\n }\r\n return target;\r\n }\r\n\r\n private extractId(entity: TTarget | number | string | null | undefined): number | string | null {\r\n if (entity === null || entity === undefined) return null;\r\n if (typeof entity === 'number' || typeof entity === 'string') {\r\n return entity;\r\n }\r\n return (entity as any)[this.targetKey] ?? null;\r\n }\r\n\r\n private get relationKey(): RelationKey {\r\n return `${this.rootTable.name}.${this.relationName}`;\r\n }\r\n\r\n private get targetKey(): string {\r\n return this.relation.targetKey || findPrimaryKey(this.relation.target);\r\n }\r\n\r\n private hydrateFromCache(): void {\r\n const keyValue = this.root[this.localKey];\r\n if (keyValue === undefined || keyValue === null) return;\r\n const rows = getHydrationRows(this.meta, this.relationName, keyValue);\r\n if (!rows?.length) return;\r\n this.items = rows.map(row => {\r\n const entity = this.createEntity(row);\r\n if ((row as any)._pivot) {\r\n (entity as any)._pivot = (row as any)._pivot;\r\n }\r\n return entity;\r\n });\r\n this.loaded = true;\r\n }\r\n\r\n toJSON(): TTarget[] {\r\n return this.items;\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { BelongsToManyRelation, HasManyRelation, HasOneRelation, BelongsToRelation } from '../schema/relation.js';\r\nimport { SelectQueryBuilder } from '../query-builder/select.js';\r\nimport { inList, LiteralNode } from '../core/ast/expression.js';\r\nimport { EntityContext } from './entity-context.js';\r\nimport type { QueryResult } from '../core/execution/db-executor.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\n\r\ntype Rows = Record<string, any>[];\r\n\r\nconst selectAllColumns = (table: TableDef): Record<string, ColumnDef> =>\r\n Object.entries(table.columns).reduce((acc, [name, def]) => {\r\n acc[name] = def;\r\n return acc;\r\n }, {} as Record<string, ColumnDef>);\r\n\r\nconst rowsFromResults = (results: QueryResult[]): Rows => {\r\n const rows: Rows = [];\r\n for (const result of results) {\r\n const { columns, values } = result;\r\n for (const valueRow of values) {\r\n const row: Record<string, any> = {};\r\n columns.forEach((column, idx) => {\r\n row[column] = valueRow[idx];\r\n });\r\n rows.push(row);\r\n }\r\n }\r\n return rows;\r\n};\r\n\r\nconst executeQuery = async (ctx: EntityContext, qb: SelectQueryBuilder<any, TableDef<any>>): Promise<Rows> => {\r\n const compiled = ctx.dialect.compileSelect(qb.getAST());\r\n const results = await ctx.executor.executeSql(compiled.sql, compiled.params);\r\n return rowsFromResults(results);\r\n};\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nexport const loadHasManyRelation = async (\r\n ctx: EntityContext,\r\n rootTable: TableDef,\r\n _relationName: string,\r\n relation: HasManyRelation\r\n): Promise<Map<string, Rows>> => {\r\n const localKey = relation.localKey || findPrimaryKey(rootTable);\r\n const roots = ctx.getEntitiesForTable(rootTable);\r\n const keys = new Set<unknown>();\r\n\r\n for (const tracked of roots) {\r\n const value = tracked.entity[localKey];\r\n if (value !== null && value !== undefined) {\r\n keys.add(value);\r\n }\r\n }\r\n\r\n if (!keys.size) {\r\n return new Map();\r\n }\r\n\r\n const selectMap = selectAllColumns(relation.target);\r\n const fb = new SelectQueryBuilder(relation.target).select(selectMap);\r\n const fkColumn = relation.target.columns[relation.foreignKey];\r\n if (!fkColumn) return new Map();\r\n\r\n fb.where(inList(fkColumn, Array.from(keys) as (string | number | LiteralNode)[]));\r\n\r\n const rows = await executeQuery(ctx, fb);\r\n const grouped = new Map<string, Rows>();\r\n\r\n for (const row of rows) {\r\n const fkValue = row[relation.foreignKey];\r\n if (fkValue === null || fkValue === undefined) continue;\r\n const key = toKey(fkValue);\r\n const bucket = grouped.get(key) ?? [];\r\n bucket.push(row);\r\n grouped.set(key, bucket);\r\n }\r\n\r\n return grouped;\r\n};\r\n\r\nexport const loadHasOneRelation = async (\r\n ctx: EntityContext,\r\n rootTable: TableDef,\r\n _relationName: string,\r\n relation: HasOneRelation\r\n): Promise<Map<string, Record<string, any>>> => {\r\n const localKey = relation.localKey || findPrimaryKey(rootTable);\r\n const roots = ctx.getEntitiesForTable(rootTable);\r\n const keys = new Set<unknown>();\r\n\r\n for (const tracked of roots) {\r\n const value = tracked.entity[localKey];\r\n if (value !== null && value !== undefined) {\r\n keys.add(value);\r\n }\r\n }\r\n\r\n if (!keys.size) {\r\n return new Map();\r\n }\r\n\r\n const selectMap = selectAllColumns(relation.target);\r\n const qb = new SelectQueryBuilder(relation.target).select(selectMap);\r\n const fkColumn = relation.target.columns[relation.foreignKey];\r\n if (!fkColumn) return new Map();\r\n\r\n qb.where(inList(fkColumn, Array.from(keys) as (string | number | LiteralNode)[]));\r\n\r\n const rows = await executeQuery(ctx, qb);\r\n const lookup = new Map<string, Record<string, any>>();\r\n\r\n for (const row of rows) {\r\n const fkValue = row[relation.foreignKey];\r\n if (fkValue === null || fkValue === undefined) continue;\r\n const key = toKey(fkValue);\r\n if (!lookup.has(key)) {\r\n lookup.set(key, row);\r\n }\r\n }\r\n\r\n return lookup;\r\n};\r\n\r\nexport const loadBelongsToRelation = async (\r\n ctx: EntityContext,\r\n rootTable: TableDef,\r\n _relationName: string,\r\n relation: BelongsToRelation\r\n): Promise<Map<string, Record<string, any>>> => {\r\n const roots = ctx.getEntitiesForTable(rootTable);\r\n const foreignKeys = new Set<unknown>();\r\n\r\n for (const tracked of roots) {\r\n const value = tracked.entity[relation.foreignKey];\r\n if (value !== null && value !== undefined) {\r\n foreignKeys.add(value);\r\n }\r\n }\r\n\r\n if (!foreignKeys.size) {\r\n return new Map();\r\n }\r\n\r\n const selectMap = selectAllColumns(relation.target);\r\n const qb = new SelectQueryBuilder(relation.target).select(selectMap);\r\n const targetKey = relation.localKey || findPrimaryKey(relation.target);\r\n const pkColumn = relation.target.columns[targetKey];\r\n if (!pkColumn) return new Map();\r\n\r\n qb.where(inList(pkColumn, Array.from(foreignKeys) as (string | number | LiteralNode)[]));\r\n const rows = await executeQuery(ctx, qb);\r\n const map = new Map<string, Record<string, any>>();\r\n\r\n for (const row of rows) {\r\n const keyValue = row[targetKey];\r\n if (keyValue === null || keyValue === undefined) continue;\r\n map.set(toKey(keyValue), row);\r\n }\r\n\r\n return map;\r\n};\r\n\r\nexport const loadBelongsToManyRelation = async (\r\n ctx: EntityContext,\r\n rootTable: TableDef,\r\n _relationName: string,\r\n relation: BelongsToManyRelation\r\n): Promise<Map<string, Rows>> => {\r\n const rootKey = relation.localKey || findPrimaryKey(rootTable);\r\n const roots = ctx.getEntitiesForTable(rootTable);\r\n const rootIds = new Set<unknown>();\r\n\r\n for (const tracked of roots) {\r\n const value = tracked.entity[rootKey];\r\n if (value !== null && value !== undefined) {\r\n rootIds.add(value);\r\n }\r\n }\r\n\r\n if (!rootIds.size) {\r\n return new Map();\r\n }\r\n\r\n const pivotSelect = selectAllColumns(relation.pivotTable);\r\n const pivotQb = new SelectQueryBuilder(relation.pivotTable).select(pivotSelect);\r\n const pivotFkCol = relation.pivotTable.columns[relation.pivotForeignKeyToRoot];\r\n if (!pivotFkCol) return new Map();\r\n\r\n pivotQb.where(inList(pivotFkCol, Array.from(rootIds) as (string | number | LiteralNode)[]));\r\n const pivotRows = await executeQuery(ctx, pivotQb);\r\n\r\n const rootLookup = new Map<string, { targetId: unknown; pivot: Record<string, any> }[]>();\r\n const targetIds = new Set<unknown>();\r\n\r\n for (const pivot of pivotRows) {\r\n const rootValue = pivot[relation.pivotForeignKeyToRoot];\r\n const targetValue = pivot[relation.pivotForeignKeyToTarget];\r\n if (rootValue === null || rootValue === undefined || targetValue === null || targetValue === undefined) {\r\n continue;\r\n }\r\n const bucket = rootLookup.get(toKey(rootValue)) ?? [];\r\n bucket.push({\r\n targetId: targetValue,\r\n pivot: { ...pivot }\r\n });\r\n rootLookup.set(toKey(rootValue), bucket);\r\n targetIds.add(targetValue);\r\n }\r\n\r\n if (!targetIds.size) {\r\n return new Map();\r\n }\r\n\r\n const targetSelect = selectAllColumns(relation.target);\r\n const targetKey = relation.targetKey || findPrimaryKey(relation.target);\r\n const targetPkColumn = relation.target.columns[targetKey];\r\n if (!targetPkColumn) return new Map();\r\n\r\n const targetQb = new SelectQueryBuilder(relation.target).select(targetSelect);\r\n targetQb.where(inList(targetPkColumn, Array.from(targetIds) as (string | number | LiteralNode)[]));\r\n const targetRows = await executeQuery(ctx, targetQb);\r\n const targetMap = new Map<string, Record<string, any>>();\r\n\r\n for (const row of targetRows) {\r\n const pkValue = row[targetKey];\r\n if (pkValue === null || pkValue === undefined) continue;\r\n targetMap.set(toKey(pkValue), row);\r\n }\r\n\r\n const result = new Map<string, Rows>();\r\n\r\n for (const [rootId, entries] of rootLookup.entries()) {\r\n const bucket: Rows = [];\r\n for (const entry of entries) {\r\n const targetRow = targetMap.get(toKey(entry.targetId));\r\n if (!targetRow) continue;\r\n bucket.push({\r\n ...targetRow,\r\n _pivot: entry.pivot\r\n });\r\n }\r\n result.set(rootId, bucket);\r\n }\r\n\r\n return result;\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { EntityInstance, RelationMap, HasManyCollection, HasOneReference, BelongsToReference, ManyToManyCollection } from '../schema/types.js';\r\nimport { EntityContext } from './entity-context.js';\r\nimport { ENTITY_META, EntityMeta, getEntityMeta } from './entity-meta.js';\r\nimport { DefaultHasManyCollection } from './relations/has-many.js';\r\nimport { DefaultHasOneReference } from './relations/has-one.js';\r\nimport { DefaultBelongsToReference } from './relations/belongs-to.js';\r\nimport { DefaultManyToManyCollection } from './relations/many-to-many.js';\r\nimport { HasManyRelation, HasOneRelation, BelongsToRelation, BelongsToManyRelation, RelationKinds } from '../schema/relation.js';\r\nimport { loadHasManyRelation, loadHasOneRelation, loadBelongsToRelation, loadBelongsToManyRelation } from './lazy-batch.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\n\r\ntype Rows = Record<string, any>[];\r\n\r\nconst relationLoaderCache = <T extends Map<string, any>>(\r\n meta: EntityMeta<any>,\r\n relationName: string,\r\n factory: () => Promise<T>\r\n): Promise<T> => {\r\n if (meta.relationCache.has(relationName)) {\r\n return meta.relationCache.get(relationName)! as Promise<T>;\r\n }\r\n\r\n const promise = factory().then(value => {\r\n for (const tracked of meta.ctx.getEntitiesForTable(meta.table)) {\r\n const otherMeta = getEntityMeta(tracked.entity);\r\n if (!otherMeta) continue;\r\n otherMeta.relationHydration.set(relationName, value);\r\n }\r\n return value;\r\n });\r\n\r\n meta.relationCache.set(relationName, promise);\r\n\r\n for (const tracked of meta.ctx.getEntitiesForTable(meta.table)) {\r\n const otherMeta = getEntityMeta(tracked.entity);\r\n if (!otherMeta) continue;\r\n otherMeta.relationCache.set(relationName, promise);\r\n }\r\n\r\n return promise;\r\n};\r\n\r\nexport const createEntityProxy = <\r\n TTable extends TableDef,\r\n TLazy extends keyof RelationMap<TTable> = keyof RelationMap<TTable>\r\n>(\r\n ctx: EntityContext,\r\n table: TTable,\r\n row: Record<string, any>,\r\n lazyRelations: TLazy[] = [] as TLazy[]\r\n): EntityInstance<TTable> => {\r\n const target: Record<string, any> = { ...row };\r\n const meta: EntityMeta<TTable> = {\r\n ctx,\r\n table,\r\n lazyRelations: [...lazyRelations],\r\n relationCache: new Map(),\r\n relationHydration: new Map(),\r\n relationWrappers: new Map()\r\n };\r\n\r\n Object.defineProperty(target, ENTITY_META, {\r\n value: meta,\r\n enumerable: false,\r\n writable: false\r\n });\r\n\r\n let proxy: EntityInstance<TTable>;\r\n const handler: ProxyHandler<any> = {\r\n get(targetObj, prop, receiver) {\r\n if (prop === ENTITY_META) {\r\n return meta;\r\n }\r\n\r\n if (prop === '$load') {\r\n return async (relationName: keyof RelationMap<TTable>) => {\r\n const wrapper = getRelationWrapper(meta, relationName as string, proxy);\r\n if (wrapper && typeof wrapper.load === 'function') {\r\n return wrapper.load();\r\n }\r\n return undefined;\r\n };\r\n }\r\n\r\n if (typeof prop === 'string' && table.relations[prop]) {\r\n return getRelationWrapper(meta, prop, proxy);\r\n }\r\n\r\n return Reflect.get(targetObj, prop, receiver);\r\n },\r\n\r\n set(targetObj, prop, value, receiver) {\r\n const result = Reflect.set(targetObj, prop, value, receiver);\r\n if (typeof prop === 'string' && table.columns[prop]) {\r\n ctx.markDirty(proxy);\r\n }\r\n return result;\r\n }\r\n };\r\n\r\n proxy = new Proxy(target, handler) as EntityInstance<TTable>;\r\n populateHydrationCache(proxy, row, meta);\r\n return proxy;\r\n};\r\n\r\nexport const createEntityFromRow = <TTable extends TableDef>(\r\n ctx: EntityContext,\r\n table: TTable,\r\n row: Record<string, any>,\r\n lazyRelations: (keyof RelationMap<TTable>)[] = []\r\n): EntityInstance<TTable> => {\r\n const pkName = findPrimaryKey(table);\r\n const pkValue = row[pkName];\r\n if (pkValue !== undefined && pkValue !== null) {\r\n const tracked = ctx.getEntity(table, pkValue);\r\n if (tracked) return tracked;\r\n }\r\n\r\n const entity = createEntityProxy(ctx, table, row, lazyRelations);\r\n if (pkValue !== undefined && pkValue !== null) {\r\n ctx.trackManaged(table, pkValue, entity);\r\n } else {\r\n ctx.trackNew(table, entity);\r\n }\r\n\r\n return entity;\r\n};\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nconst populateHydrationCache = <TTable extends TableDef>(\r\n entity: any,\r\n row: Record<string, any>,\r\n meta: EntityMeta<TTable>\r\n): void => {\r\n for (const relationName of Object.keys(meta.table.relations)) {\r\n const relation = meta.table.relations[relationName];\r\n const data = row[relationName];\r\n if (relation.type === RelationKinds.HasOne) {\r\n const localKey = relation.localKey || findPrimaryKey(meta.table);\r\n const rootValue = entity[localKey];\r\n if (rootValue === undefined || rootValue === null) continue;\r\n if (!data || typeof data !== 'object') continue;\r\n const cache = new Map<string, Record<string, any>>();\r\n cache.set(toKey(rootValue), data as Record<string, any>);\r\n meta.relationHydration.set(relationName, cache);\r\n meta.relationCache.set(relationName, Promise.resolve(cache));\r\n continue;\r\n }\r\n\r\n if (!Array.isArray(data)) continue;\r\n\r\n if (relation.type === RelationKinds.HasMany || relation.type === RelationKinds.BelongsToMany) {\r\n const localKey = relation.localKey || findPrimaryKey(meta.table);\r\n const rootValue = entity[localKey];\r\n if (rootValue === undefined || rootValue === null) continue;\r\n const cache = new Map<string, Rows>();\r\n cache.set(toKey(rootValue), data as Rows);\r\n meta.relationHydration.set(relationName, cache);\r\n meta.relationCache.set(relationName, Promise.resolve(cache));\r\n continue;\r\n }\r\n\r\n if (relation.type === RelationKinds.BelongsTo) {\r\n const targetKey = relation.localKey || findPrimaryKey(relation.target);\r\n const cache = new Map<string, Record<string, any>>();\r\n for (const item of data) {\r\n const pkValue = item[targetKey];\r\n if (pkValue === undefined || pkValue === null) continue;\r\n cache.set(toKey(pkValue), item);\r\n }\r\n if (cache.size) {\r\n meta.relationHydration.set(relationName, cache);\r\n meta.relationCache.set(relationName, Promise.resolve(cache));\r\n }\r\n }\r\n }\r\n};\r\n\r\nconst getRelationWrapper = (\r\n meta: EntityMeta<any>,\r\n relationName: string,\r\n owner: any\r\n): HasManyCollection<any> | HasOneReference<any> | BelongsToReference<any> | ManyToManyCollection<any> | undefined => {\r\n if (meta.relationWrappers.has(relationName)) {\r\n return meta.relationWrappers.get(relationName) as HasManyCollection<any>;\r\n }\r\n\r\n const relation = meta.table.relations[relationName];\r\n if (!relation) return undefined;\r\n\r\n const wrapper = instantiateWrapper(meta, relationName, relation as any, owner);\r\n if (wrapper) {\r\n meta.relationWrappers.set(relationName, wrapper);\r\n }\r\n\r\n return wrapper;\r\n};\r\n\r\nconst instantiateWrapper = (\r\n meta: EntityMeta<any>,\r\n relationName: string,\r\n relation: HasManyRelation | HasOneRelation | BelongsToRelation | BelongsToManyRelation,\r\n owner: any\r\n): HasManyCollection<any> | HasOneReference<any> | BelongsToReference<any> | ManyToManyCollection<any> | undefined => {\r\n switch (relation.type) {\r\n case RelationKinds.HasOne: {\r\n const hasOne = relation as HasOneRelation;\r\n const localKey = hasOne.localKey || findPrimaryKey(meta.table);\r\n const loader = () => relationLoaderCache(meta, relationName, () =>\r\n loadHasOneRelation(meta.ctx, meta.table, relationName, hasOne)\r\n );\r\n return new DefaultHasOneReference(\r\n meta.ctx,\r\n meta,\r\n owner,\r\n relationName,\r\n hasOne,\r\n meta.table,\r\n loader,\r\n (row: Record<string, any>) => createEntityFromRow(meta.ctx, hasOne.target, row),\r\n localKey\r\n );\r\n }\r\n case RelationKinds.HasMany: {\r\n const hasMany = relation as HasManyRelation;\r\n const localKey = hasMany.localKey || findPrimaryKey(meta.table);\r\n const loader = () => relationLoaderCache(meta, relationName, () =>\r\n loadHasManyRelation(meta.ctx, meta.table, relationName, hasMany)\r\n );\r\n return new DefaultHasManyCollection(\r\n meta.ctx,\r\n meta,\r\n owner,\r\n relationName,\r\n hasMany,\r\n meta.table,\r\n loader,\r\n (row: Record<string, any>) => createEntityFromRow(meta.ctx, relation.target, row),\r\n localKey\r\n );\r\n }\r\n case RelationKinds.BelongsTo: {\r\n const belongsTo = relation as BelongsToRelation;\r\n const targetKey = belongsTo.localKey || findPrimaryKey(belongsTo.target);\r\n const loader = () => relationLoaderCache(meta, relationName, () =>\r\n loadBelongsToRelation(meta.ctx, meta.table, relationName, belongsTo)\r\n );\r\n return new DefaultBelongsToReference(\r\n meta.ctx,\r\n meta,\r\n owner,\r\n relationName,\r\n belongsTo,\r\n meta.table,\r\n loader,\r\n (row: Record<string, any>) => createEntityFromRow(meta.ctx, relation.target, row),\r\n targetKey\r\n );\r\n }\r\n case RelationKinds.BelongsToMany: {\r\n const many = relation as BelongsToManyRelation;\r\n const localKey = many.localKey || findPrimaryKey(meta.table);\r\n const loader = () => relationLoaderCache(meta, relationName, () =>\r\n loadBelongsToManyRelation(meta.ctx, meta.table, relationName, many)\r\n );\r\n return new DefaultManyToManyCollection(\r\n meta.ctx,\r\n meta,\r\n owner,\r\n relationName,\r\n many,\r\n meta.table,\r\n loader,\r\n (row: Record<string, any>) => createEntityFromRow(meta.ctx, relation.target, row),\r\n localKey\r\n );\r\n }\r\n default:\r\n return undefined;\r\n }\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { EntityInstance } from '../schema/types.js';\r\nimport { hydrateRows } from './hydration.js';\r\nimport { OrmSession } from './orm-session.ts';\r\nimport { SelectQueryBuilder } from '../query-builder/select.js';\r\nimport { createEntityProxy, createEntityFromRow } from './entity.js';\r\nimport { EntityContext } from './entity-context.js';\r\nimport { ExecutionContext } from './execution-context.js';\r\nimport { HydrationContext } from './hydration-context.js';\r\n\r\ntype Row = Record<string, any>;\r\n\r\nconst flattenResults = (results: { columns: string[]; values: unknown[][] }[]): Row[] => {\r\n const rows: Row[] = [];\r\n for (const result of results) {\r\n const { columns, values } = result;\r\n for (const valueRow of values) {\r\n const row: Row = {};\r\n columns.forEach((column, idx) => {\r\n row[column] = valueRow[idx];\r\n });\r\n rows.push(row);\r\n }\r\n }\r\n return rows;\r\n};\r\n\r\nconst executeWithEntityContext = async <TTable extends TableDef>(\r\n entityCtx: EntityContext,\r\n qb: SelectQueryBuilder<any, TTable>\r\n): Promise<EntityInstance<TTable>[]> => {\r\n const ast = qb.getAST();\r\n const compiled = entityCtx.dialect.compileSelect(ast);\r\n const executed = await entityCtx.executor.executeSql(compiled.sql, compiled.params);\r\n const rows = flattenResults(executed);\r\n\r\n if (ast.setOps && ast.setOps.length > 0) {\r\n return rows.map(row => createEntityProxy(entityCtx, qb.getTable(), row, qb.getLazyRelations()));\r\n }\r\n\r\n const hydrated = hydrateRows(rows, qb.getHydrationPlan());\r\n return hydrated.map(row => createEntityFromRow(entityCtx, qb.getTable(), row, qb.getLazyRelations()));\r\n};\r\n\r\nexport async function executeHydrated<TTable extends TableDef>(\r\n session: OrmSession,\r\n qb: SelectQueryBuilder<any, TTable>\r\n): Promise<EntityInstance<TTable>[]> {\r\n return executeWithEntityContext(session, qb);\r\n}\r\n\r\nexport async function executeHydratedWithContexts<TTable extends TableDef>(\r\n _execCtx: ExecutionContext,\r\n hydCtx: HydrationContext,\r\n qb: SelectQueryBuilder<any, TTable>\r\n): Promise<EntityInstance<TTable>[]> {\r\n const entityCtx = hydCtx.entityContext;\r\n if (!entityCtx) {\r\n throw new Error('Hydration context is missing an EntityContext');\r\n }\r\n return executeWithEntityContext(entityCtx, qb);\r\n}\r\n","import { TableDef } from '../schema/table.js';\n\nimport { ColumnDef } from '../schema/column.js';\n\nimport { SelectQueryNode, SetOperationKind } from '../core/ast/query.js';\n\nimport { HydrationPlan } from '../core/hydration/types.js';\n\nimport {\n\n ColumnNode,\n\n ExpressionNode,\n\n FunctionNode,\n\n LiteralNode,\n\n BinaryExpressionNode,\n\n CaseExpressionNode,\n\n WindowFunctionNode,\n\n and,\n\n exists,\n\n notExists\n\n} from '../core/ast/expression.js';\nimport { derivedTable } from '../core/ast/builders.js';\n\nimport { CompiledQuery, Dialect } from '../core/dialect/abstract.js';\n\nimport { DialectKey, resolveDialectInput } from '../core/dialect/dialect-factory.js';\n\n\n\ntype SelectDialectInput = Dialect | DialectKey;\n\nimport { SelectQueryState } from './select-query-state.js';\n\nimport { HydrationManager } from './hydration-manager.js';\n\nimport {\n\n resolveSelectQueryBuilderDependencies,\n\n SelectQueryBuilderContext,\n\n SelectQueryBuilderDependencies,\n\n SelectQueryBuilderEnvironment\n\n} from './select-query-builder-deps.js';\n\nimport { QueryAstService } from './query-ast-service.js';\n\nimport { ColumnSelector } from './column-selector.js';\n\nimport { RelationManager } from './relation-manager.js';\n\nimport { RelationIncludeOptions } from './relation-types.js';\n\nimport type { RelationDef } from '../schema/relation.js';\n\nimport { JOIN_KINDS, JoinKind, ORDER_DIRECTIONS, OrderDirection } from '../core/sql/sql.js';\n\nimport { EntityInstance, RelationMap, RelationTargetTable } from '../schema/types.js';\n\nimport { OrmSession } from '../orm/orm-session.ts';\n\nimport { ExecutionContext } from '../orm/execution-context.js';\n\nimport { HydrationContext } from '../orm/hydration-context.js';\n\nimport { executeHydrated, executeHydratedWithContexts } from '../orm/execute.js';\n\nimport { createJoinNode } from '../core/ast/join-node.js';\n\n\ntype ColumnSelectionValue = ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode;\n\ntype DeepSelectConfig<TTable extends TableDef> = {\n root?: (keyof TTable['columns'] & string)[];\n} & {\n [K in keyof TTable['relations'] & string]?: (\n keyof RelationTargetTable<TTable['relations'][K]>['columns'] & string\n )[];\n};\n\ntype WhereHasOptions = {\n correlate?: ExpressionNode;\n};\n\ntype RelationCallback = <TChildTable extends TableDef>(\n qb: SelectQueryBuilder<any, TChildTable>\n) => SelectQueryBuilder<any, TChildTable>;\n\n\n/**\n\n * Main query builder class for constructing SQL SELECT queries\n\n * @typeParam T - Result type for projections (unused)\n\n * @typeParam TTable - Table definition being queried\n\n */\n\nexport class SelectQueryBuilder<T = any, TTable extends TableDef = TableDef> {\n\n private readonly env: SelectQueryBuilderEnvironment;\n\n private readonly context: SelectQueryBuilderContext;\n\n private readonly columnSelector: ColumnSelector;\n\n private readonly relationManager: RelationManager;\n\n private readonly lazyRelations: Set<string>;\n\n\n\n /**\n\n * Creates a new SelectQueryBuilder instance\n\n * @param table - Table definition to query\n\n * @param state - Optional initial query state\n\n * @param hydration - Optional hydration manager\n\n * @param dependencies - Optional query builder dependencies\n\n */\n\n constructor(\n\n table: TTable,\n\n state?: SelectQueryState,\n\n hydration?: HydrationManager,\n\n dependencies?: Partial<SelectQueryBuilderDependencies>,\n\n lazyRelations?: Set<string>\n\n ) {\n\n const deps = resolveSelectQueryBuilderDependencies(dependencies);\n\n this.env = { table, deps };\n\n const initialState = state ?? deps.createState(table);\n\n const initialHydration = hydration ?? deps.createHydration(table);\n\n this.context = {\n\n state: initialState,\n\n hydration: initialHydration\n\n };\n\n this.lazyRelations = new Set(lazyRelations ?? []);\n\n this.columnSelector = new ColumnSelector(this.env);\n\n this.relationManager = new RelationManager(this.env);\n\n }\n\n\n\n private clone(\n\n context: SelectQueryBuilderContext = this.context,\n\n lazyRelations = new Set(this.lazyRelations)\n\n ): SelectQueryBuilder<T, TTable> {\n\n return new SelectQueryBuilder(this.env.table as TTable, context.state, context.hydration, this.env.deps, lazyRelations);\n\n }\n\n /**\n * Applies an alias to the root FROM table.\n * @param alias - Alias to apply\n */\n as(alias: string): SelectQueryBuilder<T, TTable> {\n const from = this.context.state.ast.from;\n if (from.type !== 'Table') {\n throw new Error('Cannot alias non-table FROM sources');\n }\n const nextFrom = { ...from, alias };\n const nextContext = this.applyAst(this.context, service => service.withFrom(nextFrom));\n return this.clone(nextContext);\n }\n\n\n\n private resolveQueryNode(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryNode {\n\n return typeof (query as any).getAST === 'function'\n\n ? (query as SelectQueryBuilder<any, TableDef<any>>).getAST()\n\n : (query as SelectQueryNode);\n\n }\n\n private applyCorrelation(ast: SelectQueryNode, correlation?: ExpressionNode): SelectQueryNode {\n if (!correlation) return ast;\n const combinedWhere = ast.where ? and(correlation, ast.where) : correlation;\n return {\n ...ast,\n where: combinedWhere\n };\n }\n\n\n\n private createChildBuilder<R, TChild extends TableDef>(table: TChild): SelectQueryBuilder<R, TChild> {\n\n return new SelectQueryBuilder(table, undefined, undefined, this.env.deps);\n\n }\n\n\n\n private applyAst(\n\n context: SelectQueryBuilderContext,\n\n mutator: (service: QueryAstService) => SelectQueryState\n\n ): SelectQueryBuilderContext {\n\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\n\n const nextState = mutator(astService);\n\n return { state: nextState, hydration: context.hydration };\n\n }\n\n\n\n private applyJoin(\n\n context: SelectQueryBuilderContext,\n\n table: TableDef,\n\n condition: BinaryExpressionNode,\n\n kind: JoinKind\n\n ): SelectQueryBuilderContext {\n\n const joinNode = createJoinNode(kind, table.name, condition);\n\n return this.applyAst(context, service => service.withJoin(joinNode));\n\n }\n\n\n\n private applySetOperation(\n\n operator: SetOperationKind,\n\n query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode\n\n ): SelectQueryBuilderContext {\n\n const subAst = this.resolveQueryNode(query);\n\n return this.applyAst(this.context, service => service.withSetOperation(operator, subAst));\n\n }\n\n\n\n /**\n\n * Selects specific columns for the query\n\n * @param columns - Record of column definitions, function nodes, case expressions, or window functions\n\n * @returns New query builder instance with selected columns\n\n */\n\n select(columns: Record<string, ColumnSelectionValue>): SelectQueryBuilder<T, TTable> {\n\n return this.clone(this.columnSelector.select(this.context, columns));\n\n }\n\n\n /**\n * Selects columns from the root table by name (typed).\n * @param cols - Column names on the root table\n */\n selectColumns<K extends keyof TTable['columns'] & string>(...cols: K[]): SelectQueryBuilder<T, TTable> {\n const selection: Record<string, ColumnDef> = {};\n\n for (const key of cols) {\n const col = this.env.table.columns[key];\n if (!col) {\n throw new Error(`Column '${key}' not found on table '${this.env.table.name}'`);\n }\n selection[key] = col;\n }\n\n return this.select(selection);\n }\n\n\n\n /**\n\n * Selects raw column expressions\n\n * @param cols - Column expressions as strings\n\n * @returns New query builder instance with raw column selections\n\n */\n\n selectRaw(...cols: string[]): SelectQueryBuilder<T, TTable> {\n\n return this.clone(this.columnSelector.selectRaw(this.context, cols));\n\n }\n\n\n\n /**\n\n * Adds a Common Table Expression (CTE) to the query\n\n * @param name - Name of the CTE\n\n * @param query - Query builder or query node for the CTE\n\n * @param columns - Optional column names for the CTE\n\n * @returns New query builder instance with the CTE\n\n */\n\n with(name: string, query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode, columns?: string[]): SelectQueryBuilder<T, TTable> {\n\n const subAst = this.resolveQueryNode(query);\n\n const nextContext = this.applyAst(this.context, service => service.withCte(name, subAst, columns, false));\n\n return this.clone(nextContext);\n\n }\n\n\n\n /**\n\n * Adds a recursive Common Table Expression (CTE) to the query\n\n * @param name - Name of the CTE\n\n * @param query - Query builder or query node for the CTE\n\n * @param columns - Optional column names for the CTE\n\n * @returns New query builder instance with the recursive CTE\n\n */\n\n withRecursive(name: string, query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode, columns?: string[]): SelectQueryBuilder<T, TTable> {\n\n const subAst = this.resolveQueryNode(query);\n\n const nextContext = this.applyAst(this.context, service => service.withCte(name, subAst, columns, true));\n\n return this.clone(nextContext);\n\n }\n\n\n /**\n * Replaces the FROM clause with a derived table (subquery with alias)\n * @param subquery - Subquery to use as the FROM source\n * @param alias - Alias for the derived table\n * @param columnAliases - Optional column alias list\n * @returns New query builder instance with updated FROM\n */\n fromSubquery(\n subquery: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode,\n alias: string,\n columnAliases?: string[]\n ): SelectQueryBuilder<T, TTable> {\n const subAst = this.resolveQueryNode(subquery);\n const fromNode = derivedTable(subAst, alias, columnAliases);\n const nextContext = this.applyAst(this.context, service => service.withFrom(fromNode));\n return this.clone(nextContext);\n }\n\n\n\n /**\n\n * Selects a subquery as a column\n\n * @param alias - Alias for the subquery column\n\n * @param sub - Query builder or query node for the subquery\n\n * @returns New query builder instance with the subquery selection\n\n */\n\n selectSubquery(alias: string, sub: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\n\n const query = this.resolveQueryNode(sub);\n\n return this.clone(this.columnSelector.selectSubquery(this.context, alias, query));\n\n }\n\n\n /**\n * Adds a JOIN against a derived table (subquery with alias)\n * @param subquery - Subquery to join\n * @param alias - Alias for the derived table\n * @param condition - Join condition expression\n * @param joinKind - Join kind (defaults to INNER)\n * @param columnAliases - Optional column alias list for the derived table\n * @returns New query builder instance with the derived-table join\n */\n joinSubquery(\n subquery: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode,\n alias: string,\n condition: BinaryExpressionNode,\n joinKind: JoinKind = JOIN_KINDS.INNER,\n columnAliases?: string[]\n ): SelectQueryBuilder<T, TTable> {\n const subAst = this.resolveQueryNode(subquery);\n const joinNode = createJoinNode(joinKind, derivedTable(subAst, alias, columnAliases), condition);\n const nextContext = this.applyAst(this.context, service => service.withJoin(joinNode));\n return this.clone(nextContext);\n }\n\n\n\n /**\n\n * Adds an INNER JOIN to the query\n\n * @param table - Table to join\n\n * @param condition - Join condition expression\n\n * @returns New query builder instance with the INNER JOIN\n\n */\n\n innerJoin(table: TableDef, condition: BinaryExpressionNode): SelectQueryBuilder<T, TTable> {\n\n const nextContext = this.applyJoin(this.context, table, condition, JOIN_KINDS.INNER);\n\n return this.clone(nextContext);\n\n }\n\n\n\n /**\n\n * Adds a LEFT JOIN to the query\n\n * @param table - Table to join\n\n * @param condition - Join condition expression\n\n * @returns New query builder instance with the LEFT JOIN\n\n */\n\n leftJoin(table: TableDef, condition: BinaryExpressionNode): SelectQueryBuilder<T, TTable> {\n\n const nextContext = this.applyJoin(this.context, table, condition, JOIN_KINDS.LEFT);\n\n return this.clone(nextContext);\n\n }\n\n\n\n /**\n\n * Adds a RIGHT JOIN to the query\n\n * @param table - Table to join\n\n * @param condition - Join condition expression\n\n * @returns New query builder instance with the RIGHT JOIN\n\n */\n\n rightJoin(table: TableDef, condition: BinaryExpressionNode): SelectQueryBuilder<T, TTable> {\n\n const nextContext = this.applyJoin(this.context, table, condition, JOIN_KINDS.RIGHT);\n\n return this.clone(nextContext);\n\n }\n\n\n\n /**\n\n * Matches records based on a relationship\n\n * @param relationName - Name of the relationship to match\n\n * @param predicate - Optional predicate expression\n\n * @returns New query builder instance with the relationship match\n\n */\n\n match(relationName: string, predicate?: ExpressionNode): SelectQueryBuilder<T, TTable> {\n\n const nextContext = this.relationManager.match(this.context, relationName, predicate);\n\n return this.clone(nextContext);\n\n }\n\n\n\n /**\n\n * Joins a related table\n\n * @param relationName - Name of the relationship to join\n\n * @param joinKind - Type of join (defaults to INNER)\n\n * @param extraCondition - Optional additional join condition\n\n * @returns New query builder instance with the relationship join\n\n */\n\n joinRelation(\n\n relationName: string,\n\n joinKind: JoinKind = JOIN_KINDS.INNER,\n\n extraCondition?: ExpressionNode\n\n ): SelectQueryBuilder<T, TTable> {\n\n const nextContext = this.relationManager.joinRelation(this.context, relationName, joinKind, extraCondition);\n\n return this.clone(nextContext);\n\n }\n\n\n\n /**\n\n * Includes related data in the query results\n\n * @param relationName - Name of the relationship to include\n\n * @param options - Optional include options\n\n * @returns New query builder instance with the relationship inclusion\n\n */\n\n include(relationName: string, options?: RelationIncludeOptions): SelectQueryBuilder<T, TTable> {\n\n const nextContext = this.relationManager.include(this.context, relationName, options);\n\n return this.clone(nextContext);\n\n }\n\n\n\n includeLazy<K extends keyof RelationMap<TTable>>(relationName: K): SelectQueryBuilder<T, TTable> {\n\n const nextLazy = new Set(this.lazyRelations);\n\n nextLazy.add(relationName as string);\n\n return this.clone(this.context, nextLazy);\n\n }\n\n /**\n * Selects columns for a related table in a single hop.\n */\n selectRelationColumns<\n K extends keyof TTable['relations'] & string,\n TRel extends RelationDef = TTable['relations'][K],\n TTarget extends TableDef = RelationTargetTable<TRel>,\n C extends keyof TTarget['columns'] & string = keyof TTarget['columns'] & string\n >(relationName: K, ...cols: C[]): SelectQueryBuilder<T, TTable> {\n const relation = this.env.table.relations[relationName] as RelationDef | undefined;\n if (!relation) {\n throw new Error(`Relation '${relationName}' not found on table '${this.env.table.name}'`);\n }\n const target = relation.target;\n\n for (const col of cols) {\n if (!target.columns[col]) {\n throw new Error(\n `Column '${col}' not found on related table '${target.name}' for relation '${relationName}'`\n );\n }\n }\n\n return this.include(relationName as string, { columns: cols as string[] });\n }\n\n\n /**\n * Convenience alias for selecting specific columns from a relation.\n */\n includePick<\n K extends keyof TTable['relations'] & string,\n TRel extends RelationDef = TTable['relations'][K],\n TTarget extends TableDef = RelationTargetTable<TRel>,\n C extends keyof TTarget['columns'] & string = keyof TTarget['columns'] & string\n >(relationName: K, cols: C[]): SelectQueryBuilder<T, TTable> {\n return this.selectRelationColumns(relationName, ...cols);\n }\n\n\n /**\n * Selects columns for the root table and relations from a single config object.\n */\n selectColumnsDeep(config: DeepSelectConfig<TTable>): SelectQueryBuilder<T, TTable> {\n let qb: SelectQueryBuilder<T, TTable> = this;\n\n if (config.root?.length) {\n qb = qb.selectColumns(...config.root);\n }\n\n for (const key of Object.keys(config) as (keyof typeof config)[]) {\n if (key === 'root') continue;\n const relName = key as keyof TTable['relations'] & string;\n const cols = config[relName as keyof DeepSelectConfig<TTable>] as string[] | undefined;\n if (!cols || !cols.length) continue;\n qb = qb.selectRelationColumns(relName, ...(cols as string[]));\n }\n\n return qb;\n }\n\n\n\n getLazyRelations(): (keyof RelationMap<TTable>)[] {\n\n return Array.from(this.lazyRelations) as (keyof RelationMap<TTable>)[];\n\n }\n\n\n\n getTable(): TTable {\n\n return this.env.table as TTable;\n\n }\n\n\n\n async execute(ctx: OrmSession): Promise<EntityInstance<TTable>[]> {\n\n return executeHydrated(ctx, this);\n\n }\n\n\n\n async executeWithContexts(execCtx: ExecutionContext, hydCtx: HydrationContext): Promise<EntityInstance<TTable>[]> {\n\n return executeHydratedWithContexts(execCtx, hydCtx, this);\n\n }\n\n\n\n /**\n\n * Adds a WHERE condition to the query\n\n * @param expr - Expression for the WHERE clause\n\n * @returns New query builder instance with the WHERE condition\n\n */\n\n where(expr: ExpressionNode): SelectQueryBuilder<T, TTable> {\n\n const nextContext = this.applyAst(this.context, service => service.withWhere(expr));\n\n return this.clone(nextContext);\n\n }\n\n\n\n /**\n\n * Adds a GROUP BY clause to the query\n\n * @param col - Column definition or column node to group by\n\n * @returns New query builder instance with the GROUP BY clause\n\n */\n\n groupBy(col: ColumnDef | ColumnNode): SelectQueryBuilder<T, TTable> {\n\n const nextContext = this.applyAst(this.context, service => service.withGroupBy(col));\n\n return this.clone(nextContext);\n\n }\n\n\n\n /**\n\n * Adds a HAVING condition to the query\n\n * @param expr - Expression for the HAVING clause\n\n * @returns New query builder instance with the HAVING condition\n\n */\n\n having(expr: ExpressionNode): SelectQueryBuilder<T, TTable> {\n\n const nextContext = this.applyAst(this.context, service => service.withHaving(expr));\n\n return this.clone(nextContext);\n\n }\n\n\n\n /**\n\n * Adds an ORDER BY clause to the query\n\n * @param col - Column definition or column node to order by\n\n * @param direction - Order direction (defaults to ASC)\n\n * @returns New query builder instance with the ORDER BY clause\n\n */\n\n orderBy(col: ColumnDef | ColumnNode, direction: OrderDirection = ORDER_DIRECTIONS.ASC): SelectQueryBuilder<T, TTable> {\n\n const nextContext = this.applyAst(this.context, service => service.withOrderBy(col, direction));\n\n return this.clone(nextContext);\n\n }\n\n\n\n /**\n\n * Adds a DISTINCT clause to the query\n\n * @param cols - Columns to make distinct\n\n * @returns New query builder instance with the DISTINCT clause\n\n */\n\n distinct(...cols: (ColumnDef | ColumnNode)[]): SelectQueryBuilder<T, TTable> {\n\n return this.clone(this.columnSelector.distinct(this.context, cols));\n\n }\n\n\n\n /**\n\n * Adds a LIMIT clause to the query\n\n * @param n - Maximum number of rows to return\n\n * @returns New query builder instance with the LIMIT clause\n\n */\n\n limit(n: number): SelectQueryBuilder<T, TTable> {\n\n const nextContext = this.applyAst(this.context, service => service.withLimit(n));\n\n return this.clone(nextContext);\n\n }\n\n\n\n /**\n\n * Adds an OFFSET clause to the query\n\n * @param n - Number of rows to skip\n\n * @returns New query builder instance with the OFFSET clause\n\n */\n\n offset(n: number): SelectQueryBuilder<T, TTable> {\n\n const nextContext = this.applyAst(this.context, service => service.withOffset(n));\n\n return this.clone(nextContext);\n\n }\n\n\n\n /**\n\n * Combines this query with another using UNION\n\n * @param query - Query to union with\n\n * @returns New query builder instance with the set operation\n\n */\n\n union(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\n\n return this.clone(this.applySetOperation('UNION', query));\n\n }\n\n\n\n /**\n\n * Combines this query with another using UNION ALL\n\n * @param query - Query to union with\n\n * @returns New query builder instance with the set operation\n\n */\n\n unionAll(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\n\n return this.clone(this.applySetOperation('UNION ALL', query));\n\n }\n\n\n\n /**\n\n * Combines this query with another using INTERSECT\n\n * @param query - Query to intersect with\n\n * @returns New query builder instance with the set operation\n\n */\n\n intersect(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\n\n return this.clone(this.applySetOperation('INTERSECT', query));\n\n }\n\n\n\n /**\n\n * Combines this query with another using EXCEPT\n\n * @param query - Query to subtract\n\n * @returns New query builder instance with the set operation\n\n */\n\n except(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\n\n return this.clone(this.applySetOperation('EXCEPT', query));\n\n }\n\n\n\n /**\n\n * Adds a WHERE EXISTS condition to the query\n\n * @param subquery - Subquery to check for existence\n\n * @returns New query builder instance with the WHERE EXISTS condition\n\n */\n\n whereExists(\n subquery: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode,\n correlate?: ExpressionNode\n ): SelectQueryBuilder<T, TTable> {\n const subAst = this.resolveQueryNode(subquery);\n const correlated = this.applyCorrelation(subAst, correlate);\n return this.where(exists(correlated));\n }\n\n\n\n /**\n\n * Adds a WHERE NOT EXISTS condition to the query\n\n * @param subquery - Subquery to check for non-existence\n\n * @returns New query builder instance with the WHERE NOT EXISTS condition\n\n */\n\n whereNotExists(\n subquery: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode,\n correlate?: ExpressionNode\n ): SelectQueryBuilder<T, TTable> {\n const subAst = this.resolveQueryNode(subquery);\n const correlated = this.applyCorrelation(subAst, correlate);\n return this.where(notExists(correlated));\n }\n\n\n\n /**\n\n * Adds a WHERE EXISTS condition based on a relationship\n\n * @param relationName - Name of the relationship to check\n\n * @param callback - Optional callback to modify the relationship query\n\n * @returns New query builder instance with the relationship existence check\n\n */\n\n whereHas(\n\n relationName: string,\n\n callbackOrOptions?: RelationCallback | WhereHasOptions,\n\n maybeOptions?: WhereHasOptions\n\n ): SelectQueryBuilder<T, TTable> {\n\n const relation = this.env.table.relations[relationName];\n\n if (!relation) {\n\n throw new Error(`Relation '${relationName}' not found on table '${this.env.table.name}'`);\n\n }\n\n\n\n const callback = typeof callbackOrOptions === 'function' ? callbackOrOptions as RelationCallback : undefined;\n const options = (typeof callbackOrOptions === 'function' ? maybeOptions : callbackOrOptions) as WhereHasOptions | undefined;\n\n let subQb = this.createChildBuilder<any, typeof relation.target>(relation.target);\n\n if (callback) {\n\n subQb = callback(subQb);\n\n }\n\n\n\n const subAst = subQb.getAST();\n\n const finalSubAst = this.relationManager.applyRelationCorrelation(this.context, relationName, subAst, options?.correlate);\n\n return this.where(exists(finalSubAst));\n\n }\n\n\n\n /**\n\n * Adds a WHERE NOT EXISTS condition based on a relationship\n\n * @param relationName - Name of the relationship to check\n\n * @param callback - Optional callback to modify the relationship query\n\n * @returns New query builder instance with the relationship non-existence check\n\n */\n\n whereHasNot(\n\n relationName: string,\n\n callbackOrOptions?: RelationCallback | WhereHasOptions,\n\n maybeOptions?: WhereHasOptions\n\n ): SelectQueryBuilder<T, TTable> {\n\n const relation = this.env.table.relations[relationName];\n\n if (!relation) {\n\n throw new Error(`Relation '${relationName}' not found on table '${this.env.table.name}'`);\n\n }\n\n\n\n const callback = typeof callbackOrOptions === 'function' ? callbackOrOptions as RelationCallback : undefined;\n const options = (typeof callbackOrOptions === 'function' ? maybeOptions : callbackOrOptions) as WhereHasOptions | undefined;\n\n let subQb = this.createChildBuilder<any, typeof relation.target>(relation.target);\n\n if (callback) {\n\n subQb = callback(subQb);\n\n }\n\n\n\n const subAst = subQb.getAST();\n\n const finalSubAst = this.relationManager.applyRelationCorrelation(this.context, relationName, subAst, options?.correlate);\n\n return this.where(notExists(finalSubAst));\n\n }\n\n\n\n /**\n\n * Compiles the query to SQL for a specific dialect\n\n * @param dialect - Database dialect to compile for\n\n * @returns Compiled query with SQL and parameters\n\n */\n\n compile(dialect: SelectDialectInput): CompiledQuery {\n\n const resolved = resolveDialectInput(dialect);\n\n return resolved.compileSelect(this.context.state.ast);\n\n }\n\n\n\n /**\n\n * Converts the query to SQL string for a specific dialect\n\n * @param dialect - Database dialect to generate SQL for\n\n * @returns SQL string representation of the query\n\n */\n\n toSql(dialect: SelectDialectInput): string {\n\n return this.compile(dialect).sql;\n\n }\n\n\n\n /**\n\n * Gets the hydration plan for the query\n\n * @returns Hydration plan or undefined if none exists\n\n */\n\n getHydrationPlan(): HydrationPlan | undefined {\n\n return this.context.hydration.getPlan();\n\n }\n\n\n\n /**\n\n * Gets the Abstract Syntax Tree (AST) representation of the query\n\n * @returns Query AST with hydration applied\n\n */\n\n getAST(): SelectQueryNode {\n\n return this.context.hydration.applyToAst(this.context.state.ast);\n\n }\n\n}\n\n\n\n/**\n\n * Creates a column node for use in expressions\n\n * @param table - Table name\n\n * @param name - Column name\n\n * @returns ColumnNode with the specified table and name\n\n */\n\nexport const createColumn = (table: string, name: string): ColumnNode => ({ type: 'Column', table, name });\n\n\n\n/**\n\n * Creates a literal value node for use in expressions\n\n * @param val - Literal value (string or number)\n\n * @returns LiteralNode with the specified value\n\n */\n\nexport const createLiteral = (val: string | number): LiteralNode => ({ type: 'Literal', value: val });\n","import { ColumnType, ColumnDef } from '../schema/column.js';\nimport { defineTable, TableDef, TableHooks } from '../schema/table.js';\nimport { CascadeMode, RelationKinds } from '../schema/relation.js';\n\nexport type EntityConstructor = new (...args: any[]) => any;\nexport type EntityOrTableTarget = EntityConstructor | TableDef;\nexport type EntityOrTableTargetResolver = EntityOrTableTarget | (() => EntityOrTableTarget);\n\nexport type ColumnDefLike = Omit<ColumnDef, 'name' | 'table'>;\n\ninterface BaseRelationMetadata {\n propertyKey: string;\n target: EntityOrTableTargetResolver;\n cascade?: CascadeMode;\n}\n\nexport interface HasManyRelationMetadata extends BaseRelationMetadata {\n kind: typeof RelationKinds.HasMany;\n foreignKey: string;\n localKey?: string;\n}\n\nexport interface HasOneRelationMetadata extends BaseRelationMetadata {\n kind: typeof RelationKinds.HasOne;\n foreignKey: string;\n localKey?: string;\n}\n\nexport interface BelongsToRelationMetadata extends BaseRelationMetadata {\n kind: typeof RelationKinds.BelongsTo;\n foreignKey: string;\n localKey?: string;\n}\n\nexport interface BelongsToManyRelationMetadata extends BaseRelationMetadata {\n kind: typeof RelationKinds.BelongsToMany;\n pivotTable: EntityOrTableTargetResolver;\n pivotForeignKeyToRoot: string;\n pivotForeignKeyToTarget: string;\n localKey?: string;\n targetKey?: string;\n pivotPrimaryKey?: string;\n defaultPivotColumns?: string[];\n}\n\nexport type RelationMetadata =\n | HasManyRelationMetadata\n | HasOneRelationMetadata\n | BelongsToRelationMetadata\n | BelongsToManyRelationMetadata;\n\nexport interface EntityMetadata {\n target: EntityConstructor;\n tableName: string;\n columns: Record<string, ColumnDefLike>;\n relations: Record<string, RelationMetadata>;\n hooks?: TableHooks;\n table?: TableDef;\n}\n\nconst metadataMap = new Map<EntityConstructor, EntityMetadata>();\n\nexport const registerEntityMetadata = (meta: EntityMetadata): void => {\n metadataMap.set(meta.target, meta);\n};\n\nexport const ensureEntityMetadata = (target: EntityConstructor): EntityMetadata => {\n let meta = metadataMap.get(target);\n if (!meta) {\n meta = {\n target,\n tableName: target.name || 'unknown',\n columns: {},\n relations: {}\n };\n metadataMap.set(target, meta);\n }\n return meta;\n};\n\nexport const getEntityMetadata = (target: EntityConstructor): EntityMetadata | undefined => {\n return metadataMap.get(target);\n};\n\nexport const getAllEntityMetadata = (): EntityMetadata[] => {\n return Array.from(metadataMap.values());\n};\n\nexport const clearEntityMetadata = (): void => {\n metadataMap.clear();\n};\n\nexport const addColumnMetadata = (\n target: EntityConstructor,\n propertyKey: string,\n column: ColumnDefLike\n): void => {\n const meta = ensureEntityMetadata(target);\n meta.columns[propertyKey] = { ...column };\n};\n\nexport const addRelationMetadata = (\n target: EntityConstructor,\n propertyKey: string,\n relation: RelationMetadata\n): void => {\n const meta = ensureEntityMetadata(target);\n meta.relations[propertyKey] = relation;\n};\n\nexport const setEntityTableName = (\n target: EntityConstructor,\n tableName: string,\n hooks?: TableHooks\n): void => {\n const meta = ensureEntityMetadata(target);\n if (tableName && tableName.length > 0) {\n meta.tableName = tableName;\n }\n if (hooks) {\n meta.hooks = hooks;\n }\n};\n\nexport const buildTableDef = (meta: EntityMetadata): TableDef => {\n if (meta.table) {\n return meta.table;\n }\n\n const columns = Object.entries(meta.columns).reduce<Record<string, ColumnDef>>((acc, [key, def]) => {\n acc[key] = {\n ...def,\n name: key,\n table: meta.tableName\n };\n return acc;\n }, {});\n\n const table = defineTable(meta.tableName, columns, {}, meta.hooks);\n meta.table = table;\n return table;\n};\n","import { SelectQueryBuilder } from '../query-builder/select.js';\nimport {\n hasMany,\n hasOne,\n belongsTo,\n belongsToMany,\n RelationKinds,\n type RelationDef\n} from '../schema/relation.js';\nimport { TableDef } from '../schema/table.js';\nimport {\n buildTableDef,\n EntityConstructor,\n EntityOrTableTarget,\n EntityOrTableTargetResolver,\n getAllEntityMetadata,\n getEntityMetadata,\n RelationMetadata\n} from '../orm/entity-metadata.js';\n\nconst isTableDef = (value: unknown): value is TableDef => {\n return typeof value === 'object' && value !== null && 'columns' in (value as TableDef);\n};\n\nconst unwrapTarget = (target: EntityOrTableTargetResolver): EntityOrTableTarget => {\n if (typeof target === 'function' && (target as Function).prototype === undefined) {\n return (target as () => EntityOrTableTarget)();\n }\n return target as EntityOrTableTarget;\n};\n\nconst resolveTableTarget = (\n target: EntityOrTableTargetResolver,\n tableMap: Map<EntityConstructor, TableDef>\n): TableDef => {\n const resolved = unwrapTarget(target);\n if (isTableDef(resolved)) {\n return resolved;\n }\n const table = tableMap.get(resolved as EntityConstructor);\n if (!table) {\n throw new Error(`Entity '${(resolved as EntityConstructor).name}' is not registered with decorators`);\n }\n return table;\n};\n\nconst buildRelationDefinitions = (\n meta: { relations: Record<string, RelationMetadata> },\n tableMap: Map<EntityConstructor, TableDef>\n): Record<string, RelationDef> => {\n const relations: Record<string, RelationDef> = {};\n\n for (const [name, relation] of Object.entries(meta.relations)) {\n switch (relation.kind) {\n case RelationKinds.HasOne: {\n relations[name] = hasOne(\n resolveTableTarget(relation.target, tableMap),\n relation.foreignKey,\n relation.localKey,\n relation.cascade\n );\n break;\n }\n case RelationKinds.HasMany: {\n relations[name] = hasMany(\n resolveTableTarget(relation.target, tableMap),\n relation.foreignKey,\n relation.localKey,\n relation.cascade\n );\n break;\n }\n case RelationKinds.BelongsTo: {\n relations[name] = belongsTo(\n resolveTableTarget(relation.target, tableMap),\n relation.foreignKey,\n relation.localKey,\n relation.cascade\n );\n break;\n }\n case RelationKinds.BelongsToMany: {\n relations[name] = belongsToMany(\n resolveTableTarget(relation.target, tableMap),\n resolveTableTarget(relation.pivotTable, tableMap),\n {\n pivotForeignKeyToRoot: relation.pivotForeignKeyToRoot,\n pivotForeignKeyToTarget: relation.pivotForeignKeyToTarget,\n localKey: relation.localKey,\n targetKey: relation.targetKey,\n pivotPrimaryKey: relation.pivotPrimaryKey,\n defaultPivotColumns: relation.defaultPivotColumns,\n cascade: relation.cascade\n }\n );\n break;\n }\n }\n }\n\n return relations;\n};\n\nexport const bootstrapEntities = (): TableDef[] => {\n const metas = getAllEntityMetadata();\n const tableMap = new Map<EntityConstructor, TableDef>();\n\n for (const meta of metas) {\n const table = buildTableDef(meta);\n tableMap.set(meta.target, table);\n }\n\n for (const meta of metas) {\n const table = meta.table!;\n const relations = buildRelationDefinitions(meta, tableMap);\n table.relations = relations;\n }\n\n return metas.map(meta => meta.table!) as TableDef[];\n};\n\nexport const getTableDefFromEntity = (ctor: EntityConstructor): TableDef | undefined => {\n const meta = getEntityMetadata(ctor);\n if (!meta) return undefined;\n if (!meta.table) {\n bootstrapEntities();\n }\n return meta.table;\n};\n\nexport const selectFromEntity = <TTable extends TableDef>(\n ctor: EntityConstructor\n): SelectQueryBuilder<any, TTable> => {\n const table = getTableDefFromEntity(ctor);\n if (!table) {\n throw new Error(`Entity '${ctor.name}' is not registered with decorators or has not been bootstrapped`);\n }\n return new SelectQueryBuilder(table as TTable);\n};\n","import type { TableDef } from '../schema/table.js';\nimport type { ColumnDef } from '../schema/column.js';\nimport { getTableDefFromEntity } from '../decorators/bootstrap.js';\n\n/**\n * Build a typed selection map from a TableDef.\n */\nexport function sel<\n TTable extends TableDef,\n K extends keyof TTable['columns'] & string\n>(table: TTable, ...cols: K[]): Record<K, TTable['columns'][K]> {\n const selection = {} as Record<K, TTable['columns'][K]>;\n\n for (const col of cols) {\n const def = table.columns[col] as TTable['columns'][K];\n if (!def) {\n throw new Error(`Column '${col}' not found on table '${table.name}'`);\n }\n selection[col] = def;\n }\n\n return selection;\n}\n\ntype Ctor<T> = { new (...args: any[]): T };\n\n/**\n * Build a typed selection map from an entity constructor.\n */\nexport function esel<TEntity, K extends keyof TEntity & string>(\n entity: Ctor<TEntity>,\n ...props: K[]\n): Record<K, ColumnDef> {\n const table = getTableDefFromEntity(entity) as TableDef | undefined;\n if (!table) {\n throw new Error(`No table definition registered for entity '${entity.name}'`);\n }\n\n const selection = {} as Record<K, ColumnDef>;\n\n for (const prop of props) {\n const col = table.columns[prop];\n if (!col) {\n throw new Error(`No column '${prop}' found for entity '${entity.name}'`);\n }\n selection[prop] = col;\n }\n\n return selection;\n}\n","import { TableDef } from '../schema/table.js';\r\nimport { InsertQueryNode, TableNode } from '../core/ast/query.js';\r\nimport { ColumnNode, OperandNode, isValueOperandInput, valueToOperand } from '../core/ast/expression.js';\r\nimport { buildColumnNodes, createTableNode } from '../core/ast/builders.js';\r\n\r\n/**\r\n * Maintains immutable state for building INSERT queries\r\n */\r\nexport class InsertQueryState {\r\n public readonly table: TableDef;\r\n public readonly ast: InsertQueryNode;\r\n\r\n constructor(table: TableDef, ast?: InsertQueryNode) {\r\n this.table = table;\r\n this.ast = ast ?? {\r\n type: 'InsertQuery',\r\n into: createTableNode(table),\r\n columns: [],\r\n values: []\r\n };\r\n }\r\n\r\n private clone(nextAst: InsertQueryNode): InsertQueryState {\r\n return new InsertQueryState(this.table, nextAst);\r\n }\r\n\r\n withValues(rows: Record<string, unknown>[]): InsertQueryState {\r\n if (!rows.length) return this;\r\n\r\n const definedColumns = this.ast.columns.length\r\n ? this.ast.columns\r\n : buildColumnNodes(this.table, Object.keys(rows[0]));\r\n\r\n const newRows: OperandNode[][] = rows.map((row, rowIndex) =>\r\n definedColumns.map(column => {\r\n const rawValue = row[column.name];\r\n\r\n if (!isValueOperandInput(rawValue)) {\r\n throw new Error(\r\n `Invalid insert value for column \"${column.name}\" in row ${rowIndex}: only primitives, null, or OperandNodes are allowed`\r\n );\r\n }\r\n\r\n return valueToOperand(rawValue);\r\n })\r\n );\r\n\r\n return this.clone({\r\n ...this.ast,\r\n columns: definedColumns,\r\n values: [...this.ast.values, ...newRows]\r\n });\r\n }\r\n\r\n withReturning(columns: ColumnNode[]): InsertQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n returning: [...columns]\r\n });\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { ColumnNode } from '../core/ast/expression.js';\r\nimport { CompiledQuery, InsertCompiler, Dialect } from '../core/dialect/abstract.js';\r\nimport { DialectKey, resolveDialectInput } from '../core/dialect/dialect-factory.js';\r\nimport { InsertQueryNode } from '../core/ast/query.js';\r\nimport { InsertQueryState } from './insert-query-state.js';\r\nimport { buildColumnNode } from '../core/ast/builders.js';\r\n\r\ntype InsertDialectInput = Dialect | DialectKey;\r\n\r\n/**\r\n * Builder for INSERT queries\r\n */\r\nexport class InsertQueryBuilder<T> {\r\n private readonly table: TableDef;\r\n private readonly state: InsertQueryState;\r\n\r\n constructor(table: TableDef, state?: InsertQueryState) {\r\n this.table = table;\r\n this.state = state ?? new InsertQueryState(table);\r\n }\r\n\r\n private clone(state: InsertQueryState): InsertQueryBuilder<T> {\r\n return new InsertQueryBuilder(this.table, state);\r\n }\r\n\r\n values(rowOrRows: Record<string, unknown> | Record<string, unknown>[]): InsertQueryBuilder<T> {\r\n const rows = Array.isArray(rowOrRows) ? rowOrRows : [rowOrRows];\r\n if (!rows.length) return this;\r\n return this.clone(this.state.withValues(rows));\r\n }\r\n\r\n returning(...columns: (ColumnDef | ColumnNode)[]): InsertQueryBuilder<T> {\r\n if (!columns.length) return this;\r\n const nodes = columns.map(column => buildColumnNode(this.table, column));\r\n return this.clone(this.state.withReturning(nodes));\r\n }\r\n\r\n // Existing compiler-based compile stays, but we add a new overload.\r\n\r\n // 1) Keep the old behavior (used internally / tests, if any):\r\n compile(compiler: InsertCompiler): CompiledQuery;\r\n // 2) New ergonomic overload:\r\n compile(dialect: InsertDialectInput): CompiledQuery;\r\n\r\n compile(arg: InsertCompiler | InsertDialectInput): CompiledQuery {\r\n if (typeof (arg as any).compileInsert === 'function') {\r\n // InsertCompiler path – old behavior\r\n return (arg as InsertCompiler).compileInsert(this.state.ast);\r\n }\r\n\r\n // Dialect | string path – new behavior\r\n const dialect = resolveDialectInput(arg as InsertDialectInput);\r\n return dialect.compileInsert(this.state.ast);\r\n }\r\n\r\n toSql(arg: InsertCompiler | InsertDialectInput): string {\r\n return this.compile(arg as any).sql;\r\n }\r\n\r\n getAST(): InsertQueryNode {\r\n return this.state.ast;\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnNode, ExpressionNode, OperandNode, isOperandNode, valueToOperand } from '../core/ast/expression.js';\r\nimport { TableNode, UpdateQueryNode, UpdateAssignmentNode } from '../core/ast/query.js';\r\nimport { createTableNode } from '../core/ast/builders.js';\r\ntype LiteralValue = string | number | boolean | null;\r\ntype UpdateValue = OperandNode | LiteralValue;\r\n\r\nconst isUpdateValue = (value: unknown): value is UpdateValue => {\r\n if (value === null) return true;\r\n switch (typeof value) {\r\n case 'string':\r\n case 'number':\r\n case 'boolean':\r\n return true;\r\n default:\r\n return isOperandNode(value);\r\n }\r\n};\r\n\r\n/**\r\n * Immutable state for UPDATE queries\r\n */\r\nexport class UpdateQueryState {\r\n public readonly table: TableDef;\r\n public readonly ast: UpdateQueryNode;\r\n\r\n constructor(table: TableDef, ast?: UpdateQueryNode) {\r\n this.table = table;\r\n this.ast = ast ?? {\r\n type: 'UpdateQuery',\r\n table: createTableNode(table),\r\n set: []\r\n };\r\n }\r\n\r\n private clone(nextAst: UpdateQueryNode): UpdateQueryState {\r\n return new UpdateQueryState(this.table, nextAst);\r\n }\r\n\r\n withSet(values: Record<string, unknown>): UpdateQueryState {\r\n const assignments: UpdateAssignmentNode[] = Object.entries(values).map(([column, rawValue]) => {\r\n if (!isUpdateValue(rawValue)) {\r\n throw new Error(\r\n `Invalid update value for column \"${column}\": only primitives, null, or OperandNodes are allowed`\r\n );\r\n }\r\n\r\n return {\r\n column: {\r\n type: 'Column',\r\n table: this.table.name,\r\n name: column\r\n },\r\n value: valueToOperand(rawValue)\r\n };\r\n });\r\n\r\n return this.clone({\r\n ...this.ast,\r\n set: assignments\r\n });\r\n }\r\n\r\n withWhere(expr: ExpressionNode): UpdateQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n where: expr\r\n });\r\n }\r\n\r\n withReturning(columns: ColumnNode[]): UpdateQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n returning: [...columns]\r\n });\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { ColumnNode, ExpressionNode } from '../core/ast/expression.js';\r\nimport { CompiledQuery, UpdateCompiler, Dialect } from '../core/dialect/abstract.js';\r\nimport { DialectKey, resolveDialectInput } from '../core/dialect/dialect-factory.js';\r\nimport { UpdateQueryNode } from '../core/ast/query.js';\r\nimport { UpdateQueryState } from './update-query-state.js';\r\nimport { buildColumnNode } from '../core/ast/builders.js';\r\n\r\ntype UpdateDialectInput = Dialect | DialectKey;\r\n\r\n/**\r\n * Builder for UPDATE queries\r\n */\r\nexport class UpdateQueryBuilder<T> {\r\n private readonly table: TableDef;\r\n private readonly state: UpdateQueryState;\r\n\r\n constructor(table: TableDef, state?: UpdateQueryState) {\r\n this.table = table;\r\n this.state = state ?? new UpdateQueryState(table);\r\n }\r\n\r\n private clone(state: UpdateQueryState): UpdateQueryBuilder<T> {\r\n return new UpdateQueryBuilder(this.table, state);\r\n }\r\n\r\n set(values: Record<string, unknown>): UpdateQueryBuilder<T> {\r\n return this.clone(this.state.withSet(values));\r\n }\r\n\r\n where(expr: ExpressionNode): UpdateQueryBuilder<T> {\r\n return this.clone(this.state.withWhere(expr));\r\n }\r\n\r\n returning(...columns: (ColumnDef | ColumnNode)[]): UpdateQueryBuilder<T> {\r\n if (!columns.length) return this;\r\n const nodes = columns.map(column => buildColumnNode(this.table, column));\r\n return this.clone(this.state.withReturning(nodes));\r\n }\r\n\r\n // Existing compiler-based compile stays, but we add a new overload.\r\n\r\n // 1) Keep the old behavior (used internally / tests, if any):\r\n compile(compiler: UpdateCompiler): CompiledQuery;\r\n // 2) New ergonomic overload:\r\n compile(dialect: UpdateDialectInput): CompiledQuery;\r\n\r\n compile(arg: UpdateCompiler | UpdateDialectInput): CompiledQuery {\r\n if (typeof (arg as any).compileUpdate === 'function') {\r\n // UpdateCompiler path – old behavior\r\n return (arg as UpdateCompiler).compileUpdate(this.state.ast);\r\n }\r\n\r\n // Dialect | string path – new behavior\r\n const dialect = resolveDialectInput(arg as UpdateDialectInput);\r\n return dialect.compileUpdate(this.state.ast);\r\n }\r\n\r\n toSql(arg: UpdateCompiler | UpdateDialectInput): string {\r\n return this.compile(arg as any).sql;\r\n }\r\n\r\n getAST(): UpdateQueryNode {\r\n return this.state.ast;\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnNode, ExpressionNode } from '../core/ast/expression.js';\r\nimport { TableNode, DeleteQueryNode } from '../core/ast/query.js';\r\nimport { createTableNode } from '../core/ast/builders.js';\r\n\r\n/**\r\n * Maintains immutable state for DELETE queries\r\n */\r\nexport class DeleteQueryState {\r\n public readonly table: TableDef;\r\n public readonly ast: DeleteQueryNode;\r\n\r\n constructor(table: TableDef, ast?: DeleteQueryNode) {\r\n this.table = table;\r\n this.ast = ast ?? {\r\n type: 'DeleteQuery',\r\n from: createTableNode(table)\r\n };\r\n }\r\n\r\n private clone(nextAst: DeleteQueryNode): DeleteQueryState {\r\n return new DeleteQueryState(this.table, nextAst);\r\n }\r\n\r\n withWhere(expr: ExpressionNode): DeleteQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n where: expr\r\n });\r\n }\r\n\r\n withReturning(columns: ColumnNode[]): DeleteQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n returning: [...columns]\r\n });\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { ColumnNode, ExpressionNode } from '../core/ast/expression.js';\r\nimport { CompiledQuery, DeleteCompiler, Dialect } from '../core/dialect/abstract.js';\r\nimport { DialectKey, resolveDialectInput } from '../core/dialect/dialect-factory.js';\r\nimport { DeleteQueryNode } from '../core/ast/query.js';\r\nimport { DeleteQueryState } from './delete-query-state.js';\r\nimport { buildColumnNode } from '../core/ast/builders.js';\r\n\r\ntype DeleteDialectInput = Dialect | DialectKey;\r\n\r\n/**\r\n * Builder for DELETE queries\r\n */\r\nexport class DeleteQueryBuilder<T> {\r\n private readonly table: TableDef;\r\n private readonly state: DeleteQueryState;\r\n\r\n constructor(table: TableDef, state?: DeleteQueryState) {\r\n this.table = table;\r\n this.state = state ?? new DeleteQueryState(table);\r\n }\r\n\r\n private clone(state: DeleteQueryState): DeleteQueryBuilder<T> {\r\n return new DeleteQueryBuilder(this.table, state);\r\n }\r\n\r\n where(expr: ExpressionNode): DeleteQueryBuilder<T> {\r\n return this.clone(this.state.withWhere(expr));\r\n }\r\n\r\n returning(...columns: (ColumnDef | ColumnNode)[]): DeleteQueryBuilder<T> {\r\n if (!columns.length) return this;\r\n const nodes = columns.map(column => buildColumnNode(this.table, column));\r\n return this.clone(this.state.withReturning(nodes));\r\n }\r\n\r\n // Existing compiler-based compile stays, but we add a new overload.\r\n\r\n // 1) Keep the old behavior (used internally / tests, if any):\r\n compile(compiler: DeleteCompiler): CompiledQuery;\r\n // 2) New ergonomic overload:\r\n compile(dialect: DeleteDialectInput): CompiledQuery;\r\n\r\n compile(arg: DeleteCompiler | DeleteDialectInput): CompiledQuery {\r\n if (typeof (arg as any).compileDelete === 'function') {\r\n // DeleteCompiler path – old behavior\r\n return (arg as DeleteCompiler).compileDelete(this.state.ast);\r\n }\r\n\r\n // Dialect | string path – new behavior\r\n const dialect = resolveDialectInput(arg as DeleteDialectInput);\r\n return dialect.compileDelete(this.state.ast);\r\n }\r\n\r\n toSql(arg: DeleteCompiler | DeleteDialectInput): string {\r\n return this.compile(arg as any).sql;\r\n }\r\n\r\n getAST(): DeleteQueryNode {\r\n return this.state.ast;\r\n }\r\n}\r\n","import type { TableDef, IndexColumn } from '../../schema/table.js';\r\nimport type { RawDefaultValue } from '../../schema/column.js';\r\n\r\n/**\r\n * Minimal surface for anything that can quote identifiers.\r\n * Implemented by SchemaDialect, runtime Dialect, etc.\r\n */\r\nexport interface Quoter {\r\n quoteIdentifier(id: string): string;\r\n}\r\n\r\n/**\r\n * Escape a value to be safe inside a single-quoted SQL literal.\r\n * Purely mechanical; no dialect knowledge.\r\n */\r\nexport const escapeSqlString = (value: string): string =>\r\n value.replace(/'/g, \"''\");\r\n\r\n/**\r\n * Narrow a value to the RawDefaultValue shape.\r\n * This is domain-specific but dialect-agnostic.\r\n */\r\nexport const isRawDefault = (value: unknown): value is RawDefaultValue =>\r\n typeof value === 'object' &&\r\n value !== null &&\r\n 'raw' in value &&\r\n typeof (value as RawDefaultValue).raw === 'string';\r\n\r\n/**\r\n * Abstraction for \"how do I turn values into SQL literals\".\r\n * Implemented or configured by each dialect.\r\n */\r\nexport interface LiteralFormatter {\r\n formatLiteral(value: unknown): string;\r\n}\r\n\r\n/**\r\n * Declarative options for building a LiteralFormatter.\r\n * Dialects configure behavior by data, not by being hard-coded here.\r\n */\r\nexport interface LiteralFormatOptions {\r\n nullLiteral?: string; // default: 'NULL'\r\n booleanTrue?: string; // default: 'TRUE'\r\n booleanFalse?: string; // default: 'FALSE'\r\n\r\n numberFormatter?: (value: number) => string;\r\n dateFormatter?: (value: Date) => string;\r\n stringWrapper?: (escaped: string) => string; // how to wrap an escaped string\r\n jsonWrapper?: (escaped: string) => string; // how to wrap escaped JSON\r\n}\r\n\r\n/**\r\n * Factory for a value-based LiteralFormatter that:\r\n * - Handles type dispatch (null/number/boolean/date/string/object/raw)\r\n * - Delegates representation choices to options\r\n * - Knows nothing about concrete dialects\r\n */\r\nexport const createLiteralFormatter = (\r\n options: LiteralFormatOptions = {}\r\n): LiteralFormatter => {\r\n const {\r\n nullLiteral = 'NULL',\r\n booleanTrue = 'TRUE',\r\n booleanFalse = 'FALSE',\r\n\r\n numberFormatter = (value: number): string =>\r\n Number.isFinite(value) ? String(value) : nullLiteral,\r\n\r\n dateFormatter = (value: Date): string =>\r\n `'${escapeSqlString(value.toISOString())}'`,\r\n\r\n stringWrapper = (escaped: string): string => `'${escaped}'`,\r\n jsonWrapper = (escaped: string): string => `'${escaped}'`,\r\n } = options;\r\n\r\n const wrapString = stringWrapper;\r\n const wrapJson = jsonWrapper;\r\n\r\n const format = (value: unknown): string => {\r\n // Domain rule: raw defaults bypass all formatting.\r\n if (isRawDefault(value)) return value.raw;\r\n\r\n if (value === null) return nullLiteral;\r\n\r\n if (typeof value === 'number') {\r\n return numberFormatter(value);\r\n }\r\n\r\n if (typeof value === 'boolean') {\r\n return value ? booleanTrue : booleanFalse;\r\n }\r\n\r\n if (value instanceof Date) {\r\n return dateFormatter(value);\r\n }\r\n\r\n if (typeof value === 'string') {\r\n return wrapString(escapeSqlString(value));\r\n }\r\n\r\n // Fallback: serialize to JSON then treat as string.\r\n return wrapJson(escapeSqlString(JSON.stringify(value)));\r\n };\r\n\r\n return {\r\n formatLiteral: format,\r\n };\r\n};\r\n\r\n/**\r\n * Convenience wrapper if you prefer a functional style at call-sites.\r\n */\r\nexport const formatLiteral = (\r\n formatter: LiteralFormatter,\r\n value: unknown\r\n): string => formatter.formatLiteral(value);\r\n\r\n/**\r\n * Quotes a possibly qualified identifier like \"schema.table\" or \"db.schema.table\"\r\n * using a Quoter that knows how to quote a single segment.\r\n */\r\nexport const quoteQualified = (quoter: Quoter, identifier: string): string => {\r\n const parts = identifier.split('.');\r\n return parts.map(part => quoter.quoteIdentifier(part)).join('.');\r\n};\r\n\r\n/**\r\n * Renders index column list, including optional order / nulls, using the\r\n * provided Quoter for identifier quoting.\r\n */\r\nexport const renderIndexColumns = (\r\n quoter: Quoter,\r\n columns: (string | IndexColumn)[]\r\n): string =>\r\n columns\r\n .map(col => {\r\n if (typeof col === 'string') {\r\n return quoter.quoteIdentifier(col);\r\n }\r\n\r\n const parts: string[] = [quoter.quoteIdentifier(col.column)];\r\n\r\n if (col.order) {\r\n parts.push(col.order);\r\n }\r\n\r\n if (col.nulls) {\r\n parts.push(`NULLS ${col.nulls}`);\r\n }\r\n\r\n return parts.join(' ');\r\n })\r\n .join(', ');\r\n\r\n/**\r\n * Resolves the primary key column names for a table, based purely on schema\r\n * metadata. This is domain logic, but independent from any dialect.\r\n */\r\nexport const resolvePrimaryKey = (table: TableDef): string[] => {\r\n if (Array.isArray(table.primaryKey) && table.primaryKey.length > 0) {\r\n return table.primaryKey;\r\n }\r\n\r\n const columns = Object.values(table.columns ?? {});\r\n\r\n // `primary` / `name` are domain-level properties of ColumnDef.\r\n return columns\r\n .filter((col: any) => col.primary)\r\n .map((col: any) => col.name);\r\n};\r\n","import type { TableDef, IndexDef, IndexColumn } from '../../schema/table.js';\nimport type { ColumnDef, ForeignKeyReference } from '../../schema/column.js';\nimport type { SchemaDialect } from './schema-dialect.js';\nimport { deriveIndexName } from './naming-strategy.js';\nimport {\n formatLiteral,\n renderIndexColumns,\n quoteQualified,\n resolvePrimaryKey,\n Quoter\n} from './sql-writing.js';\nimport { DatabaseTable, DatabaseColumn, ColumnDiff } from './schema-types.js';\nimport { DialectName } from './schema-dialect.js';\n\nexport interface SchemaGenerateResult {\n tableSql: string;\n indexSql: string[];\n}\n\nexport interface RenderColumnOptions {\n includePrimary?: boolean;\n}\n\nexport const renderColumnDefinition = (\n table: TableDef,\n col: ColumnDef,\n dialect: SchemaDialect,\n options: RenderColumnOptions = {}\n): { sql: string; inlinePrimary: boolean } => {\n const parts: string[] = [];\n parts.push(dialect.quoteIdentifier(col.name));\n parts.push(dialect.renderColumnType(col));\n\n const autoInc = dialect.renderAutoIncrement(col, table);\n if (autoInc) parts.push(autoInc);\n\n if (col.notNull) parts.push('NOT NULL');\n if (col.unique) parts.push('UNIQUE');\n if (col.default !== undefined) {\n parts.push(`DEFAULT ${dialect.renderDefault(col.default, col)}`);\n }\n if (options.includePrimary && col.primary) {\n parts.push('PRIMARY KEY');\n }\n if (col.check) {\n parts.push(`CHECK (${col.check})`);\n }\n if (col.references) {\n parts.push(dialect.renderReference(col.references, table));\n }\n\n return { sql: parts.join(' '), inlinePrimary: !!(options.includePrimary && col.primary) };\n};\n\nexport const generateCreateTableSql = (\n table: TableDef,\n dialect: SchemaDialect\n): SchemaGenerateResult => {\n const pk = resolvePrimaryKey(table);\n const inlinePkColumns = new Set<string>();\n\n const columnLines = Object.values(table.columns).map(col => {\n const includePk = (dialect as any).preferInlinePkAutoincrement?.(col, table, pk) && pk.includes(col.name);\n if (includePk) {\n inlinePkColumns.add(col.name);\n }\n return renderColumnDefinition(table, col, dialect, { includePrimary: includePk }).sql;\n });\n\n const constraintLines: string[] = [];\n\n if (pk.length > 0 && !(pk.length === 1 && inlinePkColumns.has(pk[0]))) {\n const cols = pk.map(c => dialect.quoteIdentifier(c)).join(', ');\n constraintLines.push(`PRIMARY KEY (${cols})`);\n }\n\n if (table.checks) {\n table.checks.forEach(check => {\n const name = check.name ? `${dialect.quoteIdentifier(check.name)} ` : '';\n constraintLines.push(`CONSTRAINT ${name}CHECK (${check.expression})`);\n });\n }\n\n const allLines = [...columnLines, ...constraintLines];\n const body = allLines.map(line => ` ${line}`).join(',\\n');\n const tableOptions = dialect.renderTableOptions(table);\n const tableSql = `CREATE TABLE ${dialect.formatTableName(table)} (\\n${body}\\n)${tableOptions ? ' ' + tableOptions : ''};`;\n\n const indexSql: string[] = [];\n if (table.indexes && table.indexes.length > 0) {\n for (const idx of table.indexes) {\n if (idx.where && !dialect.supportsPartialIndexes()) {\n throw new Error(`Dialect ${dialect.name} does not support partial/filtered indexes (${idx.name || idx.columns.join('_')}).`);\n }\n indexSql.push(dialect.renderIndex(table, idx));\n }\n }\n\n return { tableSql, indexSql };\n};\n\nexport const generateSchemaSql = (\n tables: TableDef[],\n dialect: SchemaDialect\n): string[] => {\n const ordered = orderTablesByDependencies(tables);\n const statements: string[] = [];\n ordered.forEach(table => {\n const { tableSql, indexSql } = generateCreateTableSql(table, dialect);\n statements.push(tableSql, ...indexSql);\n });\n return statements;\n};\n\nconst orderTablesByDependencies = (tables: TableDef[]): TableDef[] => {\n const map = new Map<string, TableDef>();\n tables.forEach(t => map.set(t.name, t));\n\n const deps = new Map<string, Set<string>>();\n for (const table of tables) {\n const refTables = new Set<string>();\n Object.values(table.columns).forEach(col => {\n if (col.references?.table) {\n refTables.add(col.references.table);\n }\n });\n deps.set(table.name, refTables);\n }\n\n const visited = new Set<string>();\n const ordered: TableDef[] = [];\n\n const visit = (name: string, stack: Set<string>) => {\n if (visited.has(name)) return;\n const table = map.get(name);\n if (!table) return;\n if (stack.has(name)) {\n ordered.push(table);\n visited.add(name);\n return;\n }\n stack.add(name);\n for (const dep of deps.get(name) || []) {\n visit(dep, stack);\n }\n stack.delete(name);\n visited.add(name);\n ordered.push(table);\n };\n\n tables.forEach(t => visit(t.name, new Set()));\n return ordered;\n};\n\n// Re-export DialectName for backward compatibility\nexport type { DialectName };\n","import type { TableDef, IndexDef } from '../../schema/table.js';\r\n\r\nexport const deriveIndexName = (table: TableDef, index: IndexDef): string => {\r\n const base = (index.columns ?? [])\r\n .map(col => (typeof col === 'string' ? col : col.column))\r\n .join('_');\r\n\r\n const suffix = index.unique ? 'uniq' : 'idx';\r\n return `${table.name}_${base}_${suffix}`;\r\n};\r\n","import { TableDef } from '../../schema/table.js';\r\nimport { ColumnDef } from '../../schema/column.js';\r\nimport type { DbExecutor } from '../execution/db-executor.js';\r\nimport { SchemaDialect } from './schema-dialect.js';\r\nimport { deriveIndexName } from './naming-strategy.js';\r\nimport { generateCreateTableSql, renderColumnDefinition } from './schema-generator.js';\r\nimport { ColumnDiff, DatabaseColumn, DatabaseSchema, DatabaseTable } from './schema-types.js';\r\n\r\nexport type SchemaChangeKind =\r\n | 'createTable'\r\n | 'dropTable'\r\n | 'addColumn'\r\n | 'dropColumn'\r\n | 'alterColumn'\r\n | 'addIndex'\r\n | 'dropIndex';\r\n\r\nexport interface SchemaChange {\r\n kind: SchemaChangeKind;\r\n table: string;\r\n description: string;\r\n statements: string[];\r\n safe: boolean;\r\n}\r\n\r\nexport interface SchemaPlan {\r\n changes: SchemaChange[];\r\n warnings: string[];\r\n}\r\n\r\nexport interface SchemaDiffOptions {\r\n /** Allow destructive operations (drops) */\r\n allowDestructive?: boolean;\r\n}\r\n\r\nconst tableKey = (name: string, schema?: string) => (schema ? `${schema}.${name}` : name);\r\n\r\nconst mapTables = (schema: DatabaseSchema) => {\r\n const map = new Map<string, DatabaseTable>();\r\n for (const table of schema.tables) {\r\n map.set(tableKey(table.name, table.schema), table);\r\n }\r\n return map;\r\n};\r\n\r\nconst buildAddColumnSql = (table: TableDef, colName: string, dialect: SchemaDialect): string => {\r\n const column = table.columns[colName];\r\n const rendered = renderColumnDefinition(table, column, dialect);\r\n return `ALTER TABLE ${dialect.formatTableName(table)} ADD ${rendered.sql};`;\r\n};\r\n\r\nconst normalizeType = (value: string | undefined): string => (value || '').toLowerCase().replace(/\\s+/g, ' ').trim();\r\nconst normalizeDefault = (value: unknown): string | undefined => {\r\n if (value === undefined || value === null) return undefined;\r\n return String(value).trim();\r\n};\r\n\r\nconst diffColumn = (expected: ColumnDef, actual: DatabaseColumn, dialect: SchemaDialect): ColumnDiff => {\r\n const expectedType = normalizeType(dialect.renderColumnType(expected));\r\n const actualType = normalizeType(actual.type);\r\n const expectedDefault =\r\n expected.default !== undefined ? normalizeDefault(dialect.renderDefault(expected.default, expected)) : undefined;\r\n const actualDefault = normalizeDefault(actual.default);\r\n return {\r\n typeChanged: expectedType !== actualType,\r\n nullabilityChanged: !!expected.notNull !== !!actual.notNull,\r\n defaultChanged: expectedDefault !== actualDefault,\r\n autoIncrementChanged: !!expected.autoIncrement !== !!actual.autoIncrement\r\n };\r\n};\r\n\r\nexport const diffSchema = (\r\n expectedTables: TableDef[],\r\n actualSchema: DatabaseSchema,\r\n dialect: SchemaDialect,\r\n options: SchemaDiffOptions = {}\r\n): SchemaPlan => {\r\n const allowDestructive = options.allowDestructive ?? false;\r\n const plan: SchemaPlan = { changes: [], warnings: [] };\r\n\r\n const actualMap = mapTables(actualSchema);\r\n\r\n // Create missing tables and indexes\r\n for (const table of expectedTables) {\r\n const key = tableKey(table.name, table.schema);\r\n const actual = actualMap.get(key);\r\n if (!actual) {\r\n const { tableSql, indexSql } = generateCreateTableSql(table, dialect);\r\n plan.changes.push({\r\n kind: 'createTable',\r\n table: key,\r\n description: `Create table ${key}`,\r\n statements: [tableSql, ...indexSql],\r\n safe: true\r\n });\r\n continue;\r\n }\r\n\r\n // Columns\r\n const actualCols = new Map(actual.columns.map(c => [c.name, c]));\r\n for (const colName of Object.keys(table.columns)) {\r\n if (!actualCols.has(colName)) {\r\n plan.changes.push({\r\n kind: 'addColumn',\r\n table: key,\r\n description: `Add column ${colName} to ${key}`,\r\n statements: [buildAddColumnSql(table, colName, dialect)],\r\n safe: true\r\n });\r\n } else {\r\n const expectedCol = table.columns[colName];\r\n const actualCol = actualCols.get(colName)!;\r\n const colDiff = diffColumn(expectedCol, actualCol, dialect);\r\n const shouldAlter =\r\n colDiff.typeChanged || colDiff.nullabilityChanged || colDiff.defaultChanged || colDiff.autoIncrementChanged;\r\n if (shouldAlter) {\r\n const statements = dialect.alterColumnSql?.(table, expectedCol, actualCol, colDiff) ?? [];\r\n if (statements.length > 0) {\r\n plan.changes.push({\r\n kind: 'alterColumn',\r\n table: key,\r\n description: `Alter column ${colName} on ${key}`,\r\n statements,\r\n safe: true\r\n });\r\n }\r\n const warning = dialect.warnAlterColumn?.(table, expectedCol, actualCol, colDiff);\r\n if (warning) plan.warnings.push(warning);\r\n }\r\n }\r\n }\r\n for (const colName of actualCols.keys()) {\r\n if (!table.columns[colName]) {\r\n plan.changes.push({\r\n kind: 'dropColumn',\r\n table: key,\r\n description: `Drop column ${colName} from ${key}`,\r\n statements: allowDestructive ? dialect.dropColumnSql(actual, colName) : [],\r\n safe: false\r\n });\r\n const warning = dialect.warnDropColumn?.(actual, colName);\r\n if (warning) plan.warnings.push(warning);\r\n }\r\n }\r\n\r\n // Indexes (naive: based on name or derived name)\r\n const expectedIndexes = table.indexes ?? [];\r\n const actualIndexes = actual.indexes ?? [];\r\n const actualIndexMap = new Map(actualIndexes.map(idx => [idx.name, idx]));\r\n\r\n for (const idx of expectedIndexes) {\r\n const name = idx.name || deriveIndexName(table, idx);\r\n if (!actualIndexMap.has(name)) {\r\n plan.changes.push({\r\n kind: 'addIndex',\r\n table: key,\r\n description: `Create index ${name} on ${key}`,\r\n statements: [dialect.renderIndex(table, { ...idx, name })],\r\n safe: true\r\n });\r\n }\r\n }\r\n\r\n for (const idx of actualIndexes) {\r\n if (idx.name && !expectedIndexes.find(expected => (expected.name || deriveIndexName(table, expected)) === idx.name)) {\r\n plan.changes.push({\r\n kind: 'dropIndex',\r\n table: key,\r\n description: `Drop index ${idx.name} on ${key}`,\r\n statements: allowDestructive ? dialect.dropIndexSql(actual, idx.name) : [],\r\n safe: false\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Extra tables\r\n for (const actual of actualSchema.tables) {\r\n const key = tableKey(actual.name, actual.schema);\r\n if (!expectedTables.find(t => tableKey(t.name, t.schema) === key)) {\r\n plan.changes.push({\r\n kind: 'dropTable',\r\n table: key,\r\n description: `Drop table ${key}`,\r\n statements: allowDestructive ? dialect.dropTableSql(actual) : [],\r\n safe: false\r\n });\r\n }\r\n }\r\n\r\n return plan;\r\n};\r\n\r\nexport interface SynchronizeOptions extends SchemaDiffOptions {\r\n dryRun?: boolean;\r\n}\r\n\r\nexport const synchronizeSchema = async (\r\n expectedTables: TableDef[],\r\n actualSchema: DatabaseSchema,\r\n dialect: SchemaDialect,\r\n executor: DbExecutor,\r\n options: SynchronizeOptions = {}\r\n): Promise<SchemaPlan> => {\r\n const plan = diffSchema(expectedTables, actualSchema, dialect, options);\r\n if (!options.dryRun) {\r\n const { executeSchemaPlan } = await import('./schema-plan-executor.js');\r\n await executeSchemaPlan(plan, executor, options);\r\n }\r\n return plan;\r\n};\r\n","import { DbExecutor, QueryResult } from '../../execution/db-executor.js';\nimport { IntrospectOptions } from './types.js';\n\nexport const toRows = (result: QueryResult | undefined): Record<string, any>[] => {\n if (!result) return [];\n return result.values.map(row =>\n result.columns.reduce<Record<string, any>>((acc, col, idx) => {\n acc[col] = row[idx];\n return acc;\n }, {})\n );\n};\n\nexport const queryRows = async (\n executor: DbExecutor,\n sql: string,\n params: unknown[] = []\n): Promise<Record<string, any>[]> => {\n const [first] = await executor.executeSql(sql, params);\n return toRows(first);\n};\n\nexport const shouldIncludeTable = (name: string, options: IntrospectOptions): boolean => {\n if (options.includeTables && !options.includeTables.includes(name)) return false;\n if (options.excludeTables && options.excludeTables.includes(name)) return false;\n return true;\n};\n","import { defineTable } from '../../../../schema/table.js';\r\nimport { col } from '../../../../schema/column.js';\r\n\r\nexport const PgInformationSchemaColumns = defineTable(\r\n 'columns',\r\n {\r\n table_schema: col.varchar(255),\r\n table_name: col.varchar(255),\r\n column_name: col.varchar(255),\r\n data_type: col.varchar(255),\r\n is_nullable: col.varchar(3),\r\n column_default: col.varchar(1024),\r\n ordinal_position: col.int()\r\n },\r\n {},\r\n undefined,\r\n { schema: 'information_schema' }\r\n);\r\n\r\nexport const PgClass = defineTable(\r\n 'pg_class',\r\n {\r\n oid: col.int(),\r\n relname: col.varchar(255),\r\n relnamespace: col.int(),\r\n relkind: col.varchar(1)\r\n },\r\n {},\r\n undefined,\r\n { schema: 'pg_catalog' }\r\n);\r\n\r\nexport const PgNamespace = defineTable(\r\n 'pg_namespace',\r\n {\r\n oid: col.int(),\r\n nspname: col.varchar(255)\r\n },\r\n {},\r\n undefined,\r\n { schema: 'pg_catalog' }\r\n);\r\n\r\nexport const PgIndex = defineTable(\r\n 'pg_index',\r\n {\r\n indrelid: col.int(),\r\n indexrelid: col.int(),\r\n indisprimary: col.boolean(),\r\n indkey: col.varchar(255),\r\n indpred: col.varchar(1024)\r\n },\r\n {},\r\n undefined,\r\n { schema: 'pg_catalog' }\r\n);\r\n\r\nexport const PgAttribute = defineTable(\r\n 'pg_attribute',\r\n {\r\n attrelid: col.int(),\r\n attname: col.varchar(255),\r\n attnum: col.int()\r\n },\r\n {},\r\n undefined,\r\n { schema: 'pg_catalog' }\r\n);\r\n\r\nexport const PgTableConstraints = defineTable(\r\n 'table_constraints',\r\n {\r\n constraint_catalog: col.varchar(255),\r\n constraint_schema: col.varchar(255),\r\n constraint_name: col.varchar(255),\r\n table_catalog: col.varchar(255),\r\n table_schema: col.varchar(255),\r\n table_name: col.varchar(255),\r\n constraint_type: col.varchar(255)\r\n },\r\n {},\r\n undefined,\r\n { schema: 'information_schema' }\r\n);\r\n\r\nexport const PgKeyColumnUsage = defineTable(\r\n 'key_column_usage',\r\n {\r\n constraint_catalog: col.varchar(255),\r\n constraint_schema: col.varchar(255),\r\n constraint_name: col.varchar(255),\r\n table_catalog: col.varchar(255),\r\n table_schema: col.varchar(255),\r\n table_name: col.varchar(255),\r\n column_name: col.varchar(255),\r\n ordinal_position: col.int()\r\n },\r\n {},\r\n undefined,\r\n { schema: 'information_schema' }\r\n);\r\n\r\nexport const PgConstraintColumnUsage = defineTable(\r\n 'constraint_column_usage',\r\n {\r\n constraint_catalog: col.varchar(255),\r\n constraint_schema: col.varchar(255),\r\n constraint_name: col.varchar(255),\r\n table_catalog: col.varchar(255),\r\n table_schema: col.varchar(255),\r\n table_name: col.varchar(255),\r\n column_name: col.varchar(255)\r\n },\r\n {},\r\n undefined,\r\n { schema: 'information_schema' }\r\n);\r\n\r\nexport const PgReferentialConstraints = defineTable(\r\n 'referential_constraints',\r\n {\r\n constraint_catalog: col.varchar(255),\r\n constraint_schema: col.varchar(255),\r\n constraint_name: col.varchar(255),\r\n unique_constraint_catalog: col.varchar(255),\r\n unique_constraint_schema: col.varchar(255),\r\n unique_constraint_name: col.varchar(255),\r\n match_option: col.varchar(64),\r\n update_rule: col.varchar(64),\r\n delete_rule: col.varchar(64)\r\n },\r\n {},\r\n undefined,\r\n { schema: 'information_schema' }\r\n);\r\n\r\nexport default {\r\n PgInformationSchemaColumns,\r\n PgClass,\r\n PgNamespace,\r\n PgIndex,\r\n PgAttribute\r\n};\r\n","import type { SelectQueryBuilder } from '../../../query-builder/select.js';\r\nimport type { IntrospectContext } from './context.js';\r\n\r\nimport { toRows } from './utils.js';\r\n\r\nexport async function runSelect<T = Record<string, any>>(\r\n qb: SelectQueryBuilder<any, any>,\r\n ctx: IntrospectContext\r\n): Promise<T[]> {\r\n const ast = qb.getAST();\r\n const compiled = ctx.dialect.compileSelect(ast);\r\n const results = await ctx.executor.executeSql(compiled.sql, compiled.params);\r\n // executor returns QueryResult[]; take the first result set and map to rows\r\n const [first] = results;\r\n return toRows(first) as T[];\r\n}\r\n\r\nexport default runSelect;\r\n\r\nexport async function runSelectNode<T = Record<string, any>>(ast: any, ctx: IntrospectContext): Promise<T[]> {\r\n const compiled = ctx.dialect.compileSelect(ast);\r\n const results = await ctx.executor.executeSql(compiled.sql, compiled.params);\r\n const [first] = results;\r\n return toRows(first) as T[];\r\n}\r\n","import type { SchemaIntrospector, IntrospectOptions } from './types.js';\r\nimport { queryRows, shouldIncludeTable } from './utils.js';\r\nimport { DatabaseSchema, DatabaseTable, DatabaseIndex, DatabaseColumn } from '../schema-types.js';\r\nimport type { DbExecutor } from '../../execution/db-executor.js';\r\nimport type { IntrospectContext } from './context.js';\r\nimport { PgInformationSchemaColumns } from './catalogs/postgres.js';\r\nimport { PgKeyColumnUsage, PgTableConstraints, PgConstraintColumnUsage, PgReferentialConstraints, PgIndex, PgClass, PgNamespace, PgAttribute } from './catalogs/postgres.js';\r\nimport { SelectQueryBuilder } from '../../../query-builder/select.js';\r\nimport { eq, and } from '../../ast/expression-builders.js';\r\nimport type { SelectQueryNode, TableNode } from '../../ast/query.js';\r\nimport type { JoinNode } from '../../ast/join.js';\r\nimport type { ColumnNode, ExpressionNode } from '../../ast/expression-nodes.js';\r\nimport { fnTable } from '../../ast/builders.js';\r\nimport { runSelect, runSelectNode } from './run-select.js';\r\n\r\nexport const postgresIntrospector: SchemaIntrospector = {\r\n async introspect(ctx: IntrospectContext, options: IntrospectOptions): Promise<DatabaseSchema> {\r\n const schema = options.schema || 'public';\r\n const tables: DatabaseTable[] = [];\r\n\r\n // Columns query\r\n const qbColumns = new SelectQueryBuilder(PgInformationSchemaColumns as any)\r\n .select({\r\n table_schema: PgInformationSchemaColumns.columns.table_schema,\r\n table_name: PgInformationSchemaColumns.columns.table_name,\r\n column_name: PgInformationSchemaColumns.columns.column_name,\r\n data_type: PgInformationSchemaColumns.columns.data_type,\r\n is_nullable: PgInformationSchemaColumns.columns.is_nullable,\r\n column_default: PgInformationSchemaColumns.columns.column_default,\r\n ordinal_position: PgInformationSchemaColumns.columns.ordinal_position\r\n })\r\n .where(eq(PgInformationSchemaColumns.columns.table_schema, schema))\r\n .orderBy(PgInformationSchemaColumns.columns.table_name)\r\n .orderBy(PgInformationSchemaColumns.columns.ordinal_position);\r\n\r\n const columnRows = await runSelect(qbColumns, ctx);\r\n\r\n // Primary key columns query\r\n const qbPk = new SelectQueryBuilder(PgKeyColumnUsage as any)\r\n .select({\r\n table_schema: PgKeyColumnUsage.columns.table_schema,\r\n table_name: PgKeyColumnUsage.columns.table_name,\r\n column_name: PgKeyColumnUsage.columns.column_name,\r\n ordinal_position: PgKeyColumnUsage.columns.ordinal_position,\r\n constraint_name: PgKeyColumnUsage.columns.constraint_name\r\n })\r\n .innerJoin(PgTableConstraints as any, eq(PgTableConstraints.columns.constraint_name, PgKeyColumnUsage.columns.constraint_name))\r\n .where(eq(PgTableConstraints.columns.constraint_type, 'PRIMARY KEY'))\r\n .where(eq(PgKeyColumnUsage.columns.table_schema, schema))\r\n .orderBy(PgKeyColumnUsage.columns.table_name)\r\n .orderBy(PgKeyColumnUsage.columns.ordinal_position);\r\n\r\n const pkRows = await runSelect(qbPk, ctx);\r\n\r\n // Build primary key map (grouped by table, ordered by ordinal_position)\r\n const pkMap = new Map<string, string[]>();\r\n const pkGrouped = new Map<string, { pos: number; col: string }[]>();\r\n for (const r of pkRows) {\r\n const key = `${r.table_schema}.${r.table_name}`;\r\n const arr = pkGrouped.get(key) ?? [];\r\n arr.push({ pos: r.ordinal_position ?? 0, col: r.column_name });\r\n pkGrouped.set(key, arr);\r\n }\r\n for (const [k, vals] of pkGrouped.entries()) {\r\n vals.sort((a, b) => (a.pos || 0) - (b.pos || 0));\r\n pkMap.set(k, vals.map(v => v.col));\r\n }\r\n\r\n // Foreign key columns query\r\n const qbFk = new SelectQueryBuilder(PgKeyColumnUsage as any)\r\n .select({\r\n table_schema: PgKeyColumnUsage.columns.table_schema,\r\n table_name: PgKeyColumnUsage.columns.table_name,\r\n column_name: PgKeyColumnUsage.columns.column_name,\r\n constraint_name: PgKeyColumnUsage.columns.constraint_name,\r\n foreign_table_schema: PgConstraintColumnUsage.columns.table_schema,\r\n foreign_table_name: PgConstraintColumnUsage.columns.table_name,\r\n foreign_column_name: PgConstraintColumnUsage.columns.column_name\r\n })\r\n .innerJoin(PgTableConstraints as any, eq(PgTableConstraints.columns.constraint_name, PgKeyColumnUsage.columns.constraint_name))\r\n .innerJoin(PgConstraintColumnUsage as any, eq(PgConstraintColumnUsage.columns.constraint_name, PgTableConstraints.columns.constraint_name))\r\n .innerJoin(PgReferentialConstraints as any, eq(PgReferentialConstraints.columns.constraint_name, PgTableConstraints.columns.constraint_name))\r\n .where(eq(PgTableConstraints.columns.constraint_type, 'FOREIGN KEY'))\r\n .where(eq(PgKeyColumnUsage.columns.table_schema, schema));\r\n\r\n const fkRows = await runSelect(qbFk, ctx);\r\n\r\n // Build foreign key map\r\n const fkMap = new Map<string, any[]>();\r\n for (const r of fkRows) {\r\n const key = `${r.table_schema}.${r.table_name}.${r.column_name}`;\r\n const existing = fkMap.get(key) ?? [];\r\n existing.push({\r\n table: `${r.foreign_table_schema}.${r.foreign_table_name}`,\r\n column: r.foreign_column_name,\r\n onDelete: undefined,\r\n onUpdate: undefined\r\n });\r\n fkMap.set(key, existing);\r\n }\r\n\r\n // Index columns query using AST with FunctionTable for unnest\r\n const indexQuery: SelectQueryNode = {\r\n type: 'SelectQuery',\r\n from: { type: 'Table', name: 'pg_index', schema: 'pg_catalog', alias: 'i' } as TableNode,\r\n columns: [\r\n { type: 'Column', table: 'ns', name: 'nspname', alias: 'table_schema' } as ColumnNode,\r\n { type: 'Column', table: 'tbl', name: 'relname', alias: 'table_name' } as ColumnNode,\r\n { type: 'Column', table: 'idx', name: 'relname', alias: 'index_name' } as ColumnNode,\r\n { type: 'Column', table: 'i', name: 'indisunique', alias: 'is_unique' } as ColumnNode,\r\n { type: 'Column', table: 'i', name: 'indpred', alias: 'predicate' } as ColumnNode,\r\n { type: 'Column', table: 'att', name: 'attname', alias: 'attname' } as ColumnNode,\r\n { type: 'Column', table: 'arr', name: 'idx', alias: 'ord' } as ColumnNode\r\n ],\r\n joins: [\r\n // JOIN pg_class AS tbl ON tbl.oid = i.indrelid\r\n {\r\n type: 'Join',\r\n kind: 'INNER',\r\n table: { type: 'Table', name: 'pg_class', schema: 'pg_catalog', alias: 'tbl' } as TableNode,\r\n condition: eq({ table: 'tbl', name: 'oid' }, { table: 'i', name: 'indrelid' }) as ExpressionNode\r\n } as JoinNode,\r\n // JOIN pg_namespace AS ns ON ns.oid = tbl.relnamespace\r\n {\r\n type: 'Join',\r\n kind: 'INNER',\r\n table: { type: 'Table', name: 'pg_namespace', schema: 'pg_catalog', alias: 'ns' } as TableNode,\r\n condition: eq({ table: 'ns', name: 'oid' }, { table: 'tbl', name: 'relnamespace' }) as ExpressionNode\r\n } as JoinNode,\r\n // JOIN pg_class AS idx ON idx.oid = i.indexrelid\r\n {\r\n type: 'Join',\r\n kind: 'INNER',\r\n table: { type: 'Table', name: 'pg_class', schema: 'pg_catalog', alias: 'idx' } as TableNode,\r\n condition: eq({ table: 'idx', name: 'oid' }, { table: 'i', name: 'indexrelid' }) as ExpressionNode\r\n } as JoinNode,\r\n // LATERAL JOIN UNNEST(i.indkey) WITH ORDINALITY AS arr(attnum, idx)\r\n {\r\n type: 'Join',\r\n kind: 'INNER',\r\n table: fnTable('unnest', [{ type: 'Column', table: 'i', name: 'indkey' } as ColumnNode], 'arr', { \r\n lateral: true, \r\n withOrdinality: true, \r\n columnAliases: ['attnum', 'idx'] \r\n }),\r\n condition: { type: 'BinaryExpression', left: { type: 'Literal', value: 1 }, operator: '=', right: { type: 'Literal', value: 1 } } as unknown as ExpressionNode\r\n } as JoinNode,\r\n // LEFT JOIN pg_attribute AS att ON att.attrelid = tbl.oid AND att.attnum = arr.attnum\r\n {\r\n type: 'Join',\r\n kind: 'LEFT',\r\n table: { type: 'Table', name: 'pg_attribute', schema: 'pg_catalog', alias: 'att' } as TableNode,\r\n condition: and(\r\n eq({ table: 'att', name: 'attrelid' }, { table: 'tbl', name: 'oid' }),\r\n eq({ table: 'att', name: 'attnum' }, { table: 'arr', name: 'attnum' })\r\n ) as ExpressionNode\r\n } as JoinNode\r\n ],\r\n where: and(\r\n eq({ table: 'ns', name: 'nspname' }, schema) as ExpressionNode,\r\n eq({ table: 'i', name: 'indisprimary' }, { type: 'Literal', value: false } as any) as ExpressionNode\r\n ) as ExpressionNode\r\n };\r\n\r\n const indexQueryRows = await runSelectNode(indexQuery, ctx);\r\n \r\n // Aggregate index rows by table/index to build final index list\r\n const indexGrouped = new Map<string, { table_schema: string; table_name: string; index_name: string; is_unique: any; predicate: any; cols: { ord: number; att: string | null }[] }>();\r\n for (const r of indexQueryRows) {\r\n const key = `${r.table_schema}.${r.table_name}.${r.index_name}`;\r\n const entry = indexGrouped.get(key) ?? { \r\n table_schema: r.table_schema, \r\n table_name: r.table_name, \r\n index_name: r.index_name, \r\n is_unique: r.is_unique, \r\n predicate: r.predicate, \r\n cols: [] \r\n };\r\n entry.cols.push({ ord: r.ord ?? 0, att: r.attname ?? null });\r\n indexGrouped.set(key, entry);\r\n }\r\n\r\n const indexRows = Array.from(indexGrouped.values()).map(v => ({\r\n table_schema: v.table_schema,\r\n table_name: v.table_name,\r\n index_name: v.index_name,\r\n is_unique: v.is_unique,\r\n predicate: v.predicate,\r\n column_names: v.cols.sort((a, b) => (a.ord || 0) - (b.ord || 0)).map(c => c.att).filter(Boolean)\r\n }));\r\n\r\n // Build final schema\r\n const tablesByKey = new Map<string, DatabaseTable>();\r\n\r\n columnRows.forEach(r => {\r\n const key = `${r.table_schema}.${r.table_name}`;\r\n if (!shouldIncludeTable(r.table_name, options)) {\r\n return;\r\n }\r\n if (!tablesByKey.has(key)) {\r\n tablesByKey.set(key, {\r\n name: r.table_name,\r\n schema: r.table_schema,\r\n columns: [],\r\n primaryKey: pkMap.get(key) || [],\r\n indexes: []\r\n });\r\n }\r\n const cols = tablesByKey.get(key)!;\r\n const fk = fkMap.get(`${r.table_schema}.${r.table_name}.${r.column_name}`)?.[0];\r\n const column: DatabaseColumn = {\r\n name: r.column_name,\r\n type: r.data_type,\r\n notNull: r.is_nullable === 'NO',\r\n default: r.column_default ?? undefined,\r\n references: fk\r\n ? {\r\n table: fk.table,\r\n column: fk.column,\r\n onDelete: fk.onDelete,\r\n onUpdate: fk.onUpdate\r\n }\r\n : undefined\r\n };\r\n cols.columns.push(column);\r\n });\r\n\r\n indexRows.forEach(r => {\r\n const key = `${r.table_schema}.${r.table_name}`;\r\n const table = tablesByKey.get(key);\r\n if (!table) return;\r\n const idx: DatabaseIndex = {\r\n name: r.index_name,\r\n columns: (r.column_names || []).map((c: string) => ({ column: c })),\r\n unique: !!r.is_unique,\r\n where: r.predicate || undefined\r\n };\r\n table.indexes = table.indexes || [];\r\n table.indexes.push(idx);\r\n });\r\n\r\n tables.push(...tablesByKey.values());\r\n return { tables };\r\n }\r\n};\r\n","import { SchemaIntrospector, IntrospectOptions } from './types.js';\r\nimport { queryRows, shouldIncludeTable } from './utils.js';\r\nimport { DatabaseSchema, DatabaseTable, DatabaseIndex, DatabaseColumn } from '../schema-types.js';\r\nimport { DbExecutor } from '../../execution/db-executor.js';\r\n\r\nexport const mysqlIntrospector: SchemaIntrospector = {\r\n async introspect(ctx: { executor: DbExecutor }, options: IntrospectOptions): Promise<DatabaseSchema> {\r\n const schema = options.schema;\r\n const filterClause = schema ? 'table_schema = ?' : 'table_schema = database()';\r\n const params = schema ? [schema] : [];\r\n\r\n const columnRows = await queryRows(\r\n ctx.executor,\r\n `\r\n SELECT table_schema, table_name, column_name, data_type, is_nullable, column_default, extra\r\n FROM information_schema.columns\r\n WHERE ${filterClause}\r\n ORDER BY table_name, ordinal_position\r\n `,\r\n params\r\n );\r\n\r\n const pkRows = await queryRows(\r\n ctx.executor,\r\n `\r\n SELECT table_schema, table_name, column_name\r\n FROM information_schema.key_column_usage\r\n WHERE constraint_name = 'PRIMARY' AND ${filterClause}\r\n ORDER BY ordinal_position\r\n `,\r\n params\r\n );\r\n\r\n const pkMap = new Map<string, string[]>();\r\n pkRows.forEach(r => {\r\n const key = `${r.table_schema}.${r.table_name}`;\r\n const list = pkMap.get(key) || [];\r\n list.push(r.column_name);\r\n pkMap.set(key, list);\r\n });\r\n\r\n const indexRows = await queryRows(\r\n ctx.executor,\r\n `\r\n SELECT\r\n table_schema,\r\n table_name,\r\n index_name,\r\n non_unique,\r\n GROUP_CONCAT(column_name ORDER BY seq_in_index) AS cols\r\n FROM information_schema.statistics\r\n WHERE ${filterClause} AND index_name <> 'PRIMARY'\r\n GROUP BY table_schema, table_name, index_name, non_unique\r\n `,\r\n params\r\n );\r\n\r\n const tablesByKey = new Map<string, DatabaseTable>();\r\n\r\n columnRows.forEach(r => {\r\n const key = `${r.table_schema}.${r.table_name}`;\r\n if (!shouldIncludeTable(r.table_name, options)) return;\r\n if (!tablesByKey.has(key)) {\r\n tablesByKey.set(key, {\r\n name: r.table_name,\r\n schema: r.table_schema,\r\n columns: [],\r\n primaryKey: pkMap.get(key) || [],\r\n indexes: []\r\n });\r\n }\r\n const cols = tablesByKey.get(key)!;\r\n const column: DatabaseColumn = {\r\n name: r.column_name,\r\n type: r.data_type,\r\n notNull: r.is_nullable === 'NO',\r\n default: r.column_default ?? undefined,\r\n autoIncrement: typeof r.extra === 'string' && r.extra.includes('auto_increment')\r\n };\r\n cols.columns.push(column);\r\n });\r\n\r\n indexRows.forEach(r => {\r\n const key = `${r.table_schema}.${r.table_name}`;\r\n const table = tablesByKey.get(key);\r\n if (!table) return;\r\n const cols = (typeof r.cols === 'string' ? r.cols.split(',') : []).map((c: string) => ({ column: c.trim() }));\r\n const idx: DatabaseIndex = {\r\n name: r.index_name,\r\n columns: cols,\r\n unique: r.non_unique === 0\r\n };\r\n table.indexes = table.indexes || [];\r\n table.indexes.push(idx);\r\n });\r\n\r\n return { tables: Array.from(tablesByKey.values()) };\r\n }\r\n};\r\n","import { SchemaIntrospector, IntrospectOptions } from './types.js';\nimport { queryRows, shouldIncludeTable } from './utils.js';\nimport { DatabaseSchema, DatabaseTable, DatabaseIndex } from '../schema-types.js';\nimport { DbExecutor } from '../../execution/db-executor.js';\n\nconst escapeSingleQuotes = (name: string) => name.replace(/'/g, \"''\");\n\nexport const sqliteIntrospector: SchemaIntrospector = {\n async introspect(ctx: { executor: DbExecutor }, options: IntrospectOptions): Promise<DatabaseSchema> {\n const tables: DatabaseTable[] = [];\n const tableRows = await queryRows(\n ctx.executor,\n `SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%';`\n );\n\n for (const row of tableRows) {\n const name = row.name as string;\n if (!shouldIncludeTable(name, options)) continue;\n const table: DatabaseTable = { name, columns: [], primaryKey: [], indexes: [] };\n\n const cols = await queryRows(ctx.executor, `PRAGMA table_info('${escapeSingleQuotes(name)}');`);\n cols.forEach(c => {\n table.columns.push({\n name: c.name,\n type: c.type,\n notNull: c.notnull === 1,\n default: c.dflt_value ?? undefined,\n autoIncrement: false\n });\n if (c.pk && c.pk > 0) {\n table.primaryKey = table.primaryKey || [];\n table.primaryKey.push(c.name);\n }\n });\n\n const fkRows = await queryRows(ctx.executor, `PRAGMA foreign_key_list('${escapeSingleQuotes(name)}');`);\n fkRows.forEach(fk => {\n const col = table.columns.find(c => c.name === fk.from);\n if (col) {\n col.references = {\n table: fk.table,\n column: fk.to,\n onDelete: fk.on_delete?.toUpperCase(),\n onUpdate: fk.on_update?.toUpperCase()\n };\n }\n });\n\n const idxList = await queryRows(ctx.executor, `PRAGMA index_list('${escapeSingleQuotes(name)}');`);\n for (const idx of idxList) {\n const idxName = idx.name as string;\n const columnsInfo = await queryRows(ctx.executor, `PRAGMA index_info('${escapeSingleQuotes(idxName)}');`);\n const idxEntry: DatabaseIndex = {\n name: idxName,\n columns: columnsInfo.map(ci => ({ column: ci.name as string })),\n unique: idx.unique === 1\n };\n table.indexes!.push(idxEntry);\n }\n\n tables.push(table);\n }\n\n return { tables };\n }\n};\n","import { SchemaIntrospector, IntrospectOptions } from './types.js';\r\nimport { queryRows, shouldIncludeTable } from './utils.js';\r\nimport { DatabaseSchema, DatabaseTable, DatabaseIndex, DatabaseColumn } from '../schema-types.js';\r\nimport { DbExecutor } from '../../execution/db-executor.js';\r\n\r\nexport const mssqlIntrospector: SchemaIntrospector = {\r\n async introspect(ctx: { executor: DbExecutor }, options: IntrospectOptions): Promise<DatabaseSchema> {\r\n const schema = options.schema;\r\n const filterSchema = schema ? 'sch.name = @p1' : '1=1';\r\n const params = schema ? [schema] : [];\r\n\r\n const columnRows = await queryRows(\r\n ctx.executor,\r\n `\r\n SELECT\r\n sch.name AS table_schema,\r\n t.name AS table_name,\r\n c.name AS column_name,\r\n ty.name AS data_type,\r\n c.is_nullable,\r\n c.is_identity,\r\n object_definition(c.default_object_id) AS column_default\r\n FROM sys.columns c\r\n JOIN sys.tables t ON t.object_id = c.object_id\r\n JOIN sys.schemas sch ON sch.schema_id = t.schema_id\r\n JOIN sys.types ty ON ty.user_type_id = c.user_type_id\r\n WHERE t.is_ms_shipped = 0 AND ${filterSchema}\r\n `,\r\n params\r\n );\r\n\r\n const pkRows = await queryRows(\r\n ctx.executor,\r\n `\r\n SELECT\r\n sch.name AS table_schema,\r\n t.name AS table_name,\r\n c.name AS column_name,\r\n ic.key_ordinal\r\n FROM sys.indexes i\r\n JOIN sys.index_columns ic ON ic.object_id = i.object_id AND ic.index_id = i.index_id\r\n JOIN sys.columns c ON c.object_id = ic.object_id AND c.column_id = ic.column_id\r\n JOIN sys.tables t ON t.object_id = i.object_id\r\n JOIN sys.schemas sch ON sch.schema_id = t.schema_id\r\n WHERE i.is_primary_key = 1 AND ${filterSchema}\r\n ORDER BY ic.key_ordinal\r\n `,\r\n params\r\n );\r\n\r\n const pkMap = new Map<string, string[]>();\r\n pkRows.forEach(r => {\r\n const key = `${r.table_schema}.${r.table_name}`;\r\n const list = pkMap.get(key) || [];\r\n list.push(r.column_name);\r\n pkMap.set(key, list);\r\n });\r\n\r\n const indexRows = await queryRows(\r\n ctx.executor,\r\n `\r\n SELECT\r\n sch.name AS table_schema,\r\n t.name AS table_name,\r\n i.name AS index_name,\r\n i.is_unique,\r\n i.has_filter,\r\n i.filter_definition\r\n FROM sys.indexes i\r\n JOIN sys.tables t ON t.object_id = i.object_id\r\n JOIN sys.schemas sch ON sch.schema_id = t.schema_id\r\n WHERE i.is_primary_key = 0 AND i.is_hypothetical = 0 AND ${filterSchema}\r\n `,\r\n params\r\n );\r\n\r\n const indexColsRows = await queryRows(\r\n ctx.executor,\r\n `\r\n SELECT\r\n sch.name AS table_schema,\r\n t.name AS table_name,\r\n i.name AS index_name,\r\n c.name AS column_name,\r\n ic.key_ordinal\r\n FROM sys.index_columns ic\r\n JOIN sys.indexes i ON i.object_id = ic.object_id AND i.index_id = ic.index_id\r\n JOIN sys.columns c ON c.object_id = ic.object_id AND c.column_id = ic.column_id\r\n JOIN sys.tables t ON t.object_id = i.object_id\r\n JOIN sys.schemas sch ON sch.schema_id = t.schema_id\r\n WHERE i.is_primary_key = 0 AND ${filterSchema}\r\n ORDER BY ic.key_ordinal\r\n `,\r\n params\r\n );\r\n\r\n const indexColumnsMap = new Map<string, { column: string; order: number }[]>();\r\n indexColsRows.forEach(r => {\r\n const key = `${r.table_schema}.${r.table_name}.${r.index_name}`;\r\n const list = indexColumnsMap.get(key) || [];\r\n list.push({ column: r.column_name, order: r.key_ordinal });\r\n indexColumnsMap.set(key, list);\r\n });\r\n\r\n const tablesByKey = new Map<string, DatabaseTable>();\r\n\r\n columnRows.forEach(r => {\r\n if (!shouldIncludeTable(r.table_name, options)) return;\r\n const key = `${r.table_schema}.${r.table_name}`;\r\n if (!tablesByKey.has(key)) {\r\n tablesByKey.set(key, {\r\n name: r.table_name,\r\n schema: r.table_schema,\r\n columns: [],\r\n primaryKey: pkMap.get(key) || [],\r\n indexes: []\r\n });\r\n }\r\n const t = tablesByKey.get(key)!;\r\n const column: DatabaseColumn = {\r\n name: r.column_name,\r\n type: r.data_type,\r\n notNull: r.is_nullable === false || r.is_nullable === 0,\r\n default: r.column_default ?? undefined,\r\n autoIncrement: !!r.is_identity\r\n };\r\n t.columns.push(column);\r\n });\r\n\r\n indexRows.forEach(r => {\r\n const key = `${r.table_schema}.${r.table_name}`;\r\n const table = tablesByKey.get(key);\r\n if (!table) return;\r\n const cols = (indexColumnsMap.get(`${r.table_schema}.${r.table_name}.${r.index_name}`) || [])\r\n .sort((a, b) => a.order - b.order)\r\n .map(c => ({ column: c.column }));\r\n const idx: DatabaseIndex = {\r\n name: r.index_name,\r\n columns: cols,\r\n unique: !!r.is_unique,\r\n where: r.has_filter ? r.filter_definition : undefined\r\n };\r\n table.indexes = table.indexes || [];\r\n table.indexes.push(idx);\r\n });\r\n\r\n return { tables: Array.from(tablesByKey.values()) };\r\n }\r\n};\r\n","import type { DialectName } from '../schema-generator.js';\r\nimport type { SchemaIntrospector } from './types.js';\r\nimport { postgresIntrospector } from './postgres.js';\r\nimport { mysqlIntrospector } from './mysql.js';\r\nimport { sqliteIntrospector } from './sqlite.js';\r\nimport { mssqlIntrospector } from './mssql.js';\r\n\r\nconst registry = new Map<DialectName, SchemaIntrospector>();\r\n\r\nconst registerBuiltInIntrospectors = () => {\r\n registry.set('postgres', postgresIntrospector);\r\n registry.set('mysql', mysqlIntrospector);\r\n registry.set('sqlite', sqliteIntrospector);\r\n registry.set('mssql', mssqlIntrospector);\r\n};\r\n\r\nregisterBuiltInIntrospectors();\r\n\r\nexport const registerSchemaIntrospector = (dialect: DialectName, introspector: SchemaIntrospector): void => {\r\n registry.set(dialect, introspector);\r\n};\r\n\r\nexport const getSchemaIntrospector = (dialect: DialectName): SchemaIntrospector | undefined => {\r\n return registry.get(dialect);\r\n};\r\n\r\n","import type { DialectName } from './schema-generator.js';\r\nimport { DatabaseSchema } from './schema-types.js';\r\nimport { DbExecutor } from '../execution/db-executor.js';\r\nimport type { IntrospectOptions, SchemaIntrospector, IntrospectContext } from './introspect/types.js';\r\nimport { getSchemaIntrospector } from './introspect/registry.js';\r\nimport { DialectFactory } from '../dialect/dialect-factory.js';\r\n\r\n/**\r\n * Introspects an existing database schema using the dialect-specific strategy.\r\n */\r\nexport const introspectSchema = async (\r\n executor: DbExecutor,\r\n dialect: DialectName,\r\n options: IntrospectOptions = {}\r\n): Promise<DatabaseSchema> => {\r\n const handler = getSchemaIntrospector(dialect);\r\n if (!handler) {\r\n throw new Error(`Unsupported dialect for introspection: ${dialect}`);\r\n }\r\n const dialectInstance = DialectFactory.create(dialect);\r\n const ctx: IntrospectContext = { executor, dialect: dialectInstance };\r\n return handler.introspect(ctx, options);\r\n};\r\n\r\nexport type { IntrospectOptions, SchemaIntrospector };\r\n","// Pure AST Builders - No Dialect Logic Here!\r\n\r\nimport { ColumnDef } from '../../schema/column.js';\r\nimport { columnOperand, valueToOperand } from '../ast/expression-builders.js';\r\nimport { FunctionNode, OperandNode, isOperandNode } from '../ast/expression.js';\r\n\r\ntype OperandInput = OperandNode | ColumnDef | string | number | boolean | null;\r\n\r\nconst isColumnDef = (val: any): val is ColumnDef => !!val && typeof val === 'object' && 'type' in val && 'name' in val;\r\n\r\nconst toOperand = (input: OperandInput): OperandNode => {\r\n if (isOperandNode(input)) return input;\r\n if (isColumnDef(input)) return columnOperand(input);\r\n\r\n return valueToOperand(input);\r\n};\r\n\r\nconst fn = (key: string, args: OperandInput[]): FunctionNode => ({\r\n type: 'Function',\r\n name: key,\r\n fn: key,\r\n args: args.map(toOperand)\r\n});\r\n\r\n/**\r\n * Helper: LOWER(str)\r\n */\r\nexport const lower = (value: OperandInput): FunctionNode => fn('LOWER', [value]);\r\n\r\n/**\r\n * Helper: UPPER(str)\r\n */\r\nexport const upper = (value: OperandInput): FunctionNode => fn('UPPER', [value]);\r\n\r\n/**\r\n * Helper: ASCII(str)\r\n */\r\nexport const ascii = (value: OperandInput): FunctionNode => fn('ASCII', [value]);\r\n\r\n/**\r\n * Helper: CHAR(code[, code...])\r\n */\r\nexport const char = (...codes: OperandInput[]): FunctionNode => {\r\n if (codes.length === 0) throw new Error('char() expects at least 1 argument');\r\n return fn('CHAR', codes);\r\n};\r\n\r\n/**\r\n * Helper: CHAR_LENGTH(str)\r\n */\r\nexport const charLength = (value: OperandInput): FunctionNode => fn('CHAR_LENGTH', [value]);\r\n\r\n/**\r\n * Helper: LENGTH(str)\r\n */\r\nexport const length = (value: OperandInput): FunctionNode => fn('LENGTH', [value]);\r\n\r\n/**\r\n * Helper: TRIM([chars FROM] str)\r\n */\r\nexport const trim = (value: OperandInput, chars?: OperandInput): FunctionNode =>\r\n chars === undefined ? fn('TRIM', [value]) : fn('TRIM', [value, chars]);\r\n\r\n/**\r\n * Helper: LTRIM(str)\r\n */\r\nexport const ltrim = (value: OperandInput): FunctionNode => fn('LTRIM', [value]);\r\n\r\n/**\r\n * Helper: RTRIM(str)\r\n */\r\nexport const rtrim = (value: OperandInput): FunctionNode => fn('RTRIM', [value]);\r\n\r\n/**\r\n * Helper: CONCAT(arg1, arg2, ...)\r\n */\r\nexport const concat = (...args: OperandInput[]): FunctionNode => {\r\n if (args.length < 2) throw new Error('concat() expects at least 2 arguments');\r\n return fn('CONCAT', args);\r\n};\r\n\r\n/**\r\n * Helper: CONCAT_WS(separator, arg1, arg2, ...)\r\n */\r\nexport const concatWs = (separator: OperandInput, ...args: OperandInput[]): FunctionNode => {\r\n if (args.length < 1) throw new Error('concatWs() expects at least 2 arguments including the separator');\r\n return fn('CONCAT_WS', [separator, ...args]);\r\n};\r\n\r\n/**\r\n * Helper: SUBSTR(str, start[, length])\r\n */\r\nexport const substr = (value: OperandInput, start: OperandInput, length?: OperandInput): FunctionNode =>\r\n length === undefined ? fn('SUBSTR', [value, start]) : fn('SUBSTR', [value, start, length]);\r\n\r\n/**\r\n * Helper: LEFT(str, length)\r\n */\r\nexport const left = (value: OperandInput, len: OperandInput): FunctionNode => fn('LEFT', [value, len]);\r\n\r\n/**\r\n * Helper: RIGHT(str, length)\r\n */\r\nexport const right = (value: OperandInput, len: OperandInput): FunctionNode => fn('RIGHT', [value, len]);\r\n\r\n/**\r\n * Helper: POSITION(substring IN string)\r\n */\r\nexport const position = (substring: OperandInput, value: OperandInput): FunctionNode => fn('POSITION', [substring, value]);\r\n\r\n/**\r\n * Helper: INSTR(string, substring)\r\n */\r\nexport const instr = (value: OperandInput, substring: OperandInput): FunctionNode => fn('INSTR', [value, substring]);\r\n\r\n/**\r\n * Helper: LOCATE(substring, string[, start])\r\n */\r\nexport const locate = (substring: OperandInput, value: OperandInput, start?: OperandInput): FunctionNode =>\r\n start === undefined ? fn('LOCATE', [substring, value]) : fn('LOCATE', [substring, value, start]);\r\n\r\n/**\r\n * Helper: REPLACE(string, search, replace)\r\n */\r\nexport const replace = (value: OperandInput, search: OperandInput, replacement: OperandInput): FunctionNode =>\r\n fn('REPLACE', [value, search, replacement]);\r\n\r\n/**\r\n * Helper: REPEAT(string, count)\r\n */\r\nexport const repeat = (value: OperandInput, count: OperandInput): FunctionNode => fn('REPEAT', [value, count]);\r\n\r\n/**\r\n * Helper: LPAD(string, length, padstr)\r\n */\r\nexport const lpad = (value: OperandInput, len: OperandInput, pad: OperandInput): FunctionNode =>\r\n fn('LPAD', [value, len, pad]);\r\n\r\n/**\r\n * Helper: RPAD(string, length, padstr)\r\n */\r\nexport const rpad = (value: OperandInput, len: OperandInput, pad: OperandInput): FunctionNode =>\r\n fn('RPAD', [value, len, pad]);\r\n\r\n/**\r\n * Helper: SPACE(count)\r\n */\r\nexport const space = (count: OperandInput): FunctionNode => fn('SPACE', [count]);\r\n","// Pure AST Builders - No Dialect Logic Here!\r\n\r\nimport { ColumnDef } from '../../schema/column.js';\r\nimport { columnOperand, valueToOperand } from '../ast/expression-builders.js';\r\nimport { FunctionNode, OperandNode, isOperandNode } from '../ast/expression.js';\r\n\r\ntype OperandInput = OperandNode | ColumnDef | string | number | boolean | null;\r\n\r\nconst isColumnDef = (val: any): val is ColumnDef => !!val && typeof val === 'object' && 'type' in val && 'name' in val;\r\n\r\nconst toOperand = (input: OperandInput): OperandNode => {\r\n if (isOperandNode(input)) return input;\r\n if (isColumnDef(input)) return columnOperand(input);\r\n\r\n return valueToOperand(input);\r\n};\r\n\r\nconst fn = (key: string, args: OperandInput[]): FunctionNode => ({\r\n type: 'Function',\r\n name: key,\r\n fn: key,\r\n args: args.map(toOperand)\r\n});\r\n\r\n// ----------------------\r\n// Helper Functions\r\n// ----------------------\r\n\r\n/**\r\n * Helper: ABS(x) - Returns the absolute value of a number\r\n */\r\nexport const abs = (value: OperandInput): FunctionNode => fn('ABS', [value]);\r\n\r\n/**\r\n * Helper: ACOS(x) - Returns the arccosine (inverse cosine)\r\n */\r\nexport const acos = (value: OperandInput): FunctionNode => fn('ACOS', [value]);\r\n\r\n/**\r\n * Helper: ASIN(x) - Returns the arcsine (inverse sine)\r\n */\r\nexport const asin = (value: OperandInput): FunctionNode => fn('ASIN', [value]);\r\n\r\n/**\r\n * Helper: ATAN(x) - Returns the arctangent (inverse tangent)\r\n */\r\nexport const atan = (value: OperandInput): FunctionNode => fn('ATAN', [value]);\r\n\r\n/**\r\n * Helper: ATAN2(y, x) - Returns the arctangent of the two arguments\r\n */\r\nexport const atan2 = (y: OperandInput, x: OperandInput): FunctionNode => fn('ATAN2', [y, x]);\r\n\r\n/**\r\n * Helper: CEIL(x) / CEILING(x) - Returns the smallest integer >= x\r\n */\r\nexport const ceil = (value: OperandInput): FunctionNode => fn('CEIL', [value]);\r\n\r\n/**\r\n * Helper: CEILING(x) - Alias for CEIL\r\n */\r\nexport const ceiling = (value: OperandInput): FunctionNode => fn('CEILING', [value]);\r\n\r\n/**\r\n * Helper: COS(x) - Returns the cosine of a number (in radians)\r\n */\r\nexport const cos = (value: OperandInput): FunctionNode => fn('COS', [value]);\r\n\r\n/**\r\n * Helper: COT(x) - Returns the cotangent of a number\r\n */\r\nexport const cot = (value: OperandInput): FunctionNode => fn('COT', [value]);\r\n\r\n/**\r\n * Helper: DEGREES(x) - Converts radians to degrees\r\n */\r\nexport const degrees = (value: OperandInput): FunctionNode => fn('DEGREES', [value]);\r\n\r\n/**\r\n * Helper: EXP(x) - Returns e raised to the power of the argument\r\n */\r\nexport const exp = (value: OperandInput): FunctionNode => fn('EXP', [value]);\r\n\r\n/**\r\n * Helper: FLOOR(x) - Returns the largest integer <= x\r\n */\r\nexport const floor = (value: OperandInput): FunctionNode => fn('FLOOR', [value]);\r\n\r\n/**\r\n * Helper: LN(x) - Returns the natural logarithm (base e)\r\n */\r\nexport const ln = (value: OperandInput): FunctionNode => fn('LN', [value]);\r\n\r\n/**\r\n * Helper: LOG(x) - Returns the base-10 logarithm\r\n */\r\nexport const log = (value: OperandInput): FunctionNode => fn('LOG', [value]);\r\n\r\n/**\r\n * Helper: LOG10(x) - Returns the base-10 logarithm\r\n */\r\nexport const log10 = (value: OperandInput): FunctionNode => fn('LOG10', [value]);\r\n\r\n/**\r\n * Helper: LOG(base, x) - Returns the logarithm of x for a specific base\r\n */\r\nexport const logBase = (base: OperandInput, value: OperandInput): FunctionNode => fn('LOG_BASE', [base, value]);\r\n\r\n/**\r\n * Helper: MOD(x, y) - Returns the remainder of x/y\r\n */\r\nexport const mod = (x: OperandInput, y: OperandInput): FunctionNode => fn('MOD', [x, y]);\r\n\r\n/**\r\n * Helper: PI() - Returns the value of PI (approx. 3.14159...)\r\n */\r\nexport const pi = (): FunctionNode => fn('PI', []);\r\n\r\n/**\r\n * Helper: POWER(x, y) - Returns x raised to the power of y\r\n */\r\nexport const power = (x: OperandInput, y: OperandInput): FunctionNode => fn('POWER', [x, y]);\r\n\r\n/**\r\n * Helper: POW(x, y) - Alias for POWER\r\n */\r\nexport const pow = (x: OperandInput, y: OperandInput): FunctionNode => fn('POW', [x, y]);\r\n\r\n/**\r\n * Helper: RADIANS(x) - Converts degrees to radians\r\n */\r\nexport const radians = (value: OperandInput): FunctionNode => fn('RADIANS', [value]);\r\n\r\n/**\r\n * Helper: RAND() / RANDOM() - Returns a random number\r\n */\r\nexport const random = (): FunctionNode => fn('RANDOM', []);\r\n\r\n/**\r\n * Helper: RAND() - Alias for RANDOM (returns float 0-1)\r\n */\r\nexport const rand = (): FunctionNode => fn('RAND', []);\r\n\r\n/**\r\n * Helper: ROUND(x[, decimals]) - Rounds a number to specified decimal places\r\n */\r\nexport const round = (value: OperandInput, decimals?: OperandInput): FunctionNode =>\r\n decimals === undefined ? fn('ROUND', [value]) : fn('ROUND', [value, decimals]);\r\n\r\n/**\r\n * Helper: SIGN(x) - Returns the sign of a number (-1, 0, 1)\r\n */\r\nexport const sign = (value: OperandInput): FunctionNode => fn('SIGN', [value]);\r\n\r\n/**\r\n * Helper: SIN(x) - Returns the sine of a number (in radians)\r\n */\r\nexport const sin = (value: OperandInput): FunctionNode => fn('SIN', [value]);\r\n\r\n/**\r\n * Helper: SQRT(x) - Returns the square root of a number\r\n */\r\nexport const sqrt = (value: OperandInput): FunctionNode => fn('SQRT', [value]);\r\n\r\n/**\r\n * Helper: TAN(x) - Returns the tangent of a number (in radians)\r\n */\r\nexport const tan = (value: OperandInput): FunctionNode => fn('TAN', [value]);\r\n\r\n/**\r\n * Helper: TRUNC(x[, decimals]) / TRUNCATE(x, decimals) - Truncates a number without rounding\r\n */\r\nexport const trunc = (value: OperandInput, decimals?: OperandInput): FunctionNode =>\r\n decimals === undefined ? fn('TRUNC', [value]) : fn('TRUNC', [value, decimals]);\r\n\r\n/**\r\n * Helper: TRUNCATE(x, decimals) - Alias for TRUNC\r\n */\r\nexport const truncate = (value: OperandInput, decimals: OperandInput): FunctionNode =>\r\n fn('TRUNCATE', [value, decimals]);\r\n","// Pure AST Builders - No Dialect Logic Here!\r\n\r\nimport { ColumnDef } from '../../schema/column.js';\r\nimport { columnOperand, valueToOperand } from '../ast/expression-builders.js';\r\nimport { FunctionNode, OperandNode, isOperandNode } from '../ast/expression.js';\r\n\r\ntype OperandInput = OperandNode | ColumnDef | string | number | boolean | null;\r\n\r\nconst isColumnDef = (val: any): val is ColumnDef => !!val && typeof val === 'object' && 'type' in val && 'name' in val;\r\n\r\nconst toOperand = (input: OperandInput): OperandNode => {\r\n if (isOperandNode(input)) return input;\r\n if (isColumnDef(input)) return columnOperand(input);\r\n\r\n return valueToOperand(input);\r\n};\r\n\r\nconst fn = (key: string, args: OperandInput[]): FunctionNode => ({\r\n type: 'Function',\r\n name: key,\r\n args: args.map(toOperand)\r\n});\r\n\r\n// ----------------------\r\n// Helper Functions\r\n// ----------------------\r\n\r\n/**\r\n * Helper: NOW() - Returns the current local date and time\r\n */\r\nexport const now = (): FunctionNode => fn('NOW', []);\r\n\r\n/**\r\n * Helper: CURRENT_DATE - Returns only the current date (no time)\r\n */\r\nexport const currentDate = (): FunctionNode => fn('CURRENT_DATE', []);\r\n\r\n/**\r\n * Helper: CURRENT_TIME - Returns only the current time\r\n */\r\nexport const currentTime = (): FunctionNode => fn('CURRENT_TIME', []);\r\n\r\n/**\r\n * Helper: UTC_NOW() - Returns current UTC/GMT date and time\r\n */\r\nexport const utcNow = (): FunctionNode => fn('UTC_NOW', []);\r\n\r\n/**\r\n * Helper: EXTRACT(part FROM date) - Extracts a part (year, month, day, hour, etc.) from a date\r\n * @param part - The date part to extract (e.g., 'YEAR', 'MONTH', 'DAY', 'HOUR', 'MINUTE', 'SECOND')\r\n * @param date - The date/datetime value\r\n */\r\nexport const extract = (part: OperandInput, date: OperandInput): FunctionNode => fn('EXTRACT', [part, date]);\r\n\r\n/**\r\n * Helper: YEAR(date) - Extracts the year from a date\r\n */\r\nexport const year = (date: OperandInput): FunctionNode => fn('YEAR', [date]);\r\n\r\n/**\r\n * Helper: MONTH(date) - Extracts the month from a date\r\n */\r\nexport const month = (date: OperandInput): FunctionNode => fn('MONTH', [date]);\r\n\r\n/**\r\n * Helper: DAY(date) - Extracts the day from a date\r\n */\r\nexport const day = (date: OperandInput): FunctionNode => fn('DAY', [date]);\r\n\r\n/**\r\n * Helper: DATE_ADD(date, interval, unit) - Adds a specific time interval to a date\r\n * @param date - The date/datetime value\r\n * @param interval - The number of units to add\r\n * @param unit - The unit type (e.g., 'DAY', 'MONTH', 'YEAR', 'HOUR', 'MINUTE', 'SECOND')\r\n */\r\nexport const dateAdd = (date: OperandInput, interval: OperandInput, unit: OperandInput): FunctionNode =>\r\n fn('DATE_ADD', [date, interval, unit]);\r\n\r\n/**\r\n * Helper: DATE_SUB(date, interval, unit) - Subtracts a specific time interval from a date\r\n * @param date - The date/datetime value\r\n * @param interval - The number of units to subtract\r\n * @param unit - The unit type (e.g., 'DAY', 'MONTH', 'YEAR', 'HOUR', 'MINUTE', 'SECOND')\r\n */\r\nexport const dateSub = (date: OperandInput, interval: OperandInput, unit: OperandInput): FunctionNode =>\r\n fn('DATE_SUB', [date, interval, unit]);\r\n\r\n/**\r\n * Helper: DATE_DIFF(date1, date2) - Returns the difference between two dates in days\r\n * @param date1 - The end date\r\n * @param date2 - The start date\r\n */\r\nexport const dateDiff = (date1: OperandInput, date2: OperandInput): FunctionNode => fn('DATE_DIFF', [date1, date2]);\r\n\r\n/**\r\n * Helper: DATE_FORMAT(date, format) - Converts a date to a formatted string\r\n * @param date - The date/datetime value\r\n * @param format - The format string (dialect-specific)\r\n */\r\nexport const dateFormat = (date: OperandInput, format: OperandInput): FunctionNode => fn('DATE_FORMAT', [date, format]);\r\n\r\n/**\r\n * Helper: UNIX_TIMESTAMP() - Returns the current Unix epoch (seconds since 1970)\r\n */\r\nexport const unixTimestamp = (): FunctionNode => fn('UNIX_TIMESTAMP', []);\r\n\r\n/**\r\n * Helper: FROM_UNIXTIME(timestamp) - Converts Unix epoch seconds to a date\r\n * @param timestamp - Unix timestamp in seconds\r\n */\r\nexport const fromUnixTime = (timestamp: OperandInput): FunctionNode => fn('FROM_UNIXTIME', [timestamp]);\r\n\r\n/**\r\n * Helper: END_OF_MONTH(date) - Returns the last day of the month for a given date\r\n */\r\nexport const endOfMonth = (date: OperandInput): FunctionNode => fn('END_OF_MONTH', [date]);\r\n\r\n/**\r\n * Helper: DAY_OF_WEEK(date) - Returns the index of the weekday\r\n */\r\nexport const dayOfWeek = (date: OperandInput): FunctionNode => fn('DAY_OF_WEEK', [date]);\r\n\r\n/**\r\n * Helper: WEEK_OF_YEAR(date) - Returns the week number of the year\r\n */\r\nexport const weekOfYear = (date: OperandInput): FunctionNode => fn('WEEK_OF_YEAR', [date]);\r\n\r\n/**\r\n * Helper: DATE_TRUNC(part, date) - Resets date precision (e.g., first day of the month/year)\r\n * @param part - The truncation precision (e.g., 'YEAR', 'MONTH', 'DAY')\r\n * @param date - The date/datetime value\r\n */\r\nexport const dateTrunc = (part: OperandInput, date: OperandInput): FunctionNode => fn('DATE_TRUNC', [part, date]);\r\n","// In a real Node environment: import { AsyncLocalStorage } from 'node:async_hooks';\r\n\r\n/**\r\n * Browser-compatible implementation of AsyncLocalStorage\r\n * Provides a simple in-memory store for browser environments\r\n * @typeParam T - Type of the stored data\r\n */\r\nexport class AsyncLocalStorage<T> {\r\n private store: T | undefined;\r\n\r\n /**\r\n * Executes a callback with the specified store value\r\n * @param store - Value to store during callback execution\r\n * @param callback - Function to execute with the store value\r\n * @returns Result of the callback function\r\n */\r\n run<R>(store: T, callback: () => R): R {\r\n this.store = store;\r\n try {\r\n return callback();\r\n } finally {\r\n this.store = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the currently stored value\r\n * @returns Current store value or undefined if none exists\r\n */\r\n getStore(): T | undefined {\r\n return this.store;\r\n }\r\n}\r\n","import { SQL_OPERATORS, SqlOperator } from './sql.js';\r\n\r\n/**\r\n * Configuration for how SQL operators map to TypeScript builder helpers\r\n */\r\nexport interface SqlOperatorConfig {\r\n /**\r\n * SQL operator literal\r\n */\r\n sql: SqlOperator;\r\n /**\r\n * Corresponding TypeScript helper name\r\n */\r\n tsName: string;\r\n}\r\n\r\n/**\r\n * Registry of supported SQL operators and their companion helper names\r\n */\r\nexport const SQL_OPERATOR_REGISTRY: Record<SqlOperator, SqlOperatorConfig> = {\r\n [SQL_OPERATORS.EQUALS]: { sql: SQL_OPERATORS.EQUALS, tsName: 'eq' },\r\n [SQL_OPERATORS.NOT_EQUALS]: { sql: SQL_OPERATORS.NOT_EQUALS, tsName: 'neq' },\r\n [SQL_OPERATORS.GREATER_THAN]: { sql: SQL_OPERATORS.GREATER_THAN, tsName: 'gt' },\r\n [SQL_OPERATORS.GREATER_OR_EQUAL]: { sql: SQL_OPERATORS.GREATER_OR_EQUAL, tsName: 'gte' },\r\n [SQL_OPERATORS.LESS_THAN]: { sql: SQL_OPERATORS.LESS_THAN, tsName: 'lt' },\r\n [SQL_OPERATORS.LESS_OR_EQUAL]: { sql: SQL_OPERATORS.LESS_OR_EQUAL, tsName: 'lte' },\r\n [SQL_OPERATORS.LIKE]: { sql: SQL_OPERATORS.LIKE, tsName: 'like' },\r\n [SQL_OPERATORS.NOT_LIKE]: { sql: SQL_OPERATORS.NOT_LIKE, tsName: 'notLike' },\r\n [SQL_OPERATORS.IN]: { sql: SQL_OPERATORS.IN, tsName: 'inList' },\r\n [SQL_OPERATORS.NOT_IN]: { sql: SQL_OPERATORS.NOT_IN, tsName: 'notInList' },\r\n [SQL_OPERATORS.IS_NULL]: { sql: SQL_OPERATORS.IS_NULL, tsName: 'isNull' },\r\n [SQL_OPERATORS.IS_NOT_NULL]: { sql: SQL_OPERATORS.IS_NOT_NULL, tsName: 'isNotNull' },\r\n [SQL_OPERATORS.AND]: { sql: SQL_OPERATORS.AND, tsName: 'and' },\r\n [SQL_OPERATORS.OR]: { sql: SQL_OPERATORS.OR, tsName: 'or' },\r\n [SQL_OPERATORS.BETWEEN]: { sql: SQL_OPERATORS.BETWEEN, tsName: 'between' },\r\n [SQL_OPERATORS.NOT_BETWEEN]: { sql: SQL_OPERATORS.NOT_BETWEEN, tsName: 'notBetween' },\r\n [SQL_OPERATORS.EXISTS]: { sql: SQL_OPERATORS.EXISTS, tsName: 'exists' },\r\n [SQL_OPERATORS.NOT_EXISTS]: { sql: SQL_OPERATORS.NOT_EXISTS, tsName: 'notExists' }\r\n};\r\n","import type { TableNode, FunctionTableNode, DerivedTableNode, TableSourceNode } from '../core/ast/query.js';\nimport type { ColumnNode } from '../core/ast/expression.js';\r\n\r\n/**\r\n * Strategy interface for converting database names to TypeScript identifiers\r\n */\r\nexport interface NamingStrategy {\r\n /**\r\n * Converts a table name to a TypeScript symbol name\r\n * @param table - Table node, function table node, or name\n * @returns Valid TypeScript identifier\n */\n tableToSymbol(table: TableSourceNode | string): string;\n\r\n /**\r\n * Converts a column reference to a property name\r\n * @param column - Column node\r\n * @returns Valid TypeScript property name\r\n */\r\n columnToProperty(column: ColumnNode): string;\r\n}\r\n\r\n/**\r\n * Default naming strategy that maintains backward compatibility\r\n * with the original capitalize() behavior\r\n */\r\nexport class DefaultNamingStrategy implements NamingStrategy {\r\n /**\r\n * Converts table names to TypeScript symbols\r\n * @param table - Table node, function table node, or string name\n * @returns Capitalized table name (handles schema-qualified names)\n */\n tableToSymbol(table: TableNode | FunctionTableNode | DerivedTableNode | string): string {\n const tableName =\n typeof table === 'string'\n ? table\n : table.type === 'DerivedTable'\n ? table.alias\n : table.name;\n\r\n // Handle schema-qualified names (e.g., \"auth.user\" → \"AuthUser\")\r\n if (tableName.includes('.')) {\r\n return tableName.split('.')\r\n .map(part => this.capitalize(part))\r\n .join('');\r\n }\r\n\r\n return this.capitalize(tableName);\r\n }\r\n\r\n /**\r\n * Converts column references to property names\r\n * @param column - Column node\r\n * @returns Column name as-is (for backward compatibility)\r\n */\r\n columnToProperty(column: ColumnNode): string {\r\n return column.name;\r\n }\r\n\r\n /**\r\n * Capitalizes the first letter of a string\r\n * @param s - String to capitalize\r\n * @returns Capitalized string\r\n */\r\n private capitalize(s: string): string {\r\n if (!s) return s;\r\n return s.charAt(0).toUpperCase() + s.slice(1);\r\n }\r\n}\r\n","import { SelectQueryNode } from '../core/ast/query.js';\r\nimport {\r\n ExpressionNode,\r\n OperandNode,\r\n BinaryExpressionNode,\r\n LogicalExpressionNode,\r\n InExpressionNode,\r\n NullExpressionNode,\r\n JsonPathNode,\r\n ExistsExpressionNode,\r\n BetweenExpressionNode,\r\n ScalarSubqueryNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode,\r\n ColumnNode,\r\n LiteralNode,\r\n FunctionNode,\r\n ExpressionVisitor,\r\n OperandVisitor,\r\n visitExpression,\r\n visitOperand\r\n} from '../core/ast/expression.js';\r\nimport { SQL_OPERATOR_REGISTRY } from '../core/sql/sql-operator-config.js';\r\nimport { SqlOperator } from '../core/sql/sql.js';\r\nimport { isRelationAlias } from '../query-builder/relation-alias.js';\r\nimport { HydrationMetadata } from '../core/hydration/types.js';\r\nimport { getJoinRelationName } from '../core/ast/join-metadata.js';\r\nimport { NamingStrategy, DefaultNamingStrategy } from './naming-strategy.js';\r\n\r\nconst assertNever = (value: never): never => {\r\n throw new Error(`Unhandled SQL operator: ${value}`);\r\n};\r\n\r\n/**\r\n * Generates TypeScript code from query AST nodes\r\n */\r\nexport class TypeScriptGenerator implements ExpressionVisitor<string>, OperandVisitor<string> {\r\n constructor(private namingStrategy: NamingStrategy = new DefaultNamingStrategy()) {}\r\n\r\n /**\r\n * Generates TypeScript code from a query AST\r\n * @param ast - Query AST to generate code from\r\n * @returns Generated TypeScript code\r\n */\r\n generate(ast: SelectQueryNode): string {\r\n const chainLines = this.buildSelectLines(ast);\r\n const lines = chainLines.map((line, index) => (index === 0 ? `const query = ${line}` : line));\r\n lines.push(';', '', 'await query.execute();');\r\n return lines.join('\\n');\r\n }\r\n\r\n /**\r\n * Builds TypeScript method chain lines from query AST\r\n * @param ast - Query AST\r\n * @returns Array of TypeScript method chain lines\r\n */\r\n private buildSelectLines(ast: SelectQueryNode): string[] {\r\n const lines: string[] = [];\r\n const hydration = (ast.meta as HydrationMetadata | undefined)?.hydration;\r\n const hydratedRelations = new Set(hydration?.relations?.map(r => r.name) ?? []);\r\n\r\n const selections = ast.columns\r\n .filter(col => !(hydration && isRelationAlias((col as any).alias)))\r\n .map(col => {\r\n const key = (col as any).alias || (col as any).name;\r\n const operand = col as OperandNode;\r\n return `${key}: ${this.printOperand(operand)}`;\r\n });\r\n\r\n lines.push(`db.select({`);\r\n selections.forEach((sel, index) => {\r\n lines.push(` ${sel}${index < selections.length - 1 ? ',' : ''}`);\r\n });\r\n lines.push(`})`);\r\n lines.push(`.from(${this.namingStrategy.tableToSymbol(ast.from)})`);\r\n\r\n if (ast.distinct && ast.distinct.length) {\r\n const cols = ast.distinct.map(c => `${this.namingStrategy.tableToSymbol(c.table)}.${c.name}`).join(', ');\r\n lines.push(`.distinct(${cols})`);\r\n }\r\n\r\n ast.joins.forEach(join => {\r\n const relationName = getJoinRelationName(join);\r\n if (relationName && hydratedRelations.has(relationName)) {\r\n return;\r\n }\r\n\r\n if (relationName) {\r\n if (join.kind === 'INNER') {\r\n lines.push(`.joinRelation('${relationName}')`);\r\n } else {\r\n lines.push(`.joinRelation('${relationName}', '${join.kind}')`);\r\n }\r\n } else {\r\n const table = this.namingStrategy.tableToSymbol(join.table);\r\n const cond = this.printExpression(join.condition);\r\n let method = 'innerJoin';\r\n if (join.kind === 'LEFT') method = 'leftJoin';\r\n if (join.kind === 'RIGHT') method = 'rightJoin';\r\n lines.push(`.${method}(${table}, ${cond})`);\r\n }\r\n });\r\n\r\n if (hydration?.relations?.length) {\r\n hydration.relations.forEach(rel => {\r\n const options: string[] = [];\r\n if (rel.columns.length) options.push(`columns: [${rel.columns.map(c => `'${c}'`).join(', ')}]`);\r\n if (rel.aliasPrefix !== rel.name) options.push(`aliasPrefix: '${rel.aliasPrefix}'`);\r\n const opts = options.length ? `, { ${options.join(', ')} }` : '';\r\n lines.push(`.include('${rel.name}'${opts})`);\r\n });\r\n }\r\n\r\n if (ast.where) {\r\n lines.push(`.where(${this.printExpression(ast.where)})`);\r\n }\r\n\r\n if (ast.groupBy && ast.groupBy.length) {\r\n const cols = ast.groupBy.map(c => `${this.namingStrategy.tableToSymbol(c.table)}.${c.name}`).join(', ');\r\n lines.push(`.groupBy(${cols})`);\r\n }\r\n\r\n if (ast.having) {\r\n lines.push(`.having(${this.printExpression(ast.having)})`);\r\n }\r\n\r\n if (ast.orderBy && ast.orderBy.length) {\r\n ast.orderBy.forEach(o => {\r\n lines.push(`.orderBy(${this.namingStrategy.tableToSymbol(o.column.table)}.${o.column.name}, '${o.direction}')`);\r\n });\r\n }\r\n\r\n if (ast.limit) lines.push(`.limit(${ast.limit})`);\r\n if (ast.offset) lines.push(`.offset(${ast.offset})`);\r\n\r\n return lines;\r\n }\r\n\r\n /**\r\n * Prints an expression node to TypeScript code\r\n * @param expr - Expression node to print\r\n * @returns TypeScript code representation\r\n */\r\n private printExpression(expr: ExpressionNode): string {\r\n return visitExpression(expr, this);\r\n }\r\n\r\n /**\r\n * Prints an operand node to TypeScript code\r\n * @param node - Operand node to print\r\n * @returns TypeScript code representation\r\n */\r\n private printOperand(node: OperandNode): string {\r\n return visitOperand(node, this);\r\n }\r\n\r\n public visitBinaryExpression(binary: BinaryExpressionNode): string {\r\n return this.printBinaryExpression(binary);\r\n }\r\n\r\n public visitLogicalExpression(logical: LogicalExpressionNode): string {\r\n return this.printLogicalExpression(logical);\r\n }\r\n\r\n public visitNullExpression(nullExpr: NullExpressionNode): string {\r\n return this.printNullExpression(nullExpr);\r\n }\r\n\r\n public visitInExpression(inExpr: InExpressionNode): string {\r\n return this.printInExpression(inExpr);\r\n }\r\n\r\n public visitExistsExpression(existsExpr: ExistsExpressionNode): string {\r\n return this.printExistsExpression(existsExpr);\r\n }\r\n\r\n public visitBetweenExpression(betweenExpr: BetweenExpressionNode): string {\r\n return this.printBetweenExpression(betweenExpr);\r\n }\r\n\r\n public visitColumn(node: ColumnNode): string {\r\n return this.printColumnOperand(node);\r\n }\r\n\r\n public visitLiteral(node: LiteralNode): string {\r\n return this.printLiteralOperand(node);\r\n }\r\n\r\n public visitFunction(node: FunctionNode): string {\r\n return this.printFunctionOperand(node);\r\n }\r\n\r\n public visitJsonPath(node: JsonPathNode): string {\r\n return this.printJsonPathOperand(node);\r\n }\r\n\r\n public visitScalarSubquery(node: ScalarSubqueryNode): string {\r\n return this.printScalarSubqueryOperand(node);\r\n }\r\n\r\n public visitCaseExpression(node: CaseExpressionNode): string {\r\n return this.printCaseExpressionOperand(node);\r\n }\r\n\r\n public visitWindowFunction(node: WindowFunctionNode): string {\r\n return this.printWindowFunctionOperand(node);\r\n }\r\n\r\n /**\r\n * Prints a binary expression to TypeScript code\r\n * @param binary - Binary expression node\r\n * @returns TypeScript code representation\r\n */\r\n private printBinaryExpression(binary: BinaryExpressionNode): string {\r\n const left = this.printOperand(binary.left);\r\n const right = this.printOperand(binary.right);\r\n const fn = this.mapOp(binary.operator);\r\n const args = [left, right];\r\n if (binary.escape) {\r\n args.push(this.printOperand(binary.escape));\r\n }\r\n return `${fn}(${args.join(', ')})`;\r\n }\r\n\r\n /**\r\n * Prints a logical expression to TypeScript code\r\n * @param logical - Logical expression node\r\n * @returns TypeScript code representation\r\n */\r\n private printLogicalExpression(logical: LogicalExpressionNode): string {\r\n if (logical.operands.length === 0) return '';\r\n const parts = logical.operands.map(op => {\r\n const compiled = this.printExpression(op);\r\n return op.type === 'LogicalExpression' ? `(${compiled})` : compiled;\r\n });\r\n return `${this.mapOp(logical.operator)}(\\n ${parts.join(',\\n ')}\\n )`;\r\n }\r\n\r\n /**\r\n * Prints an IN expression to TypeScript code\r\n * @param inExpr - IN expression node\r\n * @returns TypeScript code representation\r\n */\r\n private printInExpression(inExpr: InExpressionNode): string {\r\n const left = this.printOperand(inExpr.left);\r\n const values = inExpr.right.map(v => this.printOperand(v)).join(', ');\r\n const fn = this.mapOp(inExpr.operator);\r\n return `${fn}(${left}, [${values}])`;\r\n }\r\n\r\n /**\r\n * Prints a null expression to TypeScript code\r\n * @param nullExpr - Null expression node\r\n * @returns TypeScript code representation\r\n */\r\n private printNullExpression(nullExpr: NullExpressionNode): string {\r\n const left = this.printOperand(nullExpr.left);\r\n const fn = this.mapOp(nullExpr.operator);\r\n return `${fn}(${left})`;\r\n }\r\n\r\n /**\r\n * Prints a BETWEEN expression to TypeScript code\r\n * @param betweenExpr - BETWEEN expression node\r\n * @returns TypeScript code representation\r\n */\r\n private printBetweenExpression(betweenExpr: BetweenExpressionNode): string {\r\n const left = this.printOperand(betweenExpr.left);\r\n const lower = this.printOperand(betweenExpr.lower);\r\n const upper = this.printOperand(betweenExpr.upper);\r\n return `${this.mapOp(betweenExpr.operator)}(${left}, ${lower}, ${upper})`;\r\n }\r\n\r\n /**\r\n * Prints an EXISTS expression to TypeScript code\r\n * @param existsExpr - EXISTS expression node\r\n * @returns TypeScript code representation\r\n */\r\n private printExistsExpression(existsExpr: ExistsExpressionNode): string {\r\n const subquery = this.inlineChain(this.buildSelectLines(existsExpr.subquery));\r\n return `${this.mapOp(existsExpr.operator)}(${subquery})`;\r\n }\r\n\r\n /**\r\n * Prints a column operand to TypeScript code\r\n * @param column - Column node\r\n * @returns TypeScript code representation\r\n */\r\n private printColumnOperand(column: ColumnNode): string {\r\n return `${this.namingStrategy.tableToSymbol(column.table)}.${column.name}`;\r\n }\r\n\r\n /**\r\n * Prints a literal operand to TypeScript code\r\n * @param literal - Literal node\r\n * @returns TypeScript code representation\r\n */\r\n private printLiteralOperand(literal: LiteralNode): string {\r\n if (literal.value === null) return 'null';\r\n return typeof literal.value === 'string' ? `'${literal.value}'` : String(literal.value);\r\n }\r\n\r\n /**\r\n * Prints a function operand to TypeScript code\r\n * @param fn - Function node\r\n * @returns TypeScript code representation\r\n */\r\n private printFunctionOperand(fn: FunctionNode): string {\r\n const args = fn.args.map(a => this.printOperand(a)).join(', ');\r\n return `${fn.name.toLowerCase()}(${args})`;\r\n }\r\n\r\n /**\r\n * Prints a JSON path operand to TypeScript code\r\n * @param json - JSON path node\r\n * @returns TypeScript code representation\r\n */\r\n private printJsonPathOperand(json: JsonPathNode): string {\r\n return `jsonPath(${this.namingStrategy.tableToSymbol(json.column.table)}.${json.column.name}, '${json.path}')`;\r\n }\r\n\r\n /**\r\n * Prints a scalar subquery operand to TypeScript code\r\n * @param node - Scalar subquery node\r\n * @returns TypeScript code representation\r\n */\r\n private printScalarSubqueryOperand(node: ScalarSubqueryNode): string {\r\n const subquery = this.inlineChain(this.buildSelectLines(node.query));\r\n return `(${subquery})`;\r\n }\r\n\r\n /**\r\n * Prints a CASE expression operand to TypeScript code\r\n * @param node - CASE expression node\r\n * @returns TypeScript code representation\r\n */\r\n private printCaseExpressionOperand(node: CaseExpressionNode): string {\r\n const clauses = node.conditions.map(\r\n condition =>\r\n `{ when: ${this.printExpression(condition.when)}, then: ${this.printOperand(condition.then)} }`\r\n );\r\n const elseValue = node.else ? `, ${this.printOperand(node.else)}` : '';\r\n return `caseWhen([${clauses.join(', ')}]${elseValue})`;\r\n }\r\n\r\n /**\r\n * Prints a window function operand to TypeScript code\r\n * @param node - Window function node\r\n * @returns TypeScript code representation\r\n */\r\n private printWindowFunctionOperand(node: WindowFunctionNode): string {\r\n let result = `${node.name}(`;\r\n if (node.args.length > 0) {\r\n result += node.args.map(arg => this.printOperand(arg)).join(', ');\r\n }\r\n result += ') OVER (';\r\n\r\n const parts: string[] = [];\r\n\r\n if (node.partitionBy && node.partitionBy.length > 0) {\r\n const partitionClause =\r\n 'PARTITION BY ' + node.partitionBy.map(col => `${this.namingStrategy.tableToSymbol(col.table)}.${col.name}`).join(', ');\r\n parts.push(partitionClause);\r\n }\r\n\r\n if (node.orderBy && node.orderBy.length > 0) {\r\n const orderClause =\r\n 'ORDER BY ' +\r\n node.orderBy.map(o => `${this.namingStrategy.tableToSymbol(o.column.table)}.${o.column.name} ${o.direction}`).join(', ');\r\n parts.push(orderClause);\r\n }\r\n\r\n result += parts.join(' ');\r\n result += ')';\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Converts method chain lines to inline format\r\n * @param lines - Method chain lines\r\n * @returns Inline method chain string\r\n */\r\n private inlineChain(lines: string[]): string {\r\n return lines\r\n .map(line => line.trim())\r\n .filter(line => line.length > 0)\r\n .join(' ');\r\n }\r\n\r\n /**\r\n * Maps SQL operators to TypeScript function names\r\n * @param op - SQL operator\r\n * @returns TypeScript function name\r\n */\r\n private mapOp(op: SqlOperator): string {\r\n const config = SQL_OPERATOR_REGISTRY[op];\r\n if (!config) {\r\n return assertNever(op as never);\r\n }\r\n return config.tsName;\r\n }\r\n}\r\n","import type { TableDef } from '../schema/table.js';\r\nimport type { TrackedEntity } from './runtime-types.js';\r\n\r\nexport class IdentityMap {\r\n private readonly buckets = new Map<string, Map<string, TrackedEntity>>();\r\n\r\n get bucketsMap(): Map<string, Map<string, TrackedEntity>> {\r\n return this.buckets;\r\n }\r\n\r\n getEntity(table: TableDef, pk: string | number): any | undefined {\r\n const bucket = this.buckets.get(table.name);\r\n return bucket?.get(this.toIdentityKey(pk))?.entity;\r\n }\r\n\r\n register(tracked: TrackedEntity): void {\r\n if (tracked.pk == null) return;\r\n const bucket = this.buckets.get(tracked.table.name) ?? new Map<string, TrackedEntity>();\r\n bucket.set(this.toIdentityKey(tracked.pk), tracked);\r\n this.buckets.set(tracked.table.name, bucket);\r\n }\r\n\r\n remove(tracked: TrackedEntity): void {\r\n if (tracked.pk == null) return;\r\n const bucket = this.buckets.get(tracked.table.name);\r\n bucket?.delete(this.toIdentityKey(tracked.pk));\r\n }\r\n\r\n getEntitiesForTable(table: TableDef): TrackedEntity[] {\r\n const bucket = this.buckets.get(table.name);\r\n return bucket ? Array.from(bucket.values()) : [];\r\n }\r\n\r\n clear(): void {\r\n this.buckets.clear();\r\n }\r\n\r\n private toIdentityKey(pk: string | number): string {\r\n return String(pk);\r\n }\r\n}\r\n","import { RelationDef } from '../schema/relation.js';\r\nimport { TableDef } from '../schema/table.js';\r\n\r\n/**\r\n * Entity status enum representing the lifecycle state of an entity\r\n */\r\nexport enum EntityStatus {\r\n /** Entity is newly created and not yet persisted */\r\n New = 'new',\r\n /** Entity is managed by the ORM and synchronized with the database */\r\n Managed = 'managed',\r\n /** Entity has been modified but not yet persisted */\r\n Dirty = 'dirty',\r\n /** Entity has been marked for removal */\r\n Removed = 'removed',\r\n /** Entity is detached from the ORM context */\r\n Detached = 'detached'\r\n}\r\n\r\n/**\r\n * Represents an entity being tracked by the ORM\r\n */\r\nexport interface TrackedEntity {\r\n /** The table definition this entity belongs to */\r\n table: TableDef;\r\n /** The actual entity instance */\r\n entity: any;\r\n /** Primary key value of the entity */\r\n pk: string | number | null;\r\n /** Current status of the entity */\r\n status: EntityStatus;\r\n /** Original values of the entity when it was loaded */\r\n original: Record<string, any> | null;\r\n}\r\n\r\n/**\r\n * Type representing a key for relation navigation\r\n */\r\nexport type RelationKey = string;\r\n\r\n/**\r\n * Represents a change operation on a relation\r\n * @typeParam T - Type of the related entity\r\n */\r\nexport type RelationChange<T> =\r\n | { kind: 'add'; entity: T }\r\n | { kind: 'attach'; entity: T }\r\n | { kind: 'remove'; entity: T }\r\n | { kind: 'detach'; entity: T };\r\n\r\n/**\r\n * Represents a relation change entry in the unit of work\r\n */\r\nexport interface RelationChangeEntry {\r\n /** Root entity that owns the relation */\r\n root: any;\r\n /** Key of the relation being changed */\r\n relationKey: RelationKey;\r\n /** Table definition of the root entity */\r\n rootTable: TableDef;\r\n /** Name of the relation */\r\n relationName: string;\r\n /** Relation definition */\r\n relation: RelationDef;\r\n /** The change being applied */\r\n change: RelationChange<any>;\r\n}\r\n\r\n/**\r\n * Represents a domain event that can be emitted by entities\r\n * @typeParam TType - Type of the event (string literal)\r\n */\r\nexport interface DomainEvent<TType extends string = string> {\r\n /** Type identifier for the event */\r\n readonly type: TType;\r\n /** Timestamp when the event occurred */\r\n readonly occurredAt?: Date;\r\n}\r\n\r\n/**\r\n * Type representing any domain event\r\n */\r\nexport type AnyDomainEvent = DomainEvent<string>;\r\n\r\n/**\r\n * Type representing ORM-specific domain events\r\n */\r\nexport type OrmDomainEvent = AnyDomainEvent;\r\n\r\n/**\r\n * Interface for entities that can emit domain events\r\n * @typeParam E - Type of domain events this entity can emit\r\n */\r\nexport interface HasDomainEvents<E extends DomainEvent = AnyDomainEvent> {\r\n /** Array of domain events emitted by this entity */\r\n domainEvents?: E[];\r\n}\r\n","import { ColumnNode, eq } from '../core/ast/expression.js';\r\nimport type { Dialect, CompiledQuery } from '../core/dialect/abstract.js';\r\nimport { InsertQueryBuilder } from '../query-builder/insert.js';\r\nimport { UpdateQueryBuilder } from '../query-builder/update.js';\r\nimport { DeleteQueryBuilder } from '../query-builder/delete.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\nimport type { TableDef, TableHooks } from '../schema/table.js';\r\nimport type { DbExecutor, QueryResult } from '../core/execution/db-executor.js';\r\nimport { IdentityMap } from './identity-map.js';\r\nimport { EntityStatus } from './runtime-types.js';\r\nimport type { TrackedEntity } from './runtime-types.js';\r\n\r\nexport class UnitOfWork {\r\n private readonly trackedEntities = new Map<any, TrackedEntity>();\r\n\r\n constructor(\r\n private readonly dialect: Dialect,\r\n private readonly executor: DbExecutor,\r\n private readonly identityMap: IdentityMap,\r\n private readonly hookContext: () => unknown\r\n ) { }\r\n\r\n get identityBuckets(): Map<string, Map<string, TrackedEntity>> {\r\n return this.identityMap.bucketsMap;\r\n }\r\n\r\n getTracked(): TrackedEntity[] {\r\n return Array.from(this.trackedEntities.values());\r\n }\r\n\r\n getEntity(table: TableDef, pk: string | number): any | undefined {\r\n return this.identityMap.getEntity(table, pk);\r\n }\r\n\r\n getEntitiesForTable(table: TableDef): TrackedEntity[] {\r\n return this.identityMap.getEntitiesForTable(table);\r\n }\r\n\r\n findTracked(entity: any): TrackedEntity | undefined {\r\n return this.trackedEntities.get(entity);\r\n }\r\n\r\n setEntity(table: TableDef, pk: string | number, entity: any): void {\r\n if (pk === null || pk === undefined) return;\r\n let tracked = this.trackedEntities.get(entity);\r\n if (!tracked) {\r\n tracked = {\r\n table,\r\n entity,\r\n pk,\r\n status: EntityStatus.Managed,\r\n original: this.createSnapshot(table, entity)\r\n };\r\n this.trackedEntities.set(entity, tracked);\r\n } else {\r\n tracked.pk = pk;\r\n }\r\n\r\n this.registerIdentity(tracked);\r\n }\r\n\r\n trackNew(table: TableDef, entity: any, pk?: string | number): void {\r\n const tracked: TrackedEntity = {\r\n table,\r\n entity,\r\n pk: pk ?? null,\r\n status: EntityStatus.New,\r\n original: null\r\n };\r\n this.trackedEntities.set(entity, tracked);\r\n if (pk != null) {\r\n this.registerIdentity(tracked);\r\n }\r\n }\r\n\r\n trackManaged(table: TableDef, pk: string | number, entity: any): void {\r\n const tracked: TrackedEntity = {\r\n table,\r\n entity,\r\n pk,\r\n status: EntityStatus.Managed,\r\n original: this.createSnapshot(table, entity)\r\n };\r\n this.trackedEntities.set(entity, tracked);\r\n this.registerIdentity(tracked);\r\n }\r\n\r\n markDirty(entity: any): void {\r\n const tracked = this.trackedEntities.get(entity);\r\n if (!tracked) return;\r\n if (tracked.status === EntityStatus.New || tracked.status === EntityStatus.Removed) return;\r\n tracked.status = EntityStatus.Dirty;\r\n }\r\n\r\n markRemoved(entity: any): void {\r\n const tracked = this.trackedEntities.get(entity);\r\n if (!tracked) return;\r\n tracked.status = EntityStatus.Removed;\r\n }\r\n\r\n async flush(): Promise<void> {\r\n const toFlush = Array.from(this.trackedEntities.values());\r\n for (const tracked of toFlush) {\r\n switch (tracked.status) {\r\n case EntityStatus.New:\r\n await this.flushInsert(tracked);\r\n break;\r\n case EntityStatus.Dirty:\r\n await this.flushUpdate(tracked);\r\n break;\r\n case EntityStatus.Removed:\r\n await this.flushDelete(tracked);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n }\r\n\r\n reset(): void {\r\n this.trackedEntities.clear();\r\n this.identityMap.clear();\r\n }\r\n\r\n private async flushInsert(tracked: TrackedEntity): Promise<void> {\r\n await this.runHook(tracked.table.hooks?.beforeInsert, tracked);\r\n\r\n const payload = this.extractColumns(tracked.table, tracked.entity);\r\n let builder = new InsertQueryBuilder(tracked.table).values(payload);\r\n if (this.dialect.supportsReturning()) {\r\n builder = builder.returning(...this.getReturningColumns(tracked.table));\r\n }\r\n const compiled = builder.compile(this.dialect);\r\n const results = await this.executeCompiled(compiled);\r\n this.applyReturningResults(tracked, results);\r\n\r\n tracked.status = EntityStatus.Managed;\r\n tracked.original = this.createSnapshot(tracked.table, tracked.entity);\r\n tracked.pk = this.getPrimaryKeyValue(tracked);\r\n this.registerIdentity(tracked);\r\n\r\n await this.runHook(tracked.table.hooks?.afterInsert, tracked);\r\n }\r\n\r\n private async flushUpdate(tracked: TrackedEntity): Promise<void> {\r\n if (tracked.pk == null) return;\r\n const changes = this.computeChanges(tracked);\r\n if (!Object.keys(changes).length) {\r\n tracked.status = EntityStatus.Managed;\r\n return;\r\n }\r\n\r\n await this.runHook(tracked.table.hooks?.beforeUpdate, tracked);\r\n\r\n const pkColumn = tracked.table.columns[findPrimaryKey(tracked.table)];\r\n if (!pkColumn) return;\r\n\r\n let builder = new UpdateQueryBuilder(tracked.table)\r\n .set(changes)\r\n .where(eq(pkColumn, tracked.pk));\r\n\r\n if (this.dialect.supportsReturning()) {\r\n builder = builder.returning(...this.getReturningColumns(tracked.table));\r\n }\r\n\r\n const compiled = builder.compile(this.dialect);\r\n const results = await this.executeCompiled(compiled);\r\n this.applyReturningResults(tracked, results);\r\n\r\n tracked.status = EntityStatus.Managed;\r\n tracked.original = this.createSnapshot(tracked.table, tracked.entity);\r\n this.registerIdentity(tracked);\r\n\r\n await this.runHook(tracked.table.hooks?.afterUpdate, tracked);\r\n }\r\n\r\n private async flushDelete(tracked: TrackedEntity): Promise<void> {\r\n if (tracked.pk == null) return;\r\n await this.runHook(tracked.table.hooks?.beforeDelete, tracked);\r\n\r\n const pkColumn = tracked.table.columns[findPrimaryKey(tracked.table)];\r\n if (!pkColumn) return;\r\n\r\n const builder = new DeleteQueryBuilder(tracked.table).where(eq(pkColumn, tracked.pk));\r\n const compiled = builder.compile(this.dialect);\r\n await this.executeCompiled(compiled);\r\n\r\n tracked.status = EntityStatus.Detached;\r\n this.trackedEntities.delete(tracked.entity);\r\n this.identityMap.remove(tracked);\r\n\r\n await this.runHook(tracked.table.hooks?.afterDelete, tracked);\r\n }\r\n\r\n private async runHook(\r\n hook: TableHooks[keyof TableHooks] | undefined,\r\n tracked: TrackedEntity\r\n ): Promise<void> {\r\n if (!hook) return;\r\n await hook(this.hookContext() as any, tracked.entity);\r\n }\r\n\r\n private computeChanges(tracked: TrackedEntity): Record<string, unknown> {\r\n const snapshot = tracked.original ?? {};\r\n const changes: Record<string, unknown> = {};\r\n for (const column of Object.keys(tracked.table.columns)) {\r\n const current = tracked.entity[column];\r\n if (snapshot[column] !== current) {\r\n changes[column] = current;\r\n }\r\n }\r\n return changes;\r\n }\r\n\r\n private extractColumns(table: TableDef, entity: any): Record<string, unknown> {\r\n const payload: Record<string, unknown> = {};\r\n for (const column of Object.keys(table.columns)) {\r\n if (entity[column] === undefined) continue;\r\n payload[column] = entity[column];\r\n }\r\n return payload;\r\n }\r\n\r\n private async executeCompiled(compiled: CompiledQuery): Promise<QueryResult[]> {\r\n return this.executor.executeSql(compiled.sql, compiled.params);\r\n }\r\n\r\n private getReturningColumns(table: TableDef): ColumnNode[] {\r\n return Object.values(table.columns).map(column => ({\r\n type: 'Column',\r\n table: table.name,\r\n name: column.name,\r\n alias: column.name\r\n }));\r\n }\r\n\r\n private applyReturningResults(tracked: TrackedEntity, results: QueryResult[]): void {\r\n if (!this.dialect.supportsReturning()) return;\r\n const first = results[0];\r\n if (!first || first.values.length === 0) return;\r\n\r\n const row = first.values[0];\r\n for (let i = 0; i < first.columns.length; i++) {\r\n const columnName = this.normalizeColumnName(first.columns[i]);\r\n if (!(columnName in tracked.table.columns)) continue;\r\n tracked.entity[columnName] = row[i];\r\n }\r\n }\r\n\r\n private normalizeColumnName(column: string): string {\r\n const parts = column.split('.');\r\n const candidate = parts[parts.length - 1];\r\n return candidate.replace(/^[\"`[\\]]+|[\"`[\\]]+$/g, '');\r\n }\r\n\r\n private registerIdentity(tracked: TrackedEntity): void {\r\n if (tracked.pk == null) return;\r\n this.identityMap.register(tracked);\r\n }\r\n\r\n private createSnapshot(table: TableDef, entity: any): Record<string, any> {\r\n const snapshot: Record<string, any> = {};\r\n for (const column of Object.keys(table.columns)) {\r\n snapshot[column] = entity[column];\r\n }\r\n return snapshot;\r\n }\r\n\r\n private getPrimaryKeyValue(tracked: TrackedEntity): string | number | null {\r\n const key = findPrimaryKey(tracked.table);\r\n const val = tracked.entity[key];\r\n if (val === undefined || val === null) return null;\r\n return val;\r\n }\r\n}\r\n","import type { DomainEvent, HasDomainEvents, TrackedEntity } from './runtime-types.js';\r\n\r\ntype EventOfType<E extends DomainEvent, TType extends E['type']> =\r\n Extract<E, { type: TType }>;\r\n\r\nexport type DomainEventHandler<E extends DomainEvent, Context> =\r\n (event: E, ctx: Context) => Promise<void> | void;\r\n\r\nexport type InitialHandlers<E extends DomainEvent, Context> = {\r\n [K in E['type']]?: DomainEventHandler<EventOfType<E, K>, Context>[];\r\n};\r\n\r\nexport class DomainEventBus<E extends DomainEvent, Context> {\r\n private readonly handlers = new Map<E['type'], DomainEventHandler<E, Context>[]>();\r\n\r\n constructor(initialHandlers?: InitialHandlers<E, Context>) {\r\n if (initialHandlers) {\r\n for (const key in initialHandlers) {\r\n const type = key as E['type'];\r\n const list = initialHandlers[type] ?? [];\r\n this.handlers.set(type, [...(list as DomainEventHandler<E, Context>[])]);\r\n }\r\n }\r\n }\r\n\r\n on<TType extends E['type']>(\r\n type: TType,\r\n handler: DomainEventHandler<EventOfType<E, TType>, Context>\r\n ): void {\r\n const key = type as E['type'];\r\n const existing = this.handlers.get(key) ?? [];\r\n existing.push(handler as unknown as DomainEventHandler<E, Context>);\r\n this.handlers.set(key, existing);\r\n }\r\n\r\n register<TType extends E['type']>(\r\n type: TType,\r\n handler: DomainEventHandler<EventOfType<E, TType>, Context>\r\n ): void {\r\n this.on(type, handler);\r\n }\r\n\r\n async dispatch(trackedEntities: Iterable<TrackedEntity>, ctx: Context): Promise<void> {\r\n for (const tracked of trackedEntities) {\r\n const entity = tracked.entity as HasDomainEvents<E>;\r\n if (!entity.domainEvents?.length) continue;\r\n\r\n for (const event of entity.domainEvents) {\r\n const handlers = this.handlers.get(event.type as E['type']);\r\n if (!handlers?.length) continue;\r\n\r\n for (const handler of handlers) {\r\n await handler(event, ctx);\r\n }\r\n }\r\n\r\n entity.domainEvents = [];\r\n }\r\n }\r\n}\r\n\r\nexport const addDomainEvent = <E extends DomainEvent>(\r\n entity: HasDomainEvents<E>,\r\n event: E\r\n): void => {\r\n if (!entity.domainEvents) {\r\n entity.domainEvents = [];\r\n }\r\n entity.domainEvents.push(event);\r\n};\r\n","import { and, eq } from '../core/ast/expression.js';\r\nimport type { Dialect } from '../core/dialect/abstract.js';\r\nimport { DeleteQueryBuilder } from '../query-builder/delete.js';\r\nimport { InsertQueryBuilder } from '../query-builder/insert.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\nimport type { BelongsToManyRelation, HasManyRelation, HasOneRelation } from '../schema/relation.js';\r\nimport { RelationKinds } from '../schema/relation.js';\r\nimport type { TableDef } from '../schema/table.js';\r\nimport type { DbExecutor } from '../core/execution/db-executor.js';\r\nimport type { RelationChangeEntry } from './runtime-types.js';\r\nimport { UnitOfWork } from './unit-of-work.js';\r\n\r\nexport class RelationChangeProcessor {\r\n private readonly relationChanges: RelationChangeEntry[] = [];\r\n\r\n constructor(\r\n private readonly unitOfWork: UnitOfWork,\r\n private readonly dialect: Dialect,\r\n private readonly executor: DbExecutor\r\n ) { }\r\n\r\n registerChange(entry: RelationChangeEntry): void {\r\n this.relationChanges.push(entry);\r\n }\r\n\r\n reset(): void {\r\n this.relationChanges.length = 0;\r\n }\r\n\r\n async process(): Promise<void> {\r\n if (!this.relationChanges.length) return;\r\n const entries = [...this.relationChanges];\r\n this.relationChanges.length = 0;\r\n\r\n for (const entry of entries) {\r\n switch (entry.relation.type) {\r\n case RelationKinds.HasMany:\r\n await this.handleHasManyChange(entry);\r\n break;\r\n case RelationKinds.HasOne:\r\n await this.handleHasOneChange(entry);\r\n break;\r\n case RelationKinds.BelongsToMany:\r\n await this.handleBelongsToManyChange(entry);\r\n break;\r\n case RelationKinds.BelongsTo:\r\n await this.handleBelongsToChange(entry);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n private async handleHasManyChange(entry: RelationChangeEntry): Promise<void> {\r\n const relation = entry.relation as HasManyRelation;\r\n const target = entry.change.entity;\r\n if (!target) return;\r\n\r\n const tracked = this.unitOfWork.findTracked(target);\r\n if (!tracked) return;\r\n\r\n const localKey = relation.localKey || findPrimaryKey(entry.rootTable);\r\n const rootValue = entry.root[localKey];\r\n if (rootValue === undefined || rootValue === null) return;\r\n\r\n if (entry.change.kind === 'add' || entry.change.kind === 'attach') {\r\n this.assignHasManyForeignKey(tracked.entity, relation, rootValue);\r\n this.unitOfWork.markDirty(tracked.entity);\r\n return;\r\n }\r\n\r\n if (entry.change.kind === 'remove') {\r\n this.detachHasManyChild(tracked.entity, relation);\r\n }\r\n }\r\n\r\n private async handleHasOneChange(entry: RelationChangeEntry): Promise<void> {\r\n const relation = entry.relation as HasOneRelation;\r\n const target = entry.change.entity;\r\n if (!target) return;\r\n\r\n const tracked = this.unitOfWork.findTracked(target);\r\n if (!tracked) return;\r\n\r\n const localKey = relation.localKey || findPrimaryKey(entry.rootTable);\r\n const rootValue = entry.root[localKey];\r\n if (rootValue === undefined || rootValue === null) return;\r\n\r\n if (entry.change.kind === 'attach' || entry.change.kind === 'add') {\r\n this.assignHasOneForeignKey(tracked.entity, relation, rootValue);\r\n this.unitOfWork.markDirty(tracked.entity);\r\n return;\r\n }\r\n\r\n if (entry.change.kind === 'remove') {\r\n this.detachHasOneChild(tracked.entity, relation);\r\n }\r\n }\r\n\r\n private async handleBelongsToChange(_entry: RelationChangeEntry): Promise<void> {\r\n // Reserved for future cascade/persist behaviors for belongs-to relations.\r\n }\r\n\r\n private async handleBelongsToManyChange(entry: RelationChangeEntry): Promise<void> {\r\n const relation = entry.relation as BelongsToManyRelation;\r\n const rootKey = relation.localKey || findPrimaryKey(entry.rootTable);\r\n const rootId = entry.root[rootKey];\r\n if (rootId === undefined || rootId === null) return;\r\n\r\n const targetId = this.resolvePrimaryKeyValue(entry.change.entity, relation.target);\r\n if (targetId === null) return;\r\n\r\n if (entry.change.kind === 'attach' || entry.change.kind === 'add') {\r\n await this.insertPivotRow(relation, rootId, targetId);\r\n return;\r\n }\r\n\r\n if (entry.change.kind === 'detach' || entry.change.kind === 'remove') {\r\n await this.deletePivotRow(relation, rootId, targetId);\r\n\r\n if (relation.cascade === 'all' || relation.cascade === 'remove') {\r\n this.unitOfWork.markRemoved(entry.change.entity);\r\n }\r\n }\r\n }\r\n\r\n private assignHasManyForeignKey(child: any, relation: HasManyRelation, rootValue: unknown): void {\r\n const current = child[relation.foreignKey];\r\n if (current === rootValue) return;\r\n child[relation.foreignKey] = rootValue;\r\n }\r\n\r\n private detachHasManyChild(child: any, relation: HasManyRelation): void {\r\n if (relation.cascade === 'all' || relation.cascade === 'remove') {\r\n this.unitOfWork.markRemoved(child);\r\n return;\r\n }\r\n child[relation.foreignKey] = null;\r\n this.unitOfWork.markDirty(child);\r\n }\r\n\r\n private assignHasOneForeignKey(child: any, relation: HasOneRelation, rootValue: unknown): void {\r\n const current = child[relation.foreignKey];\r\n if (current === rootValue) return;\r\n child[relation.foreignKey] = rootValue;\r\n }\r\n\r\n private detachHasOneChild(child: any, relation: HasOneRelation): void {\r\n if (relation.cascade === 'all' || relation.cascade === 'remove') {\r\n this.unitOfWork.markRemoved(child);\r\n return;\r\n }\r\n child[relation.foreignKey] = null;\r\n this.unitOfWork.markDirty(child);\r\n }\r\n\r\n private async insertPivotRow(relation: BelongsToManyRelation, rootId: string | number, targetId: string | number): Promise<void> {\r\n const payload = {\r\n [relation.pivotForeignKeyToRoot]: rootId,\r\n [relation.pivotForeignKeyToTarget]: targetId\r\n };\r\n const builder = new InsertQueryBuilder(relation.pivotTable).values(payload);\r\n const compiled = builder.compile(this.dialect);\r\n await this.executor.executeSql(compiled.sql, compiled.params);\r\n }\r\n\r\n private async deletePivotRow(relation: BelongsToManyRelation, rootId: string | number, targetId: string | number): Promise<void> {\r\n const rootCol = relation.pivotTable.columns[relation.pivotForeignKeyToRoot];\r\n const targetCol = relation.pivotTable.columns[relation.pivotForeignKeyToTarget];\r\n if (!rootCol || !targetCol) return;\r\n\r\n const builder = new DeleteQueryBuilder(relation.pivotTable).where(\r\n and(eq(rootCol, rootId), eq(targetCol, targetId))\r\n );\r\n const compiled = builder.compile(this.dialect);\r\n await this.executor.executeSql(compiled.sql, compiled.params);\r\n }\r\n\r\n private resolvePrimaryKeyValue(entity: any, table: TableDef): string | number | null {\r\n if (!entity) return null;\r\n const key = findPrimaryKey(table);\r\n const value = entity[key];\r\n if (value === undefined || value === null) return null;\r\n return value;\r\n }\r\n}\r\n","import type { DbExecutor } from '../core/execution/db-executor.js';\n\n/**\n * Represents a single SQL query log entry\n */\nexport interface QueryLogEntry {\n /** The SQL query that was executed */\n sql: string;\n /** Parameters used in the query */\n params?: unknown[];\n}\n\n/**\n * Function type for query logging callbacks\n * @param entry - The query log entry to process\n */\nexport type QueryLogger = (entry: QueryLogEntry) => void;\n\n/**\n * Creates a wrapped database executor that logs all SQL queries\n * @param executor - Original database executor to wrap\n * @param logger - Optional logger function to receive query log entries\n * @returns Wrapped executor that logs queries before execution\n */\nexport const createQueryLoggingExecutor = (\n executor: DbExecutor,\n logger?: QueryLogger\n): DbExecutor => {\n if (!logger) {\n return executor;\n }\n\n const wrapped: DbExecutor = {\n async executeSql(sql, params) {\n logger({ sql, params });\n return executor.executeSql(sql, params);\n }\n };\n\n if (executor.beginTransaction) {\n wrapped.beginTransaction = executor.beginTransaction.bind(executor);\n }\n\n if (executor.commitTransaction) {\n wrapped.commitTransaction = executor.commitTransaction.bind(executor);\n }\n\n if (executor.rollbackTransaction) {\n wrapped.rollbackTransaction = executor.rollbackTransaction.bind(executor);\n }\n\n return wrapped;\n};\n","import type { DbExecutor } from '../core/execution/db-executor.js';\r\n\r\n/**\r\n * Executes a function within a database transaction\r\n * @param executor - Database executor to use for transaction operations\r\n * @param action - Function to execute within the transaction\r\n * @returns Promise that resolves when the transaction is complete\r\n * @throws Re-throws any errors that occur during the transaction (after rolling back)\r\n */\r\nexport const runInTransaction = async (executor: DbExecutor, action: () => Promise<void>): Promise<void> => {\r\n if (!executor.beginTransaction) {\r\n await action();\r\n return;\r\n }\r\n\r\n await executor.beginTransaction();\r\n try {\r\n await action();\r\n await executor.commitTransaction?.();\r\n } catch (error) {\r\n await executor.rollbackTransaction?.();\r\n throw error;\r\n }\r\n};\r\n","import { Dialect } from '../core/dialect/abstract.js';\nimport { eq } from '../core/ast/expression.js';\nimport type { DbExecutor } from '../core/execution/db-executor.js';\nimport { SelectQueryBuilder } from '../query-builder/select.js';\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\nimport type { ColumnDef } from '../schema/column.js';\nimport type { TableDef } from '../schema/table.js';\nimport { EntityInstance } from '../schema/types.js';\nimport { RelationDef } from '../schema/relation.js';\n\nimport { selectFromEntity, getTableDefFromEntity } from '../decorators/bootstrap.js';\nimport type { EntityConstructor } from './entity-metadata.js';\nimport { Orm } from './orm.js';\nimport { IdentityMap } from './identity-map.js';\nimport { UnitOfWork } from './unit-of-work.js';\nimport { DomainEventBus, DomainEventHandler, InitialHandlers } from './domain-event-bus.js';\nimport { RelationChangeProcessor } from './relation-change-processor.js';\nimport { createQueryLoggingExecutor, QueryLogger } from './query-logger.js';\nimport { ExecutionContext } from './execution-context.js';\nimport type { HydrationContext } from './hydration-context.js';\nimport type { EntityContext } from './entity-context.js';\nimport {\n DomainEvent,\n OrmDomainEvent,\n RelationChange,\n RelationChangeEntry,\n RelationKey,\n TrackedEntity\n} from './runtime-types.js';\nimport { executeHydrated } from './execute.js';\nimport { runInTransaction } from './transaction-runner.js';\n\nexport interface OrmInterceptor {\n beforeFlush?(ctx: EntityContext): Promise<void> | void;\n afterFlush?(ctx: EntityContext): Promise<void> | void;\n}\n\nexport interface OrmSessionOptions<E extends DomainEvent = OrmDomainEvent> {\n orm: Orm<E>;\n executor: DbExecutor;\n queryLogger?: QueryLogger;\n interceptors?: OrmInterceptor[];\n domainEventHandlers?: InitialHandlers<E, OrmSession<E>>;\n}\n\nexport class OrmSession<E extends DomainEvent = OrmDomainEvent> implements EntityContext {\n readonly orm: Orm<E>;\n readonly executor: DbExecutor;\n readonly identityMap: IdentityMap;\n readonly unitOfWork: UnitOfWork;\n readonly domainEvents: DomainEventBus<E, OrmSession<E>>;\n readonly relationChanges: RelationChangeProcessor;\n\n private readonly interceptors: OrmInterceptor[];\n\n constructor(opts: OrmSessionOptions<E>) {\n this.orm = opts.orm;\n this.executor = createQueryLoggingExecutor(opts.executor, opts.queryLogger);\n this.interceptors = [...(opts.interceptors ?? [])];\n\n this.identityMap = new IdentityMap();\n this.unitOfWork = new UnitOfWork(this.orm.dialect, this.executor, this.identityMap, () => this);\n this.relationChanges = new RelationChangeProcessor(this.unitOfWork, this.orm.dialect, this.executor);\n this.domainEvents = new DomainEventBus<E, OrmSession<E>>(opts.domainEventHandlers);\n }\n\n get dialect(): Dialect {\n return this.orm.dialect;\n }\n\n get identityBuckets(): Map<string, Map<string, TrackedEntity>> {\n return this.unitOfWork.identityBuckets;\n }\n\n get tracked(): TrackedEntity[] {\n return this.unitOfWork.getTracked();\n }\n\n getEntity(table: TableDef, pk: any): any | undefined {\n return this.unitOfWork.getEntity(table, pk);\n }\n\n setEntity(table: TableDef, pk: any, entity: any): void {\n this.unitOfWork.setEntity(table, pk, entity);\n }\n\n trackNew(table: TableDef, entity: any, pk?: any): void {\n this.unitOfWork.trackNew(table, entity, pk);\n }\n\n trackManaged(table: TableDef, pk: any, entity: any): void {\n this.unitOfWork.trackManaged(table, pk, entity);\n }\n\n markDirty(entity: any): void {\n this.unitOfWork.markDirty(entity);\n }\n\n markRemoved(entity: any): void {\n this.unitOfWork.markRemoved(entity);\n }\n\n registerRelationChange = (\n root: any,\n relationKey: RelationKey,\n rootTable: TableDef,\n relationName: string,\n relation: RelationDef,\n change: RelationChange<any>\n ): void => {\n this.relationChanges.registerChange(\n buildRelationChangeEntry(root, relationKey, rootTable, relationName, relation, change)\n );\n };\n\n getEntitiesForTable(table: TableDef): TrackedEntity[] {\n return this.unitOfWork.getEntitiesForTable(table);\n }\n\n registerInterceptor(interceptor: OrmInterceptor): void {\n this.interceptors.push(interceptor);\n }\n\n registerDomainEventHandler<TType extends E['type']>(\n type: TType,\n handler: DomainEventHandler<Extract<E, { type: TType }>, OrmSession<E>>\n ): void {\n this.domainEvents.on(type, handler);\n }\n\n async find<TTable extends TableDef>(entityClass: EntityConstructor, id: any): Promise<EntityInstance<TTable> | null> {\n const table = getTableDefFromEntity(entityClass);\n if (!table) {\n throw new Error('Entity metadata has not been bootstrapped');\n }\n const primaryKey = findPrimaryKey(table);\n const column = table.columns[primaryKey];\n if (!column) {\n throw new Error('Entity table does not expose a primary key');\n }\n const columnSelections = Object.values(table.columns).reduce<Record<string, ColumnDef>>((acc, col) => {\n acc[col.name] = col;\n return acc;\n }, {});\n const qb = selectFromEntity<TTable>(entityClass)\n .select(columnSelections)\n .where(eq(column, id))\n .limit(1);\n const rows = await executeHydrated(this, qb);\n return rows[0] ?? null;\n }\n\n async findOne<TTable extends TableDef>(qb: SelectQueryBuilder<any, TTable>): Promise<EntityInstance<TTable> | null> {\n const limited = qb.limit(1);\n const rows = await executeHydrated(this, limited);\n return rows[0] ?? null;\n }\n\n async findMany<TTable extends TableDef>(qb: SelectQueryBuilder<any, TTable>): Promise<EntityInstance<TTable>[]> {\n return executeHydrated(this, qb);\n }\n\n async persist(entity: object): Promise<void> {\n if (this.unitOfWork.findTracked(entity)) {\n return;\n }\n const table = getTableDefFromEntity((entity as any).constructor as EntityConstructor);\n if (!table) {\n throw new Error('Entity metadata has not been bootstrapped');\n }\n const primaryKey = findPrimaryKey(table);\n const pkValue = (entity as Record<string, any>)[primaryKey];\n if (pkValue !== undefined && pkValue !== null) {\n this.trackManaged(table, pkValue, entity);\n } else {\n this.trackNew(table, entity);\n }\n }\n\n async remove(entity: object): Promise<void> {\n this.markRemoved(entity);\n }\n\n async flush(): Promise<void> {\n await this.unitOfWork.flush();\n }\n\n async commit(): Promise<void> {\n await runInTransaction(this.executor, async () => {\n for (const interceptor of this.interceptors) {\n await interceptor.beforeFlush?.(this);\n }\n\n await this.unitOfWork.flush();\n await this.relationChanges.process();\n await this.unitOfWork.flush();\n\n for (const interceptor of this.interceptors) {\n await interceptor.afterFlush?.(this);\n }\n });\n\n await this.domainEvents.dispatch(this.unitOfWork.getTracked(), this);\n }\n\n async rollback(): Promise<void> {\n await this.executor.rollbackTransaction?.();\n this.unitOfWork.reset();\n this.relationChanges.reset();\n }\n\n getExecutionContext(): ExecutionContext {\n return {\n dialect: this.orm.dialect,\n executor: this.executor,\n interceptors: this.orm.interceptors\n };\n }\n\n getHydrationContext(): HydrationContext<E> {\n return {\n identityMap: this.identityMap,\n unitOfWork: this.unitOfWork,\n domainEvents: this.domainEvents,\n relationChanges: this.relationChanges,\n entityContext: this\n };\n }\n}\n\nconst buildRelationChangeEntry = (\n root: any,\n relationKey: RelationKey,\n rootTable: TableDef,\n relationName: string,\n relation: RelationDef,\n change: RelationChange<any>\n): RelationChangeEntry => ({\n root,\n relationKey,\n rootTable,\n relationName,\n relation,\n change\n});\n","import type { DbExecutor, QueryResult } from '../core/execution/db-executor.js';\r\n\r\nexport interface QueryContext {\r\n sql: string;\r\n params: unknown[];\r\n // maybe metadata like entity type, operation type, etc.\r\n}\r\n\r\nexport type QueryInterceptor = (ctx: QueryContext, next: () => Promise<QueryResult[]>) => Promise<QueryResult[]>;\r\n\r\nexport class InterceptorPipeline {\r\n private interceptors: QueryInterceptor[] = [];\r\n\r\n use(interceptor: QueryInterceptor) {\r\n this.interceptors.push(interceptor);\r\n }\r\n\r\n async run(ctx: QueryContext, executor: DbExecutor): Promise<QueryResult[]> {\r\n let i = 0;\r\n const dispatch = async (): Promise<QueryResult[]> => {\r\n const interceptor = this.interceptors[i++];\r\n if (!interceptor) {\r\n return executor.executeSql(ctx.sql, ctx.params);\r\n }\r\n return interceptor(ctx, dispatch);\r\n };\r\n return dispatch();\r\n }\r\n}\r\n","import type { DomainEvent, OrmDomainEvent } from './runtime-types.js';\r\nimport type { Dialect } from '../core/dialect/abstract.js';\r\nimport type { DbExecutor } from '../core/execution/db-executor.js';\r\nimport type { NamingStrategy } from '../codegen/naming-strategy.js';\r\nimport { InterceptorPipeline } from './interceptor-pipeline.js';\r\nimport { DefaultNamingStrategy } from '../codegen/naming-strategy.js';\r\nimport { OrmSession } from './orm-session.js';\r\n\r\nexport interface OrmOptions<E extends DomainEvent = OrmDomainEvent> {\r\n dialect: Dialect;\r\n executorFactory: DbExecutorFactory;\r\n interceptors?: InterceptorPipeline;\r\n namingStrategy?: NamingStrategy;\r\n // model registrations etc.\r\n}\r\n\r\nexport interface DbExecutorFactory {\r\n createExecutor(options?: { tx?: ExternalTransaction }): DbExecutor;\r\n createTransactionalExecutor(): DbExecutor;\r\n}\r\n\r\nexport interface ExternalTransaction {\r\n // Transaction-specific properties\r\n}\r\n\r\nexport class Orm<E extends DomainEvent = OrmDomainEvent> {\r\n readonly dialect: Dialect;\r\n readonly interceptors: InterceptorPipeline;\r\n readonly namingStrategy: NamingStrategy;\r\n private readonly executorFactory: DbExecutorFactory;\r\n\r\n constructor(opts: OrmOptions<E>) {\r\n this.dialect = opts.dialect;\r\n this.interceptors = opts.interceptors ?? new InterceptorPipeline();\r\n this.namingStrategy = opts.namingStrategy ?? new DefaultNamingStrategy();\r\n this.executorFactory = opts.executorFactory;\r\n }\r\n\r\n createSession(options?: { tx?: ExternalTransaction }): OrmSession<E> {\r\n const executor = this.executorFactory.createExecutor(options?.tx);\r\n return new OrmSession<E>({ orm: this, executor });\r\n }\r\n\r\n async transaction<T>(fn: (session: OrmSession<E>) => Promise<T>): Promise<T> {\r\n const executor = this.executorFactory.createTransactionalExecutor();\r\n const session = new OrmSession<E>({ orm: this, executor });\r\n try {\r\n const result = await fn(session);\r\n await session.commit();\r\n return result;\r\n } catch (err) {\r\n await session.rollback();\r\n throw err;\r\n } finally {\r\n // executor cleanup if needed\r\n }\r\n }\r\n}\r\n","import { ColumnDefLike, RelationMetadata } from '../orm/entity-metadata.js';\n\nexport interface StandardDecoratorContext {\n kind: string;\n name?: string | symbol;\n metadata?: Record<PropertyKey, unknown>;\n addInitializer?(initializer: (this: unknown) => void): void;\n static?: boolean;\n private?: boolean;\n}\n\nexport interface DualModePropertyDecorator {\n (target: object, propertyKey: string | symbol): void;\n (value: unknown, context: StandardDecoratorContext): void;\n}\n\nexport interface DualModeClassDecorator {\n <TFunction extends Function>(value: TFunction): void | TFunction;\n <TFunction extends Function>(value: TFunction, context: StandardDecoratorContext): void | TFunction;\n}\n\nexport interface DecoratorMetadataBag {\n columns: Array<{ propertyName: string; column: ColumnDefLike }>;\n relations: Array<{ propertyName: string; relation: RelationMetadata }>;\n}\n\nconst METADATA_KEY = 'metal-orm:decorators';\n\nexport const isStandardDecoratorContext = (value: unknown): value is StandardDecoratorContext => {\n return typeof value === 'object' && value !== null && 'kind' in (value as any);\n};\n\nexport const getOrCreateMetadataBag = (context: StandardDecoratorContext): DecoratorMetadataBag => {\n const metadata = context.metadata || (context.metadata = {} as Record<PropertyKey, unknown>);\n const existing = metadata[METADATA_KEY] as DecoratorMetadataBag | undefined;\n if (existing) {\n return existing;\n }\n const bag: DecoratorMetadataBag = { columns: [], relations: [] };\n metadata[METADATA_KEY] = bag;\n return bag;\n};\n\nexport const readMetadataBag = (context: StandardDecoratorContext): DecoratorMetadataBag | undefined => {\n return context.metadata?.[METADATA_KEY] as DecoratorMetadataBag | undefined;\n};\n\nexport const registerInitializer = (\n context: StandardDecoratorContext,\n initializer: (this: unknown) => void\n): void => {\n context.addInitializer?.(initializer);\n};\n","import { TableHooks } from '../schema/table.js';\nimport {\n addColumnMetadata,\n addRelationMetadata,\n EntityConstructor,\n ensureEntityMetadata,\n setEntityTableName\n} from '../orm/entity-metadata.js';\nimport { DualModeClassDecorator, isStandardDecoratorContext, readMetadataBag } from './decorator-metadata.js';\n\nexport interface EntityOptions {\n tableName?: string;\n hooks?: TableHooks;\n}\n\nconst toSnakeCase = (value: string): string => {\n return value\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/[^a-z0-9_]+/gi, '_')\n .replace(/__+/g, '_')\n .replace(/^_|_$/g, '')\n .toLowerCase();\n};\n\nconst deriveTableNameFromConstructor = (ctor: Function): string => {\n const fallback = 'unknown';\n const rawName = ctor.name || fallback;\n const strippedName = rawName.replace(/Entity$/i, '');\n const normalized = toSnakeCase(strippedName || rawName);\n if (!normalized) {\n return fallback;\n }\n return normalized.endsWith('s') ? normalized : `${normalized}s`;\n};\n\nexport function Entity(options: EntityOptions = {}) {\n const decorator: DualModeClassDecorator = value => {\n const tableName = options.tableName ?? deriveTableNameFromConstructor(value);\n setEntityTableName(value as EntityConstructor, tableName, options.hooks);\n\n return value;\n };\n\n const decoratorWithContext: DualModeClassDecorator = (value, context?) => {\n const ctor = value as EntityConstructor;\n decorator(ctor);\n\n if (context && isStandardDecoratorContext(context)) {\n const bag = readMetadataBag(context);\n if (bag) {\n const meta = ensureEntityMetadata(ctor);\n for (const entry of bag.columns) {\n if (!meta.columns[entry.propertyName]) {\n addColumnMetadata(ctor, entry.propertyName, { ...entry.column });\n }\n }\n for (const entry of bag.relations) {\n if (!meta.relations[entry.propertyName]) {\n addRelationMetadata(ctor, entry.propertyName, entry.relation);\n }\n }\n }\n }\n\n return ctor;\n };\n\n return decoratorWithContext;\n}\n","import { ColumnDef, ColumnType } from '../schema/column.js';\nimport {\n addColumnMetadata,\n EntityConstructor,\n ColumnDefLike,\n ensureEntityMetadata\n} from '../orm/entity-metadata.js';\nimport {\n DualModePropertyDecorator,\n getOrCreateMetadataBag,\n isStandardDecoratorContext,\n registerInitializer,\n StandardDecoratorContext\n} from './decorator-metadata.js';\n\nexport interface ColumnOptions {\n type: ColumnType;\n args?: ColumnDef['args'];\n notNull?: boolean;\n primary?: boolean;\n}\n\nexport type ColumnInput = ColumnOptions | ColumnDef;\n\nconst normalizeColumnInput = (input: ColumnInput): ColumnDefLike => {\n const asOptions = input as ColumnOptions;\n const asDefinition = input as ColumnDef;\n const column: ColumnDefLike = {\n type: asOptions.type ?? asDefinition.type,\n args: asOptions.args ?? asDefinition.args,\n notNull: asOptions.notNull ?? asDefinition.notNull,\n primary: asOptions.primary ?? asDefinition.primary,\n unique: asDefinition.unique,\n default: asDefinition.default,\n autoIncrement: asDefinition.autoIncrement,\n generated: asDefinition.generated,\n check: asDefinition.check,\n references: asDefinition.references,\n comment: asDefinition.comment\n };\n\n if (!column.type) {\n throw new Error('Column decorator requires a column type');\n }\n\n return column;\n};\n\nconst normalizePropertyName = (name: string | symbol): string => {\n if (typeof name === 'symbol') {\n return name.description ?? name.toString();\n }\n return name;\n};\n\nconst resolveConstructor = (target: unknown): EntityConstructor | undefined => {\n if (typeof target === 'function') {\n return target as EntityConstructor;\n }\n\n if (target && typeof (target as any).constructor === 'function') {\n return (target as any).constructor as EntityConstructor;\n }\n\n return undefined;\n};\n\nconst registerColumn = (ctor: EntityConstructor, propertyName: string, column: ColumnDefLike): void => {\n const meta = ensureEntityMetadata(ctor);\n if (meta.columns[propertyName]) {\n return;\n }\n addColumnMetadata(ctor, propertyName, column);\n};\n\nconst registerColumnFromContext = (\n context: StandardDecoratorContext,\n column: ColumnDefLike\n): void => {\n if (!context.name) {\n throw new Error('Column decorator requires a property name');\n }\n const propertyName = normalizePropertyName(context.name);\n const bag = getOrCreateMetadataBag(context);\n if (!bag.columns.some(entry => entry.propertyName === propertyName)) {\n bag.columns.push({ propertyName, column: { ...column } });\n }\n\n registerInitializer(context, function () {\n const ctor = resolveConstructor(this);\n if (!ctor) {\n return;\n }\n registerColumn(ctor, propertyName, column);\n });\n};\n\nexport function Column(definition: ColumnInput) {\n const normalized = normalizeColumnInput(definition);\n const decorator: DualModePropertyDecorator = (targetOrValue, propertyKeyOrContext) => {\n if (isStandardDecoratorContext(propertyKeyOrContext)) {\n registerColumnFromContext(propertyKeyOrContext, normalized);\n return;\n }\n\n const propertyName = normalizePropertyName(propertyKeyOrContext);\n const ctor = resolveConstructor(targetOrValue);\n if (!ctor) {\n throw new Error('Unable to resolve constructor when registering column metadata');\n }\n registerColumn(ctor, propertyName, { ...normalized });\n };\n\n return decorator;\n}\n\nexport function PrimaryKey(definition: ColumnInput) {\n const normalized = normalizeColumnInput(definition);\n normalized.primary = true;\n return Column(normalized);\n}\n","import { CascadeMode, RelationKinds } from '../schema/relation.js';\nimport {\n addRelationMetadata,\n EntityConstructor,\n EntityOrTableTargetResolver,\n RelationMetadata\n} from '../orm/entity-metadata.js';\nimport {\n DualModePropertyDecorator,\n getOrCreateMetadataBag,\n isStandardDecoratorContext,\n registerInitializer,\n StandardDecoratorContext\n} from './decorator-metadata.js';\n\ninterface BaseRelationOptions {\n target: EntityOrTableTargetResolver;\n cascade?: CascadeMode;\n localKey?: string;\n}\n\nexport interface HasManyOptions extends BaseRelationOptions {\n foreignKey: string;\n}\n\nexport interface HasOneOptions extends BaseRelationOptions {\n foreignKey: string;\n}\n\nexport interface BelongsToOptions extends BaseRelationOptions {\n foreignKey: string;\n}\n\nexport interface BelongsToManyOptions {\n target: EntityOrTableTargetResolver;\n pivotTable: EntityOrTableTargetResolver;\n pivotForeignKeyToRoot: string;\n pivotForeignKeyToTarget: string;\n localKey?: string;\n targetKey?: string;\n pivotPrimaryKey?: string;\n defaultPivotColumns?: string[];\n cascade?: CascadeMode;\n}\n\nconst normalizePropertyName = (name: string | symbol): string => {\n if (typeof name === 'symbol') {\n return name.description ?? name.toString();\n }\n return name;\n};\n\nconst resolveConstructor = (instanceOrCtor: unknown): EntityConstructor | undefined => {\n if (typeof instanceOrCtor === 'function') {\n return instanceOrCtor as EntityConstructor;\n }\n if (instanceOrCtor && typeof (instanceOrCtor as any).constructor === 'function') {\n return (instanceOrCtor as any).constructor as EntityConstructor;\n }\n return undefined;\n};\n\nconst registerRelation = (ctor: EntityConstructor, propertyName: string, metadata: RelationMetadata): void => {\n addRelationMetadata(ctor, propertyName, metadata);\n};\n\nconst createFieldDecorator = (\n metadataFactory: (propertyName: string) => RelationMetadata\n) => {\n const decorator: DualModePropertyDecorator = (targetOrValue, propertyKeyOrContext) => {\n if (isStandardDecoratorContext(propertyKeyOrContext)) {\n const ctx = propertyKeyOrContext as StandardDecoratorContext;\n if (!ctx.name) {\n throw new Error('Relation decorator requires a property name');\n }\n const propertyName = normalizePropertyName(ctx.name);\n const bag = getOrCreateMetadataBag(ctx);\n const relationMetadata = metadataFactory(propertyName);\n\n if (!bag.relations.some(entry => entry.propertyName === propertyName)) {\n bag.relations.push({ propertyName, relation: relationMetadata });\n }\n\n registerInitializer(ctx, function () {\n const ctor = resolveConstructor(this);\n if (!ctor) {\n return;\n }\n registerRelation(ctor, propertyName, relationMetadata);\n });\n return;\n }\n\n const propertyName = normalizePropertyName(propertyKeyOrContext);\n const ctor = resolveConstructor(targetOrValue);\n if (!ctor) {\n throw new Error('Unable to resolve constructor when registering relation metadata');\n }\n registerRelation(ctor, propertyName, metadataFactory(propertyName));\n };\n\n return decorator;\n};\n\nexport function HasMany(options: HasManyOptions) {\n return createFieldDecorator(propertyName => ({\n kind: RelationKinds.HasMany,\n propertyKey: propertyName,\n target: options.target,\n foreignKey: options.foreignKey,\n localKey: options.localKey,\n cascade: options.cascade\n }));\n}\n\nexport function HasOne(options: HasOneOptions) {\n return createFieldDecorator(propertyName => ({\n kind: RelationKinds.HasOne,\n propertyKey: propertyName,\n target: options.target,\n foreignKey: options.foreignKey,\n localKey: options.localKey,\n cascade: options.cascade\n }));\n}\n\nexport function BelongsTo(options: BelongsToOptions) {\n return createFieldDecorator(propertyName => ({\n kind: RelationKinds.BelongsTo,\n propertyKey: propertyName,\n target: options.target,\n foreignKey: options.foreignKey,\n localKey: options.localKey,\n cascade: options.cascade\n }));\n}\n\nexport function BelongsToMany(options: BelongsToManyOptions) {\n return createFieldDecorator(propertyName => ({\n kind: RelationKinds.BelongsToMany,\n propertyKey: propertyName,\n target: options.target,\n pivotTable: options.pivotTable,\n pivotForeignKeyToRoot: options.pivotForeignKeyToRoot,\n pivotForeignKeyToTarget: options.pivotForeignKeyToTarget,\n localKey: options.localKey,\n targetKey: options.targetKey,\n pivotPrimaryKey: options.pivotPrimaryKey,\n defaultPivotColumns: options.defaultPivotColumns,\n cascade: options.cascade\n }));\n}\n","// src/core/execution/db-executor.ts\r\n\r\n// low-level canonical shape\r\nexport type QueryResult = {\r\n columns: string[];\r\n values: unknown[][];\r\n};\r\n\r\nexport interface DbExecutor {\r\n executeSql(sql: string, params?: unknown[]): Promise<QueryResult[]>;\r\n\r\n beginTransaction?(): Promise<void>;\r\n commitTransaction?(): Promise<void>;\r\n rollbackTransaction?(): Promise<void>;\r\n}\r\n\r\n// --- helpers ---\r\n\r\n/**\r\n * Convert an array of row objects into a QueryResult.\r\n */\r\nexport function rowsToQueryResult(\r\n rows: Array<Record<string, unknown>>\r\n): QueryResult {\r\n if (rows.length === 0) {\r\n return { columns: [], values: [] };\r\n }\r\n\r\n const columns = Object.keys(rows[0]);\r\n const values = rows.map(row => columns.map(c => (row as any)[c]));\r\n return { columns, values };\r\n}\r\n\r\n/**\r\n * Minimal contract that most SQL clients can implement.\r\n */\r\nexport interface SimpleQueryRunner {\r\n query(\r\n sql: string,\r\n params?: unknown[]\r\n ): Promise<Array<Record<string, unknown>>>;\r\n beginTransaction?(): Promise<void>;\r\n commitTransaction?(): Promise<void>;\r\n rollbackTransaction?(): Promise<void>;\r\n}\r\n\r\n/**\r\n * Generic factory: turn any SimpleQueryRunner into a DbExecutor.\r\n */\r\nexport function createExecutorFromQueryRunner(\r\n runner: SimpleQueryRunner\r\n): DbExecutor {\r\n return {\r\n async executeSql(sql, params) {\r\n const rows = await runner.query(sql, params);\r\n const result = rowsToQueryResult(rows);\r\n return [result];\r\n },\r\n beginTransaction: runner.beginTransaction?.bind(runner),\r\n commitTransaction: runner.commitTransaction?.bind(runner),\r\n rollbackTransaction: runner.rollbackTransaction?.bind(runner),\r\n };\r\n}\r\n","// src/core/execution/executors/postgres-executor.ts\r\nimport {\r\n DbExecutor,\r\n createExecutorFromQueryRunner\r\n} from '../db-executor.js';\r\n\r\nexport interface PostgresClientLike {\r\n query(\r\n text: string,\r\n params?: unknown[]\r\n ): Promise<{ rows: Array<Record<string, unknown>> }>;\r\n}\r\n\r\nexport function createPostgresExecutor(\r\n client: PostgresClientLike\r\n): DbExecutor {\r\n return createExecutorFromQueryRunner({\r\n async query(sql, params) {\r\n const { rows } = await client.query(sql, params as any[]);\r\n return rows;\r\n },\r\n async beginTransaction() {\r\n await client.query('BEGIN');\r\n },\r\n async commitTransaction() {\r\n await client.query('COMMIT');\r\n },\r\n async rollbackTransaction() {\r\n await client.query('ROLLBACK');\r\n },\r\n });\r\n}\r\n","// src/core/execution/executors/mysql-executor.ts\r\nimport {\r\n DbExecutor,\r\n rowsToQueryResult\r\n} from '../db-executor.js';\r\n\r\nexport interface MysqlClientLike {\r\n query(\r\n sql: string,\r\n params?: unknown[]\r\n ): Promise<[any, any?]>; // rows, metadata\r\n beginTransaction?(): Promise<void>;\r\n commit?(): Promise<void>;\r\n rollback?(): Promise<void>;\r\n}\r\n\r\nexport function createMysqlExecutor(\r\n client: MysqlClientLike\r\n): DbExecutor {\r\n return {\r\n async executeSql(sql, params) {\r\n const [rows] = await client.query(sql, params as any[]);\r\n\r\n if (!Array.isArray(rows)) {\r\n // e.g. insert/update returning only headers, treat as no rows\r\n return [{ columns: [], values: [] }];\r\n }\r\n\r\n const result = rowsToQueryResult(\r\n rows as Array<Record<string, unknown>>\r\n );\r\n return [result];\r\n },\r\n async beginTransaction() {\r\n if (!client.beginTransaction) return;\r\n await client.beginTransaction();\r\n },\r\n async commitTransaction() {\r\n if (!client.commit) return;\r\n await client.commit();\r\n },\r\n async rollbackTransaction() {\r\n if (!client.rollback) return;\r\n await client.rollback();\r\n },\r\n };\r\n}\r\n","// src/core/execution/executors/sqlite-executor.ts\r\nimport {\r\n DbExecutor,\r\n rowsToQueryResult\r\n} from '../db-executor.js';\r\n\r\nexport interface SqliteClientLike {\r\n all(\r\n sql: string,\r\n params?: unknown[]\r\n ): Promise<Array<Record<string, unknown>>>;\r\n run?(sql: string, params?: unknown[]): Promise<unknown>;\r\n beginTransaction?(): Promise<void>;\r\n commitTransaction?(): Promise<void>;\r\n rollbackTransaction?(): Promise<void>;\r\n}\r\n\r\nexport function createSqliteExecutor(\r\n client: SqliteClientLike\r\n): DbExecutor {\r\n return {\r\n async executeSql(sql, params) {\r\n const rows = await client.all(sql, params);\r\n const result = rowsToQueryResult(rows);\r\n return [result];\r\n },\r\n beginTransaction: client.beginTransaction?.bind(client),\r\n commitTransaction: client.commitTransaction?.bind(client),\r\n rollbackTransaction: client.rollbackTransaction?.bind(client),\r\n };\r\n}\r\n","// src/core/execution/executors/mssql-executor.ts\r\nimport {\r\n DbExecutor,\r\n rowsToQueryResult\r\n} from '../db-executor.js';\r\n\r\nexport interface MssqlClientLike {\r\n query(\r\n sql: string,\r\n params?: unknown[]\r\n ): Promise<{ recordset: Array<Record<string, unknown>> }>;\r\n beginTransaction?(): Promise<void>;\r\n commit?(): Promise<void>;\r\n rollback?(): Promise<void>;\r\n}\r\n\r\nexport function createMssqlExecutor(\r\n client: MssqlClientLike\r\n): DbExecutor {\r\n return {\r\n async executeSql(sql, params) {\r\n const { recordset } = await client.query(sql, params);\r\n const result = rowsToQueryResult(recordset ?? []);\r\n return [result];\r\n },\r\n async beginTransaction() {\r\n if (!client.beginTransaction) return;\r\n await client.beginTransaction();\r\n },\r\n async commitTransaction() {\r\n if (!client.commit) return;\r\n await client.commit();\r\n },\r\n async rollbackTransaction() {\r\n if (!client.rollback) return;\r\n await client.rollback();\r\n },\r\n };\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Tedious integration helper (driver adapter)\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface TediousColumn {\r\n metadata: { colName: string };\r\n value: unknown;\r\n}\r\n\r\nexport interface TediousRequest {\r\n addParameter(name: string, type: unknown, value: unknown): void;\r\n on(event: 'row', listener: (columns: TediousColumn[]) => void): void;\r\n}\r\n\r\nexport interface TediousRequestCtor {\r\n new (sql: string, callback: (err?: Error | null) => void): TediousRequest;\r\n}\r\n\r\nexport interface TediousTypes {\r\n NVarChar: unknown;\r\n Int: unknown;\r\n Float: unknown;\r\n BigInt: unknown;\r\n Bit: unknown;\r\n DateTime: unknown;\r\n VarBinary: unknown;\r\n}\r\n\r\nexport interface TediousModule {\r\n Request: TediousRequestCtor;\r\n TYPES: TediousTypes;\r\n}\r\n\r\nexport interface TediousConnectionLike {\r\n execSql(request: TediousRequest): void;\r\n beginTransaction?(cb: (err?: Error | null) => void): void;\r\n commitTransaction?(cb: (err?: Error | null) => void): void;\r\n rollbackTransaction?(cb: (err?: Error | null) => void): void;\r\n}\r\n\r\nexport interface CreateTediousClientOptions {\r\n inferType?(value: unknown, TYPES: TediousTypes): unknown;\r\n}\r\n\r\nconst defaultInferType = (value: unknown, TYPES: TediousTypes): unknown => {\r\n if (value === null || value === undefined) return TYPES.NVarChar;\r\n if (typeof value === 'number') {\r\n return Number.isInteger(value) ? TYPES.Int : TYPES.Float;\r\n }\r\n if (typeof value === 'bigint') return TYPES.BigInt;\r\n if (typeof value === 'boolean') return TYPES.Bit;\r\n if (value instanceof Date) return TYPES.DateTime;\r\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) {\r\n return TYPES.VarBinary;\r\n }\r\n return TYPES.NVarChar;\r\n};\r\n\r\nexport function createTediousMssqlClient(\r\n connection: TediousConnectionLike,\r\n { Request, TYPES }: TediousModule,\r\n options?: CreateTediousClientOptions\r\n): MssqlClientLike {\r\n const inferType = options?.inferType ?? defaultInferType;\r\n\r\n return {\r\n async query(sql: string, params: unknown[] = []) {\r\n const rows = await new Promise<Array<Record<string, unknown>>>(\r\n (resolve, reject) => {\r\n const collected: Record<string, unknown>[] = [];\r\n\r\n const request = new Request(sql, err => {\r\n if (err) return reject(err);\r\n resolve(collected);\r\n });\r\n\r\n params.forEach((value, idx) => {\r\n const sqlType = inferType(value, TYPES);\r\n request.addParameter(\r\n `p${idx + 1}`,\r\n sqlType,\r\n value as unknown\r\n );\r\n });\r\n\r\n request.on('row', cols => {\r\n const row: Record<string, unknown> = {};\r\n for (const col of cols) {\r\n row[col.metadata.colName] = col.value;\r\n }\r\n collected.push(row);\r\n });\r\n\r\n connection.execSql(request);\r\n }\r\n );\r\n\r\n return { recordset: rows };\r\n },\r\n\r\n beginTransaction: connection.beginTransaction\r\n ? () =>\r\n new Promise<void>((resolve, reject) => {\r\n connection.beginTransaction!(err =>\r\n err ? reject(err) : resolve()\r\n );\r\n })\r\n : undefined,\r\n\r\n commit: connection.commitTransaction\r\n ? () =>\r\n new Promise<void>((resolve, reject) => {\r\n connection.commitTransaction!(err =>\r\n err ? reject(err) : resolve()\r\n );\r\n })\r\n : undefined,\r\n\r\n rollback: connection.rollbackTransaction\r\n ? () =>\r\n new Promise<void>((resolve, reject) => {\r\n connection.rollbackTransaction!(err =>\r\n err ? reject(err) : resolve()\r\n );\r\n })\r\n : undefined,\r\n };\r\n}\r\n\r\nexport function createTediousExecutor(\r\n connection: TediousConnectionLike,\r\n module: TediousModule,\r\n options?: CreateTediousClientOptions\r\n): DbExecutor {\r\n const client = createTediousMssqlClient(connection, module, options);\r\n return createMssqlExecutor(client);\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA,IAGa;AAHb;AAAA;AAGO,IAAM,oBAAoB,OAC/B,MACA,UACA,UAA8B,CAAC,MACb;AAClB,iBAAW,UAAU,KAAK,SAAS;AACjC,YAAI,CAAC,OAAO,WAAW,OAAQ;AAC/B,YAAI,CAAC,OAAO,QAAQ,CAAC,QAAQ,iBAAkB;AAC/C,mBAAW,QAAQ,OAAO,YAAY;AACpC,cAAI,CAAC,KAAK,KAAK,EAAG;AAClB,gBAAM,SAAS,WAAW,IAAI;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AChBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACuFO,IAAM,cAAc,CACvB,MACA,SACA,YAAyC,CAAC,GAC1C,OACA,UAAwB,CAAC,MACX;AAEhB,QAAM,gBAAgB,OAAO,QAAQ,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AACxE,IAAC,IAAY,GAAG,IAAI,EAAE,GAAG,KAAK,MAAM,KAAK,OAAO,KAAK;AACrD,WAAO;AAAA,EACT,GAAG,CAAC,CAAM;AAEV,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,QAAQ;AAAA,IAChB,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,YAAY,QAAQ;AAAA,IACpB,SAAS,QAAQ;AAAA,IACjB,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ;AAAA,IACjB,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ;AAAA,IACjB,WAAW,QAAQ;AAAA,EACrB;AACF;;;ACJO,IAAM,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,EAKjB,KAAK,OAAyB,EAAE,MAAM,IAAI,MAAM,MAAM;AAAA;AAAA;AAAA;AAAA,EAKtD,QAAQ,OAA4B,EAAE,MAAM,IAAI,MAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO/D,SAAS,CAACA,aAA0C,EAAE,MAAM,IAAI,MAAM,WAAW,MAAM,CAACA,OAAM,EAAE;AAAA;AAAA;AAAA;AAAA,EAKhG,SAAS,CAAC,WAAmB,QAAQ,OAA6B;AAAA,IAChE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM,CAAC,WAAW,KAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,CAAC,eAA4C;AAAA,IAClD,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM,cAAc,SAAY,CAAC,SAAS,IAAI;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAA0B,EAAE,MAAM,IAAI,MAAM,OAAO;AAAA;AAAA;AAAA;AAAA,EAKzD,MAAM,OAA0B,EAAE,MAAM,IAAI,MAAM,OAAO;AAAA;AAAA;AAAA;AAAA,EAKzD,QAAQ,CAACA,aAA0C;AAAA,IACjD,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAMA,YAAW,SAAY,CAACA,OAAM,IAAI;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,CAACA,aAA6C;AAAA,IACvD,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAMA,YAAW,SAAY,CAACA,OAAM,IAAI;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAA2B,EAAE,MAAM,IAAI,MAAM,QAAQ;AAAA;AAAA;AAAA;AAAA,EAK5D,WAAW,OAA4D,EAAE,MAAM,IAAI,MAAM,YAAY;AAAA;AAAA;AAAA;AAAA,EAKrG,aAAa,OAA8D,EAAE,MAAM,IAAI,MAAM,cAAc;AAAA;AAAA;AAAA;AAAA,EAK3G,MAAM,OAAuD,EAAE,MAAM,IAAI,MAAM,OAAO;AAAA;AAAA;AAAA;AAAA,EAKtF,UAAU,OAA2D,EAAE,MAAM,IAAI,MAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,EAMlG,MAAM,OAA0B,EAAE,MAAM,IAAI,MAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAMzD,SAAS,OAA6B,EAAE,MAAM,IAAI,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,EAMlE,MAAM,CAAC,YAAyC,EAAE,MAAM,IAAI,MAAM,QAAQ,MAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOvF,YAAY,CAAuB,SAChC,EAAE,GAAG,KAAK,SAAS,KAAK;AAAA;AAAA;AAAA;AAAA,EAK3B,SAAS,CAAuB,SAC7B,EAAE,GAAG,KAAK,SAAS,KAAK;AAAA;AAAA;AAAA;AAAA,EAK3B,QAAQ,CAAuB,KAAmB,UAC/C;AAAA,IACC,GAAG;AAAA,IACH,QAAQ,QAAQ;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKF,SAAS,CAAuB,KAAmB,WAChD;AAAA,IACC,GAAG;AAAA,IACH,SAAS;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKF,YAAY,CAAuB,KAAmB,gBACnD;AAAA,IACC,GAAG;AAAA,IACH,SAAS,EAAE,KAAK,WAAW;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKF,eAAe,CACb,KACA,WAAmC,iBAElC;AAAA,IACC,GAAG;AAAA,IACH,eAAe;AAAA,IACf,WAAW;AAAA,EACb;AAAA;AAAA;AAAA;AAAA,EAKF,YAAY,CAAuB,KAAmB,SACnD;AAAA,IACC,GAAG;AAAA,IACH,YAAY;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKF,OAAO,CAAuB,KAAmB,gBAC9C;AAAA,IACC,GAAG;AAAA,IACH,OAAO;AAAA,EACT;AACJ;;;AC5RO,IAAM,gBAAgB;AAAA;AAAA,EAEzB,QAAQ;AAAA;AAAA,EAER,SAAS;AAAA;AAAA,EAET,WAAW;AAAA;AAAA,EAEX,eAAe;AACnB;AA+EO,IAAM,UAAU,CACrB,QACA,YACA,UACA,aAC8B;AAAA,EAC5B,MAAM,cAAc;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AASO,IAAM,SAAS,CACpB,QACA,YACA,UACA,aAC6B;AAAA,EAC3B,MAAM,cAAc;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AAcO,IAAM,YAAY,CACvB,QACA,YACA,UACA,aACgC;AAAA,EAC9B,MAAM,cAAc;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AASO,IAAM,gBAAgB,CAG3B,QACA,YACA,aASoC;AAAA,EAClC,MAAM,cAAc;AAAA,EACpB;AAAA,EACA;AAAA,EACA,uBAAuB,QAAQ;AAAA,EAC/B,yBAAyB,QAAQ;AAAA,EACjC,UAAU,QAAQ;AAAA,EAClB,WAAW,QAAQ;AAAA,EACnB,iBAAiB,QAAQ;AAAA,EACzB,qBAAqB,QAAQ;AAAA,EAC7B,SAAS,QAAQ;AACrB;;;ACpEA,IAAM,eAAe,oBAAI,IAAyB;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,gBAAgB,CAAC,SAAmC,QAAQ,aAAa,IAAI,KAAK,IAAI;AAE5F,IAAM,iBAAiB,CAAC,SAAoC,MAAM,SAAS;AAC3E,IAAM,uBAAuB,CAAC,SAA0C,MAAM,SAAS;AACvF,IAAM,uBAAuB,CAAC,SAA0C,MAAM,SAAS;AACvF,IAAM,4BAA4B,CACvC,SAEA,eAAe,IAAI,KAAK,qBAAqB,IAAI,KAAK,qBAAqB,IAAI;;;ACxG1E,IAAM,iBAAiB,CAAC,UAA0C;AACvE,MAAI,cAAc,KAAK,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,EACF;AACF;AAEA,IAAM,SAAS,CAACC,SAA8C;AAC5D,MAAI,cAAcA,IAAG,EAAG,QAAOA;AAC/B,QAAM,MAAMA;AACZ,SAAO,EAAE,MAAM,UAAU,OAAO,IAAI,SAAS,WAAW,MAAM,IAAI,KAAK;AACzE;AAEA,IAAM,gBAAgB,CAAC,WAA0D;AAAA,EAC/E,MAAM;AAAA,EACN;AACF;AAEA,IAAM,iBAAiB,CAAC,UACtB,UAAU,QAAQ,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU;AAExF,IAAM,sBAAsB,CAAC,UAClC,cAAc,KAAK,KAAK,eAAe,KAAK;AAE9C,IAAM,YAAY,CAAC,QAA6D;AAC9E,MAAI,eAAe,GAAG,GAAG;AACvB,WAAO,eAAe,GAAG;AAAA,EAC3B;AAEA,SAAO,OAAO,GAAG;AACnB;AAEO,IAAM,gBAAgB,CAACA,SAA4C,OAAOA,IAAG;AAK7E,IAAM,WAAW,CAACA,UAA6C;AAAA,EACpE,GAAG,cAAcA,IAAG;AAAA,EACpB,OAAO;AACT;AAKO,IAAM,cAAc,CAAC,OAAe,WAA+B,SAAS,EAAE,MAAM,QAAQ,MAAM,CAAC;AAE1G,IAAM,yBAAyB,CAC7B,UACAC,OACAC,QACA,WACyB;AACzB,QAAM,OAA6B;AAAA,IACjC,MAAM;AAAA,IACN,MAAM,OAAOD,KAAI;AAAA,IACjB;AAAA,IACA,OAAO,UAAUC,MAAK;AAAA,EACxB;AAEA,MAAI,WAAW,QAAW;AACxB,SAAK,SAAS,cAAc,MAAM;AAAA,EACpC;AAEA,SAAO;AACT;AAQO,IAAM,KAAK,CAACD,OAA+BC,WAChD,uBAAuB,KAAKD,OAAMC,MAAK;AAKlC,IAAM,MAAM,CACjBD,OACAC,WACyB,uBAAuB,MAAMD,OAAMC,MAAK;AAQ5D,IAAM,KAAK,CAACD,OAA+BC,WAChD,uBAAuB,KAAKD,OAAMC,MAAK;AAKlC,IAAM,MAAM,CAACD,OAA+BC,WACjD,uBAAuB,MAAMD,OAAMC,MAAK;AAQnC,IAAM,KAAK,CAACD,OAA+BC,WAChD,uBAAuB,KAAKD,OAAMC,MAAK;AAKlC,IAAM,MAAM,CAACD,OAA+BC,WACjD,uBAAuB,MAAMD,OAAMC,MAAK;AASnC,IAAM,OAAO,CAACD,OAA+B,SAAiB,WACnE,uBAAuB,QAAQA,OAAM,SAAS,MAAM;AAS/C,IAAM,UAAU,CAACA,OAA+B,SAAiB,WACtE,uBAAuB,YAAYA,OAAM,SAAS,MAAM;AAOnD,IAAM,MAAM,IAAI,cAAuD;AAAA,EAC5E,MAAM;AAAA,EACN,UAAU;AAAA,EACV;AACF;AAOO,IAAM,KAAK,IAAI,cAAuD;AAAA,EAC3E,MAAM;AAAA,EACN,UAAU;AAAA,EACV;AACF;AAOO,IAAM,SAAS,CAACA,WAAuD;AAAA,EAC5E,MAAM;AAAA,EACN,MAAM,OAAOA,KAAI;AAAA,EACjB,UAAU;AACZ;AAOO,IAAM,YAAY,CAACA,WAAuD;AAAA,EAC/E,MAAM;AAAA,EACN,MAAM,OAAOA,KAAI;AAAA,EACjB,UAAU;AACZ;AAEA,IAAM,qBAAqB,CACzB,UACAA,OACA,YACsB;AAAA,EACtB,MAAM;AAAA,EACN,MAAM,OAAOA,KAAI;AAAA,EACjB;AAAA,EACA,OAAO,OAAO,IAAI,OAAK,UAAU,CAAC,CAAC;AACrC;AAQO,IAAM,SAAS,CAACA,OAA+B,WACpD,mBAAmB,MAAMA,OAAM,MAAM;AAQhC,IAAM,YAAY,CAACA,OAA+B,WACvD,mBAAmB,UAAUA,OAAM,MAAM;AAE3C,IAAM,0BAA0B,CAC9B,UACAA,OACAE,QACAC,YAC2B;AAAA,EAC3B,MAAM;AAAA,EACN,MAAM,OAAOH,KAAI;AAAA,EACjB;AAAA,EACA,OAAO,UAAUE,MAAK;AAAA,EACtB,OAAO,UAAUC,MAAK;AACxB;AASO,IAAM,UAAU,CACrBH,OACAE,QACAC,WAC0B,wBAAwB,WAAWH,OAAME,QAAOC,MAAK;AAS1E,IAAM,aAAa,CACxBH,OACAE,QACAC,WAC0B,wBAAwB,eAAeH,OAAME,QAAOC,MAAK;AAQ9E,IAAM,WAAW,CAACJ,MAA6B,UAAgC;AAAA,EACpF,MAAM;AAAA,EACN,QAAQ,cAAcA,IAAG;AAAA,EACzB;AACF;AAQO,IAAM,WAAW,CACtB,YACA,eACwB;AAAA,EACxB,MAAM;AAAA,EACN,YAAY,WAAW,IAAI,QAAM;AAAA,IAC/B,MAAM,EAAE;AAAA,IACR,MAAM,UAAU,EAAE,IAAI;AAAA,EACxB,EAAE;AAAA,EACF,MAAM,cAAc,SAAY,UAAU,SAAS,IAAI;AACzD;AAOO,IAAM,SAAS,CAAC,cAAqD;AAAA,EAC1E,MAAM;AAAA,EACN,UAAU;AAAA,EACV;AACF;AAOO,IAAM,YAAY,CAAC,cAAqD;AAAA,EAC7E,MAAM;AAAA,EACN,UAAU;AAAA,EACV;AACF;;;ACnUA,IAAM,sBAAsB,CAC1B,MACA,OAAoD,CAAC,GACrD,aACA,YACuB;AACvB,QAAM,OAA2B;AAAA,IAC/B,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AAEA,MAAI,eAAe,YAAY,QAAQ;AACrC,SAAK,cAAc;AAAA,EACrB;AAEA,MAAI,WAAW,QAAQ,QAAQ;AAC7B,SAAK,UAAU;AAAA,EACjB;AAEA,SAAO;AACT;AAMO,IAAM,YAAY,MAA0B,oBAAoB,YAAY;AAM5E,IAAM,OAAO,MAA0B,oBAAoB,MAAM;AAMjE,IAAM,YAAY,MAA0B,oBAAoB,YAAY;AAO5E,IAAM,QAAQ,CAAC,MACpB,oBAAoB,SAAS,CAAC,EAAE,MAAM,WAAW,OAAO,EAAE,CAAC,CAAC;AASvD,IAAM,MAAM,CAACK,MAA6B,SAAiB,GAAG,iBAA2C;AAC9G,QAAM,OAAoD;AAAA,IACxD,cAAcA,IAAG;AAAA,IACjB,EAAE,MAAM,WAAW,OAAO,OAAO;AAAA,EACnC;AACA,MAAI,iBAAiB,QAAW;AAC9B,SAAK,KAAK,EAAE,MAAM,WAAW,OAAO,aAAa,CAAC;AAAA,EACpD;AACA,SAAO,oBAAoB,OAAO,IAAI;AACxC;AASO,IAAM,OAAO,CAACA,MAA6B,SAAiB,GAAG,iBAA2C;AAC/G,QAAM,OAAoD;AAAA,IACxD,cAAcA,IAAG;AAAA,IACjB,EAAE,MAAM,WAAW,OAAO,OAAO;AAAA,EACnC;AACA,MAAI,iBAAiB,QAAW;AAC9B,SAAK,KAAK,EAAE,MAAM,WAAW,OAAO,aAAa,CAAC;AAAA,EACpD;AACA,SAAO,oBAAoB,QAAQ,IAAI;AACzC;AAOO,IAAM,aAAa,CAACA,SACzB,oBAAoB,eAAe,CAAC,cAAcA,IAAG,CAAC,CAAC;AAOlD,IAAM,YAAY,CAACA,SACxB,oBAAoB,cAAc,CAAC,cAAcA,IAAG,CAAC,CAAC;AAUjD,IAAM,iBAAiB,CAC5B,MACA,OAAgE,CAAC,GACjE,aACA,YACuB;AACvB,QAAM,WAAW,KAAK,IAAI,SAAO;AAC/B,QAAI,OAAQ,IAAoB,UAAU,aAAa;AACrD,aAAO;AAAA,IACT;AACA,QAAI,UAAU,KAAK;AACjB,aAAO;AAAA,IACT;AACA,WAAO,cAAc,GAA6B;AAAA,EACpD,CAAC;AAED,QAAM,iBAAiB,aAAa,IAAI,CAAAA,SAAO,cAAcA,IAAG,CAAC,KAAK;AACtE,QAAM,aAAwC,SAAS,IAAI,QAAM;AAAA,IAC/D,MAAM;AAAA,IACN,QAAQ,cAAc,EAAE,MAAM;AAAA,IAC9B,WAAW,EAAE;AAAA,EACf,EAAE;AAEF,SAAO,oBAAoB,MAAM,UAAU,gBAAgB,UAAU;AACvE;;;ACxGO,IAAM,gBAAgB;AAAA;AAAA,EAE3B,QAAQ;AAAA;AAAA,EAER,YAAY;AAAA;AAAA,EAEZ,cAAc;AAAA;AAAA,EAEd,kBAAkB;AAAA;AAAA,EAElB,WAAW;AAAA;AAAA,EAEX,eAAe;AAAA;AAAA,EAEf,MAAM;AAAA;AAAA,EAEN,UAAU;AAAA;AAAA,EAEV,IAAI;AAAA;AAAA,EAEJ,QAAQ;AAAA;AAAA,EAER,SAAS;AAAA;AAAA,EAET,aAAa;AAAA;AAAA,EAEb,SAAS;AAAA;AAAA,EAET,aAAa;AAAA;AAAA,EAEb,KAAK;AAAA;AAAA,EAEL,IAAI;AAAA;AAAA,EAEJ,QAAQ;AAAA;AAAA,EAER,YAAY;AACd;AAUO,IAAM,aAAa;AAAA;AAAA,EAExB,OAAO;AAAA;AAAA,EAEP,MAAM;AAAA;AAAA,EAEN,OAAO;AAAA;AAAA,EAEP,OAAO;AACT;AAUO,IAAM,mBAAmB;AAAA;AAAA,EAE9B,KAAK;AAAA;AAAA,EAEL,MAAM;AACR;;;ACpGA,IAAM,iBAAiB,CAAC,SAAiB,CAACC,UAA+C;AAAA,EACvF,MAAM;AAAA,EACN;AAAA,EACA,MAAM,CAAC,cAAcA,IAAG,CAAC;AAC3B;AAOO,IAAM,QAAQ,eAAe,OAAO;AAOpC,IAAM,MAAM,eAAe,KAAK;AAOhC,IAAM,MAAM,eAAe,KAAK;AAOhC,IAAM,MAAM,eAAe,KAAK;AAOhC,IAAM,MAAM,eAAe,KAAK;AAYvC,IAAM,gBAAgB,CAAC,WAAiD;AAAA,EACtE,MAAM;AAAA,EACN,QAAQ,cAAc,MAAM,MAAM;AAAA,EAClC,WAAW,MAAM,aAAa,iBAAiB;AACjD;AAKO,IAAM,cAAc,CACzBA,MACA,aACkB;AAAA,EAClB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM,CAAC,cAAcA,IAAG,CAAC;AAAA,EACzB,SAAS,SAAS,SAAS,IAAI,aAAa;AAAA,EAC5C,WAAW,SAAS,cAAc,SAAY,eAAe,QAAQ,SAAS,IAAI;AACpF;;;AC3BA,IAAM,wBAAwB,oBAAI,IAAgC;AAClE,IAAM,qBAAqB,oBAAI,IAA6B;AAMrD,IAAM,+BAA+B,CAAC,MAAc,eAAyC;AAClG,wBAAsB,IAAI,MAAM,UAAU;AAC5C;AAMO,IAAM,4BAA4B,CAAC,MAAc,eAAsC;AAC5F,qBAAmB,IAAI,MAAM,UAAU;AACzC;AAKO,IAAM,6BAA6B,MAAY,sBAAsB,MAAM;AAC3E,IAAM,0BAA0B,MAAY,mBAAmB,MAAM;AAE5E,IAAM,wBAAwB,CAAC,SAAgC;AAC7D,QAAM,IAAI,MAAM,gCAAiC,MAAc,QAAQ,SAAS,GAAG;AACrF;AAEA,IAAM,qBAAqB,CAAC,SAA6B;AACvD,QAAM,IAAI,MAAM,6BAA8B,MAAc,QAAQ,SAAS,GAAG;AAClF;AAMO,IAAM,kBAAkB,CAAI,MAAsB,YAAqC;AAC5F,QAAM,UAAU,sBAAsB,IAAK,MAAc,IAAI;AAC7D,MAAI,QAAS,QAAO,QAAQ,MAAa,OAAO;AAEhD,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,UAAI,QAAQ,sBAAuB,QAAO,QAAQ,sBAAsB,IAAI;AAC5E;AAAA,IACF,KAAK;AACH,UAAI,QAAQ,uBAAwB,QAAO,QAAQ,uBAAuB,IAAI;AAC9E;AAAA,IACF,KAAK;AACH,UAAI,QAAQ,oBAAqB,QAAO,QAAQ,oBAAoB,IAAI;AACxE;AAAA,IACF,KAAK;AACH,UAAI,QAAQ,kBAAmB,QAAO,QAAQ,kBAAkB,IAAI;AACpE;AAAA,IACF,KAAK;AACH,UAAI,QAAQ,sBAAuB,QAAO,QAAQ,sBAAsB,IAAI;AAC5E;AAAA,IACF,KAAK;AACH,UAAI,QAAQ,uBAAwB,QAAO,QAAQ,uBAAuB,IAAI;AAC9E;AAAA,IACF;AACE;AAAA,EACJ;AACA,MAAI,QAAQ,UAAW,QAAO,QAAQ,UAAU,IAAI;AACpD,SAAO,sBAAsB,IAAI;AACnC;AAOO,IAAM,eAAe,CAAI,MAAmB,YAAkC;AACnF,QAAM,UAAU,mBAAmB,IAAK,MAAc,IAAI;AAC1D,MAAI,QAAS,QAAO,QAAQ,MAAa,OAAO;AAEhD,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,UAAI,QAAQ,YAAa,QAAO,QAAQ,YAAY,IAAI;AACxD;AAAA,IACF,KAAK;AACH,UAAI,QAAQ,aAAc,QAAO,QAAQ,aAAa,IAAI;AAC1D;AAAA,IACF,KAAK;AACH,UAAI,QAAQ,cAAe,QAAO,QAAQ,cAAc,IAAI;AAC5D;AAAA,IACF,KAAK;AACH,UAAI,QAAQ,cAAe,QAAO,QAAQ,cAAc,IAAI;AAC5D;AAAA,IACF,KAAK;AACH,UAAI,QAAQ,oBAAqB,QAAO,QAAQ,oBAAoB,IAAI;AACxE;AAAA,IACF,KAAK;AACH,UAAI,QAAQ,oBAAqB,QAAO,QAAQ,oBAAoB,IAAI;AACxE;AAAA,IACF,KAAK;AACH,UAAI,QAAQ,oBAAqB,QAAO,QAAQ,oBAAoB,IAAI;AACxE;AAAA,IACF;AACE;AAAA,EACJ;AACA,MAAI,QAAQ,UAAW,QAAO,QAAQ,UAAU,IAAI;AACpD,SAAO,mBAAmB,IAAI;AAChC;;;AChJO,IAAM,cAAc,CAACC,UAA2C;AAAA,EACrE,MAAMA,KAAI;AAAA,EACV,OAAOA,KAAI;AAAA,EACX,OAAQA,KAAkB;AAC5B;AAKO,IAAM,aAAa,CAAC,WAA0C;AAAA,EACnE,MAAM,MAAM;AAAA,EACZ,QAAQ,MAAM;AAAA,EACd,OAAQ,MAAmB;AAC7B;;;ACXO,IAAM,kBAAkB,CAAC,OAAiB,WAA+C;AAC9F,MAAK,OAAsB,SAAS,UAAU;AAC5C,WAAO;AAAA,EACT;AAEA,QAAM,MAAM;AACZ,QAAM,YAAY,IAAI,QAClB,MAAM,SAAS,IAAI,UAAU,MAAM,OACjC,MAAM,QACN,IAAI,QACN,MAAM,SAAS,MAAM;AAEzB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM,IAAI;AAAA,EACZ;AACF;AAOO,IAAM,mBAAmB,CAAC,OAAiB,UAChD,MAAM,IAAI,WAAS;AAAA,EACjB,MAAM;AAAA,EACN,OAAO,MAAM,SAAS,MAAM;AAAA,EAC5B;AACF,EAAE;AAMG,IAAM,kBAAkB,CAAC,WAAgC;AAAA,EAC9D,MAAM;AAAA,EACN,MAAM,MAAM;AACd;AAKO,IAAM,UAAU,CAAC,MAAc,OAAc,CAAC,GAAG,OAAgB,UAA0H;AAAA,EAChM,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS,MAAM;AAAA,EACf,gBAAgB,MAAM;AAAA,EACtB,eAAe,MAAM;AAAA,EACrB,QAAQ,MAAM;AAChB;AAKO,IAAM,eAAe,CAC1B,OACA,OACA,mBACsB;AAAA,EACtB,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AACF;;;ACxEO,IAAM,2BAAN,MAAM,0BAAqD;AAAA,EAG9D,cAAc;AAFd,SAAU,YAA2C,oBAAI,IAAI;AAGzD,SAAK,iBAAiB;AAAA,EAC1B;AAAA,EAEU,mBAAmB;AAEzB,SAAK,IAAI,SAAS,CAAC,EAAE,aAAa,MAAM,SAAS,aAAa,KAAK,IAAI,CAAC,GAAG;AAC3E,SAAK,IAAI,OAAO,CAAC,EAAE,aAAa,MAAM,OAAO,aAAa,CAAC,CAAC,GAAG;AAC/D,SAAK,IAAI,OAAO,CAAC,EAAE,aAAa,MAAM,OAAO,aAAa,CAAC,CAAC,GAAG;AAC/D,SAAK,IAAI,OAAO,CAAC,EAAE,aAAa,MAAM,OAAO,aAAa,CAAC,CAAC,GAAG;AAC/D,SAAK,IAAI,OAAO,CAAC,EAAE,aAAa,MAAM,OAAO,aAAa,CAAC,CAAC,GAAG;AAC/D,SAAK,IAAI,OAAO,CAAC,EAAE,aAAa,MAAM,OAAO,aAAa,CAAC,CAAC,GAAG;AAC/D,SAAK,IAAI,SAAS,CAAC,EAAE,aAAa,MAAM,SAAS,aAAa,CAAC,CAAC,GAAG;AACnE,SAAK,IAAI,SAAS,CAAC,EAAE,aAAa,MAAM,SAAS,aAAa,CAAC,CAAC,GAAG;AACnE,SAAK,IAAI,UAAU,CAAC,EAAE,aAAa,MAAM,UAAU,aAAa,CAAC,CAAC,GAAG;AACrE,SAAK,IAAI,QAAQ,CAAC,EAAE,aAAa,MAAM,QAAQ,aAAa,CAAC,CAAC,GAAG;AACjE,SAAK,IAAI,SAAS,CAAC,EAAE,aAAa,MAAM,SAAS,aAAa,CAAC,CAAC,GAAG;AACnE,SAAK,IAAI,SAAS,CAAC,EAAE,aAAa,MAAM,SAAS,aAAa,CAAC,CAAC,GAAG;AACnE,SAAK,IAAI,aAAa,CAAC,EAAE,aAAa,MAAM,aAAa,aAAa,KAAK,IAAI,CAAC,GAAG;AACnF,SAAK,IAAI,UAAU,CAAC,EAAE,aAAa,MAAM,UAAU,aAAa,KAAK,IAAI,CAAC,GAAG;AAC7E,SAAK,IAAI,OAAO,MAAM,OAAO;AAC7B,SAAK,IAAI,gBAAgB,MAAM,cAAc;AAC7C,SAAK,IAAI,gBAAgB,MAAM,cAAc;AAC7C,SAAK,IAAI,WAAW,CAAC,EAAE,aAAa,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,aAAa,CAAC,CAAC,GAAG;AAC/F,SAAK,IAAI,QAAQ,CAAC,EAAE,aAAa,MAAM,qBAAqB,aAAa,CAAC,CAAC,GAAG;AAC9E,SAAK,IAAI,SAAS,CAAC,EAAE,aAAa,MAAM,sBAAsB,aAAa,CAAC,CAAC,GAAG;AAChF,SAAK,IAAI,OAAO,CAAC,EAAE,aAAa,MAAM,oBAAoB,aAAa,CAAC,CAAC,GAAG;AAC5E,SAAK,IAAI,YAAY,CAAC,EAAE,aAAa,MAAM,IAAI,aAAa,CAAC,CAAC,eAAe,aAAa,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,GAAG;AAClH,SAAK,IAAI,YAAY,CAAC,EAAE,aAAa,MAAM,IAAI,aAAa,CAAC,CAAC,eAAe,aAAa,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,GAAG;AAClH,SAAK,IAAI,aAAa,CAAC,EAAE,aAAa,MAAM,YAAY,aAAa,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,GAAG;AAC9F,SAAK,IAAI,eAAe,CAAC,EAAE,aAAa,MAAM,eAAe,aAAa,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,GAAG;AACnG,SAAK,IAAI,kBAAkB,MAAM,kBAAkB;AACnD,SAAK,IAAI,iBAAiB,CAAC,EAAE,aAAa,MAAM,iBAAiB,aAAa,CAAC,CAAC,GAAG;AACnF,SAAK,IAAI,gBAAgB,CAAC,EAAE,aAAa,MAAM,YAAY,aAAa,CAAC,CAAC,GAAG;AAC7E,SAAK,IAAI,eAAe,CAAC,EAAE,aAAa,MAAM,aAAa,aAAa,CAAC,CAAC,GAAG;AAC7E,SAAK,IAAI,gBAAgB,CAAC,EAAE,aAAa,MAAM,cAAc,aAAa,CAAC,CAAC,GAAG;AAC/E,SAAK,IAAI,cAAc,CAAC,EAAE,aAAa,MAAM,cAAc,aAAa,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,GAAG;AACjG,SAAK,IAAI,gBAAgB,SAAO,KAAK,kBAAkB,GAAG,CAAC;AAAA,EAC/D;AAAA,EAEU,IAAI,MAAc,UAA4B;AACpD,SAAK,UAAU,IAAI,MAAM,QAAQ;AAAA,EACrC;AAAA,EAEA,YAAY,MAA4C;AACpD,WAAO,KAAK,UAAU,IAAI,IAAI;AAAA,EAClC;AAAA,EAEQ,kBAAkB,KAAoC;AAC1D,UAAM,MAAM,IAAI,aAAa,CAAC;AAC9B,UAAM,cAAc,KAAK,uBAAuB,GAAG;AACnD,UAAM,eAAe,cAAc,IAAI,WAAW,KAAK;AACvD,UAAM,kBAAkB,KAAK,2BAA2B,GAAG;AAC3D,WAAO,gBAAgB,GAAG,GAAG,YAAY,GAAG,eAAe;AAAA,EAC/D;AAAA,EAEU,uBAAuB,KAAoC;AACjE,UAAM,UAAU,IAAI,KAAK;AACzB,QAAI,CAAC,WAAW,QAAQ,WAAW,GAAG;AAClC,aAAO;AAAA,IACX;AACA,UAAM,QAAQ,QAAQ,IAAI,WAAS,GAAG,IAAI,eAAe,MAAM,MAAM,CAAC,IAAI,MAAM,SAAS,EAAE;AAC3F,WAAO,YAAY,MAAM,KAAK,IAAI,CAAC;AAAA,EACvC;AAAA,EAEU,2BAA2B,KAAoC;AACrE,QAAI,CAAC,IAAI,KAAK,WAAW;AACrB,aAAO;AAAA,IACX;AACA,WAAO,cAAc,IAAI,eAAe,IAAI,KAAK,SAAS,CAAC;AAAA,EAC/D;AAAA,EAEU,+BAA+B,KAAyC;AAC9E,WAAO,IAAI,KAAK,aAAa,0BAAyB;AAAA,EAC1D;AAAA,EAEA;AAAA,SAA0B,iCAA8C;AAAA,MACpE,MAAM;AAAA,MACN,OAAO;AAAA,IACX;AAAA;AACJ;;;AClBO,IAAe,UAAf,MAAe,SACsD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS1E,cAAc,KAAqC;AACjD,UAAM,MAAM,KAAK,sBAAsB;AACvC,UAAM,aAAa,KAAK,mBAAmB,GAAG;AAC9C,UAAM,SAAS,KAAK,iBAAiB,YAAY,GAAG,EAAE,KAAK;AAC3D,UAAM,MAAM,OAAO,SAAS,GAAG,IAAI,SAAS,GAAG,MAAM;AACrD,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,CAAC,GAAG,IAAI,MAAM;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,cAAc,KAAqC;AACjD,UAAM,MAAM,KAAK,sBAAsB;AACvC,UAAM,SAAS,KAAK,iBAAiB,KAAK,GAAG,EAAE,KAAK;AACpD,UAAM,MAAM,OAAO,SAAS,GAAG,IAAI,SAAS,GAAG,MAAM;AACrD,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,CAAC,GAAG,IAAI,MAAM;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,cAAc,KAAqC;AACjD,UAAM,MAAM,KAAK,sBAAsB;AACvC,UAAM,SAAS,KAAK,iBAAiB,KAAK,GAAG,EAAE,KAAK;AACpD,UAAM,MAAM,OAAO,SAAS,GAAG,IAAI,SAAS,GAAG,MAAM;AACrD,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,CAAC,GAAG,IAAI,MAAM;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,cAAc,KAAqC;AACjD,UAAM,MAAM,KAAK,sBAAsB;AACvC,UAAM,SAAS,KAAK,iBAAiB,KAAK,GAAG,EAAE,KAAK;AACpD,UAAM,MAAM,OAAO,SAAS,GAAG,IAAI,SAAS,GAAG,MAAM;AACrD,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,CAAC,GAAG,IAAI,MAAM;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,oBAA6B;AAC3B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BU,aAAa,OAAmC,KAA8B;AACtF,QAAI,CAAC,MAAO,QAAO;AACnB,WAAO,UAAU,KAAK,kBAAkB,OAAO,GAAG,CAAC;AAAA,EACrD;AAAA,EAEU,iBACR,WACA,KACQ;AACR,QAAI,CAAC,aAAa,UAAU,WAAW,EAAG,QAAO;AACjD,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWU,uBAAuB,KAAsB,KAA8B;AACnF,UAAM,aAAa,KAAK,mBAAmB,GAAG;AAC9C,UAAM,OAAO,KAAK,iBAAiB,YAAY,GAAG,EAAE,KAAK,EAAE,QAAQ,MAAM,EAAE;AAG3E,QAAI,WAAW,UAAU,WAAW,OAAO,SAAS,GAAG;AACrD,aAAO,kBAAkB,IAAI;AAAA,IAC/B;AAEA,UAAMC,SAAQ,KAAK,YAAY;AAC/B,UAAM,YAAYA,OAAM,QAAQ,QAAQ;AACxC,QAAI,cAAc,IAAI;AACpB,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,KAAK,MAAM,SAAS;AACjC,WAAO,WAAW,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,wBAAyC;AACjD,UAAM,SAAoB,CAAC;AAC3B,QAAI,UAAU;AACd,WAAO;AAAA,MACL;AAAA,MACA,cAAc,CAAC,UAAmB;AAChC,mBAAW;AACX,eAAO,KAAK,KAAK;AACjB,eAAO,KAAK,kBAAkB,OAAO;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOU,kBAAkB,OAAuB;AACjD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,qBAAqB,MAAiC;AAC9D,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASU,sBAAsB,KAAsB,cAAc,MAAY;AAC9E,UAAM,YAAY,CAAC,EAAE,IAAI,UAAU,IAAI,OAAO;AAC9C,QAAI,CAAC,gBAAgB,IAAI,WAAW,IAAI,UAAU,UAAa,IAAI,WAAW,SAAY;AACxF,YAAM,IAAI,MAAM,6EAA6E;AAAA,IAC/F;AAEA,QAAI,WAAW;AACb,iBAAW,MAAM,IAAI,QAAS;AAC5B,YAAI,CAAC,KAAK,qBAAqB,GAAG,QAAQ,GAAG;AAC3C,gBAAM,IAAI,MAAM,iBAAiB,GAAG,QAAQ,oCAAoC;AAAA,QAClF;AACA,aAAK,sBAAsB,GAAG,OAAO,KAAK;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,UAAU,KAAiG;AACjH,QAAI,UAAuC,CAAC;AAE5C,UAAM,mBAAmB,IAAI,QAAQ,IAAI,QAAM;AAC7C,YAAM,EAAE,YAAY,OAAO,aAAa,aAAa,IAAI,KAAK,UAAU,GAAG,KAAK;AAChF,YAAM,YAAY,MAAM,QAAQ,CAAC;AACjC,UAAI,UAAU,QAAQ;AACpB,kBAAU,QAAQ,OAAO,SAAS;AAAA,MACpC;AACA,gBAAU,QAAQ,OAAO,YAAY;AACrC,YAAM,mBAAmB,UAAU,SAAS,EAAE,GAAG,OAAO,MAAM,OAAU,IAAI;AAC5E,aAAO,EAAE,GAAG,IAAI,OAAO,iBAAiB;AAAA,IAC1C,CAAC;AAED,UAAM,aAA8B,mBAAmB,EAAE,GAAG,KAAK,QAAQ,iBAAiB,IAAI;AAC9F,WAAO,EAAE,YAAY,aAAa,QAAQ;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOU,mBAAmB,KAAuC;AAClE,SAAK,sBAAsB,KAAK,IAAI;AACpC,UAAM,EAAE,YAAY,YAAY,IAAI,KAAK,UAAU,GAAG;AACtD,UAAM,eAAe,CAAC,GAAI,WAAW,QAAQ,CAAC,GAAI,GAAG,WAAW;AAChE,WAAO,aAAa,SAAS,EAAE,GAAG,YAAY,MAAM,aAAa,IAAI;AAAA,EACvE;AAAA,EAMU,YAAY,kBAAqC;AACzD,SAAK,sBAAsB,oBAAI,IAAI;AACnC,SAAK,mBAAmB,oBAAI,IAAI;AAChC,SAAK,mBAAmB,oBAAoB,IAAI,yBAAyB;AACzE,SAAK,gCAAgC;AACrC,SAAK,mCAAmC;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,OAAO,kBAA8C;AAAA,IAE1D,MAAM,oBAAoB,SAAQ;AAAA,MAAlC;AAAA;AACE,aAAmB,UAAuB;AAAA;AAAA,MAC1C,gBAAgB,IAAoB;AAClC,eAAO,IAAI,EAAE;AAAA,MACf;AAAA,MACU,mBAA0B;AAClC,cAAM,IAAI,MAAM,iBAAiB;AAAA,MACnC;AAAA,MACU,mBAA0B;AAClC,cAAM,IAAI,MAAM,iBAAiB;AAAA,MACnC;AAAA,MACU,mBAA0B;AAClC,cAAM,IAAI,MAAM,iBAAiB;AAAA,MACnC;AAAA,MACU,mBAA0B;AAClC,cAAM,IAAI,MAAM,iBAAiB;AAAA,MACnC;AAAA,IACF;AACA,WAAO,IAAI,YAAY,gBAAgB;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOU,2BAAqD,MAAiB,UAA2D;AACzI,SAAK,oBAAoB,IAAI,MAAM,QAAkE;AAAA,EACvG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOU,wBAA+C,MAAiB,UAA2D;AACnI,SAAK,iBAAiB,IAAI,MAAM,QAA+D;AAAA,EACjG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQU,kBAAkB,MAAsB,KAA8B;AAC9E,UAAM,WAAW,KAAK,oBAAoB,IAAI,KAAK,IAAI;AACvD,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,qCAAqC,KAAK,IAAI,SAAS,KAAK,YAAY,IAAI,EAAE;AAAA,IAChG;AACA,WAAO,SAAS,MAAM,GAAG;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQU,eAAe,MAAmB,KAA8B;AACxE,UAAM,WAAW,KAAK,iBAAiB,IAAI,KAAK,IAAI;AACpD,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,kCAAkC,KAAK,IAAI,SAAS,KAAK,YAAY,IAAI,EAAE;AAAA,IAC7F;AACA,WAAO,SAAS,MAAM,GAAG;AAAA,EAC3B;AAAA,EAEQ,qCAA2C;AACjD,SAAK,2BAA2B,oBAAoB,CAAC,QAA8B,QAAQ;AACzF,YAAMC,QAAO,KAAK,eAAe,OAAO,MAAM,GAAG;AACjD,YAAMC,SAAQ,KAAK,eAAe,OAAO,OAAO,GAAG;AACnD,YAAM,OAAO,GAAGD,KAAI,IAAI,OAAO,QAAQ,IAAIC,MAAK;AAChD,UAAI,OAAO,QAAQ;AACjB,cAAM,gBAAgB,KAAK,eAAe,OAAO,QAAQ,GAAG;AAC5D,eAAO,GAAG,IAAI,WAAW,aAAa;AAAA,MACxC;AACA,aAAO;AAAA,IACT,CAAC;AAED,SAAK,2BAA2B,qBAAqB,CAAC,SAAgC,QAAQ;AAC5F,UAAI,QAAQ,SAAS,WAAW,EAAG,QAAO;AAC1C,YAAM,QAAQ,QAAQ,SAAS,IAAI,QAAM;AACvC,cAAM,WAAW,KAAK,kBAAkB,IAAI,GAAG;AAC/C,eAAO,GAAG,SAAS,sBAAsB,IAAI,QAAQ,MAAM;AAAA,MAC7D,CAAC;AACD,aAAO,MAAM,KAAK,IAAI,QAAQ,QAAQ,GAAG;AAAA,IAC3C,CAAC;AAED,SAAK,2BAA2B,kBAAkB,CAAC,UAA8B,QAAQ;AACvF,YAAMD,QAAO,KAAK,eAAe,SAAS,MAAM,GAAG;AACnD,aAAO,GAAGA,KAAI,IAAI,SAAS,QAAQ;AAAA,IACrC,CAAC;AAED,SAAK,2BAA2B,gBAAgB,CAAC,QAA0B,QAAQ;AACjF,YAAMA,QAAO,KAAK,eAAe,OAAO,MAAM,GAAG;AACjD,YAAM,SAAS,OAAO,MAAM,IAAI,OAAK,KAAK,eAAe,GAAG,GAAG,CAAC,EAAE,KAAK,IAAI;AAC3E,aAAO,GAAGA,KAAI,IAAI,OAAO,QAAQ,KAAK,MAAM;AAAA,IAC9C,CAAC;AAED,SAAK,2BAA2B,oBAAoB,CAAC,YAAkC,QAAQ;AAC7F,YAAM,cAAc,KAAK,uBAAuB,WAAW,UAAU,GAAG;AACxE,aAAO,GAAG,WAAW,QAAQ,KAAK,WAAW;AAAA,IAC/C,CAAC;AAED,SAAK,2BAA2B,qBAAqB,CAAC,aAAoC,QAAQ;AAChG,YAAMA,QAAO,KAAK,eAAe,YAAY,MAAM,GAAG;AACtD,YAAME,SAAQ,KAAK,eAAe,YAAY,OAAO,GAAG;AACxD,YAAMH,SAAQ,KAAK,eAAe,YAAY,OAAO,GAAG;AACxD,aAAO,GAAGC,KAAI,IAAI,YAAY,QAAQ,IAAIE,MAAK,QAAQH,MAAK;AAAA,IAC9D,CAAC;AAAA,EACH;AAAA,EAEQ,kCAAwC;AAC9C,SAAK,wBAAwB,WAAW,CAAC,SAAsB,QAAQ,IAAI,aAAa,QAAQ,KAAK,CAAC;AAEtG,SAAK,wBAAwB,UAAU,CAAC,QAAoB,SAAS;AACnE,aAAO,GAAG,KAAK,gBAAgB,OAAO,KAAK,CAAC,IAAI,KAAK,gBAAgB,OAAO,IAAI,CAAC;AAAA,IACnF,CAAC;AACD,SAAK;AAAA,MAAwB;AAAA,MAAY,CAAC,QAAsB,QAC9D,KAAK,uBAAuB,QAAQ,GAAG;AAAA,IACzC;AACA,SAAK,wBAAwB,YAAY,CAAC,MAAoB,SAAS,KAAK,gBAAgB,IAAI,CAAC;AAEjG,SAAK,wBAAwB,kBAAkB,CAAC,MAA0B,QAAQ;AAChF,YAAM,MAAM,KAAK,iBAAiB,KAAK,OAAO,GAAG,EAAE,KAAK,EAAE,QAAQ,MAAM,EAAE;AAC1E,aAAO,IAAI,GAAG;AAAA,IAChB,CAAC;AAED,SAAK,wBAAwB,kBAAkB,CAAC,MAA0B,QAAQ;AAChF,YAAM,QAAQ,CAAC,MAAM;AACrB,iBAAW,EAAE,MAAM,KAAK,KAAK,KAAK,YAAY;AAC5C,cAAM,KAAK,QAAQ,KAAK,kBAAkB,MAAM,GAAG,CAAC,SAAS,KAAK,eAAe,MAAM,GAAG,CAAC,EAAE;AAAA,MAC/F;AACA,UAAI,KAAK,MAAM;AACb,cAAM,KAAK,QAAQ,KAAK,eAAe,KAAK,MAAM,GAAG,CAAC,EAAE;AAAA,MAC1D;AACA,YAAM,KAAK,KAAK;AAChB,aAAO,MAAM,KAAK,GAAG;AAAA,IACvB,CAAC;AAED,SAAK,wBAAwB,kBAAkB,CAAC,MAA0B,QAAQ;AAChF,UAAI,SAAS,GAAG,KAAK,IAAI;AACzB,UAAI,KAAK,KAAK,SAAS,GAAG;AACxB,kBAAU,KAAK,KAAK,IAAI,SAAO,KAAK,eAAe,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI;AAAA,MACzE;AACA,gBAAU;AAEV,YAAM,QAAkB,CAAC;AAEzB,UAAI,KAAK,eAAe,KAAK,YAAY,SAAS,GAAG;AACnD,cAAM,kBAAkB,kBAAkB,KAAK,YAAY;AAAA,UAAI,CAAAI,SAC7D,GAAG,KAAK,gBAAgBA,KAAI,KAAK,CAAC,IAAI,KAAK,gBAAgBA,KAAI,IAAI,CAAC;AAAA,QACtE,EAAE,KAAK,IAAI;AACX,cAAM,KAAK,eAAe;AAAA,MAC5B;AAEA,UAAI,KAAK,WAAW,KAAK,QAAQ,SAAS,GAAG;AAC3C,cAAM,cAAc,cAAc,KAAK,QAAQ;AAAA,UAAI,OACjD,GAAG,KAAK,gBAAgB,EAAE,OAAO,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS;AAAA,QAC/F,EAAE,KAAK,IAAI;AACX,cAAM,KAAK,WAAW;AAAA,MACxB;AAEA,gBAAU,MAAM,KAAK,GAAG;AACxB,gBAAU;AAEV,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA,EAGU,gBAAgB,MAA4B;AACpD,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKU,uBAAuB,QAAsB,KAA8B;AACnF,UAAM,eAAe,OAAO,KAAK,IAAI,SAAO,KAAK,eAAe,KAAK,GAAG,CAAC;AACzE,UAAM,WAAW,KAAK,iBAAiB,YAAY,OAAO,IAAI;AAC9D,QAAI,UAAU;AACZ,aAAO,SAAS;AAAA,QACd,MAAM;AAAA,QACN;AAAA,QACA,gBAAgB,aAAW,KAAK,eAAe,SAAS,GAAG;AAAA,MAC7D,CAAC;AAAA,IACH;AACA,WAAO,GAAG,OAAO,IAAI,IAAI,aAAa,KAAK,IAAI,CAAC;AAAA,EAClD;AACF;;;ACxdO,IAAM,yBAAN,MAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQlC,OAAO,OAAOC,KAAuB,KAAuB,SAAkC;AAC5F,UAAM,aAAa,KAAK,aAAaA,KAAI,OAAO;AAChD,UAAM,OAAO,KAAK,WAAWA,KAAI,KAAK,OAAO;AAC7C,UAAM,OAAO,KAAK,WAAWA,KAAI,YAAY,MAAM,OAAO;AAC1D,UAAM,UAAU,KAAK,cAAcA,GAAE;AACrC,UAAM,QAAQ,KAAK,YAAYA,KAAI,OAAO;AAC1C,UAAM,aAAa,KAAK,oBAAoBA,KAAI,OAAO;AACvD,WAAO,GAAG,OAAO,GAAG,IAAI,GAAG,KAAK,GAAG,UAAU;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAe,aAAaA,KAAuB,SAAkC;AACnF,QAAI,CAACA,IAAG,OAAQ,QAAO;AACvB,UAAM,SAAS,UAAU,QAAQ,gBAAgBA,IAAG,MAAM,IAAIA,IAAG;AACjE,WAAO,GAAG,MAAM;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAe,WAAWA,KAAuB,KAAuB,SAAkC;AACxG,YAAQA,IAAG,QAAQ,CAAC,GACjB,IAAI,CAAC,MAAW;AACf,UAAI,OAAO,SAAS;AAClB,eAAQ,QAAgB,eAAe,GAAG,GAAG;AAAA,MAC/C;AACA,aAAO,OAAO,CAAC;AAAA,IACjB,CAAC,EACA,KAAK,IAAI;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAe,WAAWA,KAAuB,YAAoB,MAAc,SAAkC;AACnH,UAAM,aAAaA,IAAG,iBAAiB,qBAAqB;AAC5D,UAAM,SAAS,UAAU,QAAQ,gBAAgBA,IAAG,IAAI,IAAIA,IAAG;AAC/D,WAAO,GAAG,UAAU,GAAG,MAAM,IAAI,IAAI,IAAI,UAAU;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAe,cAAcA,KAA+B;AAC1D,WAAOA,IAAG,UAAU,aAAa;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAe,YAAYA,KAAuB,SAAkC;AAClF,QAAI,CAACA,IAAG,MAAO,QAAO;AACtB,UAAM,SAAS,UAAU,QAAQ,gBAAgBA,IAAG,KAAK,IAAIA,IAAG;AAChE,WAAO,OAAO,MAAM;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAe,oBAAoBA,KAAuB,SAAkC;AAC1F,QAAI,CAACA,IAAG,iBAAiB,CAACA,IAAG,cAAc,OAAQ,QAAO;AAC1D,UAAM,UAAUA,IAAG,cAChB,IAAI,CAAAC,SAAO,UAAU,QAAQ,gBAAgBA,IAAG,IAAIA,IAAG,EACvD,KAAK,IAAI;AACZ,WAAO,IAAI,OAAO;AAAA,EACpB;AACF;;;ACtGO,IAAM,gCAAN,MAAkE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOvE,kBAAkB,OAAgB,QAAyB;AACzD,UAAM,QAAkB,CAAC;AACzB,QAAI,UAAU,OAAW,OAAM,KAAK,SAAS,KAAK,EAAE;AACpD,QAAI,WAAW,OAAW,OAAM,KAAK,UAAU,MAAM,EAAE;AACvD,WAAO,MAAM,SAAS,IAAI,MAAM,KAAK,GAAG,CAAC,KAAK;AAAA,EAChD;AACF;;;ACxBO,IAAM,cAAN,MAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWvB,OAAO,YAAY,KAAsB,KAAsB,iBAAyC,kBAA0E,oBAA+D,wBAAyD;AACxS,QAAI,CAAC,IAAI,QAAQ,IAAI,KAAK,WAAW,EAAG,QAAO;AAC/C,UAAM,eAAe,IAAI,KAAK,KAAK,SAAO,IAAI,SAAS;AACvD,UAAM,SAAS,eAAe,oBAAoB;AAClD,UAAM,UAAU,IAAI,KAAK,IAAI,SAAO;AAClC,YAAM,OAAO,gBAAgB,IAAI,IAAI;AACrC,YAAM,OAAO,IAAI,WAAW,IAAI,QAAQ,SACpC,IAAI,IAAI,QAAQ,IAAI,OAAK,gBAAgB,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,MACvD;AACJ,YAAM,QAAQ,uBAAuB,iBAAiB,mBAAmB,IAAI,KAAK,GAAG,GAAG,CAAC;AACzF,aAAO,GAAG,IAAI,GAAG,IAAI,QAAQ,KAAK;AAAA,IACpC,CAAC,EAAE,KAAK,IAAI;AACZ,WAAO,GAAG,MAAM,GAAG,OAAO;AAAA,EAC5B;AACF;;;ACHO,IAAM,sBAAN,MAAuD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO5D,iBAAiB,WAAqC,MAA+B;AACnF,QAAI,CAAC,aAAa,UAAU,WAAW,EAAG,QAAO;AACjD,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,uBAAuB,WAAyB,iBAAiD;AAC/F,WAAO,UACJ,IAAI,YAAU;AACb,YAAM,YAAY,OAAO,QAAQ,GAAG,gBAAgB,OAAO,KAAK,CAAC,MAAM;AACvE,YAAM,YAAY,OAAO,QAAQ,OAAO,gBAAgB,OAAO,KAAK,CAAC,KAAK;AAC1E,aAAO,GAAG,SAAS,GAAG,gBAAgB,OAAO,IAAI,CAAC,GAAG,SAAS;AAAA,IAChE,CAAC,EACA,KAAK,IAAI;AAAA,EACd;AACF;;;AChDO,IAAM,eAAN,MAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASxB,OAAO,aAAa,KAAsB,KAAsB,aAA0D,mBAAwE;AAChM,QAAI,CAAC,IAAI,SAAS,IAAI,MAAM,WAAW,EAAG,QAAO;AACjD,UAAM,QAAQ,IAAI,MAAM,IAAI,OAAK;AAC/B,YAAM,QAAQ,YAAY,EAAE,OAAc,GAAG;AAC7C,YAAM,OAAO,kBAAkB,EAAE,WAAW,GAAG;AAC/C,aAAO,GAAG,EAAE,IAAI,SAAS,KAAK,OAAO,IAAI;AAAA,IAC3C,CAAC;AACD,WAAO,IAAI,MAAM,KAAK,GAAG,CAAC;AAAA,EAC5B;AACF;;;ACnBO,IAAM,kBAAN,MAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO3B,OAAO,eAAe,KAAsB,iBAAiD;AAC3F,QAAI,CAAC,IAAI,WAAW,IAAI,QAAQ,WAAW,EAAG,QAAO;AACrD,UAAM,OAAO,IAAI,QACd,IAAI,OAAK,GAAG,gBAAgB,EAAE,KAAK,CAAC,IAAI,gBAAgB,EAAE,IAAI,CAAC,EAAE,EACjE,KAAK,IAAI;AACZ,WAAO,aAAa,IAAI;AAAA,EAC1B;AACF;;;ACdO,IAAM,kBAAN,MAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO3B,OAAO,eAAe,KAAsB,iBAAiD;AAC3F,QAAI,CAAC,IAAI,WAAW,IAAI,QAAQ,WAAW,EAAG,QAAO;AACrD,UAAM,QAAQ,IAAI,QACf,IAAI,OAAK,GAAG,gBAAgB,EAAE,OAAO,KAAK,CAAC,IAAI,gBAAgB,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,EAC9F,KAAK,IAAI;AACZ,WAAO,aAAa,KAAK;AAAA,EAC3B;AACF;;;ACRO,IAAe,iBAAf,cAAsC,QAAQ;AAAA,EAA9C;AAAA;AAGL,SAAU,qBAAyC,IAAI,8BAA8B;AACrF,SAAU,oBAAuC,IAAI,oBAAoB;AAAA;AAAA,EAE/D,iBAAiB,KAAsB,KAA8B;AAC7E,UAAM,YAAY,CAAC,EAAE,IAAI,UAAU,IAAI,OAAO;AAC9C,UAAM,OAAO,YAAY;AAAA,MACvB;AAAA,MACA;AAAA,MACA,KAAK,gBAAgB,KAAK,IAAI;AAAA,MAC9B,KAAK,iBAAiB,KAAK,IAAI;AAAA,MAC/B,KAAK,oBAAoB,KAAK,IAAI,MAAM,CAAC,MAAM;AAAA,MAC/C,KAAK,uBAAuB,KAAK,IAAI;AAAA,IACvC;AACA,UAAM,UAA2B,YAC7B,EAAE,GAAG,KAAK,QAAQ,QAAW,SAAS,QAAW,OAAO,QAAW,QAAQ,OAAU,IACrF;AACJ,UAAM,aAAa,KAAK,kBAAkB,SAAS,GAAG;AACtD,QAAI,CAAC,WAAW;AACd,aAAO,GAAG,IAAI,GAAG,UAAU;AAAA,IAC7B;AACA,WAAO,KAAK,wBAAwB,KAAK,YAAY,MAAM,GAAG;AAAA,EAChE;AAAA,EAEQ,wBACN,KACA,YACA,MACA,KACQ;AACR,UAAM,WAAW,IAAI,OAClB,IAAI,QAAM,GAAG,GAAG,QAAQ,IAAI,KAAK,eAAe,KAAK,iBAAiB,GAAG,OAAO,GAAG,CAAC,CAAC,EAAE,EACvF,KAAK,GAAG;AACX,UAAM,UAAU,gBAAgB,eAAe,KAAK,KAAK,gBAAgB,KAAK,IAAI,CAAC;AACnF,UAAM,aAAa,KAAK,mBAAmB,kBAAkB,IAAI,OAAO,IAAI,MAAM;AAClF,UAAM,WAAW,GAAG,KAAK,eAAe,UAAU,CAAC,IAAI,QAAQ;AAC/D,WAAO,GAAG,IAAI,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU;AAAA,EAClD;AAAA,EAEU,iBAAiB,KAAsB,KAA8B;AAC7E,UAAM,QAAQ,KAAK,iBAAiB,IAAI,IAAI;AAC5C,UAAM,aAAa,KAAK,wBAAwB,IAAI,OAAO;AAC3D,UAAM,SAAS,KAAK,oBAAoB,IAAI,QAAQ,GAAG;AACvD,UAAM,YAAY,KAAK,iBAAiB,IAAI,WAAW,GAAG;AAC1D,WAAO,eAAe,KAAK,KAAK,UAAU,YAAY,MAAM,GAAG,SAAS;AAAA,EAC1E;AAAA,EAEU,iBAAiB,WAAqC,KAA8B;AAC5F,WAAO,KAAK,kBAAkB,iBAAiB,WAAW,GAAG;AAAA,EAC/D;AAAA,EAEQ,wBAAwB,SAA+B;AAC7D,WAAO,QAAQ,IAAI,YAAU,KAAK,gBAAgB,OAAO,IAAI,CAAC,EAAE,KAAK,IAAI;AAAA,EAC3E;AAAA,EAEQ,oBAAoB,QAAiB,KAA8B;AACzE,WAAO,OACJ,IAAI,SAAO,IAAI,IAAI,IAAI,WAAS,KAAK,eAAe,OAAO,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG,EAC9E,KAAK,IAAI;AAAA,EACd;AAAA,EAEQ,kBAAkB,KAAsB,KAA8B;AAC5E,UAAM,UAAU,KAAK,qBAAqB,KAAK,GAAG;AAClD,UAAM,OAAO,KAAK,YAAY,IAAI,MAAM,GAAG;AAC3C,UAAM,QAAQ,aAAa,aAAa,KAAK,KAAK,KAAK,YAAY,KAAK,IAAI,GAAG,KAAK,kBAAkB,KAAK,IAAI,CAAC;AAChH,UAAM,cAAc,KAAK,aAAa,IAAI,OAAO,GAAG;AACpD,UAAM,UAAU,gBAAgB,eAAe,KAAK,KAAK,gBAAgB,KAAK,IAAI,CAAC;AACnF,UAAM,SAAS,KAAK,cAAc,KAAK,GAAG;AAC1C,UAAM,UAAU,gBAAgB,eAAe,KAAK,KAAK,gBAAgB,KAAK,IAAI,CAAC;AACnF,UAAM,aAAa,KAAK,mBAAmB,kBAAkB,IAAI,OAAO,IAAI,MAAM;AAClF,WAAO,UAAU,KAAK,gBAAgB,GAAG,CAAC,GAAG,OAAO,SAAS,IAAI,GAAG,KAAK,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU;AAAA,EACnI;AAAA,EAEU,iBAAiB,KAAsB,KAA8B;AAC7E,UAAM,QAAQ,KAAK,iBAAiB,IAAI,KAAK;AAC7C,UAAM,cAAc,KAAK,yBAAyB,IAAI,KAAK,GAAG;AAC9D,UAAM,cAAc,KAAK,aAAa,IAAI,OAAO,GAAG;AACpD,UAAM,YAAY,KAAK,iBAAiB,IAAI,WAAW,GAAG;AAC1D,WAAO,UAAU,KAAK,QAAQ,WAAW,GAAG,WAAW,GAAG,SAAS;AAAA,EACrE;AAAA,EAEQ,yBACN,aACA,KACQ;AACR,WAAO,YACJ,IAAI,gBAAc;AACjB,YAAMC,OAAM,WAAW;AACvB,YAAM,SAAS,KAAK,gBAAgBA,KAAI,IAAI;AAC5C,YAAM,QAAQ,KAAK,eAAe,WAAW,OAAO,GAAG;AACvD,aAAO,GAAG,MAAM,MAAM,KAAK;AAAA,IAC7B,CAAC,EACA,KAAK,IAAI;AAAA,EACd;AAAA,EAEU,iBAAiB,KAAsB,KAA8B;AAC7E,UAAM,QAAQ,KAAK,iBAAiB,IAAI,IAAI;AAC5C,UAAM,cAAc,KAAK,aAAa,IAAI,OAAO,GAAG;AACpD,UAAM,YAAY,KAAK,iBAAiB,IAAI,WAAW,GAAG;AAC1D,WAAO,eAAe,KAAK,GAAG,WAAW,GAAG,SAAS;AAAA,EACvD;AAAA,EAEU,uBAAuB,WAAiC;AAChE,WAAO,KAAK,kBAAkB,uBAAuB,WAAW,KAAK,gBAAgB,KAAK,IAAI,CAAC;AAAA,EACjG;AAAA,EAEU,gBAAgB,KAA8B;AACtD,WAAO,IAAI,WAAW,cAAc;AAAA,EACtC;AAAA,EAEU,qBAAqB,KAAsB,KAA8B;AACjF,WAAO,IAAI,QAAQ,IAAI,OAAK;AAC1B,YAAM,OAAO,KAAK,eAAe,GAAG,GAAG;AACvC,UAAI,EAAE,OAAO;AACX,YAAI,EAAE,MAAM,SAAS,GAAG,EAAG,QAAO,EAAE;AACpC,eAAO,GAAG,IAAI,OAAO,KAAK,gBAAgB,EAAE,KAAK,CAAC;AAAA,MACpD;AACA,aAAO;AAAA,IACT,CAAC,EAAE,KAAK,IAAI;AAAA,EACd;AAAA,EAEU,YAAY,KAA8B,KAA+B;AACjF,UAAM,cAAc;AACpB,QAAI,YAAY,SAAS,iBAAiB;AACxC,aAAO,KAAK,qBAAqB,aAAa,GAAG;AAAA,IACnD;AACA,QAAI,YAAY,SAAS,gBAAgB;AACvC,aAAO,KAAK,oBAAoB,aAAa,GAAG;AAAA,IAClD;AACA,WAAO,KAAK,mBAAmB,WAAW;AAAA,EAC5C;AAAA,EAEU,qBAAqBC,KAAuB,KAA+B;AACnF,WAAO,uBAAuB,OAAOA,KAAI,KAAK,IAAI;AAAA,EACpD;AAAA,EAEU,oBAAoB,OAAyB,KAA+B;AACpF,QAAI,CAAC,MAAM,OAAO;AAChB,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AACA,UAAM,WAAW,KAAK,iBAAiB,KAAK,mBAAmB,MAAM,KAAK,GAAG,GAAI,EAAE,KAAK,EAAE,QAAQ,MAAM,EAAE;AAC1G,UAAM,UAAU,MAAM,eAAe,SACjC,KAAK,MAAM,cAAc,IAAI,OAAK,KAAK,gBAAgB,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,MACrE;AACJ,WAAO,IAAI,QAAQ,QAAQ,KAAK,gBAAgB,MAAM,KAAK,CAAC,GAAG,OAAO;AAAA,EACxE;AAAA,EAEU,mBAAmB,OAAgC;AAC3D,QAAI,MAAM,SAAS,iBAAiB;AAClC,aAAO,KAAK,qBAAqB,KAA0B;AAAA,IAC7D;AACA,QAAI,MAAM,SAAS,gBAAgB;AACjC,aAAO,KAAK,oBAAoB,KAAyB;AAAA,IAC3D;AACA,UAAM,OAAO,KAAK,iBAAiB,KAAK;AACxC,WAAO,MAAM,QAAQ,GAAG,IAAI,OAAO,KAAK,gBAAgB,MAAM,KAAK,CAAC,KAAK;AAAA,EAC3E;AAAA,EAEU,iBAAiB,OAAkD;AAC3E,QAAI,MAAM,QAAQ;AAChB,aAAO,GAAG,KAAK,gBAAgB,MAAM,MAAM,CAAC,IAAI,KAAK,gBAAgB,MAAM,IAAI,CAAC;AAAA,IAClF;AACA,WAAO,KAAK,gBAAgB,MAAM,IAAI;AAAA,EACxC;AAAA,EAEU,cAAc,KAAsB,KAA8B;AAC1E,QAAI,CAAC,IAAI,OAAQ,QAAO;AACxB,WAAO,WAAW,KAAK,kBAAkB,IAAI,QAAQ,GAAG,CAAC;AAAA,EAC3D;AAAA,EAEU,uBAAuB,KAAqB;AACpD,WAAO,IAAI,KAAK,EAAE,QAAQ,MAAM,EAAE;AAAA,EACpC;AAAA,EAEU,eAAe,KAAqB;AAC5C,UAAM,UAAU,KAAK,uBAAuB,GAAG;AAC/C,WAAO,IAAI,OAAO;AAAA,EACpB;AACF;;;AC5LO,IAAM,2BAAN,cAAuC,yBAAyB;AAAA,EACnE,cAAc;AACV,UAAM;AACN,SAAK,kBAAkB;AAAA,EAC3B;AAAA,EAEQ,oBAAoB;AAIxB,SAAK,IAAI,WAAW,MAAM,4BAA4B;AACtD,SAAK,IAAI,kBAAkB,MAAM,oCAAoC;AACrE,SAAK,IAAI,iBAAiB,CAAC,EAAE,aAAa,MAAM;AAC5C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,kCAAkC;AACjF,aAAO,gBAAgB,aAAa,CAAC,CAAC;AAAA,IAC1C,CAAC;AAED,SAAK,IAAI,WAAW,CAAC,EAAE,aAAa,MAAM;AACtC,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,0CAA0C;AACzF,YAAM,CAAC,MAAM,IAAI,IAAI;AACrB,YAAM,YAAY,KAAK,QAAQ,SAAS,EAAE;AAC1C,aAAO,WAAW,SAAS,SAAS,IAAI;AAAA,IAC5C,CAAC;AAED,SAAK,IAAI,QAAQ,CAAC,EAAE,aAAa,MAAM;AACnC,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,yBAAyB;AACxE,aAAO,qBAAqB,aAAa,CAAC,CAAC;AAAA,IAC/C,CAAC;AAED,SAAK,IAAI,SAAS,CAAC,EAAE,aAAa,MAAM;AACpC,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,0BAA0B;AACzE,aAAO,sBAAsB,aAAa,CAAC,CAAC;AAAA,IAChD,CAAC;AAED,SAAK,IAAI,OAAO,CAAC,EAAE,aAAa,MAAM;AAClC,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,wBAAwB;AACvE,aAAO,oBAAoB,aAAa,CAAC,CAAC;AAAA,IAC9C,CAAC;AAED,SAAK,IAAI,YAAY,CAAC,EAAE,MAAM,aAAa,MAAM;AAC7C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,qDAAqD;AACpG,YAAM,CAAC,MAAM,QAAQ,IAAI;AACzB,YAAM,UAAU,KAAK,KAAK,CAAC;AAC3B,YAAM,YAAY,OAAO,QAAQ,KAAK,EAAE,QAAQ,SAAS,EAAE,EAAE,YAAY;AACzE,aAAO,IAAI,IAAI,OAAO,QAAQ,SAAS,SAAS;AAAA,IACpD,CAAC;AAED,SAAK,IAAI,YAAY,CAAC,EAAE,MAAM,aAAa,MAAM;AAC7C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,qDAAqD;AACpG,YAAM,CAAC,MAAM,QAAQ,IAAI;AACzB,YAAM,UAAU,KAAK,KAAK,CAAC;AAC3B,YAAM,YAAY,OAAO,QAAQ,KAAK,EAAE,QAAQ,SAAS,EAAE,EAAE,YAAY;AACzE,aAAO,IAAI,IAAI,OAAO,QAAQ,SAAS,SAAS;AAAA,IACpD,CAAC;AAED,SAAK,IAAI,aAAa,CAAC,EAAE,aAAa,MAAM;AACxC,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,+BAA+B;AAC9E,YAAM,CAAC,OAAO,KAAK,IAAI;AACvB,aAAO,IAAI,KAAK,YAAY,KAAK;AAAA,IACrC,CAAC;AAED,SAAK,IAAI,eAAe,CAAC,EAAE,aAAa,MAAM;AAC1C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,iCAAiC;AAChF,YAAM,CAAC,MAAM,MAAM,IAAI;AACvB,aAAO,WAAW,IAAI,KAAK,MAAM;AAAA,IACrC,CAAC;AAED,SAAK,IAAI,gBAAgB,CAAC,EAAE,aAAa,MAAM;AAC3C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,iCAAiC;AAChF,aAAO,wBAAwB,aAAa,CAAC,CAAC;AAAA,IAClD,CAAC;AAED,SAAK,IAAI,eAAe,CAAC,EAAE,aAAa,MAAM;AAC1C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,gCAAgC;AAC/E,aAAO,oBAAoB,aAAa,CAAC,CAAC;AAAA,IAC9C,CAAC;AAED,SAAK,IAAI,gBAAgB,CAAC,EAAE,aAAa,MAAM;AAC3C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,iCAAiC;AAChF,aAAO,qBAAqB,aAAa,CAAC,CAAC;AAAA,IAC/C,CAAC;AAED,SAAK,IAAI,cAAc,CAAC,EAAE,MAAM,aAAa,MAAM;AAC/C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,6CAA6C;AAC5F,YAAM,CAAC,EAAE,IAAI,IAAI;AACjB,YAAM,UAAU,KAAK,KAAK,CAAC;AAC3B,YAAM,YAAY,OAAO,QAAQ,KAAK,EAAE,QAAQ,SAAS,EAAE,EAAE,YAAY;AACzE,aAAO,eAAe,SAAS,MAAM,IAAI;AAAA,IAC7C,CAAC;AAED,SAAK,IAAI,gBAAgB,SAAO;AAC5B,YAAM,MAAM,IAAI,aAAa,CAAC;AAC9B,YAAM,cAAc,KAAK,uBAAuB,GAAG;AACnD,YAAM,eAAe,cAAc,IAAI,WAAW,KAAK;AACvD,YAAM,mBAAmB,KAAK,+BAA+B,GAAG;AAChE,YAAM,YAAY,IAAI,eAAe,gBAAgB;AACrD,aAAO,cAAc,GAAG,KAAK,SAAS,GAAG,YAAY;AAAA,IACzD,CAAC;AAAA,EACL;AACJ;;;AC/FO,IAAM,kBAAN,cAA8B,eAAe;AAAA;AAAA;AAAA;AAAA,EAK3C,cAAc;AACnB,UAAM,IAAI,yBAAyB,CAAC;AALtC,SAAmB,UAAU;AAAA,EAM7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAgB,IAAoB;AAClC,WAAO,IAAI,EAAE;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOU,gBAAgB,MAA4B;AACpD,UAAMC,OAAM,GAAG,KAAK,gBAAgB,KAAK,OAAO,KAAK,CAAC,IAAI,KAAK,gBAAgB,KAAK,OAAO,IAAI,CAAC;AAEhG,WAAO,GAAGA,IAAG,OAAO,KAAK,IAAI;AAAA,EAC/B;AAAA,EAEU,iBAAiB,WAAqC,KAA8B;AAC5F,QAAI,CAAC,aAAa,UAAU,WAAW,EAAG,QAAO;AACjD,UAAM,UAAU,KAAK,uBAAuB,SAAS;AACrD,WAAO,cAAc,OAAO;AAAA,EAC9B;AAAA,EAEA,oBAA6B;AAC3B,WAAO;AAAA,EACT;AACF;;;AC1CO,IAAM,wBAAN,cAAoC,yBAAyB;AAAA,EAChE,cAAc;AACV,UAAM;AACN,SAAK,kBAAkB;AAAA,EAC3B;AAAA,EAEQ,oBAAoB;AAIxB,SAAK,IAAI,OAAO,MAAM,OAAO;AAC7B,SAAK,IAAI,gBAAgB,MAAM,WAAW;AAC1C,SAAK,IAAI,gBAAgB,MAAM,WAAW;AAC1C,SAAK,IAAI,WAAW,MAAM,iBAAiB;AAE3C,SAAK,IAAI,WAAW,CAAC,EAAE,aAAa,MAAM;AACtC,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,0CAA0C;AACzF,YAAM,CAAC,MAAM,IAAI,IAAI;AACrB,YAAM,YAAY,KAAK,QAAQ,SAAS,EAAE;AAC1C,aAAO,WAAW,SAAS,SAAS,IAAI;AAAA,IAC5C,CAAC;AAED,SAAK,IAAI,QAAQ,CAAC,EAAE,aAAa,MAAM;AACnC,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,yBAAyB;AACxE,aAAO,QAAQ,aAAa,CAAC,CAAC;AAAA,IAClC,CAAC;AAED,SAAK,IAAI,SAAS,CAAC,EAAE,aAAa,MAAM;AACpC,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,0BAA0B;AACzE,aAAO,SAAS,aAAa,CAAC,CAAC;AAAA,IACnC,CAAC;AAED,SAAK,IAAI,OAAO,CAAC,EAAE,aAAa,MAAM;AAClC,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,wBAAwB;AACvE,aAAO,OAAO,aAAa,CAAC,CAAC;AAAA,IACjC,CAAC;AAED,SAAK,IAAI,YAAY,CAAC,EAAE,MAAM,aAAa,MAAM;AAC7C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,qDAAqD;AACpG,YAAM,CAAC,MAAM,QAAQ,IAAI;AACzB,YAAM,UAAU,KAAK,KAAK,CAAC;AAC3B,YAAM,YAAY,OAAO,QAAQ,KAAK,EAAE,QAAQ,SAAS,EAAE,EAAE,YAAY;AACzE,aAAO,YAAY,IAAI,cAAc,QAAQ,IAAI,SAAS;AAAA,IAC9D,CAAC;AAED,SAAK,IAAI,YAAY,CAAC,EAAE,MAAM,aAAa,MAAM;AAC7C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,qDAAqD;AACpG,YAAM,CAAC,MAAM,QAAQ,IAAI;AACzB,YAAM,UAAU,KAAK,KAAK,CAAC;AAC3B,YAAM,YAAY,OAAO,QAAQ,KAAK,EAAE,QAAQ,SAAS,EAAE,EAAE,YAAY;AACzE,aAAO,YAAY,IAAI,cAAc,QAAQ,IAAI,SAAS;AAAA,IAC9D,CAAC;AAED,SAAK,IAAI,aAAa,CAAC,EAAE,aAAa,MAAM;AACxC,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,+BAA+B;AAC9E,YAAM,CAAC,OAAO,KAAK,IAAI;AACvB,aAAO,YAAY,KAAK,KAAK,KAAK;AAAA,IACtC,CAAC;AAED,SAAK,IAAI,eAAe,CAAC,EAAE,aAAa,MAAM;AAC1C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,iCAAiC;AAChF,YAAM,CAAC,MAAM,MAAM,IAAI;AACvB,aAAO,eAAe,IAAI,KAAK,MAAM;AAAA,IACzC,CAAC;AAED,SAAK,IAAI,gBAAgB,CAAC,EAAE,aAAa,MAAM;AAC3C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,iCAAiC;AAChF,aAAO,YAAY,aAAa,CAAC,CAAC;AAAA,IACtC,CAAC;AAED,SAAK,IAAI,eAAe,CAAC,EAAE,aAAa,MAAM;AAC1C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,gCAAgC;AAC/E,aAAO,aAAa,aAAa,CAAC,CAAC;AAAA,IACvC,CAAC;AAED,SAAK,IAAI,gBAAgB,CAAC,EAAE,aAAa,MAAM;AAC3C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,iCAAiC;AAChF,aAAO,cAAc,aAAa,CAAC,CAAC;AAAA,IACxC,CAAC;AAED,SAAK,IAAI,cAAc,CAAC,EAAE,MAAM,aAAa,MAAM;AAC/C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,6CAA6C;AAC5F,YAAM,CAAC,EAAE,IAAI,IAAI;AACjB,YAAM,UAAU,KAAK,KAAK,CAAC;AAC3B,YAAM,YAAY,OAAO,QAAQ,KAAK,EAAE,QAAQ,SAAS,EAAE,EAAE,YAAY;AAEzE,UAAI,cAAc,QAAQ;AACtB,eAAO,eAAe,IAAI;AAAA,MAC9B,WAAW,cAAc,SAAS;AAC9B,eAAO,eAAe,IAAI;AAAA,MAC9B,WAAW,cAAc,OAAO;AAC5B,eAAO,QAAQ,IAAI;AAAA,MACvB;AACA,aAAO,QAAQ,IAAI;AAAA,IACvB,CAAC;AAAA,EACL;AACJ;;;AC7FO,IAAM,eAAN,cAA2B,eAAe;AAAA;AAAA;AAAA;AAAA,EAKxC,cAAc;AACnB,UAAM,IAAI,sBAAsB,CAAC;AALnC,SAAmB,UAAU;AAAA,EAM7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAgB,IAAoB;AAClC,WAAO,KAAK,EAAE;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOU,gBAAgB,MAA4B;AACpD,UAAMC,OAAM,GAAG,KAAK,gBAAgB,KAAK,OAAO,KAAK,CAAC,IAAI,KAAK,gBAAgB,KAAK,OAAO,IAAI,CAAC;AAEhG,WAAO,GAAGA,IAAG,MAAM,KAAK,IAAI;AAAA,EAC9B;AACF;;;AC/BO,IAAM,yBAAN,cAAqC,yBAAyB;AAAA,EACjE,cAAc;AACV,UAAM;AACN,SAAK,kBAAkB;AAAA,EAC3B;AAAA,EAEQ,oBAAoB;AAIxB,SAAK,IAAI,OAAO,MAAM,8BAA8B;AACpD,SAAK,IAAI,gBAAgB,MAAM,0BAA0B;AACzD,SAAK,IAAI,gBAAgB,MAAM,0BAA0B;AACzD,SAAK,IAAI,WAAW,MAAM,iBAAiB;AAE3C,SAAK,IAAI,WAAW,CAAC,EAAE,aAAa,MAAM;AACtC,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,0CAA0C;AACzF,YAAM,CAAC,MAAM,IAAI,IAAI;AAErB,YAAM,YAAY,KAAK,QAAQ,SAAS,EAAE,EAAE,YAAY;AACxD,YAAM,YAAoC;AAAA,QACtC,QAAQ;AAAA,QAAM,SAAS;AAAA,QAAM,OAAO;AAAA,QACpC,QAAQ;AAAA,QAAM,UAAU;AAAA,QAAM,UAAU;AAAA,QACxC,OAAO;AAAA,QAAM,QAAQ;AAAA,MACzB;AACA,YAAM,SAAS,UAAU,SAAS,KAAK;AACvC,aAAO,kBAAkB,MAAM,MAAM,IAAI;AAAA,IAC7C,CAAC;AAED,SAAK,IAAI,QAAQ,CAAC,EAAE,aAAa,MAAM;AACnC,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,yBAAyB;AACxE,aAAO,uBAAuB,aAAa,CAAC,CAAC;AAAA,IACjD,CAAC;AAED,SAAK,IAAI,SAAS,CAAC,EAAE,aAAa,MAAM;AACpC,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,0BAA0B;AACzE,aAAO,uBAAuB,aAAa,CAAC,CAAC;AAAA,IACjD,CAAC;AAED,SAAK,IAAI,OAAO,CAAC,EAAE,aAAa,MAAM;AAClC,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,wBAAwB;AACvE,aAAO,uBAAuB,aAAa,CAAC,CAAC;AAAA,IACjD,CAAC;AAED,SAAK,IAAI,YAAY,CAAC,EAAE,MAAM,aAAa,MAAM;AAC7C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,qDAAqD;AACpG,YAAM,CAAC,MAAM,QAAQ,IAAI;AACzB,YAAM,UAAU,KAAK,KAAK,CAAC;AAC3B,YAAM,YAAY,OAAO,QAAQ,KAAK,EAAE,QAAQ,SAAS,EAAE,EAAE,YAAY;AACzE,aAAO,YAAY,IAAI,YAAY,QAAQ,SAAS,SAAS;AAAA,IACjE,CAAC;AAED,SAAK,IAAI,YAAY,CAAC,EAAE,MAAM,aAAa,MAAM;AAC7C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,qDAAqD;AACpG,YAAM,CAAC,MAAM,QAAQ,IAAI;AACzB,YAAM,UAAU,KAAK,KAAK,CAAC;AAC3B,YAAM,YAAY,OAAO,QAAQ,KAAK,EAAE,QAAQ,SAAS,EAAE,EAAE,YAAY;AACzE,aAAO,YAAY,IAAI,YAAY,QAAQ,SAAS,SAAS;AAAA,IACjE,CAAC;AAED,SAAK,IAAI,aAAa,CAAC,EAAE,aAAa,MAAM;AACxC,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,+BAA+B;AAC9E,YAAM,CAAC,OAAO,KAAK,IAAI;AACvB,aAAO,kBAAkB,KAAK,iBAAiB,KAAK;AAAA,IACxD,CAAC;AAED,SAAK,IAAI,eAAe,CAAC,EAAE,aAAa,MAAM;AAC1C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,iCAAiC;AAChF,YAAM,CAAC,MAAM,MAAM,IAAI;AACvB,aAAO,YAAY,MAAM,KAAK,IAAI;AAAA,IACtC,CAAC;AAED,SAAK,IAAI,kBAAkB,MAAM,wCAAwC;AAEzE,SAAK,IAAI,iBAAiB,CAAC,EAAE,aAAa,MAAM;AAC5C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,kCAAkC;AACjF,aAAO,YAAY,aAAa,CAAC,CAAC;AAAA,IACtC,CAAC;AAED,SAAK,IAAI,gBAAgB,CAAC,EAAE,aAAa,MAAM;AAC3C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,iCAAiC;AAChF,aAAO,QAAQ,aAAa,CAAC,CAAC;AAAA,IAClC,CAAC;AAED,SAAK,IAAI,eAAe,CAAC,EAAE,aAAa,MAAM;AAC1C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,gCAAgC;AAC/E,aAAO,uBAAuB,aAAa,CAAC,CAAC;AAAA,IACjD,CAAC;AAED,SAAK,IAAI,gBAAgB,CAAC,EAAE,aAAa,MAAM;AAC3C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,iCAAiC;AAChF,aAAO,uBAAuB,aAAa,CAAC,CAAC;AAAA,IACjD,CAAC;AAED,SAAK,IAAI,cAAc,CAAC,EAAE,MAAM,aAAa,MAAM;AAC/C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,6CAA6C;AAC5F,YAAM,CAAC,EAAE,IAAI,IAAI;AACjB,YAAM,UAAU,KAAK,KAAK,CAAC;AAC3B,YAAM,YAAY,OAAO,QAAQ,KAAK,EAAE,QAAQ,SAAS,EAAE,EAAE,YAAY;AAEzE,UAAI,cAAc,QAAQ;AACtB,eAAO,QAAQ,IAAI;AAAA,MACvB,WAAW,cAAc,SAAS;AAC9B,eAAO,QAAQ,IAAI;AAAA,MACvB,WAAW,cAAc,OAAO;AAC5B,eAAO,QAAQ,IAAI;AAAA,MACvB;AACA,aAAO,QAAQ,IAAI,eAAe,SAAS;AAAA,IAC/C,CAAC;AAED,SAAK,IAAI,gBAAgB,SAAO;AAC5B,YAAM,MAAM,IAAI,aAAa,CAAC;AAC9B,YAAM,mBAAmB,KAAK,+BAA+B,GAAG;AAChE,YAAM,YAAY,IAAI,eAAe,gBAAgB;AACrD,aAAO,gBAAgB,GAAG,KAAK,SAAS;AAAA,IAC5C,CAAC;AAAA,EACL;AACJ;;;ACjHO,IAAM,gBAAN,cAA4B,eAAe;AAAA;AAAA;AAAA;AAAA,EAKzC,cAAc;AACnB,UAAM,IAAI,uBAAuB,CAAC;AALpC,SAAmB,UAAU;AAAA,EAM7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAgB,IAAoB;AAClC,WAAO,IAAI,EAAE;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOU,gBAAgB,MAA4B;AACpD,UAAMC,OAAM,GAAG,KAAK,gBAAgB,KAAK,OAAO,KAAK,CAAC,IAAI,KAAK,gBAAgB,KAAK,OAAO,IAAI,CAAC;AAEhG,WAAO,gBAAgBA,IAAG,MAAM,KAAK,IAAI;AAAA,EAC3C;AAAA,EAEU,iBAAiB,WAAqC,KAA8B;AAC5F,QAAI,CAAC,aAAa,UAAU,WAAW,EAAG,QAAO;AACjD,UAAM,UAAU,KAAK,uBAAuB,SAAS;AACrD,WAAO,cAAc,OAAO;AAAA,EAC9B;AAAA,EAEU,uBAAuB,WAAiC;AAChE,WAAO,UACJ,IAAI,YAAU;AACb,YAAM,QAAQ,OAAO,QAAQ,OAAO,KAAK,gBAAgB,OAAO,KAAK,CAAC,KAAK;AAC3E,aAAO,GAAG,KAAK,gBAAgB,OAAO,IAAI,CAAC,GAAG,KAAK;AAAA,IACrD,CAAC,EACA,KAAK,IAAI;AAAA,EACd;AAAA,EAEA,oBAA6B;AAC3B,WAAO;AAAA,EACT;AACF;;;ACnDO,IAAM,wBAAN,cAAoC,yBAAyB;AAAA,EAChE,cAAc;AACV,UAAM;AACN,SAAK,kBAAkB;AAAA,EAC3B;AAAA,EAEQ,oBAAoB;AAIxB,SAAK,IAAI,OAAO,MAAM,WAAW;AACjC,SAAK,IAAI,gBAAgB,MAAM,yBAAyB;AACxD,SAAK,IAAI,gBAAgB,MAAM,yBAAyB;AACxD,SAAK,IAAI,WAAW,MAAM,cAAc;AAExC,SAAK,IAAI,WAAW,CAAC,EAAE,aAAa,MAAM;AACtC,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,0CAA0C;AACzF,YAAM,CAAC,MAAM,IAAI,IAAI;AACrB,YAAM,YAAY,KAAK,QAAQ,SAAS,EAAE,EAAE,YAAY;AACxD,aAAO,YAAY,SAAS,KAAK,IAAI;AAAA,IACzC,CAAC;AAED,SAAK,IAAI,QAAQ,CAAC,EAAE,aAAa,MAAM;AACnC,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,yBAAyB;AACxE,aAAO,QAAQ,aAAa,CAAC,CAAC;AAAA,IAClC,CAAC;AAED,SAAK,IAAI,SAAS,CAAC,EAAE,aAAa,MAAM;AACpC,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,0BAA0B;AACzE,aAAO,SAAS,aAAa,CAAC,CAAC;AAAA,IACnC,CAAC;AAED,SAAK,IAAI,OAAO,CAAC,EAAE,aAAa,MAAM;AAClC,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,wBAAwB;AACvE,aAAO,OAAO,aAAa,CAAC,CAAC;AAAA,IACjC,CAAC;AAED,SAAK,IAAI,YAAY,CAAC,EAAE,MAAM,aAAa,MAAM;AAC7C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,qDAAqD;AACpG,YAAM,CAAC,MAAM,QAAQ,IAAI;AACzB,YAAM,UAAU,KAAK,KAAK,CAAC;AAC3B,YAAM,YAAY,OAAO,QAAQ,KAAK,EAAE,QAAQ,SAAS,EAAE,EAAE,YAAY;AACzE,aAAO,WAAW,SAAS,KAAK,QAAQ,KAAK,IAAI;AAAA,IACrD,CAAC;AAED,SAAK,IAAI,YAAY,CAAC,EAAE,MAAM,aAAa,MAAM;AAC7C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,qDAAqD;AACpG,YAAM,CAAC,MAAM,QAAQ,IAAI;AACzB,YAAM,UAAU,KAAK,KAAK,CAAC;AAC3B,YAAM,YAAY,OAAO,QAAQ,KAAK,EAAE,QAAQ,SAAS,EAAE,EAAE,YAAY;AACzE,aAAO,WAAW,SAAS,MAAM,QAAQ,KAAK,IAAI;AAAA,IACtD,CAAC;AAED,SAAK,IAAI,aAAa,CAAC,EAAE,aAAa,MAAM;AACxC,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,+BAA+B;AAC9E,YAAM,CAAC,OAAO,KAAK,IAAI;AACvB,aAAO,iBAAiB,KAAK,KAAK,KAAK;AAAA,IAC3C,CAAC;AAED,SAAK,IAAI,eAAe,CAAC,EAAE,aAAa,MAAM;AAC1C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,iCAAiC;AAChF,YAAM,CAAC,MAAM,MAAM,IAAI;AACvB,aAAO,UAAU,IAAI,KAAK,MAAM;AAAA,IACpC,CAAC;AAED,SAAK,IAAI,kBAAkB,MAAM,8CAA8C;AAE/E,SAAK,IAAI,iBAAiB,CAAC,EAAE,aAAa,MAAM;AAC5C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,kCAAkC;AACjF,aAAO,mBAAmB,aAAa,CAAC,CAAC;AAAA,IAC7C,CAAC;AAED,SAAK,IAAI,gBAAgB,CAAC,EAAE,aAAa,MAAM;AAC3C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,iCAAiC;AAChF,aAAO,WAAW,aAAa,CAAC,CAAC;AAAA,IACrC,CAAC;AAED,SAAK,IAAI,eAAe,CAAC,EAAE,aAAa,MAAM;AAC1C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,gCAAgC;AAC/E,aAAO,gBAAgB,aAAa,CAAC,CAAC;AAAA,IAC1C,CAAC;AAED,SAAK,IAAI,gBAAgB,CAAC,EAAE,aAAa,MAAM;AAC3C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,iCAAiC;AAChF,aAAO,gBAAgB,aAAa,CAAC,CAAC;AAAA,IAC1C,CAAC;AAED,SAAK,IAAI,cAAc,CAAC,EAAE,MAAM,aAAa,MAAM;AAC/C,UAAI,aAAa,WAAW,EAAG,OAAM,IAAI,MAAM,6CAA6C;AAC5F,YAAM,CAAC,EAAE,IAAI,IAAI;AACjB,YAAM,UAAU,KAAK,KAAK,CAAC;AAC3B,YAAM,YAAY,OAAO,QAAQ,KAAK,EAAE,QAAQ,SAAS,EAAE,EAAE,YAAY;AAEzE,aAAO,aAAa,SAAS,KAAK,IAAI;AAAA,IAC1C,CAAC;AAED,SAAK,IAAI,gBAAgB,SAAO;AAC5B,YAAM,MAAM,IAAI,aAAa,CAAC;AAC9B,YAAM,mBAAmB,KAAK,+BAA+B,GAAG;AAChE,YAAM,YAAY,IAAI,eAAe,gBAAgB;AACrD,YAAM,cAAc,KAAK,uBAAuB,GAAG;AACnD,YAAM,cAAc,cAAc,kBAAkB,WAAW,MAAM;AACrE,aAAO,cAAc,GAAG,KAAK,SAAS,IAAI,WAAW;AAAA,IACzD,CAAC;AAAA,EACL;AACJ;;;ACpGO,IAAM,mBAAN,cAA+B,QAAQ;AAAA;AAAA;AAAA;AAAA,EAKrC,cAAc;AACnB,UAAM,IAAI,sBAAsB,CAAC;AALnC,SAAmB,UAAU;AAAA,EAM7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAgB,IAAoB;AAClC,WAAO,IAAI,EAAE;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOU,gBAAgB,MAA4B;AACpD,UAAMC,OAAM,GAAG,KAAK,gBAAgB,KAAK,OAAO,KAAK,CAAC,IAAI,KAAK,gBAAgB,KAAK,OAAO,IAAI,CAAC;AAEhG,WAAO,cAAcA,IAAG,MAAM,KAAK,IAAI;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOU,kBAAkB,OAAuB;AACjD,WAAO,KAAK,KAAK;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQU,iBAAiB,KAAsB,KAA8B;AAC7E,UAAM,YAAY,CAAC,EAAE,IAAI,UAAU,IAAI,OAAO;AAC9C,UAAM,OAAO,KAAK,YAAY,KAAK,GAAG;AAEtC,UAAM,UAA2B,YAC7B,EAAE,GAAG,KAAK,QAAQ,QAAW,SAAS,QAAW,OAAO,QAAW,QAAQ,OAAU,IACrF;AAEJ,UAAM,aAAa,KAAK,kBAAkB,SAAS,GAAG;AAEtD,QAAI,CAAC,WAAW;AACd,aAAO,GAAG,IAAI,GAAG,UAAU;AAAA,IAC7B;AAEA,UAAM,WAAW,IAAI,OAClB,IAAI,QAAM,GAAG,GAAG,QAAQ,IAAI,KAAK,eAAe,KAAK,iBAAiB,GAAG,OAAO,GAAG,CAAC,CAAC,EAAE,EACvF,KAAK,GAAG;AAEX,UAAM,UAAU,KAAK,eAAe,GAAG;AACvC,UAAM,aAAa,KAAK,kBAAkB,KAAK,OAAO;AACtD,UAAM,WAAW,GAAG,KAAK,eAAe,UAAU,CAAC,IAAI,QAAQ;AAC/D,UAAM,OAAO,cAAc;AAC3B,WAAO,GAAG,IAAI,GAAG,QAAQ,GAAG,IAAI;AAAA,EAClC;AAAA,EAEU,iBAAiB,KAAsB,KAA8B;AAC7E,UAAM,QAAQ,KAAK,gBAAgB,IAAI,KAAK,IAAI;AAChD,UAAM,aAAa,IAAI,QAAQ,IAAI,YAAU,GAAG,KAAK,gBAAgB,OAAO,KAAK,CAAC,IAAI,KAAK,gBAAgB,OAAO,IAAI,CAAC,EAAE,EAAE,KAAK,IAAI;AACpI,UAAM,SAAS,IAAI,OAAO,IAAI,SAAO,IAAI,IAAI,IAAI,WAAS,KAAK,eAAe,OAAO,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI;AACnH,WAAO,eAAe,KAAK,KAAK,UAAU,YAAY,MAAM;AAAA,EAC9D;AAAA,EAEU,iBAAiB,KAAsB,KAA8B;AAC7E,UAAM,QAAQ,KAAK,gBAAgB,IAAI,MAAM,IAAI;AACjD,UAAM,cAAc,IAAI,IAAI,IAAI,gBAAc;AAC5C,YAAMA,OAAM,WAAW;AACvB,YAAM,SAAS,GAAG,KAAK,gBAAgBA,KAAI,KAAK,CAAC,IAAI,KAAK,gBAAgBA,KAAI,IAAI,CAAC;AACnF,YAAM,QAAQ,KAAK,eAAe,WAAW,OAAO,GAAG;AACvD,aAAO,GAAG,MAAM,MAAM,KAAK;AAAA,IAC7B,CAAC,EAAE,KAAK,IAAI;AACZ,UAAM,cAAc,KAAK,aAAa,IAAI,OAAO,GAAG;AACpD,WAAO,UAAU,KAAK,QAAQ,WAAW,GAAG,WAAW;AAAA,EACzD;AAAA,EAEU,iBAAiB,KAAsB,KAA8B;AAC7E,QAAI,IAAI,KAAK,SAAS,SAAS;AAC7B,YAAM,IAAI,MAAM,wDAAwD;AAAA,IAC1E;AACA,UAAM,QAAQ,KAAK,gBAAgB,IAAI,KAAK,IAAI;AAChD,UAAM,cAAc,KAAK,aAAa,IAAI,OAAO,GAAG;AACpD,WAAO,eAAe,KAAK,GAAG,WAAW;AAAA,EAC3C;AAAA,EAEQ,kBAAkB,KAAsB,KAA8B;AAC5E,UAAM,UAAU,IAAI,QAAQ,IAAI,OAAK;AACnC,UAAI,OAAO;AACX,UAAI,EAAE,SAAS,YAAY;AACzB,eAAO,KAAK,eAAe,GAAG,GAAG;AAAA,MACnC,WAAW,EAAE,SAAS,UAAU;AAC9B,eAAO,GAAG,KAAK,gBAAgB,EAAE,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,IAAI,CAAC;AAAA,MACzE,WAAW,EAAE,SAAS,kBAAkB;AACtC,eAAO,KAAK,eAAe,GAAG,GAAG;AAAA,MACnC,WAAW,EAAE,SAAS,kBAAkB;AACtC,eAAO,KAAK,eAAe,GAAG,GAAG;AAAA,MACnC;AAEA,UAAI,EAAE,OAAO;AACX,YAAI,EAAE,MAAM,SAAS,GAAG,EAAG,QAAO,EAAE;AACpC,eAAO,GAAG,IAAI,OAAO,KAAK,gBAAgB,EAAE,KAAK,CAAC;AAAA,MACpD;AACA,aAAO;AAAA,IACT,CAAC,EAAE,KAAK,IAAI;AAEZ,UAAM,WAAW,IAAI,WAAW,cAAc;AAC9C,UAAM,OAAO,KAAK,mBAAmB,IAAI,MAAM,GAAG;AAElD,UAAM,QAAQ,IAAI,MAAM,IAAI,OAAK;AAC/B,YAAM,QAAQ,KAAK,mBAAmB,EAAE,OAAO,GAAG;AAClD,YAAM,OAAO,KAAK,kBAAkB,EAAE,WAAW,GAAG;AACpD,aAAO,GAAG,EAAE,IAAI,SAAS,KAAK,OAAO,IAAI;AAAA,IAC3C,CAAC,EAAE,KAAK,GAAG;AACX,UAAM,cAAc,KAAK,aAAa,IAAI,OAAO,GAAG;AAEpD,UAAM,UAAU,IAAI,WAAW,IAAI,QAAQ,SAAS,IAChD,eAAe,IAAI,QAAQ,IAAI,OAAK,GAAG,KAAK,gBAAgB,EAAE,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,IAAI,IACjH;AAEJ,UAAM,SAAS,IAAI,SACf,WAAW,KAAK,kBAAkB,IAAI,QAAQ,GAAG,CAAC,KAClD;AAEJ,UAAM,UAAU,KAAK,eAAe,GAAG;AACvC,UAAM,aAAa,KAAK,kBAAkB,KAAK,OAAO;AAEtD,QAAI,YAAY;AACd,aAAO,UAAU,QAAQ,GAAG,OAAO,SAAS,IAAI,GAAG,QAAQ,MAAM,QAAQ,EAAE,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU;AAAA,IAC3H;AAEA,WAAO,UAAU,QAAQ,GAAG,OAAO,SAAS,IAAI,GAAG,QAAQ,MAAM,QAAQ,EAAE,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO;AAAA,EACxH;AAAA,EAEQ,eAAe,KAA8B;AACnD,QAAI,CAAC,IAAI,WAAW,IAAI,QAAQ,WAAW,EAAG,QAAO;AACrD,WAAO,eAAe,IAAI,QACvB,IAAI,OAAK,GAAG,KAAK,gBAAgB,EAAE,OAAO,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,EACxG,KAAK,IAAI;AAAA,EACd;AAAA,EAEQ,kBAAkB,KAAsB,SAAyB;AACvE,UAAM,WAAW,IAAI,UAAU;AAC/B,UAAM,YAAY,IAAI,WAAW;AACjC,QAAI,CAAC,YAAY,CAAC,UAAW,QAAO;AAEpC,UAAM,MAAM,IAAI,UAAU;AAC1B,UAAM,cAAc,WAAW;AAC/B,QAAI,aAAa,GAAG,WAAW,WAAW,GAAG;AAC7C,QAAI,UAAU;AACZ,oBAAc,eAAe,IAAI,KAAK;AAAA,IACxC;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,mBAAmB,OAAwB,KAA8B;AAC/E,QAAI,MAAM,SAAS,iBAAiB;AAClC,aAAO,uBAAuB,OAAO,OAAO,KAAK,IAAW;AAAA,IAC9D;AACA,QAAI,MAAM,SAAS,gBAAgB;AACjC,aAAO,KAAK,oBAAoB,OAAO,GAAG;AAAA,IAC5C;AACA,UAAM,OAAO,MAAM,SACf,GAAG,KAAK,gBAAgB,MAAM,MAAM,CAAC,IAAI,KAAK,gBAAgB,MAAM,IAAI,CAAC,KACzE,KAAK,gBAAgB,MAAM,IAAI;AACnC,WAAO,MAAM,QAAQ,GAAG,IAAI,OAAO,KAAK,gBAAgB,MAAM,KAAK,CAAC,KAAK;AAAA,EAC3E;AAAA,EAEQ,oBAAoB,OAAyB,KAA8B;AACjF,UAAM,MAAM,KAAK,iBAAiB,KAAK,mBAAmB,MAAM,KAAK,GAAG,GAAG,EAAE,KAAK,EAAE,QAAQ,MAAM,EAAE;AACpG,UAAM,OAAO,MAAM,eAAe,SAC9B,KAAK,MAAM,cAAc,IAAI,OAAK,KAAK,gBAAgB,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,MACrE;AACJ,WAAO,IAAI,GAAG,QAAQ,KAAK,gBAAgB,MAAM,KAAK,CAAC,GAAG,IAAI;AAAA,EAChE;AAAA,EAEQ,YAAY,KAAsB,KAA8B;AACtE,QAAI,CAAC,IAAI,QAAQ,IAAI,KAAK,WAAW,EAAG,QAAO;AAE/C,UAAM,OAAO,IAAI,KAAK,IAAI,SAAO;AAC/B,YAAM,OAAO,KAAK,gBAAgB,IAAI,IAAI;AAC1C,YAAM,OAAO,IAAI,UAAU,IAAI,IAAI,QAAQ,IAAI,OAAK,KAAK,gBAAgB,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,MAAM;AAC7F,YAAM,QAAQ,KAAK,iBAAiB,KAAK,mBAAmB,IAAI,KAAK,GAAG,GAAG,EAAE,KAAK,EAAE,QAAQ,MAAM,EAAE;AACpG,aAAO,GAAG,IAAI,GAAG,IAAI,QAAQ,KAAK;AAAA,IACpC,CAAC,EAAE,KAAK,IAAI;AACZ,WAAO,QAAQ,IAAI;AAAA,EACrB;AAAA,EAEQ,eAAe,KAAqB;AAC1C,UAAM,UAAU,IAAI,KAAK,EAAE,QAAQ,MAAM,EAAE;AAC3C,WAAO,IAAI,OAAO;AAAA,EACpB;AACF;;;AClMO,IAAM,iBAAN,MAAqB;AAAA,EAC1B;AAAA,SAAe,WAAW,oBAAI,IAAkC;AAAA;AAAA,EAChE;AAAA,SAAe,sBAAsB;AAAA;AAAA,EAErC,OAAe,iBAAuB;AACpC,QAAI,KAAK,oBAAqB;AAC9B,SAAK,sBAAsB;AAG3B,QAAI,CAAC,KAAK,SAAS,IAAI,UAAU,GAAG;AAClC,WAAK,SAAS,IAAI,YAAY,MAAM,IAAI,gBAAgB,CAAC;AAAA,IAC3D;AACA,QAAI,CAAC,KAAK,SAAS,IAAI,OAAO,GAAG;AAC/B,WAAK,SAAS,IAAI,SAAS,MAAM,IAAI,aAAa,CAAC;AAAA,IACrD;AACA,QAAI,CAAC,KAAK,SAAS,IAAI,QAAQ,GAAG;AAChC,WAAK,SAAS,IAAI,UAAU,MAAM,IAAI,cAAc,CAAC;AAAA,IACvD;AACA,QAAI,CAAC,KAAK,SAAS,IAAI,OAAO,GAAG;AAC/B,WAAK,SAAS,IAAI,SAAS,MAAM,IAAI,iBAAiB,CAAC;AAAA,IACzD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAc,SAAS,KAAiB,SAAiC;AACvE,SAAK,SAAS,IAAI,KAAK,OAAO;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAc,OAAO,KAA0B;AAC7C,SAAK,eAAe;AACpB,UAAM,UAAU,KAAK,SAAS,IAAI,GAAG;AACrC,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI;AAAA,QACR,YAAY;AAAA,UACV;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AACA,WAAO,QAAQ;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAc,QAAc;AAC1B,SAAK,SAAS,MAAM;AACpB,SAAK,sBAAsB;AAAA,EAC7B;AACF;AAMO,IAAM,sBAAsB,CACjC,YACY;AACZ,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO,eAAe,OAAO,OAAO;AAAA,EACtC;AACA,SAAO;AACT;;;ACjEO,IAAM,mBAAN,MAAM,kBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAe5B,YAAY,OAAiB,KAAuB;AAClD,SAAK,QAAQ;AACb,SAAK,MAAM,OAAO;AAAA,MAChB,MAAM;AAAA,MACN,MAAM,EAAE,MAAM,SAAS,MAAM,MAAM,KAAK;AAAA,MACxC,SAAS,CAAC;AAAA,MACV,OAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,MAAM,SAA4C;AACxD,WAAO,IAAI,kBAAiB,KAAK,OAAO,OAAO;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,SAA6C;AACvD,WAAO,KAAK,MAAM;AAAA,MAChB,GAAG,KAAK;AAAA,MACR,SAAS,CAAC,GAAI,KAAK,IAAI,WAAW,CAAC,GAAI,GAAG,OAAO;AAAA,IACnD,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,MAAkC;AACzC,WAAO,KAAK,MAAM;AAAA,MAChB,GAAG,KAAK;AAAA,MACR,OAAO,CAAC,GAAI,KAAK,IAAI,SAAS,CAAC,GAAI,IAAI;AAAA,IACzC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,MAAyC;AAChD,WAAO,KAAK,MAAM;AAAA,MAChB,GAAG,KAAK;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,WAA6C;AACrD,WAAO,KAAK,MAAM;AAAA,MAChB,GAAG,KAAK;AAAA,MACR,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,WAA6C;AACtD,WAAO,KAAK,MAAM;AAAA,MAChB,GAAG,KAAK;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,SAAyC;AACnD,WAAO,KAAK,MAAM;AAAA,MAChB,GAAG,KAAK;AAAA,MACR,SAAS,CAAC,GAAI,KAAK,IAAI,WAAW,CAAC,GAAI,GAAG,OAAO;AAAA,IACnD,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,SAA0C;AACpD,WAAO,KAAK,MAAM;AAAA,MAChB,GAAG,KAAK;AAAA,MACR,SAAS,CAAC,GAAI,KAAK,IAAI,WAAW,CAAC,GAAI,GAAG,OAAO;AAAA,IACnD,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,SAAyC;AACpD,WAAO,KAAK,MAAM;AAAA,MAChB,GAAG,KAAK;AAAA,MACR,UAAU,CAAC,GAAI,KAAK,IAAI,YAAY,CAAC,GAAI,GAAG,OAAO;AAAA,IACrD,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,OAAiC;AACzC,WAAO,KAAK,MAAM;AAAA,MAChB,GAAG,KAAK;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,QAAkC;AAC3C,WAAO,KAAK,MAAM;AAAA,MAChB,GAAG,KAAK;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,KAAkD;AACxD,WAAO,KAAK,MAAM;AAAA,MAChB,GAAG,KAAK;AAAA,MACR,MAAM,CAAC,GAAI,KAAK,IAAI,QAAQ,CAAC,GAAI,GAAG;AAAA,IACtC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiB,IAAwC;AACvD,WAAO,KAAK,MAAM;AAAA,MAChB,GAAG,KAAK;AAAA,MACR,QAAQ,CAAC,GAAI,KAAK,IAAI,UAAU,CAAC,GAAI,EAAE;AAAA,IACzC,CAAC;AAAA,EACH;AACF;;;AChMO,IAAM,iBAAiB,CAC5B,MACA,WACA,WACA,kBACc;AAAA,EACd,MAAM;AAAA,EACN;AAAA,EACA,OAAO,OAAO,cAAc,WACvB,EAAE,MAAM,SAAS,MAAM,UAAU,IACjC;AAAA,EACL;AAAA,EACA,MAAM,eAAgB,EAAE,aAAa,IAAqB;AAC5D;;;ACVO,IAAM,mBAAN,MAAM,kBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM5B,YACmB,OACA,SACjB;AAFiB;AACA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOK,MAAM,aAAiD;AAC7D,WAAO,IAAI,kBAAiB,KAAK,OAAO,WAAW;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,kBAAkB,OAAyB,YAAgD;AACzF,UAAM,UAAU,KAAK,QAAQ,mBAAmB,UAAU;AAC1D,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,mBACE,OACA,UACA,cACA,aACA,eACA,OACkB;AAClB,UAAM,YAAY,KAAK,QAAQ,mBAAmB,MAAM,IAAI,OAAO;AACnE,UAAM,OAAO,UAAU,gBAAgB,UAAU,cAAc,aAAa,eAAe,KAAK;AAChG,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,KAAuC;AAEhD,QAAI,IAAI,UAAU,IAAI,OAAO,SAAS,GAAG;AACvC,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,KAAK,QAAQ,QAAQ;AAClC,QAAI,CAAC,KAAM,QAAO;AAElB,UAAM,uBAAuB,KAAK,yBAAyB,KAAK,IAAI;AACpE,UAAM,YAAY,uBAAuB,KAAK,wBAAwB,KAAK,IAAI,IAAI;AACnF,WAAO,KAAK,oBAAoB,WAAW,IAAI;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAqC;AACnC,WAAO,KAAK,QAAQ,QAAQ;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,KAAsB,MAAsC;AACtF,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM;AAAA,QACJ,GAAI,IAAI,QAAQ,CAAC;AAAA,QACjB,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,yBAAyB,KAAsB,MAA8B;AACnF,UAAM,gBAAgB,IAAI,UAAU,UAAa,IAAI,WAAW;AAChE,WAAO,iBAAiB,KAAK,wBAAwB,IAAI;AAAA,EAC3D;AAAA,EAEQ,wBAAwB,MAA8B;AAC5D,WAAO,KAAK,UAAU;AAAA,MACpB,SAAO,IAAI,SAAS,cAAc,WAAW,IAAI,SAAS,cAAc;AAAA,IAC1E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWQ,wBAAwB,KAAsB,MAAsC;AAC1F,UAAM,kBAAkB,KAAK,mBAAmB,IAAI,OAAO;AAC3D,QAAI,CAAC,iBAAiB;AACpB,aAAO;AAAA,IACT;AAEA,UAAM,oBAAoB,KAAK,wBAAwB,IAAI,OAAO;AAClE,UAAM,gBAAgB,IAAI,IAAI,eAAe;AAC7C,UAAM,cAAc,kBAAkB,IAAI,GAAG,KAAK,SAAS,IAAI,KAAK,cAAc,EAAE,KAAK,KAAK;AAE9F,UAAM,cAAc,KAAK,YAAY,IAAI,MAAM,yBAAyB;AACxE,UAAM,YAA6B;AAAA,MACjC,GAAG;AAAA,MACH,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAEA,UAAM,UAAqC;AAAA,MACzC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,WAAW;AAAA,IACb;AAEA,UAAM,UAAU,KAAK,WAAW,IAAI,SAAS,MAAM,mBAAmB,aAAa,aAAa;AAGhG,QAAI,YAAY,MAAM;AACpB,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,KAAK,YAAY,CAAC,GAAI,IAAI,QAAQ,CAAC,GAAI,OAAO,GAAG,yBAAyB;AAC9F,UAAM,gBAAgB,KAAK,mBAAmB,aAAa,SAAS,WAAW;AAE/E,UAAM,UAAqC;AAAA,MACzC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,EAAE,MAAM,SAAS,MAAM,YAAY;AAAA,QACzC,SAAS;AAAA,QACT,OAAO,CAAC;AAAA,QACR,UAAU,CAAC,EAAE,MAAM,UAAU,OAAO,aAAa,MAAM,YAAY,CAAC;AAAA,QACpE;AAAA,QACA,OAAO,IAAI;AAAA,QACX,QAAQ,IAAI;AAAA,MACd;AAAA,MACA,WAAW;AAAA,IACb;AAEA,UAAM,gBAAgB;AAAA,MACpB,EAAE,MAAM,UAAU,OAAO,aAAa,MAAM,YAAY;AAAA,MACxD,EAAE,MAAM,UAAU,OAAO,aAAa,MAAM,YAAY;AAAA,IAC1D;AAEA,UAAM,eAA6B,gBAAgB,IAAI,WAAS;AAAA,MAC9D,MAAM;AAAA,MACN,OAAO;AAAA,MACP;AAAA,MACA,OAAO;AAAA,IACT,EAAE;AAEF,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM,EAAE,MAAM,SAAS,MAAM,YAAY;AAAA,MACzC,SAAS;AAAA,MACT,OAAO,CAAC,eAAe,WAAW,OAAO,aAAa,aAAa,CAAC;AAAA,MACpE;AAAA,MACA,MAAM,CAAC,GAAI,IAAI,QAAQ,CAAC,GAAI,SAAS,OAAO;AAAA,IAC9C;AAAA,EACF;AAAA,EAEQ,YAAY,UAAmD,UAA0B;AAC/F,UAAM,QAAQ,IAAI,KAAK,YAAY,CAAC,GAAG,IAAI,SAAO,IAAI,IAAI,CAAC;AAC3D,QAAI,YAAY;AAChB,QAAI,SAAS;AAEb,WAAO,MAAM,IAAI,SAAS,GAAG;AAC3B,gBAAU;AACV,kBAAY,GAAG,QAAQ,IAAI,MAAM;AAAA,IACnC;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,mBAAmB,SAAiD;AAC1E,UAAM,QAAkB,CAAC;AACzB,eAAWC,QAAO,SAAS;AACzB,YAAM,QAASA,KAAY,SAAUA,KAAY;AACjD,UAAI,CAAC,MAAO,QAAO;AACnB,YAAM,KAAK,KAAK;AAAA,IAClB;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,wBAAwB,SAAgD;AAC9E,UAAM,MAAM,oBAAI,IAAoB;AACpC,eAAWA,QAAO,SAAS;AACzB,UAAKA,KAAmB,SAAS,SAAU;AAC3C,YAAM,OAAOA;AACb,YAAM,MAAM,GAAG,KAAK,KAAK,IAAI,KAAK,IAAI;AACtC,UAAI,IAAI,KAAK,KAAK,SAAS,KAAK,IAAI;AAAA,IACtC;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,WACN,SACA,MACA,mBACA,WACA,kBACkC;AAClC,QAAI,CAAC,WAAW,QAAQ,WAAW,GAAG;AACpC,aAAO;AAAA,IACT;AAEA,UAAM,SAAwB,CAAC;AAE/B,eAAW,MAAM,SAAS;AAExB,UAAI,GAAG,OAAO,UAAU,KAAK,WAAW;AACtC,eAAO;AAAA,MACT;AAEA,YAAM,QAAQ,kBAAkB,IAAI,GAAG,GAAG,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,EAAE,KAAK,GAAG,OAAO;AACzF,UAAI,CAAC,iBAAiB,IAAI,KAAK,GAAG;AAChC,eAAO;AAAA,MACT;AAEA,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,QAAQ,EAAE,MAAM,UAAU,OAAO,WAAW,MAAM,MAAM;AAAA,QACxD,WAAW,GAAG;AAAA,MAChB,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,mBAAmB,YAAoB,SAAoC,YAAkC;AACnH,UAAM,UAAwB,CAAC,EAAE,MAAM,UAAU,OAAO,YAAY,MAAM,YAAY,OAAO,WAAW,CAAC;AAEzG,QAAI,CAAC,QAAS,QAAO;AAErB,eAAW,MAAM,SAAS;AACxB,UAAI,CAAC,QAAQ,KAAK,CAAAA,SAAOA,KAAI,SAAS,GAAG,OAAO,IAAI,GAAG;AACrD,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,OAAO;AAAA,UACP,MAAM,GAAG,OAAO;AAAA,UAChB,OAAO,GAAG,OAAO;AAAA,QACnB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;AChSA,IAAM,qBAAqB;AAmBpB,IAAM,oBAAoB,CAAC,cAAsB,eACtD,GAAG,YAAY,GAAG,kBAAkB,GAAG,UAAU;AAkB5C,IAAM,kBAAkB,CAAC,UAC9B,CAAC,CAAC,SAAS,MAAM,SAAS,kBAAkB;;;ACrCvC,IAAM,2BAA2B,CACtC,KACA,YACa;AACb,QAAM,WAAW,oBAAI,IAAI,CAAC,SAAS,IAAI,uBAAuB,IAAI,uBAAuB,CAAC;AAC1F,SAAO,OAAO,KAAK,IAAI,WAAW,OAAO,EAAE,OAAO,CAAAC,SAAO,CAAC,SAAS,IAAIA,IAAG,CAAC;AAC7E;;;ACCO,IAAM,iBAAiB,CAAC,UAA4B;AACzD,QAAM,KAAK,OAAO,OAAO,MAAM,OAAO,EAAE,KAAK,OAAK,EAAE,OAAO;AAC3D,SAAO,IAAI,QAAQ;AACrB;AAKO,IAAM,mBAAN,MAAM,kBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM5B,YAA6B,OAAkC,MAAsB;AAAxD;AAAkC;AAAA,EAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOvF,mBAAmB,SAA6C;AAC9D,UAAM,cAAc,KAAK,iBAAiB;AAC1C,UAAM,WAAW,IAAI,IAAI,YAAY,WAAW;AAChD,QAAI,UAAU;AAEd,YAAQ,QAAQ,UAAQ;AACtB,UAAI,KAAK,SAAS,SAAU;AAC5B,UAAI,KAAK,UAAU,KAAK,MAAM,KAAM;AAEpC,YAAM,QAAQ,KAAK,SAAS,KAAK;AACjC,UAAI,gBAAgB,KAAK,EAAG;AAC5B,UAAI,CAAC,SAAS,IAAI,KAAK,GAAG;AACxB,iBAAS,IAAI,KAAK;AAClB,kBAAU;AAAA,MACZ;AAAA,IACF,CAAC;AAED,QAAI,CAAC,QAAS,QAAO;AACrB,WAAO,IAAI,kBAAiB,KAAK,OAAO;AAAA,MACtC,GAAG;AAAA,MACH,aAAa,MAAM,KAAK,QAAQ;AAAA,IAClC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,gBACE,KACA,cACA,aACA,SACA,OACkB;AAClB,UAAM,cAAc,KAAK,iBAAiB;AAC1C,UAAM,YAAY,YAAY,UAAU,OAAO,OAAK,EAAE,SAAS,YAAY;AAC3E,cAAU,KAAK,KAAK,kBAAkB,KAAK,cAAc,aAAa,SAAS,KAAK,CAAC;AACrF,WAAO,IAAI,kBAAiB,KAAK,OAAO;AAAA,MACtC,GAAG;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAqC;AACnC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,mBAAkC;AACxC,WAAO,KAAK,QAAQ,0BAA0B,KAAK,KAAK;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,kBACN,KACA,cACA,aACA,SACA,OACuB;AACvB,YAAQ,IAAI,MAAM;AAAA,MAChB,KAAK,cAAc;AAAA,MACnB,KAAK,cAAc,QAAQ;AACzB,cAAM,WAAW,IAAI,YAAY,eAAe,KAAK,KAAK;AAC1D,eAAO;AAAA,UACL,MAAM;AAAA,UACN;AAAA,UACA,MAAM,IAAI;AAAA,UACV,aAAa,IAAI,OAAO;AAAA,UACxB,kBAAkB,eAAe,IAAI,MAAM;AAAA,UAC3C,YAAY,IAAI;AAAA,UAChB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA,KAAK,cAAc,WAAW;AAC5B,cAAM,WAAW,IAAI,YAAY,eAAe,IAAI,MAAM;AAC1D,eAAO;AAAA,UACL,MAAM;AAAA,UACN;AAAA,UACA,MAAM,IAAI;AAAA,UACV,aAAa,IAAI,OAAO;AAAA,UACxB,kBAAkB,eAAe,IAAI,MAAM;AAAA,UAC3C,YAAY,IAAI;AAAA,UAChB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA,KAAK,cAAc,eAAe;AAChC,cAAM,OAAO;AACb,cAAM,WAAW,KAAK,YAAY,eAAe,KAAK,KAAK;AAC3D,cAAM,WAAW,KAAK,aAAa,eAAe,KAAK,MAAM;AAC7D,cAAM,UAAU,KAAK,mBAAmB,eAAe,KAAK,UAAU;AACtE,cAAM,mBAAmB,OAAO,eAAe,GAAG,WAAW;AAC7D,cAAM,eACJ,OAAO,WACP,KAAK,uBACL,yBAAyB,MAAM,OAAO;AAExC,eAAO;AAAA,UACL,MAAM;AAAA,UACN;AAAA,UACA,MAAM,IAAI;AAAA,UACV,aAAa,KAAK,OAAO;AAAA,UACzB,kBAAkB;AAAA,UAClB,YAAY,KAAK;AAAA,UACjB;AAAA,UACA;AAAA,UACA,OAAO;AAAA,YACL,OAAO,KAAK,WAAW;AAAA,YACvB,YAAY;AAAA,YACZ,aAAa;AAAA,YACb,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAOA,IAAM,4BAA4B,CAAC,WAAoC;AAAA,EACrE,WAAW,MAAM;AAAA,EACjB,gBAAgB,eAAe,KAAK;AAAA,EACpC,aAAa,CAAC;AAAA,EACd,WAAW,CAAC;AACd;;;AC/KO,IAAM,iBAAiB,CAC5BC,MACA,WACA,SACe;AACf,MAAIA,KAAI,SAAS,GAAG,GAAG;AACrB,UAAM,CAACC,KAAI,IAAI,IAAID,KAAI,MAAM,GAAG;AAChC,UAAM,UAAU,KAAK,QAAQ,KAAK,EAAE;AACpC,UAAM,CAAC,OAAO,IAAI,IAAI,QAAQ,SAAS,GAAG,IAAI,QAAQ,MAAM,GAAG,IAAI,CAAC,WAAW,OAAO;AACtF,WAAO,EAAE,MAAM,UAAU,OAAO,MAAM,OAAOA,KAAI;AAAA,EACnD;AAEA,MAAIA,KAAI,SAAS,GAAG,GAAG;AACrB,UAAM,CAAC,kBAAkB,UAAU,IAAIA,KAAI,MAAM,GAAG;AACpD,UAAM,SAAS,MAAM,KAAK,SAAO,IAAI,SAAS,gBAAgB;AAE9D,QAAI,QAAQ;AACV,aAAO,EAAE,MAAM,UAAU,OAAO,WAAW,MAAMA,KAAI;AAAA,IACvD;AAEA,WAAO,EAAE,MAAM,UAAU,OAAO,kBAAkB,MAAM,WAAW;AAAA,EACrE;AAEA,SAAO,EAAE,MAAM,UAAU,OAAO,WAAW,MAAMA,KAAI;AACvD;;;ACKO,IAAM,kBAAN,MAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM3B,YAA6B,OAAkC,OAAyB;AAA3D;AAAkC;AAAA,EAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOzF,OACE,SACuB;AACvB,UAAM,kBAAkB,IAAI;AAAA,MAC1B,KAAK,MAAM,IAAI,QAAQ,IAAI,OAAM,EAAiB,SAAU,EAAiB,IAAI;AAAA,IACnF;AACA,UAAM,OAAO,KAAK,MAAM,IAAI;AAC5B,UAAM,gBAAgB,KAAK,SAAS,WAAW,KAAK,QAAQ,KAAK,QAAQ,KAAK,MAAM;AAEpF,UAAM,UAAU,OAAO,QAAQ,OAAO,EAAE,OAAyB,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AACtF,UAAI,gBAAgB,IAAI,KAAK,EAAG,QAAO;AAEvC,UAAI,0BAA0B,GAAG,GAAG;AAClC,YAAI,KAAK,EAAE,GAAI,KAAgE,MAAM,CAAmB;AACxG,eAAO;AAAA,MACT;AAEA,YAAM,SAAS;AACf,YAAM,gBACJ,OAAO,SAAS,OAAO,UAAU,KAAK,MAAM,QAAQ,KAAK,SAAS,WAAW,KAAK,QAC9E,KAAK,QACL,OAAO,SAAS;AACtB,UAAI,KAAK;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,QACP,MAAM,OAAO;AAAA,QACb;AAAA,MACF,CAAe;AACf,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AAEL,UAAM,YAAY,KAAK,MAAM,YAAY,OAAO;AAChD,WAAO,EAAE,OAAO,WAAW,cAAc,QAAQ;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,MAAuC;AAC/C,UAAM,OAAO,KAAK,MAAM,IAAI;AAC5B,UAAM,eAAe,KAAK,SAAS,WAAW,KAAK,QAAQ,KAAK,QAAQ,KAAK,MAAM;AACnF,UAAM,UAAU,KAAK,IAAI,CAAAE,SAAO,eAAeA,MAAK,cAAc,KAAK,MAAM,IAAI,IAAI,CAAC;AACtF,UAAM,YAAY,KAAK,MAAM,YAAY,OAAO;AAChD,WAAO,EAAE,OAAO,WAAW,cAAc,QAAQ;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,QAAQ,MAAc,OAAwB,SAAoB,YAAY,OAAyB;AACrG,UAAM,MAAiC;AAAA,MACrC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO,KAAK,MAAM,QAAQ,GAAG;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,iBAAiB,UAA4B,OAA0C;AACrF,UAAM,KAAuB;AAAA,MAC3B,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF;AACA,WAAO,KAAK,MAAM,iBAAiB,EAAE;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,MAAyC;AAChD,WAAO,KAAK,MAAM,SAAS,IAAI;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,eAAe,OAAe,OAA0C;AACtE,UAAM,OAA2B,EAAE,MAAM,kBAAkB,OAAO,MAAM;AACxE,WAAO,KAAK,MAAM,YAAY,CAAC,IAAI,CAAC;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,MAAkC;AACzC,WAAO,KAAK,MAAM,SAAS,IAAI;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,MAAwC;AAChD,UAAM,WAAW,KAAK,mBAAmB,KAAK,MAAM,IAAI,OAAO,IAAI;AACnE,WAAO,KAAK,MAAM,UAAU,QAAQ;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAYA,MAA+C;AACzD,UAAM,OAAO,KAAK,MAAM,IAAI;AAC5B,UAAM,WAAW,KAAK,SAAS,WAAW,KAAK,QAAQ,EAAE,GAAG,KAAK,OAAO,OAAO,KAAK,MAAM,IAAI,KAAK;AACnG,UAAM,OAAO,gBAAgB,UAAUA,IAAG;AAC1C,WAAO,KAAK,MAAM,YAAY,CAAC,IAAI,CAAC;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,MAAwC;AACjD,UAAM,WAAW,KAAK,mBAAmB,KAAK,MAAM,IAAI,QAAQ,IAAI;AACpE,WAAO,KAAK,MAAM,WAAW,QAAQ;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAYA,MAA6B,WAA6C;AACpF,UAAM,OAAO,KAAK,MAAM,IAAI;AAC5B,UAAM,WAAW,KAAK,SAAS,WAAW,KAAK,QAAQ,EAAE,GAAG,KAAK,OAAO,OAAO,KAAK,MAAM,IAAI,KAAK;AACnG,UAAM,OAAO,gBAAgB,UAAUA,IAAG;AAC1C,WAAO,KAAK,MAAM,YAAY,CAAC,EAAE,MAAM,WAAW,QAAQ,MAAM,UAAU,CAAC,CAAC;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,MAAsC;AACjD,WAAO,KAAK,MAAM,aAAa,IAAI;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,OAAiC;AACzC,WAAO,KAAK,MAAM,UAAU,KAAK;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,QAAkC;AAC3C,WAAO,KAAK,MAAM,WAAW,MAAM;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,mBAAmB,UAAsC,MAAsC;AACrG,WAAO,WAAW,IAAI,UAAU,IAAI,IAAI;AAAA,EAC1C;AAEF;;;ACjNO,IAAM,2BAAN,MAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMpC,YACmB,OACA,eACjB;AAFiB;AACA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQH,qBAAqB,OAAyB,WAA6C;AACzF,UAAM,aAAa,eAAe,KAAK,KAAK;AAE5C,QAAI,CAAC,KAAK,kBAAkB,KAAK,GAAG;AAClC,aAAO,KAAK,cAAc,OAAO,WAAW,KAAK,eAAe,CAAC;AAAA,IACnE;AAEA,QAAI,cAAc,CAAC,KAAK,mBAAmB,OAAO,UAAU,KAAK,KAAK,MAAM,QAAQ,UAAU,GAAG;AAC/F,aAAO,KAAK,cAAc,OAAO,WAAW;AAAA,QAC1C,CAAC,UAAU,GAAG,KAAK,MAAM,QAAQ,UAAU;AAAA,MAC7C,CAAC;AAAA,IACH;AAEA,WAAO,EAAE,OAAO,UAAU;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,kBAAkB,OAAkC;AAC1D,WAAO,MAAM,IAAI,QAAQ,KAAK,CAAAC,SAAO,CAAC,gBAAiBA,KAAmB,KAAK,CAAC;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,mBAAmB,OAAyB,YAA6B;AAC/E,WAAO,MAAM,IAAI,QAAQ,KAAK,CAAAA,SAAO;AACnC,YAAM,QAASA,KAAmB;AAClC,YAAM,OAAO,SAAUA,KAAmB;AAC1C,aAAO,CAAC,gBAAgB,KAAK,KAAK,SAAS;AAAA,IAC7C,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAA4C;AAClD,WAAO,OAAO,KAAK,KAAK,MAAM,OAAO,EAAE,OAAO,CAAC,KAAK,QAAQ;AAC1D,UAAI,GAAG,IAAK,KAAK,MAAM,QAAsC,GAAG;AAChE,aAAO;AAAA,IACT,GAAG,CAAC,CAA8B;AAAA,EACpC;AACF;;;ACvFA,IAAM,cAAc,CAAC,UAAwB;AAC3C,QAAM,IAAI,MAAM,4BAA4B,KAAK,UAAU,KAAK,CAAC,EAAE;AACrE;AAQA,IAAM,wBAAwB,CAAC,MAAgB,UAAuB,cAAuC;AAC3G,QAAM,YAAY,aAAa,KAAK;AACpC,QAAM,kBACN,SAAS,SAAS,cAAc,WAAW,SAAS,SAAS,cAAc,SACvE,eAAe,IAAI,IACnB,eAAe,SAAS,MAAM;AAClC,QAAM,WAAW,SAAS,YAAY;AAEtC,UAAQ,SAAS,MAAM;AAAA,IACrB,KAAK,cAAc;AAAA,IACnB,KAAK,cAAc;AACjB,aAAO;AAAA,QACL,EAAE,MAAM,UAAU,OAAO,SAAS,OAAO,MAAM,MAAM,SAAS,WAAW;AAAA,QACzE,EAAE,MAAM,UAAU,OAAO,WAAW,MAAM,SAAS;AAAA,MACrD;AAAA,IACF,KAAK,cAAc;AACjB,aAAO;AAAA,QACL,EAAE,MAAM,UAAU,OAAO,SAAS,OAAO,MAAM,MAAM,SAAS;AAAA,QAC9D,EAAE,MAAM,UAAU,OAAO,WAAW,MAAM,SAAS,WAAW;AAAA,MAChE;AAAA,IACF,KAAK,cAAc;AACjB,YAAM,IAAI,MAAM,4EAA4E;AAAA,IAC9F;AACE,aAAO,YAAY,QAAQ;AAAA,EAC/B;AACF;AAKO,IAAM,0BAA0B,CACrC,MACA,cACA,UACA,UACA,OACA,cACe;AACf,QAAM,UAAU,SAAS,YAAY,eAAe,IAAI;AACxD,QAAM,YAAY,SAAS,aAAa,eAAe,SAAS,MAAM;AACtE,QAAM,YAAY,aAAa,KAAK;AAEpC,QAAM,iBAAiB;AAAA,IACrB,EAAE,MAAM,UAAU,OAAO,SAAS,WAAW,MAAM,MAAM,SAAS,sBAAsB;AAAA,IACxF,EAAE,MAAM,UAAU,OAAO,WAAW,MAAM,QAAQ;AAAA,EACpD;AAEA,QAAM,YAAY,eAAe,UAAU,SAAS,WAAW,MAAM,cAAc;AAEnF,MAAI,kBAAkC;AAAA,IACpC,EAAE,MAAM,UAAU,OAAO,SAAS,OAAO,MAAM,MAAM,UAAU;AAAA,IAC/D,EAAE,MAAM,UAAU,OAAO,SAAS,WAAW,MAAM,MAAM,SAAS,wBAAwB;AAAA,EAC5F;AAEA,MAAI,OAAO;AACT,sBAAkB,IAAI,iBAAiB,KAAK;AAAA,EAC9C;AAEA,QAAM,aAAa;AAAA,IACjB;AAAA,IACA,SAAS,OAAO;AAAA,IAChB;AAAA,IACA;AAAA,EACF;AAEA,SAAO,CAAC,WAAW,UAAU;AAC/B;AASO,IAAM,6BAA6B,CACxC,MACA,UACA,OACA,cACmB;AACnB,QAAM,OAAO,sBAAsB,MAAM,UAAU,SAAS;AAC5D,SAAO,QAAQ,IAAI,MAAM,KAAK,IAAI;AACpC;AAQO,IAAM,2BAA2B,CAAC,MAAgB,UAAuB,cAAuC;AACrH,SAAO,sBAAsB,MAAM,UAAU,SAAS;AACxD;;;ACvGO,IAAM,sBAAsB,CAAC,SACjC,KAAK,MAAmC;;;ACgBpC,IAAM,kBAAN,MAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS3B,YACmB,OACA,OACA,WACA,uBACjB;AAJiB;AACA;AACA;AACA;AAEjB,SAAK,mBAAmB,IAAI;AAAA,MAAyB;AAAA,MAAO,CAACC,QAAOC,YAAW,YAC7E,KAAK,cAAcD,QAAOC,YAAW,OAAO;AAAA,IAC9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,aACE,cACA,UACA,gBACgB;AAChB,UAAM,YAAY,KAAK,SAAS,KAAK,OAAO,cAAc,UAAU,cAAc;AAClF,WAAO,EAAE,OAAO,WAAW,WAAW,KAAK,UAAU;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MACE,cACA,WACgB;AAChB,UAAM,SAAS,KAAK,aAAa,cAAc,WAAW,OAAO,SAAS;AAC1E,UAAM,KAAK,eAAe,KAAK,KAAK;AACpC,UAAM,eAA6B,CAAC,EAAE,MAAM,UAAU,OAAO,KAAK,cAAc,GAAG,MAAM,GAAG,CAAC;AAC7F,UAAM,mBAAmB,OAAO,MAAM,IAAI,WAAW,OAAO,MAAM,IAAI,WAAW,CAAC;AAClF,UAAM,YAAY,KAAK,WAAW,OAAO,KAAK,EAAE,aAAa,CAAC,GAAG,kBAAkB,GAAG,YAAY,CAAC;AACnG,WAAO,EAAE,OAAO,WAAW,WAAW,OAAO,UAAU;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAQ,cAAsB,SAAkD;AAC9E,QAAI,QAAQ,KAAK;AACjB,QAAI,YAAY,KAAK;AAErB,UAAM,WAAW,KAAK,YAAY,YAAY;AAC9C,UAAM,cAAc,SAAS,eAAe;AAC5C,UAAM,gBAAgB,MAAM,IAAI,MAAM,KAAK,OAAK,oBAAoB,CAAC,MAAM,YAAY;AAEvF,QAAI,CAAC,eAAe;AAClB,YAAM,SAAS,KAAK,aAAa,cAAc,SAAS,YAAY,WAAW,MAAM,SAAS,MAAM;AACpG,cAAQ,OAAO;AAAA,IACjB;AAEA,UAAM,mBAAmB,KAAK,iBAAiB,qBAAqB,OAAO,SAAS;AACpF,YAAQ,iBAAiB;AACzB,gBAAY,iBAAiB;AAE7B,UAAM,gBAAgB,SAAS,SAAS,SACpC,QAAQ,UACR,OAAO,KAAK,SAAS,OAAO,OAAO;AAEvC,UAAM,sBAAsB,CAC1B,SACA,QACA,MACA,eAC+B;AAC/B,aAAO,KAAK,OAAO,CAAC,KAAK,QAAQ;AAC/B,cAAM,MAAM,QAAQ,GAAG;AACvB,YAAI,CAAC,KAAK;AACR,gBAAM,IAAI,MAAM,WAAW,GAAG,CAAC;AAAA,QACjC;AACA,YAAI,kBAAkB,QAAQ,GAAG,CAAC,IAAI;AACtC,eAAO;AAAA,MACT,GAAG,CAAC,CAA8B;AAAA,IACpC;AAEA,UAAM,kBAAkB;AAAA,MACtB,SAAS,OAAO;AAAA,MAChB;AAAA,MACA;AAAA,MACA,SAAO,WAAW,GAAG,4BAA4B,YAAY;AAAA,IAC/D;AAEA,QAAI,SAAS,SAAS,cAAc,eAAe;AACjD,YAAMC,2BAA0B,KAAK,cAAc,OAAO,WAAW,eAAe;AACpF,cAAQA,yBAAwB;AAChC,kBAAYA,yBAAwB;AAEpC,kBAAY,UAAU;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,aAAO,EAAE,OAAO,UAAU;AAAA,IAC5B;AAEA,UAAM,OAAO;AACb,UAAM,mBAAmB,SAAS,OAAO,eAAe,GAAG,WAAW;AACtE,UAAM,UAAU,KAAK,mBAAmB,eAAe,KAAK,UAAU;AACtE,UAAM,eACJ,SAAS,OAAO,WAChB,KAAK,uBACL,yBAAyB,MAAM,OAAO;AAExC,UAAM,iBAAiB;AAAA,MACrB,KAAK,WAAW;AAAA,MAChB;AAAA,MACA;AAAA,MACA,SAAO,WAAW,GAAG,+BAA+B,KAAK,WAAW,IAAI;AAAA,IAC1E;AAEA,UAAM,oBAAoB;AAAA,MACxB,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAEA,UAAM,0BAA0B,KAAK,cAAc,OAAO,WAAW,iBAAiB;AACtF,YAAQ,wBAAwB;AAChC,gBAAY,wBAAwB;AAEpC,gBAAY,UAAU;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,EAAE,aAAa,kBAAkB,SAAS,aAAa;AAAA,IACzD;AAEA,WAAO,EAAE,OAAO,UAAU;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,yBACE,cACA,KACA,uBACiB;AACjB,UAAM,WAAW,KAAK,YAAY,YAAY;AAC9C,UAAM,YAAY,KAAK,MAAM,IAAI,KAAK,SAAS,UAAU,KAAK,MAAM,IAAI,KAAK,QAAQ;AACrF,QAAI,cAAc,yBAAyB,KAAK,OAAO,UAAU,SAAS;AAC1E,QAAI,uBAAuB;AACzB,oBAAc,IAAI,aAAa,qBAAqB;AAAA,IACtD;AACA,UAAM,kBAAkB,IAAI,QACxB,IAAI,aAAa,IAAI,KAAK,IAC1B;AAEJ,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,SACN,OACA,cACA,UACA,gBACkB;AAClB,UAAM,WAAW,KAAK,YAAY,YAAY;AAC9C,UAAM,YAAY,MAAM,IAAI,KAAK,SAAS,UAAU,MAAM,IAAI,KAAK,QAAQ;AAC3E,QAAI,SAAS,SAAS,cAAc,eAAe;AACjD,YAAM,QAAQ;AAAA,QACZ,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,aAAO,MAAM,OAAO,CAAC,SAAS,SAAS,KAAK,WAAW,OAAO,EAAE,SAAS,IAAI,GAAG,KAAK;AAAA,IACvF;AAEA,UAAM,YAAY,2BAA2B,KAAK,OAAO,UAAU,gBAAgB,SAAS;AAC5F,UAAM,WAAW,eAAe,UAAU,SAAS,OAAO,MAAM,WAAW,YAAY;AAEvF,WAAO,KAAK,WAAW,KAAK,EAAE,SAAS,QAAQ;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,cACN,OACA,WACA,SACgB;AAChB,UAAM,EAAE,OAAO,WAAW,aAAa,IAAI,KAAK,WAAW,KAAK,EAAE,OAAO,OAAO;AAChF,WAAO;AAAA,MACL,OAAO;AAAA,MACP,WAAW,UAAU,kBAAkB,WAAW,YAAY;AAAA,IAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,YAAY,cAAmC;AACrD,UAAM,WAAW,KAAK,MAAM,UAAU,YAAY;AAClD,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,aAAa,YAAY,yBAAyB,KAAK,MAAM,IAAI,GAAG;AAAA,IACtF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,WAAW,QAA0B,KAAK,OAAwB;AACxE,WAAO,KAAK,sBAAsB,KAAK,OAAO,KAAK;AAAA,EACrD;AAAA,EAEQ,gBAAwB;AAC9B,UAAM,OAAO,KAAK,MAAM,IAAI;AAC5B,QAAI,KAAK,SAAS,WAAW,KAAK,MAAO,QAAO,KAAK;AACrD,WAAO,KAAK,MAAM;AAAA,EACpB;AACF;;;ACtNA,IAAM,+BAA+B,CAAC,OAAiB,UAA4B,IAAI,gBAAgB,OAAO,KAAK;AACnH,IAAM,gCAAgC,CAAC,UAAoB,IAAI,iBAAiB,KAAK;AAErF,IAAM,yBAAyB,CAAC,OAAiB,mBAC/C,IAAI,iBAAiB,OAAO,eAAe,KAAK,CAAC;AAM5C,IAAM,wCAAwC,CACnD,YAAqD,CAAC,MACnB;AACnC,QAAM,wBAAwB,UAAU,yBAAyB;AACjE,QAAM,yBAAyB,UAAU,0BAA0B;AACnE,QAAM,kBACJ,UAAU,oBAAoB,WAAS,uBAAuB,OAAO,sBAAsB;AAC7F,QAAM,wBACJ,UAAU,0BACT,CAAC,OAAO,OAAO,cAAc,IAAI,gBAAgB,OAAO,OAAO,WAAW,qBAAqB;AAElG,SAAO;AAAA,IACL,aAAa,UAAU,gBAAgB,WAAS,IAAI,iBAAiB,KAAK;AAAA,IAC1E;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,wCAAwC,sCAAsC;;;ACjGpF,IAAM,iBAAN,MAAqB;AAAA;AAAA;AAAA;AAAA;AAAA,EAK1B,YAA6B,KAAoC;AAApC;AAAA,EAAqC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQlE,OAAO,SAAoC,SAA0D;AACnG,UAAM,aAAa,KAAK,IAAI,KAAK,sBAAsB,KAAK,IAAI,OAAO,QAAQ,KAAK;AACpF,UAAM,EAAE,OAAO,WAAW,aAAa,IAAI,WAAW,OAAO,OAAO;AACpE,WAAO;AAAA,MACL,OAAO;AAAA,MACP,WAAW,QAAQ,UAAU,kBAAkB,WAAW,YAAY;AAAA,IACxE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAU,SAAoC,SAA8C;AAC1F,UAAM,aAAa,KAAK,IAAI,KAAK,sBAAsB,KAAK,IAAI,OAAO,QAAQ,KAAK;AACpF,UAAM,YAAY,WAAW,UAAU,OAAO,EAAE;AAChD,WAAO,EAAE,OAAO,WAAW,WAAW,QAAQ,UAAU;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eACE,SACA,OACA,OAC2B;AAC3B,UAAM,aAAa,KAAK,IAAI,KAAK,sBAAsB,KAAK,IAAI,OAAO,QAAQ,KAAK;AACpF,UAAM,YAAY,WAAW,eAAe,OAAO,KAAK;AACxD,WAAO,EAAE,OAAO,WAAW,WAAW,QAAQ,UAAU;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS,SAAoC,SAAgE;AAC3G,UAAM,OAAO,QAAQ,MAAM,IAAI;AAC/B,UAAM,WAAW,KAAK,SAAS,WAAW,KAAK,QAAQ,EAAE,GAAG,KAAK,IAAI,OAAO,OAAO,KAAK,MAAM,IAAI,KAAK,IAAI;AAC3G,UAAM,QAAQ,QAAQ,IAAI,CAAAC,SAAO,gBAAgB,UAAUA,IAAG,CAAC;AAC/D,UAAM,aAAa,KAAK,IAAI,KAAK,sBAAsB,KAAK,IAAI,OAAO,QAAQ,KAAK;AACpF,UAAM,YAAY,WAAW,aAAa,KAAK;AAC/C,WAAO,EAAE,OAAO,WAAW,WAAW,QAAQ,UAAU;AAAA,EAC1D;AACF;;;ACtEO,IAAM,kBAAN,MAAsB;AAAA;AAAA;AAAA;AAAA;AAAA,EAK3B,YAA6B,KAAoC;AAApC;AAAA,EAAqC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASlE,MAAM,SAAoC,cAAsB,WAAuD;AACrH,UAAM,SAAS,KAAK,cAAc,OAAO,EAAE,MAAM,cAAc,SAAS;AACxE,WAAO,EAAE,OAAO,OAAO,OAAO,WAAW,OAAO,UAAU;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,aACE,SACA,cACA,UACA,gBAC2B;AAC3B,UAAM,SAAS,KAAK,cAAc,OAAO,EAAE,aAAa,cAAc,UAAU,cAAc;AAC9F,WAAO,EAAE,OAAO,OAAO,OAAO,WAAW,OAAO,UAAU;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QACE,SACA,cACA,SAC2B;AAC3B,UAAM,SAAS,KAAK,cAAc,OAAO,EAAE,QAAQ,cAAc,OAAO;AACxE,WAAO,EAAE,OAAO,OAAO,OAAO,WAAW,OAAO,UAAU;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,yBACE,SACA,cACA,KACA,uBACiB;AACjB,WAAO,KAAK,cAAc,OAAO,EAAE,yBAAyB,cAAc,KAAK,qBAAqB;AAAA,EACtG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,cAAc,SAAoC;AACxD,WAAO,KAAK,IAAI,KAAK,sBAAsB,KAAK,IAAI,OAAO,QAAQ,OAAO,QAAQ,SAAS;AAAA,EAC7F;AACF;;;AC5EO,IAAM,cAAc,CAAC,MAA6B,SAAgD;AACvG,MAAI,CAAC,QAAQ,CAAC,KAAK,OAAQ,QAAO;AAElC,QAAM,UAAU,oBAAI,IAA8B;AAClD,QAAM,gBAAgB,oBAAI,IAAmC;AAE7D,QAAM,oBAAoB,CAAC,QAA6B;AACtD,UAAM,SAAS,IAAI,KAAK,cAAc;AACtC,QAAI,WAAW,OAAW,QAAO;AAEjC,QAAI,CAAC,QAAQ,IAAI,MAAM,GAAG;AACxB,cAAQ,IAAI,QAAQ,cAAc,KAAK,IAAI,CAAC;AAAA,IAC9C;AAEA,WAAO,QAAQ,IAAI,MAAM;AAAA,EAC3B;AAEA,QAAM,qBAAqB,CAAC,QAAa,iBAAmC;AAC1E,QAAI,aAAa,cAAc,IAAI,MAAM;AACzC,QAAI,CAAC,YAAY;AACf,mBAAa,CAAC;AACd,oBAAc,IAAI,QAAQ,UAAU;AAAA,IACtC;AAEA,QAAI,OAAO,WAAW,YAAY;AAClC,QAAI,CAAC,MAAM;AACT,aAAO,oBAAI,IAAS;AACpB,iBAAW,YAAY,IAAI;AAAA,IAC7B;AAEA,WAAO;AAAA,EACT;AAEA,aAAW,OAAO,MAAM;AACtB,UAAM,SAAS,IAAI,KAAK,cAAc;AACtC,QAAI,WAAW,OAAW;AAE1B,UAAM,SAAS,kBAAkB,GAAG;AACpC,QAAI,CAAC,OAAQ;AAEb,eAAW,OAAO,KAAK,WAAW;AAChC,YAAM,aAAa,kBAAkB,IAAI,aAAa,IAAI,gBAAgB;AAC1E,YAAM,UAAU,IAAI,UAAU;AAC9B,UAAI,YAAY,QAAQ,YAAY,OAAW;AAE/C,YAAM,OAAO,mBAAmB,QAAQ,IAAI,IAAI;AAChD,UAAI,KAAK,IAAI,OAAO,EAAG;AACvB,WAAK,IAAI,OAAO;AAEhB,UAAI,IAAI,SAAS,cAAc,QAAQ;AACrC,YAAI,CAAC,OAAO,IAAI,IAAI,GAAG;AACrB,iBAAO,IAAI,IAAI,IAAI,WAAW,KAAK,GAAG;AAAA,QACxC;AACA;AAAA,MACF;AAEA,YAAM,SAAS,OAAO,IAAI,IAAI;AAC9B,aAAO,KAAK,WAAW,KAAK,GAAG,CAAC;AAAA,IAClC;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,QAAQ,OAAO,CAAC;AACpC;AAEA,IAAM,gBAAgB,CAAC,KAA0B,SAA6C;AAC5F,QAAM,OAA4B,CAAC;AACnC,QAAM,WAAW,KAAK,YAAY,SAC9B,KAAK,cACL,OAAO,KAAK,GAAG,EAAE,OAAO,OAAK,CAAC,gBAAgB,CAAC,CAAC;AAEpD,aAAW,OAAO,UAAU;AAC1B,SAAK,GAAG,IAAI,IAAI,GAAG;AAAA,EACrB;AAEA,aAAW,OAAO,KAAK,WAAW;AAChC,SAAK,IAAI,IAAI,IAAI,IAAI,SAAS,cAAc,SAAS,OAAO,CAAC;AAAA,EAC/D;AAEA,SAAO;AACT;AAEA,IAAM,aAAa,CAAC,KAA0B,QAAoD;AAChG,QAAM,QAA6B,CAAC;AACpC,aAAWC,QAAO,IAAI,SAAS;AAC7B,UAAM,MAAM,kBAAkB,IAAI,aAAaA,IAAG;AAClD,UAAMA,IAAG,IAAI,IAAI,GAAG;AAAA,EACtB;AAEA,QAAM,QAAQ,WAAW,KAAK,GAAG;AACjC,MAAI,OAAO;AACT,IAAC,MAAc,SAAS;AAAA,EAC1B;AAEA,SAAO;AACT;AAEA,IAAM,aAAa,CAAC,KAA0B,QAAgE;AAC5G,MAAI,CAAC,IAAI,MAAO,QAAO;AAEvB,QAAM,QAA6B,CAAC;AACpC,aAAWA,QAAO,IAAI,MAAM,SAAS;AACnC,UAAM,MAAM,kBAAkB,IAAI,MAAM,aAAaA,IAAG;AACxD,UAAMA,IAAG,IAAI,IAAI,GAAG;AAAA,EACtB;AAEA,QAAM,WAAW,OAAO,OAAO,KAAK,EAAE,KAAK,OAAK,MAAM,QAAQ,MAAM,MAAS;AAC7E,SAAO,WAAW,QAAQ;AAC5B;;;AC9GO,IAAM,cAAc,OAAO,YAAY;AAE9C,IAAM,QAAQ,CAAC,UAA4B,UAAU,QAAQ,UAAU,SAAY,KAAK,OAAO,KAAK;AA6B7F,IAAM,mBAAmB,CAC9B,MACA,cACA,QACsC;AACtC,QAAM,MAAM,KAAK,kBAAkB,IAAI,YAAY;AACnD,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,OAAO,IAAI,IAAI,MAAM,GAAG,CAAC;AAC/B,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,MAAM,QAAQ,IAAI,IAAI,OAAO;AACtC;AAUO,IAAM,qBAAqB,CAChC,MACA,cACA,QACoC;AACpC,QAAM,MAAM,KAAK,kBAAkB,IAAI,YAAY;AACnD,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,QAAQ,IAAI,IAAI,MAAM,GAAG,CAAC;AAChC,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,CAAC;AAAA,EAChB;AACA,SAAO;AACT;AAQO,IAAM,gBAAgB,CAA0B,WAAgD;AACrG,MAAI,CAAC,UAAU,OAAO,WAAW,SAAU,QAAO;AAClD,SAAQ,OAAe,WAAW;AACpC;AAOO,IAAM,gBAAgB,CAAC,WAAmE;AAC/F,SAAO,QAAQ,cAAc,MAAM,CAAC;AACtC;;;AClFA,IAAMC,SAAQ,CAAC,UAA4B,UAAU,QAAQ,UAAU,SAAY,KAAK,OAAO,KAAK;AAEpG,IAAM,eAAe,CAAC,KAAU,SAAyB;AACvD,aAAW,OAAO,MAAM;AACtB,WAAO,eAAe,KAAK,KAAK;AAAA,MAC9B,OAAO,IAAI,GAAG;AAAA,MACd,UAAU;AAAA,MACV,cAAc;AAAA,MACd,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AACF;AAEO,IAAM,2BAAN,MAA4E;AAAA,EAMjF,YACmB,KACA,MACA,MACA,cACA,UACA,WACA,QACA,cACA,UACjB;AATiB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAdnB,SAAQ,SAAS;AACjB,SAAQ,QAAkB,CAAC;AAC3B,SAAiB,QAAQ,oBAAI,IAAY;AACzC,SAAiB,UAAU,oBAAI,IAAY;AAazC,iBAAa,MAAM,CAAC,OAAO,QAAQ,QAAQ,gBAAgB,YAAY,aAAa,UAAU,gBAAgB,UAAU,CAAC;AACzH,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,MAAM,OAA0B;AAC9B,QAAI,KAAK,OAAQ,QAAO,KAAK;AAC7B,UAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,UAAM,MAAMA,OAAM,KAAK,KAAK,KAAK,QAAQ,CAAC;AAC1C,UAAM,OAAO,IAAI,IAAI,GAAG,KAAK,CAAC;AAC9B,SAAK,QAAQ,KAAK,IAAI,SAAO,KAAK,aAAa,GAAG,CAAC;AACnD,SAAK,SAAS;AACd,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,WAAqB;AACnB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,MAA+B;AACjC,UAAM,WAAW,KAAK,KAAK,KAAK,QAAQ;AACxC,UAAM,WAAgC;AAAA,MACpC,GAAG;AAAA,MACH,CAAC,KAAK,SAAS,UAAU,GAAG;AAAA,IAC9B;AACA,UAAM,SAAS,KAAK,aAAa,QAAQ;AACzC,SAAK,MAAM,IAAI,MAAM;AACrB,SAAK,MAAM,KAAK,MAAM;AACtB,SAAK,IAAI;AAAA,MACP,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,EAAE,MAAM,OAAO,OAAO;AAAA,IACxB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,QAAsB;AAC3B,UAAM,WAAW,KAAK,KAAK,KAAK,QAAQ;AACxC,IAAC,OAA+B,KAAK,SAAS,UAAU,IAAI;AAC5D,SAAK,IAAI,UAAU,MAAM;AACzB,SAAK,MAAM,KAAK,MAAM;AACtB,SAAK,IAAI;AAAA,MACP,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,EAAE,MAAM,UAAU,OAAO;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,OAAO,QAAsB;AAC3B,SAAK,QAAQ,KAAK,MAAM,OAAO,UAAQ,SAAS,MAAM;AACtD,SAAK,QAAQ,IAAI,MAAM;AACvB,SAAK,IAAI;AAAA,MACP,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,EAAE,MAAM,UAAU,OAAO;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,QAAc;AACZ,eAAW,UAAU,CAAC,GAAG,KAAK,KAAK,GAAG;AACpC,WAAK,OAAO,MAAM;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,IAAY,cAA2B;AACrC,WAAO,GAAG,KAAK,UAAU,IAAI,IAAI,KAAK,YAAY;AAAA,EACpD;AAAA,EAEQ,mBAAyB;AAC/B,UAAM,WAAW,KAAK,KAAK,KAAK,QAAQ;AACxC,QAAI,aAAa,UAAa,aAAa,KAAM;AACjD,UAAM,OAAO,iBAAiB,KAAK,MAAM,KAAK,cAAc,QAAQ;AACpE,QAAI,CAAC,MAAM,OAAQ;AACnB,SAAK,QAAQ,KAAK,IAAI,SAAO,KAAK,aAAa,GAAG,CAAC;AACnD,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,SAAmB;AACjB,WAAO,KAAK;AAAA,EACd;AACF;;;ACtHA,IAAMC,SAAQ,CAAC,UAA4B,UAAU,QAAQ,UAAU,SAAY,KAAK,OAAO,KAAK;AAEpG,IAAMC,gBAAe,CAAC,KAAU,SAAyB;AACvD,aAAW,OAAO,MAAM;AACtB,WAAO,eAAe,KAAK,KAAK;AAAA,MAC9B,OAAO,IAAI,GAAG;AAAA,MACd,UAAU;AAAA,MACV,cAAc;AAAA,MACd,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AACF;AAEO,IAAM,yBAAN,MAAwE;AAAA,EAI7E,YACmB,KACA,MACA,MACA,cACA,UACA,WACA,QACA,cACA,UACjB;AATiB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAZnB,SAAQ,SAAS;AACjB,SAAQ,UAAyB;AAa/B,IAAAA,cAAa,MAAM;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,SAAK,2BAA2B;AAAA,EAClC;AAAA,EAEA,MAAM,OAA+B;AACnC,QAAI,KAAK,OAAQ,QAAO,KAAK;AAC7B,UAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,UAAM,WAAW,KAAK,KAAK,KAAK,QAAQ;AACxC,QAAI,aAAa,UAAa,aAAa,MAAM;AAC/C,WAAK,SAAS;AACd,aAAO,KAAK;AAAA,IACd;AACA,UAAM,MAAM,IAAI,IAAID,OAAM,QAAQ,CAAC;AACnC,SAAK,UAAU,MAAM,KAAK,aAAa,GAAG,IAAI;AAC9C,SAAK,SAAS;AACd,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAqB;AACnB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,MAAsD;AACxD,QAAI,SAAS,MAAM;AACjB,aAAO,KAAK,cAAc;AAAA,IAC5B;AAEA,UAAM,SAAS,cAAc,IAAI,IAAK,OAAkB,KAAK,aAAa,IAAW;AACrF,QAAI,KAAK,WAAW,KAAK,YAAY,QAAQ;AAC3C,WAAK,IAAI;AAAA,QACP,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,EAAE,MAAM,UAAU,QAAQ,KAAK,QAAQ;AAAA,MACzC;AAAA,IACF;AAEA,SAAK,iBAAiB,MAAM;AAC5B,SAAK,UAAU;AACf,SAAK,SAAS;AAEd,SAAK,IAAI;AAAA,MACP,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,EAAE,MAAM,UAAU,OAAO;AAAA,IAC3B;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,SAAwB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,gBAA+B;AACrC,UAAM,WAAW,KAAK;AACtB,QAAI,CAAC,SAAU,QAAO;AACtB,SAAK,UAAU;AACf,SAAK,SAAS;AACd,SAAK,IAAI;AAAA,MACP,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,EAAE,MAAM,UAAU,QAAQ,SAAS;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,QAAsB;AAC7C,UAAM,WAAW,KAAK,KAAK,KAAK,QAAQ;AACxC,IAAC,OAAe,KAAK,SAAS,UAAU,IAAI;AAAA,EAC9C;AAAA,EAEA,IAAY,cAA2B;AACrC,WAAO,GAAG,KAAK,UAAU,IAAI,IAAI,KAAK,YAAY;AAAA,EACpD;AAAA,EAEQ,6BAAmC;AACzC,UAAM,WAAW,KAAK,KAAK,KAAK,QAAQ;AACxC,QAAI,aAAa,UAAa,aAAa,KAAM;AACjD,UAAM,MAAM,mBAAmB,KAAK,MAAM,KAAK,cAAc,QAAQ;AACrE,QAAI,CAAC,IAAK;AACV,SAAK,UAAU,KAAK,aAAa,GAAG;AACpC,SAAK,SAAS;AAAA,EAChB;AACF;;;AClIA,IAAME,SAAQ,CAAC,UAA4B,UAAU,QAAQ,UAAU,SAAY,KAAK,OAAO,KAAK;AAEpG,IAAMC,gBAAe,CAAC,KAAU,SAAyB;AACvD,aAAW,OAAO,MAAM;AACtB,WAAO,eAAe,KAAK,KAAK;AAAA,MAC9B,OAAO,IAAI,GAAG;AAAA,MACd,UAAU;AAAA,MACV,cAAc;AAAA,MACd,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AACF;AAEO,IAAM,4BAAN,MAAgF;AAAA,EAIrF,YACmB,KACA,MACA,MACA,cACA,UACA,WACA,QACA,cACA,WACjB;AATiB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAZnB,SAAQ,SAAS;AACjB,SAAQ,UAA0B;AAahC,IAAAA,cAAa,MAAM,CAAC,OAAO,QAAQ,QAAQ,gBAAgB,YAAY,aAAa,UAAU,gBAAgB,WAAW,CAAC;AAC1H,SAAK,2BAA2B;AAAA,EAClC;AAAA,EAEA,MAAM,OAAgC;AACpC,QAAI,KAAK,OAAQ,QAAO,KAAK;AAC7B,UAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,UAAM,UAAU,KAAK,KAAK,KAAK,SAAS,UAAU;AAClD,QAAI,YAAY,QAAQ,YAAY,QAAW;AAC7C,WAAK,UAAU;AAAA,IACjB,OAAO;AACL,YAAM,MAAM,IAAI,IAAID,OAAM,OAAO,CAAC;AAClC,WAAK,UAAU,MAAM,KAAK,aAAa,GAAG,IAAI;AAAA,IAChD;AACA,SAAK,SAAS;AACd,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAsB;AACpB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,MAAyD;AAC3D,QAAI,SAAS,MAAM;AACjB,YAAM,WAAW,KAAK;AACtB,WAAK,KAAK,KAAK,SAAS,UAAU,IAAI;AACtC,WAAK,UAAU;AACf,WAAK,IAAI;AAAA,QACP,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,EAAE,MAAM,UAAU,QAAQ,SAAS;AAAA,MACrC;AACA,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,cAAc,IAAI,IAAK,OAAmB,KAAK,aAAa,IAA2B;AACtG,UAAM,UAAW,OAAe,KAAK,SAAS;AAC9C,QAAI,YAAY,QAAW;AACzB,WAAK,KAAK,KAAK,SAAS,UAAU,IAAI;AAAA,IACxC;AACA,SAAK,UAAU;AACf,SAAK,IAAI;AAAA,MACP,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,EAAE,MAAM,UAAU,OAAO;AAAA,IAC3B;AACA,WAAO;AAAA,EACT;AAAA,EAEA,IAAY,cAA2B;AACrC,WAAO,GAAG,KAAK,UAAU,IAAI,IAAI,KAAK,YAAY;AAAA,EACpD;AAAA,EAEQ,6BAAmC;AACzC,UAAM,UAAU,KAAK,KAAK,KAAK,SAAS,UAAU;AAClD,QAAI,YAAY,UAAa,YAAY,KAAM;AAC/C,UAAM,MAAM,mBAAmB,KAAK,MAAM,KAAK,cAAc,OAAO;AACpE,QAAI,CAAC,IAAK;AACV,SAAK,UAAU,KAAK,aAAa,GAAG;AACpC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,SAAyB;AACvB,WAAO,KAAK;AAAA,EACd;AACF;;;AClGA,IAAME,SAAQ,CAAC,UAA4B,UAAU,QAAQ,UAAU,SAAY,KAAK,OAAO,KAAK;AAEpG,IAAMC,gBAAe,CAAC,KAAU,SAAyB;AACvD,aAAW,OAAO,MAAM;AACtB,WAAO,eAAe,KAAK,KAAK;AAAA,MAC9B,OAAO,IAAI,GAAG;AAAA,MACd,UAAU;AAAA,MACV,cAAc;AAAA,MACd,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AACF;AAEO,IAAM,8BAAN,MAAoF;AAAA,EAIzF,YACmB,KACA,MACA,MACA,cACA,UACA,WACA,QACA,cACA,UACjB;AATiB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAZnB,SAAQ,SAAS;AACjB,SAAQ,QAAmB,CAAC;AAa1B,IAAAA,cAAa,MAAM,CAAC,OAAO,QAAQ,QAAQ,gBAAgB,YAAY,aAAa,UAAU,gBAAgB,UAAU,CAAC;AACzH,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,MAAM,OAA2B;AAC/B,QAAI,KAAK,OAAQ,QAAO,KAAK;AAC7B,UAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,UAAM,MAAMD,OAAM,KAAK,KAAK,KAAK,QAAQ,CAAC;AAC1C,UAAM,OAAO,IAAI,IAAI,GAAG,KAAK,CAAC;AAC9B,SAAK,QAAQ,KAAK,IAAI,SAAO;AAC3B,YAAM,SAAS,KAAK,aAAa,GAAG;AACpC,UAAK,IAAY,QAAQ;AACvB,QAAC,OAAe,SAAS,IAAI;AAAA,MAC/B;AACA,aAAO;AAAA,IACT,CAAC;AACD,SAAK,SAAS;AACd,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,WAAsB;AACpB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,OAAO,QAAyC;AAC9C,UAAM,SAAS,KAAK,aAAa,MAAM;AACvC,UAAM,KAAK,KAAK,UAAU,MAAM;AAChC,QAAI,MAAM,KAAM;AAChB,QAAI,KAAK,MAAM,KAAK,UAAQ,KAAK,UAAU,IAAI,MAAM,EAAE,GAAG;AACxD;AAAA,IACF;AACA,SAAK,MAAM,KAAK,MAAM;AACtB,SAAK,IAAI;AAAA,MACP,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,EAAE,MAAM,UAAU,OAAO;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,OAAO,QAAyC;AAC9C,UAAM,KAAK,OAAO,WAAW,YAAY,OAAO,WAAW,WACvD,SACA,KAAK,UAAU,MAAM;AAEzB,QAAI,MAAM,KAAM;AAEhB,UAAM,WAAW,KAAK,MAAM,KAAK,UAAQ,KAAK,UAAU,IAAI,MAAM,EAAE;AACpE,QAAI,CAAC,SAAU;AAEf,SAAK,QAAQ,KAAK,MAAM,OAAO,UAAQ,KAAK,UAAU,IAAI,MAAM,EAAE;AAClE,SAAK,IAAI;AAAA,MACP,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,EAAE,MAAM,UAAU,QAAQ,SAAS;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,KAAyC;AACvD,UAAM,KAAK,KAAK;AAChB,UAAM,YAAY,KAAK,SAAS,aAAa,eAAe,KAAK,SAAS,MAAM;AAChF,UAAM,aAAa,IAAI,IAAI,IAAI,IAAI,QAAMA,OAAM,EAAE,CAAC,CAAC;AACnD,UAAM,aAAa,IAAI,IAAI,KAAK,MAAM,IAAI,UAAQA,OAAM,KAAK,UAAU,IAAI,CAAC,CAAC,CAAC;AAE9E,eAAW,MAAM,YAAY;AAC3B,UAAI,CAAC,WAAW,IAAI,EAAE,GAAG;AACvB,aAAK,OAAO,EAAE;AAAA,MAChB;AAAA,IACF;AAEA,eAAW,QAAQ,CAAC,GAAG,KAAK,KAAK,GAAG;AAClC,YAAM,SAASA,OAAM,KAAK,UAAU,IAAI,CAAC;AACzC,UAAI,CAAC,WAAW,IAAI,MAAM,GAAG;AAC3B,aAAK,OAAO,IAAI;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,aAAa,QAA4C;AAC/D,QAAI,OAAO,WAAW,YAAY,OAAO,WAAW,UAAU;AAC5D,YAAM,OAA4B;AAAA,QAChC,CAAC,KAAK,SAAS,GAAG;AAAA,MACpB;AACA,aAAO,KAAK,aAAa,IAAI;AAAA,IAC/B;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,UAAU,QAA8E;AAC9F,QAAI,WAAW,QAAQ,WAAW,OAAW,QAAO;AACpD,QAAI,OAAO,WAAW,YAAY,OAAO,WAAW,UAAU;AAC5D,aAAO;AAAA,IACT;AACA,WAAQ,OAAe,KAAK,SAAS,KAAK;AAAA,EAC5C;AAAA,EAEA,IAAY,cAA2B;AACrC,WAAO,GAAG,KAAK,UAAU,IAAI,IAAI,KAAK,YAAY;AAAA,EACpD;AAAA,EAEA,IAAY,YAAoB;AAC9B,WAAO,KAAK,SAAS,aAAa,eAAe,KAAK,SAAS,MAAM;AAAA,EACvE;AAAA,EAEQ,mBAAyB;AAC/B,UAAM,WAAW,KAAK,KAAK,KAAK,QAAQ;AACxC,QAAI,aAAa,UAAa,aAAa,KAAM;AACjD,UAAM,OAAO,iBAAiB,KAAK,MAAM,KAAK,cAAc,QAAQ;AACpE,QAAI,CAAC,MAAM,OAAQ;AACnB,SAAK,QAAQ,KAAK,IAAI,SAAO;AAC3B,YAAM,SAAS,KAAK,aAAa,GAAG;AACpC,UAAK,IAAY,QAAQ;AACvB,QAAC,OAAe,SAAU,IAAY;AAAA,MACxC;AACA,aAAO;AAAA,IACT,CAAC;AACD,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,SAAoB;AAClB,WAAO,KAAK;AAAA,EACd;AACF;;;AC1JA,IAAM,mBAAmB,CAAC,UACxB,OAAO,QAAQ,MAAM,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;AACzD,MAAI,IAAI,IAAI;AACZ,SAAO;AACT,GAAG,CAAC,CAA8B;AAEpC,IAAM,kBAAkB,CAAC,YAAiC;AACxD,QAAM,OAAa,CAAC;AACpB,aAAW,UAAU,SAAS;AAC5B,UAAM,EAAE,SAAS,OAAO,IAAI;AAC5B,eAAW,YAAY,QAAQ;AAC7B,YAAM,MAA2B,CAAC;AAClC,cAAQ,QAAQ,CAAC,QAAQ,QAAQ;AAC/B,YAAI,MAAM,IAAI,SAAS,GAAG;AAAA,MAC5B,CAAC;AACD,WAAK,KAAK,GAAG;AAAA,IACf;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,eAAe,OAAO,KAAoB,OAA8D;AAC5G,QAAM,WAAW,IAAI,QAAQ,cAAc,GAAG,OAAO,CAAC;AACtD,QAAM,UAAU,MAAM,IAAI,SAAS,WAAW,SAAS,KAAK,SAAS,MAAM;AAC3E,SAAO,gBAAgB,OAAO;AAChC;AAEA,IAAME,SAAQ,CAAC,UAA4B,UAAU,QAAQ,UAAU,SAAY,KAAK,OAAO,KAAK;AAE7F,IAAM,sBAAsB,OACjC,KACA,WACA,eACA,aAC+B;AAC/B,QAAM,WAAW,SAAS,YAAY,eAAe,SAAS;AAC9D,QAAM,QAAQ,IAAI,oBAAoB,SAAS;AAC/C,QAAM,OAAO,oBAAI,IAAa;AAE9B,aAAW,WAAW,OAAO;AAC3B,UAAM,QAAQ,QAAQ,OAAO,QAAQ;AACrC,QAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,WAAK,IAAI,KAAK;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,CAAC,KAAK,MAAM;AACd,WAAO,oBAAI,IAAI;AAAA,EACjB;AAEA,QAAM,YAAY,iBAAiB,SAAS,MAAM;AAClD,QAAM,KAAK,IAAI,mBAAmB,SAAS,MAAM,EAAE,OAAO,SAAS;AACnE,QAAM,WAAW,SAAS,OAAO,QAAQ,SAAS,UAAU;AAC5D,MAAI,CAAC,SAAU,QAAO,oBAAI,IAAI;AAE9B,KAAG,MAAM,OAAO,UAAU,MAAM,KAAK,IAAI,CAAsC,CAAC;AAEhF,QAAM,OAAO,MAAM,aAAa,KAAK,EAAE;AACvC,QAAM,UAAU,oBAAI,IAAkB;AAEtC,aAAW,OAAO,MAAM;AACtB,UAAM,UAAU,IAAI,SAAS,UAAU;AACvC,QAAI,YAAY,QAAQ,YAAY,OAAW;AAC/C,UAAM,MAAMA,OAAM,OAAO;AACzB,UAAM,SAAS,QAAQ,IAAI,GAAG,KAAK,CAAC;AACpC,WAAO,KAAK,GAAG;AACf,YAAQ,IAAI,KAAK,MAAM;AAAA,EACzB;AAEA,SAAO;AACT;AAEO,IAAM,qBAAqB,OAChC,KACA,WACA,eACA,aAC8C;AAC9C,QAAM,WAAW,SAAS,YAAY,eAAe,SAAS;AAC9D,QAAM,QAAQ,IAAI,oBAAoB,SAAS;AAC/C,QAAM,OAAO,oBAAI,IAAa;AAE9B,aAAW,WAAW,OAAO;AAC3B,UAAM,QAAQ,QAAQ,OAAO,QAAQ;AACrC,QAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,WAAK,IAAI,KAAK;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,CAAC,KAAK,MAAM;AACd,WAAO,oBAAI,IAAI;AAAA,EACjB;AAEA,QAAM,YAAY,iBAAiB,SAAS,MAAM;AAClD,QAAM,KAAK,IAAI,mBAAmB,SAAS,MAAM,EAAE,OAAO,SAAS;AACnE,QAAM,WAAW,SAAS,OAAO,QAAQ,SAAS,UAAU;AAC5D,MAAI,CAAC,SAAU,QAAO,oBAAI,IAAI;AAE9B,KAAG,MAAM,OAAO,UAAU,MAAM,KAAK,IAAI,CAAsC,CAAC;AAEhF,QAAM,OAAO,MAAM,aAAa,KAAK,EAAE;AACvC,QAAM,SAAS,oBAAI,IAAiC;AAEpD,aAAW,OAAO,MAAM;AACtB,UAAM,UAAU,IAAI,SAAS,UAAU;AACvC,QAAI,YAAY,QAAQ,YAAY,OAAW;AAC/C,UAAM,MAAMA,OAAM,OAAO;AACzB,QAAI,CAAC,OAAO,IAAI,GAAG,GAAG;AACpB,aAAO,IAAI,KAAK,GAAG;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,wBAAwB,OACnC,KACA,WACA,eACA,aAC8C;AAC9C,QAAM,QAAQ,IAAI,oBAAoB,SAAS;AAC/C,QAAM,cAAc,oBAAI,IAAa;AAErC,aAAW,WAAW,OAAO;AAC3B,UAAM,QAAQ,QAAQ,OAAO,SAAS,UAAU;AAChD,QAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,kBAAY,IAAI,KAAK;AAAA,IACvB;AAAA,EACF;AAEA,MAAI,CAAC,YAAY,MAAM;AACrB,WAAO,oBAAI,IAAI;AAAA,EACjB;AAEA,QAAM,YAAY,iBAAiB,SAAS,MAAM;AAClD,QAAM,KAAK,IAAI,mBAAmB,SAAS,MAAM,EAAE,OAAO,SAAS;AACnE,QAAM,YAAY,SAAS,YAAY,eAAe,SAAS,MAAM;AACrE,QAAM,WAAW,SAAS,OAAO,QAAQ,SAAS;AAClD,MAAI,CAAC,SAAU,QAAO,oBAAI,IAAI;AAE9B,KAAG,MAAM,OAAO,UAAU,MAAM,KAAK,WAAW,CAAsC,CAAC;AACvF,QAAM,OAAO,MAAM,aAAa,KAAK,EAAE;AACvC,QAAM,MAAM,oBAAI,IAAiC;AAEjD,aAAW,OAAO,MAAM;AACtB,UAAM,WAAW,IAAI,SAAS;AAC9B,QAAI,aAAa,QAAQ,aAAa,OAAW;AACjD,QAAI,IAAIA,OAAM,QAAQ,GAAG,GAAG;AAAA,EAC9B;AAEA,SAAO;AACT;AAEO,IAAM,4BAA4B,OACvC,KACA,WACA,eACA,aAC+B;AAC/B,QAAM,UAAU,SAAS,YAAY,eAAe,SAAS;AAC7D,QAAM,QAAQ,IAAI,oBAAoB,SAAS;AAC/C,QAAM,UAAU,oBAAI,IAAa;AAEjC,aAAW,WAAW,OAAO;AAC3B,UAAM,QAAQ,QAAQ,OAAO,OAAO;AACpC,QAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,cAAQ,IAAI,KAAK;AAAA,IACnB;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,MAAM;AACjB,WAAO,oBAAI,IAAI;AAAA,EACjB;AAEA,QAAM,cAAc,iBAAiB,SAAS,UAAU;AACxD,QAAM,UAAU,IAAI,mBAAmB,SAAS,UAAU,EAAE,OAAO,WAAW;AAC9E,QAAM,aAAa,SAAS,WAAW,QAAQ,SAAS,qBAAqB;AAC7E,MAAI,CAAC,WAAY,QAAO,oBAAI,IAAI;AAEhC,UAAQ,MAAM,OAAO,YAAY,MAAM,KAAK,OAAO,CAAsC,CAAC;AAC1F,QAAM,YAAY,MAAM,aAAa,KAAK,OAAO;AAEjD,QAAM,aAAa,oBAAI,IAAiE;AACxF,QAAM,YAAY,oBAAI,IAAa;AAEnC,aAAW,SAAS,WAAW;AAC7B,UAAM,YAAY,MAAM,SAAS,qBAAqB;AACtD,UAAM,cAAc,MAAM,SAAS,uBAAuB;AAC1D,QAAI,cAAc,QAAQ,cAAc,UAAa,gBAAgB,QAAQ,gBAAgB,QAAW;AACtG;AAAA,IACF;AACA,UAAM,SAAS,WAAW,IAAIA,OAAM,SAAS,CAAC,KAAK,CAAC;AACpD,WAAO,KAAK;AAAA,MACV,UAAU;AAAA,MACV,OAAO,EAAE,GAAG,MAAM;AAAA,IACpB,CAAC;AACD,eAAW,IAAIA,OAAM,SAAS,GAAG,MAAM;AACvC,cAAU,IAAI,WAAW;AAAA,EAC3B;AAEA,MAAI,CAAC,UAAU,MAAM;AACnB,WAAO,oBAAI,IAAI;AAAA,EACjB;AAEA,QAAM,eAAe,iBAAiB,SAAS,MAAM;AACrD,QAAM,YAAY,SAAS,aAAa,eAAe,SAAS,MAAM;AACtE,QAAM,iBAAiB,SAAS,OAAO,QAAQ,SAAS;AACxD,MAAI,CAAC,eAAgB,QAAO,oBAAI,IAAI;AAEpC,QAAM,WAAW,IAAI,mBAAmB,SAAS,MAAM,EAAE,OAAO,YAAY;AAC5E,WAAS,MAAM,OAAO,gBAAgB,MAAM,KAAK,SAAS,CAAsC,CAAC;AACjG,QAAM,aAAa,MAAM,aAAa,KAAK,QAAQ;AACnD,QAAM,YAAY,oBAAI,IAAiC;AAEvD,aAAW,OAAO,YAAY;AAC5B,UAAM,UAAU,IAAI,SAAS;AAC7B,QAAI,YAAY,QAAQ,YAAY,OAAW;AAC/C,cAAU,IAAIA,OAAM,OAAO,GAAG,GAAG;AAAA,EACnC;AAEA,QAAM,SAAS,oBAAI,IAAkB;AAErC,aAAW,CAAC,QAAQ,OAAO,KAAK,WAAW,QAAQ,GAAG;AACpD,UAAM,SAAe,CAAC;AACtB,eAAW,SAAS,SAAS;AAC3B,YAAM,YAAY,UAAU,IAAIA,OAAM,MAAM,QAAQ,CAAC;AACrD,UAAI,CAAC,UAAW;AAChB,aAAO,KAAK;AAAA,QACV,GAAG;AAAA,QACH,QAAQ,MAAM;AAAA,MAChB,CAAC;AAAA,IACH;AACA,WAAO,IAAI,QAAQ,MAAM;AAAA,EAC3B;AAEA,SAAO;AACT;;;AC1OA,IAAM,sBAAsB,CAC1B,MACA,cACA,YACe;AACf,MAAI,KAAK,cAAc,IAAI,YAAY,GAAG;AACxC,WAAO,KAAK,cAAc,IAAI,YAAY;AAAA,EAC5C;AAEA,QAAM,UAAU,QAAQ,EAAE,KAAK,WAAS;AACtC,eAAW,WAAW,KAAK,IAAI,oBAAoB,KAAK,KAAK,GAAG;AAC9D,YAAM,YAAY,cAAc,QAAQ,MAAM;AAC9C,UAAI,CAAC,UAAW;AAChB,gBAAU,kBAAkB,IAAI,cAAc,KAAK;AAAA,IACrD;AACA,WAAO;AAAA,EACT,CAAC;AAED,OAAK,cAAc,IAAI,cAAc,OAAO;AAE5C,aAAW,WAAW,KAAK,IAAI,oBAAoB,KAAK,KAAK,GAAG;AAC9D,UAAM,YAAY,cAAc,QAAQ,MAAM;AAC9C,QAAI,CAAC,UAAW;AAChB,cAAU,cAAc,IAAI,cAAc,OAAO;AAAA,EACnD;AAEA,SAAO;AACT;AAEO,IAAM,oBAAoB,CAI/B,KACA,OACA,KACA,gBAAyB,CAAC,MACC;AAC3B,QAAM,SAA8B,EAAE,GAAG,IAAI;AAC7C,QAAM,OAA2B;AAAA,IAC/B;AAAA,IACA;AAAA,IACA,eAAe,CAAC,GAAG,aAAa;AAAA,IAChC,eAAe,oBAAI,IAAI;AAAA,IACvB,mBAAmB,oBAAI,IAAI;AAAA,IAC3B,kBAAkB,oBAAI,IAAI;AAAA,EAC5B;AAEA,SAAO,eAAe,QAAQ,aAAa;AAAA,IACzC,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ,CAAC;AAED,MAAI;AACJ,QAAM,UAA6B;AAAA,IACjC,IAAI,WAAW,MAAM,UAAU;AAC7B,UAAI,SAAS,aAAa;AACxB,eAAO;AAAA,MACT;AAEA,UAAI,SAAS,SAAS;AACpB,eAAO,OAAO,iBAA4C;AACxD,gBAAM,UAAU,mBAAmB,MAAM,cAAwB,KAAK;AACtE,cAAI,WAAW,OAAO,QAAQ,SAAS,YAAY;AACjD,mBAAO,QAAQ,KAAK;AAAA,UACtB;AACA,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,UAAI,OAAO,SAAS,YAAY,MAAM,UAAU,IAAI,GAAG;AACrD,eAAO,mBAAmB,MAAM,MAAM,KAAK;AAAA,MAC7C;AAEA,aAAO,QAAQ,IAAI,WAAW,MAAM,QAAQ;AAAA,IAC9C;AAAA,IAEA,IAAI,WAAW,MAAM,OAAO,UAAU;AACpC,YAAM,SAAS,QAAQ,IAAI,WAAW,MAAM,OAAO,QAAQ;AAC3D,UAAI,OAAO,SAAS,YAAY,MAAM,QAAQ,IAAI,GAAG;AACnD,YAAI,UAAU,KAAK;AAAA,MACrB;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,UAAQ,IAAI,MAAM,QAAQ,OAAO;AACjC,yBAAuB,OAAO,KAAK,IAAI;AACvC,SAAO;AACT;AAEO,IAAM,sBAAsB,CACjC,KACA,OACA,KACA,gBAA+C,CAAC,MACrB;AAC3B,QAAM,SAAS,eAAe,KAAK;AACnC,QAAM,UAAU,IAAI,MAAM;AAC1B,MAAI,YAAY,UAAa,YAAY,MAAM;AAC7C,UAAM,UAAU,IAAI,UAAU,OAAO,OAAO;AAC5C,QAAI,QAAS,QAAO;AAAA,EACtB;AAEA,QAAM,SAAS,kBAAkB,KAAK,OAAO,KAAK,aAAa;AAC/D,MAAI,YAAY,UAAa,YAAY,MAAM;AAC7C,QAAI,aAAa,OAAO,SAAS,MAAM;AAAA,EACzC,OAAO;AACL,QAAI,SAAS,OAAO,MAAM;AAAA,EAC5B;AAEA,SAAO;AACT;AAEA,IAAMC,SAAQ,CAAC,UAA4B,UAAU,QAAQ,UAAU,SAAY,KAAK,OAAO,KAAK;AAEpG,IAAM,yBAAyB,CAC7B,QACA,KACA,SACS;AACT,aAAW,gBAAgB,OAAO,KAAK,KAAK,MAAM,SAAS,GAAG;AAC5D,UAAM,WAAW,KAAK,MAAM,UAAU,YAAY;AAClD,UAAM,OAAO,IAAI,YAAY;AAC7B,QAAI,SAAS,SAAS,cAAc,QAAQ;AAC1C,YAAM,WAAW,SAAS,YAAY,eAAe,KAAK,KAAK;AAC/D,YAAM,YAAY,OAAO,QAAQ;AACjC,UAAI,cAAc,UAAa,cAAc,KAAM;AACnD,UAAI,CAAC,QAAQ,OAAO,SAAS,SAAU;AACvC,YAAM,QAAQ,oBAAI,IAAiC;AACnD,YAAM,IAAIA,OAAM,SAAS,GAAG,IAA2B;AACvD,WAAK,kBAAkB,IAAI,cAAc,KAAK;AAC9C,WAAK,cAAc,IAAI,cAAc,QAAQ,QAAQ,KAAK,CAAC;AAC3D;AAAA,IACF;AAEA,QAAI,CAAC,MAAM,QAAQ,IAAI,EAAG;AAE1B,QAAI,SAAS,SAAS,cAAc,WAAW,SAAS,SAAS,cAAc,eAAe;AAC5F,YAAM,WAAW,SAAS,YAAY,eAAe,KAAK,KAAK;AAC/D,YAAM,YAAY,OAAO,QAAQ;AACjC,UAAI,cAAc,UAAa,cAAc,KAAM;AACnD,YAAM,QAAQ,oBAAI,IAAkB;AACpC,YAAM,IAAIA,OAAM,SAAS,GAAG,IAAY;AACxC,WAAK,kBAAkB,IAAI,cAAc,KAAK;AAC9C,WAAK,cAAc,IAAI,cAAc,QAAQ,QAAQ,KAAK,CAAC;AAC3D;AAAA,IACF;AAEA,QAAI,SAAS,SAAS,cAAc,WAAW;AAC7C,YAAM,YAAY,SAAS,YAAY,eAAe,SAAS,MAAM;AACrE,YAAM,QAAQ,oBAAI,IAAiC;AACnD,iBAAW,QAAQ,MAAM;AACvB,cAAM,UAAU,KAAK,SAAS;AAC9B,YAAI,YAAY,UAAa,YAAY,KAAM;AAC/C,cAAM,IAAIA,OAAM,OAAO,GAAG,IAAI;AAAA,MAChC;AACA,UAAI,MAAM,MAAM;AACd,aAAK,kBAAkB,IAAI,cAAc,KAAK;AAC9C,aAAK,cAAc,IAAI,cAAc,QAAQ,QAAQ,KAAK,CAAC;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,qBAAqB,CACzB,MACA,cACA,UACoH;AACpH,MAAI,KAAK,iBAAiB,IAAI,YAAY,GAAG;AAC3C,WAAO,KAAK,iBAAiB,IAAI,YAAY;AAAA,EAC/C;AAEA,QAAM,WAAW,KAAK,MAAM,UAAU,YAAY;AAClD,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,UAAU,mBAAmB,MAAM,cAAc,UAAiB,KAAK;AAC7E,MAAI,SAAS;AACX,SAAK,iBAAiB,IAAI,cAAc,OAAO;AAAA,EACjD;AAEA,SAAO;AACT;AAEA,IAAM,qBAAqB,CACzB,MACA,cACA,UACA,UACoH;AACpH,UAAQ,SAAS,MAAM;AAAA,IACrB,KAAK,cAAc,QAAQ;AACzB,YAAMC,UAAS;AACf,YAAM,WAAWA,QAAO,YAAY,eAAe,KAAK,KAAK;AAC7D,YAAM,SAAS,MAAM;AAAA,QAAoB;AAAA,QAAM;AAAA,QAAc,MAC3D,mBAAmB,KAAK,KAAK,KAAK,OAAO,cAAcA,OAAM;AAAA,MAC/D;AACA,aAAO,IAAI;AAAA,QACT,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACAA;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA,CAAC,QAA6B,oBAAoB,KAAK,KAAKA,QAAO,QAAQ,GAAG;AAAA,QAC9E;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,cAAc,SAAS;AAC1B,YAAMC,WAAU;AAChB,YAAM,WAAWA,SAAQ,YAAY,eAAe,KAAK,KAAK;AAC9D,YAAM,SAAS,MAAM;AAAA,QAAoB;AAAA,QAAM;AAAA,QAAc,MAC3D,oBAAoB,KAAK,KAAK,KAAK,OAAO,cAAcA,QAAO;AAAA,MACjE;AACA,aAAO,IAAI;AAAA,QACT,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACAA;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA,CAAC,QAA6B,oBAAoB,KAAK,KAAK,SAAS,QAAQ,GAAG;AAAA,QAChF;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,cAAc,WAAW;AAC5B,YAAMC,aAAY;AAClB,YAAM,YAAYA,WAAU,YAAY,eAAeA,WAAU,MAAM;AACvE,YAAM,SAAS,MAAM;AAAA,QAAoB;AAAA,QAAM;AAAA,QAAc,MAC3D,sBAAsB,KAAK,KAAK,KAAK,OAAO,cAAcA,UAAS;AAAA,MACrE;AACA,aAAO,IAAI;AAAA,QACT,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACAA;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA,CAAC,QAA6B,oBAAoB,KAAK,KAAK,SAAS,QAAQ,GAAG;AAAA,QAChF;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,cAAc,eAAe;AAChC,YAAM,OAAO;AACb,YAAM,WAAW,KAAK,YAAY,eAAe,KAAK,KAAK;AAC3D,YAAM,SAAS,MAAM;AAAA,QAAoB;AAAA,QAAM;AAAA,QAAc,MAC3D,0BAA0B,KAAK,KAAK,KAAK,OAAO,cAAc,IAAI;AAAA,MACpE;AACA,aAAO,IAAI;AAAA,QACT,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA,CAAC,QAA6B,oBAAoB,KAAK,KAAK,SAAS,QAAQ,GAAG;AAAA,QAChF;AAAA,MACF;AAAA,IACF;AAAA,IACA;AACE,aAAO;AAAA,EACX;AACF;;;AC9QA,IAAM,iBAAiB,CAAC,YAAiE;AACvF,QAAM,OAAc,CAAC;AACrB,aAAW,UAAU,SAAS;AAC5B,UAAM,EAAE,SAAS,OAAO,IAAI;AAC5B,eAAW,YAAY,QAAQ;AAC7B,YAAM,MAAW,CAAC;AAClB,cAAQ,QAAQ,CAAC,QAAQ,QAAQ;AAC/B,YAAI,MAAM,IAAI,SAAS,GAAG;AAAA,MAC5B,CAAC;AACD,WAAK,KAAK,GAAG;AAAA,IACf;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,2BAA2B,OAC/B,WACA,OACsC;AACtC,QAAM,MAAM,GAAG,OAAO;AACtB,QAAM,WAAW,UAAU,QAAQ,cAAc,GAAG;AACpD,QAAM,WAAW,MAAM,UAAU,SAAS,WAAW,SAAS,KAAK,SAAS,MAAM;AAClF,QAAM,OAAO,eAAe,QAAQ;AAEpC,MAAI,IAAI,UAAU,IAAI,OAAO,SAAS,GAAG;AACvC,WAAO,KAAK,IAAI,SAAO,kBAAkB,WAAW,GAAG,SAAS,GAAG,KAAK,GAAG,iBAAiB,CAAC,CAAC;AAAA,EAChG;AAEA,QAAM,WAAW,YAAY,MAAM,GAAG,iBAAiB,CAAC;AACxD,SAAO,SAAS,IAAI,SAAO,oBAAoB,WAAW,GAAG,SAAS,GAAG,KAAK,GAAG,iBAAiB,CAAC,CAAC;AACtG;AAEA,eAAsB,gBACpB,SACA,IACmC;AACnC,SAAO,yBAAyB,SAAS,EAAE;AAC7C;AAEA,eAAsB,4BACpB,UACA,QACA,IACmC;AACnC,QAAM,YAAY,OAAO;AACzB,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AACA,SAAO,yBAAyB,WAAW,EAAE;AAC/C;;;ACkDO,IAAM,qBAAN,MAAM,oBAAgE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4B3E,YAEE,OAEA,OAEA,WAEA,cAEA,eAEA;AAEA,UAAM,OAAO,sCAAsC,YAAY;AAE/D,SAAK,MAAM,EAAE,OAAO,KAAK;AAEzB,UAAM,eAAe,SAAS,KAAK,YAAY,KAAK;AAEpD,UAAM,mBAAmB,aAAa,KAAK,gBAAgB,KAAK;AAEhE,SAAK,UAAU;AAAA,MAEb,OAAO;AAAA,MAEP,WAAW;AAAA,IAEb;AAEA,SAAK,gBAAgB,IAAI,IAAI,iBAAiB,CAAC,CAAC;AAEhD,SAAK,iBAAiB,IAAI,eAAe,KAAK,GAAG;AAEjD,SAAK,kBAAkB,IAAI,gBAAgB,KAAK,GAAG;AAAA,EAErD;AAAA,EAIQ,MAEN,UAAqC,KAAK,SAE1C,gBAAgB,IAAI,IAAI,KAAK,aAAa,GAEX;AAE/B,WAAO,IAAI,oBAAmB,KAAK,IAAI,OAAiB,QAAQ,OAAO,QAAQ,WAAW,KAAK,IAAI,MAAM,aAAa;AAAA,EAExH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,GAAG,OAA8C;AAC/C,UAAM,OAAO,KAAK,QAAQ,MAAM,IAAI;AACpC,QAAI,KAAK,SAAS,SAAS;AACzB,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACvD;AACA,UAAM,WAAW,EAAE,GAAG,MAAM,MAAM;AAClC,UAAM,cAAc,KAAK,SAAS,KAAK,SAAS,aAAW,QAAQ,SAAS,QAAQ,CAAC;AACrF,WAAO,KAAK,MAAM,WAAW;AAAA,EAC/B;AAAA,EAIQ,iBAAiB,OAAkF;AAEzG,WAAO,OAAQ,MAAc,WAAW,aAEnC,MAAiD,OAAO,IAExD;AAAA,EAEP;AAAA,EAEQ,iBAAiB,KAAsB,aAA+C;AAC5F,QAAI,CAAC,YAAa,QAAO;AACzB,UAAM,gBAAgB,IAAI,QAAQ,IAAI,aAAa,IAAI,KAAK,IAAI;AAChE,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAIQ,mBAA+C,OAA8C;AAEnG,WAAO,IAAI,oBAAmB,OAAO,QAAW,QAAW,KAAK,IAAI,IAAI;AAAA,EAE1E;AAAA,EAIQ,SAEN,SAEA,SAE2B;AAE3B,UAAM,aAAa,KAAK,IAAI,KAAK,sBAAsB,KAAK,IAAI,OAAO,QAAQ,KAAK;AAEpF,UAAM,YAAY,QAAQ,UAAU;AAEpC,WAAO,EAAE,OAAO,WAAW,WAAW,QAAQ,UAAU;AAAA,EAE1D;AAAA,EAIQ,UAEN,SAEA,OAEA,WAEA,MAE2B;AAE3B,UAAM,WAAW,eAAe,MAAM,MAAM,MAAM,SAAS;AAE3D,WAAO,KAAK,SAAS,SAAS,aAAW,QAAQ,SAAS,QAAQ,CAAC;AAAA,EAErE;AAAA,EAIQ,kBAEN,UAEA,OAE2B;AAE3B,UAAM,SAAS,KAAK,iBAAiB,KAAK;AAE1C,WAAO,KAAK,SAAS,KAAK,SAAS,aAAW,QAAQ,iBAAiB,UAAU,MAAM,CAAC;AAAA,EAE1F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,OAAO,SAA8E;AAEnF,WAAO,KAAK,MAAM,KAAK,eAAe,OAAO,KAAK,SAAS,OAAO,CAAC;AAAA,EAErE;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAA6D,MAA0C;AACrG,UAAM,YAAuC,CAAC;AAE9C,eAAW,OAAO,MAAM;AACtB,YAAMC,OAAM,KAAK,IAAI,MAAM,QAAQ,GAAG;AACtC,UAAI,CAACA,MAAK;AACR,cAAM,IAAI,MAAM,WAAW,GAAG,yBAAyB,KAAK,IAAI,MAAM,IAAI,GAAG;AAAA,MAC/E;AACA,gBAAU,GAAG,IAAIA;AAAA,IACnB;AAEA,WAAO,KAAK,OAAO,SAAS;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,aAAa,MAA+C;AAE1D,WAAO,KAAK,MAAM,KAAK,eAAe,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,EAErE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,KAAK,MAAc,OAAiE,SAAmD;AAErI,UAAM,SAAS,KAAK,iBAAiB,KAAK;AAE1C,UAAM,cAAc,KAAK,SAAS,KAAK,SAAS,aAAW,QAAQ,QAAQ,MAAM,QAAQ,SAAS,KAAK,CAAC;AAExG,WAAO,KAAK,MAAM,WAAW;AAAA,EAE/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,cAAc,MAAc,OAAiE,SAAmD;AAE9I,UAAM,SAAS,KAAK,iBAAiB,KAAK;AAE1C,UAAM,cAAc,KAAK,SAAS,KAAK,SAAS,aAAW,QAAQ,QAAQ,MAAM,QAAQ,SAAS,IAAI,CAAC;AAEvG,WAAO,KAAK,MAAM,WAAW;AAAA,EAE/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,aACE,UACA,OACA,eAC+B;AAC/B,UAAM,SAAS,KAAK,iBAAiB,QAAQ;AAC7C,UAAM,WAAW,aAAa,QAAQ,OAAO,aAAa;AAC1D,UAAM,cAAc,KAAK,SAAS,KAAK,SAAS,aAAW,QAAQ,SAAS,QAAQ,CAAC;AACrF,WAAO,KAAK,MAAM,WAAW;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,eAAe,OAAe,KAA8F;AAE1H,UAAM,QAAQ,KAAK,iBAAiB,GAAG;AAEvC,WAAO,KAAK,MAAM,KAAK,eAAe,eAAe,KAAK,SAAS,OAAO,KAAK,CAAC;AAAA,EAElF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,aACE,UACA,OACA,WACA,WAAqB,WAAW,OAChC,eAC+B;AAC/B,UAAM,SAAS,KAAK,iBAAiB,QAAQ;AAC7C,UAAM,WAAW,eAAe,UAAU,aAAa,QAAQ,OAAO,aAAa,GAAG,SAAS;AAC/F,UAAM,cAAc,KAAK,SAAS,KAAK,SAAS,aAAW,QAAQ,SAAS,QAAQ,CAAC;AACrF,WAAO,KAAK,MAAM,WAAW;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,UAAU,OAAiB,WAAgE;AAEzF,UAAM,cAAc,KAAK,UAAU,KAAK,SAAS,OAAO,WAAW,WAAW,KAAK;AAEnF,WAAO,KAAK,MAAM,WAAW;AAAA,EAE/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,SAAS,OAAiB,WAAgE;AAExF,UAAM,cAAc,KAAK,UAAU,KAAK,SAAS,OAAO,WAAW,WAAW,IAAI;AAElF,WAAO,KAAK,MAAM,WAAW;AAAA,EAE/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,UAAU,OAAiB,WAAgE;AAEzF,UAAM,cAAc,KAAK,UAAU,KAAK,SAAS,OAAO,WAAW,WAAW,KAAK;AAEnF,WAAO,KAAK,MAAM,WAAW;AAAA,EAE/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,cAAsB,WAA2D;AAErF,UAAM,cAAc,KAAK,gBAAgB,MAAM,KAAK,SAAS,cAAc,SAAS;AAEpF,WAAO,KAAK,MAAM,WAAW;AAAA,EAE/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,aAEE,cAEA,WAAqB,WAAW,OAEhC,gBAE+B;AAE/B,UAAM,cAAc,KAAK,gBAAgB,aAAa,KAAK,SAAS,cAAc,UAAU,cAAc;AAE1G,WAAO,KAAK,MAAM,WAAW;AAAA,EAE/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,QAAQ,cAAsB,SAAiE;AAE7F,UAAM,cAAc,KAAK,gBAAgB,QAAQ,KAAK,SAAS,cAAc,OAAO;AAEpF,WAAO,KAAK,MAAM,WAAW;AAAA,EAE/B;AAAA,EAIA,YAAiD,cAAgD;AAE/F,UAAM,WAAW,IAAI,IAAI,KAAK,aAAa;AAE3C,aAAS,IAAI,YAAsB;AAEnC,WAAO,KAAK,MAAM,KAAK,SAAS,QAAQ;AAAA,EAE1C;AAAA;AAAA;AAAA;AAAA,EAKA,sBAKE,iBAAoB,MAA0C;AAC9D,UAAM,WAAW,KAAK,IAAI,MAAM,UAAU,YAAY;AACtD,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,aAAa,YAAY,yBAAyB,KAAK,IAAI,MAAM,IAAI,GAAG;AAAA,IAC1F;AACA,UAAM,SAAS,SAAS;AAExB,eAAWA,QAAO,MAAM;AACtB,UAAI,CAAC,OAAO,QAAQA,IAAG,GAAG;AACxB,cAAM,IAAI;AAAA,UACR,WAAWA,IAAG,iCAAiC,OAAO,IAAI,mBAAmB,YAAY;AAAA,QAC3F;AAAA,MACF;AAAA,IACF;AAEA,WAAO,KAAK,QAAQ,cAAwB,EAAE,SAAS,KAAiB,CAAC;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA,EAMA,YAKE,cAAiB,MAA0C;AAC3D,WAAO,KAAK,sBAAsB,cAAc,GAAG,IAAI;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB,QAAiE;AACjF,QAAI,KAAoC;AAExC,QAAI,OAAO,MAAM,QAAQ;AACvB,WAAK,GAAG,cAAc,GAAG,OAAO,IAAI;AAAA,IACtC;AAEA,eAAW,OAAO,OAAO,KAAK,MAAM,GAA8B;AAChE,UAAI,QAAQ,OAAQ;AACpB,YAAM,UAAU;AAChB,YAAM,OAAO,OAAO,OAAyC;AAC7D,UAAI,CAAC,QAAQ,CAAC,KAAK,OAAQ;AAC3B,WAAK,GAAG,sBAAsB,SAAS,GAAI,IAAiB;AAAA,IAC9D;AAEA,WAAO;AAAA,EACT;AAAA,EAIA,mBAAkD;AAEhD,WAAO,MAAM,KAAK,KAAK,aAAa;AAAA,EAEtC;AAAA,EAIA,WAAmB;AAEjB,WAAO,KAAK,IAAI;AAAA,EAElB;AAAA,EAIA,MAAM,QAAQ,KAAoD;AAEhE,WAAO,gBAAgB,KAAK,IAAI;AAAA,EAElC;AAAA,EAIA,MAAM,oBAAoB,SAA2B,QAA6D;AAEhH,WAAO,4BAA4B,SAAS,QAAQ,IAAI;AAAA,EAE1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,MAAqD;AAEzD,UAAM,cAAc,KAAK,SAAS,KAAK,SAAS,aAAW,QAAQ,UAAU,IAAI,CAAC;AAElF,WAAO,KAAK,MAAM,WAAW;AAAA,EAE/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,QAAQA,MAA4D;AAElE,UAAM,cAAc,KAAK,SAAS,KAAK,SAAS,aAAW,QAAQ,YAAYA,IAAG,CAAC;AAEnF,WAAO,KAAK,MAAM,WAAW;AAAA,EAE/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,OAAO,MAAqD;AAE1D,UAAM,cAAc,KAAK,SAAS,KAAK,SAAS,aAAW,QAAQ,WAAW,IAAI,CAAC;AAEnF,WAAO,KAAK,MAAM,WAAW;AAAA,EAE/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,QAAQA,MAA6B,YAA4B,iBAAiB,KAAoC;AAEpH,UAAM,cAAc,KAAK,SAAS,KAAK,SAAS,aAAW,QAAQ,YAAYA,MAAK,SAAS,CAAC;AAE9F,WAAO,KAAK,MAAM,WAAW;AAAA,EAE/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,YAAY,MAAiE;AAE3E,WAAO,KAAK,MAAM,KAAK,eAAe,SAAS,KAAK,SAAS,IAAI,CAAC;AAAA,EAEpE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,GAA0C;AAE9C,UAAM,cAAc,KAAK,SAAS,KAAK,SAAS,aAAW,QAAQ,UAAU,CAAC,CAAC;AAE/E,WAAO,KAAK,MAAM,WAAW;AAAA,EAE/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,OAAO,GAA0C;AAE/C,UAAM,cAAc,KAAK,SAAS,KAAK,SAAS,aAAW,QAAQ,WAAW,CAAC,CAAC;AAEhF,WAAO,KAAK,MAAM,WAAW;AAAA,EAE/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,OAAgG;AAEpG,WAAO,KAAK,MAAM,KAAK,kBAAkB,SAAS,KAAK,CAAC;AAAA,EAE1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,SAAS,OAAgG;AAEvG,WAAO,KAAK,MAAM,KAAK,kBAAkB,aAAa,KAAK,CAAC;AAAA,EAE9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,UAAU,OAAgG;AAExG,WAAO,KAAK,MAAM,KAAK,kBAAkB,aAAa,KAAK,CAAC;AAAA,EAE9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,OAAO,OAAgG;AAErG,WAAO,KAAK,MAAM,KAAK,kBAAkB,UAAU,KAAK,CAAC;AAAA,EAE3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,YACE,UACA,WAC+B;AAC/B,UAAM,SAAS,KAAK,iBAAiB,QAAQ;AAC7C,UAAM,aAAa,KAAK,iBAAiB,QAAQ,SAAS;AAC1D,WAAO,KAAK,MAAM,OAAO,UAAU,CAAC;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,eACE,UACA,WAC+B;AAC/B,UAAM,SAAS,KAAK,iBAAiB,QAAQ;AAC7C,UAAM,aAAa,KAAK,iBAAiB,QAAQ,SAAS;AAC1D,WAAO,KAAK,MAAM,UAAU,UAAU,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,SAEE,cAEA,mBAEA,cAE+B;AAE/B,UAAM,WAAW,KAAK,IAAI,MAAM,UAAU,YAAY;AAEtD,QAAI,CAAC,UAAU;AAEb,YAAM,IAAI,MAAM,aAAa,YAAY,yBAAyB,KAAK,IAAI,MAAM,IAAI,GAAG;AAAA,IAE1F;AAIA,UAAM,WAAW,OAAO,sBAAsB,aAAa,oBAAwC;AACnG,UAAM,UAAW,OAAO,sBAAsB,aAAa,eAAe;AAE1E,QAAI,QAAQ,KAAK,mBAAgD,SAAS,MAAM;AAEhF,QAAI,UAAU;AAEZ,cAAQ,SAAS,KAAK;AAAA,IAExB;AAIA,UAAM,SAAS,MAAM,OAAO;AAE5B,UAAM,cAAc,KAAK,gBAAgB,yBAAyB,KAAK,SAAS,cAAc,QAAQ,SAAS,SAAS;AAExH,WAAO,KAAK,MAAM,OAAO,WAAW,CAAC;AAAA,EAEvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,YAEE,cAEA,mBAEA,cAE+B;AAE/B,UAAM,WAAW,KAAK,IAAI,MAAM,UAAU,YAAY;AAEtD,QAAI,CAAC,UAAU;AAEb,YAAM,IAAI,MAAM,aAAa,YAAY,yBAAyB,KAAK,IAAI,MAAM,IAAI,GAAG;AAAA,IAE1F;AAIA,UAAM,WAAW,OAAO,sBAAsB,aAAa,oBAAwC;AACnG,UAAM,UAAW,OAAO,sBAAsB,aAAa,eAAe;AAE1E,QAAI,QAAQ,KAAK,mBAAgD,SAAS,MAAM;AAEhF,QAAI,UAAU;AAEZ,cAAQ,SAAS,KAAK;AAAA,IAExB;AAIA,UAAM,SAAS,MAAM,OAAO;AAE5B,UAAM,cAAc,KAAK,gBAAgB,yBAAyB,KAAK,SAAS,cAAc,QAAQ,SAAS,SAAS;AAExH,WAAO,KAAK,MAAM,UAAU,WAAW,CAAC;AAAA,EAE1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,QAAQ,SAA4C;AAElD,UAAM,WAAW,oBAAoB,OAAO;AAE5C,WAAO,SAAS,cAAc,KAAK,QAAQ,MAAM,GAAG;AAAA,EAEtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,SAAqC;AAEzC,WAAO,KAAK,QAAQ,OAAO,EAAE;AAAA,EAE/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,mBAA8C;AAE5C,WAAO,KAAK,QAAQ,UAAU,QAAQ;AAAA,EAExC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,SAA0B;AAExB,WAAO,KAAK,QAAQ,UAAU,WAAW,KAAK,QAAQ,MAAM,GAAG;AAAA,EAEjE;AAEF;AAgBO,IAAM,eAAe,CAAC,OAAe,UAA8B,EAAE,MAAM,UAAU,OAAO,KAAK;AAcjG,IAAM,gBAAgB,CAAC,SAAuC,EAAE,MAAM,WAAW,OAAO,IAAI;;;ACtlCnG,IAAM,cAAc,oBAAI,IAAuC;AAMxD,IAAM,uBAAuB,CAAC,WAA8C;AACjF,MAAI,OAAO,YAAY,IAAI,MAAM;AACjC,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,MACL;AAAA,MACA,WAAW,OAAO,QAAQ;AAAA,MAC1B,SAAS,CAAC;AAAA,MACV,WAAW,CAAC;AAAA,IACd;AACA,gBAAY,IAAI,QAAQ,IAAI;AAAA,EAC9B;AACA,SAAO;AACT;AAEO,IAAM,oBAAoB,CAAC,WAA0D;AAC1F,SAAO,YAAY,IAAI,MAAM;AAC/B;AAEO,IAAM,uBAAuB,MAAwB;AAC1D,SAAO,MAAM,KAAK,YAAY,OAAO,CAAC;AACxC;AAMO,IAAM,oBAAoB,CAC/B,QACA,aACA,WACS;AACT,QAAM,OAAO,qBAAqB,MAAM;AACxC,OAAK,QAAQ,WAAW,IAAI,EAAE,GAAG,OAAO;AAC1C;AAEO,IAAM,sBAAsB,CACjC,QACA,aACA,aACS;AACT,QAAM,OAAO,qBAAqB,MAAM;AACxC,OAAK,UAAU,WAAW,IAAI;AAChC;AAEO,IAAM,qBAAqB,CAChC,QACA,WACA,UACS;AACT,QAAM,OAAO,qBAAqB,MAAM;AACxC,MAAI,aAAa,UAAU,SAAS,GAAG;AACrC,SAAK,YAAY;AAAA,EACnB;AACA,MAAI,OAAO;AACT,SAAK,QAAQ;AAAA,EACf;AACF;AAEO,IAAM,gBAAgB,CAAC,SAAmC;AAC/D,MAAI,KAAK,OAAO;AACd,WAAO,KAAK;AAAA,EACd;AAEA,QAAM,UAAU,OAAO,QAAQ,KAAK,OAAO,EAAE,OAAkC,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AAClG,QAAI,GAAG,IAAI;AAAA,MACT,GAAG;AAAA,MACH,MAAM;AAAA,MACN,OAAO,KAAK;AAAA,IACd;AACA,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,QAAM,QAAQ,YAAY,KAAK,WAAW,SAAS,CAAC,GAAG,KAAK,KAAK;AACjE,OAAK,QAAQ;AACb,SAAO;AACT;;;ACzHA,IAAM,aAAa,CAAC,UAAsC;AACxD,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,aAAc;AACtE;AAEA,IAAM,eAAe,CAAC,WAA6D;AACjF,MAAI,OAAO,WAAW,cAAe,OAAoB,cAAc,QAAW;AAChF,WAAQ,OAAqC;AAAA,EAC/C;AACA,SAAO;AACT;AAEA,IAAM,qBAAqB,CACzB,QACA,aACa;AACb,QAAM,WAAW,aAAa,MAAM;AACpC,MAAI,WAAW,QAAQ,GAAG;AACxB,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,SAAS,IAAI,QAA6B;AACxD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,WAAY,SAA+B,IAAI,qCAAqC;AAAA,EACtG;AACA,SAAO;AACT;AAEA,IAAM,2BAA2B,CAC/B,MACA,aACgC;AAChC,QAAM,YAAyC,CAAC;AAEhD,aAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,KAAK,SAAS,GAAG;AAC7D,YAAQ,SAAS,MAAM;AAAA,MACrB,KAAK,cAAc,QAAQ;AACzB,kBAAU,IAAI,IAAI;AAAA,UAChB,mBAAmB,SAAS,QAAQ,QAAQ;AAAA,UAC5C,SAAS;AAAA,UACT,SAAS;AAAA,UACT,SAAS;AAAA,QACX;AACA;AAAA,MACF;AAAA,MACA,KAAK,cAAc,SAAS;AAC1B,kBAAU,IAAI,IAAI;AAAA,UAChB,mBAAmB,SAAS,QAAQ,QAAQ;AAAA,UAC5C,SAAS;AAAA,UACT,SAAS;AAAA,UACT,SAAS;AAAA,QACX;AACA;AAAA,MACF;AAAA,MACA,KAAK,cAAc,WAAW;AAC5B,kBAAU,IAAI,IAAI;AAAA,UAChB,mBAAmB,SAAS,QAAQ,QAAQ;AAAA,UAC5C,SAAS;AAAA,UACT,SAAS;AAAA,UACT,SAAS;AAAA,QACX;AACA;AAAA,MACF;AAAA,MACA,KAAK,cAAc,eAAe;AAChC,kBAAU,IAAI,IAAI;AAAA,UAChB,mBAAmB,SAAS,QAAQ,QAAQ;AAAA,UAC5C,mBAAmB,SAAS,YAAY,QAAQ;AAAA,UAChD;AAAA,YACE,uBAAuB,SAAS;AAAA,YAChC,yBAAyB,SAAS;AAAA,YAClC,UAAU,SAAS;AAAA,YACnB,WAAW,SAAS;AAAA,YACpB,iBAAiB,SAAS;AAAA,YAC1B,qBAAqB,SAAS;AAAA,YAC9B,SAAS,SAAS;AAAA,UACpB;AAAA,QACF;AACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,oBAAoB,MAAkB;AACjD,QAAM,QAAQ,qBAAqB;AACnC,QAAM,WAAW,oBAAI,IAAiC;AAEtD,aAAW,QAAQ,OAAO;AACxB,UAAM,QAAQ,cAAc,IAAI;AAChC,aAAS,IAAI,KAAK,QAAQ,KAAK;AAAA,EACjC;AAEA,aAAW,QAAQ,OAAO;AACxB,UAAM,QAAQ,KAAK;AACnB,UAAM,YAAY,yBAAyB,MAAM,QAAQ;AACzD,UAAM,YAAY;AAAA,EACpB;AAEA,SAAO,MAAM,IAAI,UAAQ,KAAK,KAAM;AACtC;AAEO,IAAM,wBAAwB,CAAC,SAAkD;AACtF,QAAM,OAAO,kBAAkB,IAAI;AACnC,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,CAAC,KAAK,OAAO;AACf,sBAAkB;AAAA,EACpB;AACA,SAAO,KAAK;AACd;AAEO,IAAM,mBAAmB,CAC9B,SACoC;AACpC,QAAM,QAAQ,sBAAsB,IAAI;AACxC,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,WAAW,KAAK,IAAI,kEAAkE;AAAA,EACxG;AACA,SAAO,IAAI,mBAAmB,KAAe;AAC/C;;;ACnIO,SAAS,IAGd,UAAkB,MAA4C;AAC9D,QAAM,YAAY,CAAC;AAEnB,aAAWC,QAAO,MAAM;AACtB,UAAM,MAAM,MAAM,QAAQA,IAAG;AAC7B,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,MAAM,WAAWA,IAAG,yBAAyB,MAAM,IAAI,GAAG;AAAA,IACtE;AACA,cAAUA,IAAG,IAAI;AAAA,EACnB;AAEA,SAAO;AACT;AAOO,SAAS,KACd,WACG,OACmB;AACtB,QAAM,QAAQ,sBAAsB,MAAM;AAC1C,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,8CAA8C,OAAO,IAAI,GAAG;AAAA,EAC9E;AAEA,QAAM,YAAY,CAAC;AAEnB,aAAW,QAAQ,OAAO;AACxB,UAAMA,OAAM,MAAM,QAAQ,IAAI;AAC9B,QAAI,CAACA,MAAK;AACR,YAAM,IAAI,MAAM,cAAc,IAAI,uBAAuB,OAAO,IAAI,GAAG;AAAA,IACzE;AACA,cAAU,IAAI,IAAIA;AAAA,EACpB;AAEA,SAAO;AACT;;;ACzCO,IAAM,mBAAN,MAAM,kBAAiB;AAAA,EAI5B,YAAY,OAAiB,KAAuB;AAClD,SAAK,QAAQ;AACb,SAAK,MAAM,OAAO;AAAA,MAChB,MAAM;AAAA,MACN,MAAM,gBAAgB,KAAK;AAAA,MAC3B,SAAS,CAAC;AAAA,MACV,QAAQ,CAAC;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,MAAM,SAA4C;AACxD,WAAO,IAAI,kBAAiB,KAAK,OAAO,OAAO;AAAA,EACjD;AAAA,EAEA,WAAW,MAAmD;AAC5D,QAAI,CAAC,KAAK,OAAQ,QAAO;AAEzB,UAAM,iBAAiB,KAAK,IAAI,QAAQ,SACpC,KAAK,IAAI,UACT,iBAAiB,KAAK,OAAO,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC;AAErD,UAAM,UAA2B,KAAK;AAAA,MAAI,CAAC,KAAK,aAC9C,eAAe,IAAI,YAAU;AAC3B,cAAM,WAAW,IAAI,OAAO,IAAI;AAEhC,YAAI,CAAC,oBAAoB,QAAQ,GAAG;AAClC,gBAAM,IAAI;AAAA,YACR,oCAAoC,OAAO,IAAI,YAAY,QAAQ;AAAA,UACrE;AAAA,QACF;AAEA,eAAO,eAAe,QAAQ;AAAA,MAChC,CAAC;AAAA,IACH;AAEA,WAAO,KAAK,MAAM;AAAA,MAChB,GAAG,KAAK;AAAA,MACR,SAAS;AAAA,MACT,QAAQ,CAAC,GAAG,KAAK,IAAI,QAAQ,GAAG,OAAO;AAAA,IACzC,CAAC;AAAA,EACH;AAAA,EAEA,cAAc,SAAyC;AACrD,WAAO,KAAK,MAAM;AAAA,MAChB,GAAG,KAAK;AAAA,MACR,WAAW,CAAC,GAAG,OAAO;AAAA,IACxB,CAAC;AAAA,EACH;AACF;;;AC9CO,IAAM,qBAAN,MAAM,oBAAsB;AAAA,EAIjC,YAAY,OAAiB,OAA0B;AACrD,SAAK,QAAQ;AACb,SAAK,QAAQ,SAAS,IAAI,iBAAiB,KAAK;AAAA,EAClD;AAAA,EAEQ,MAAM,OAAgD;AAC5D,WAAO,IAAI,oBAAmB,KAAK,OAAO,KAAK;AAAA,EACjD;AAAA,EAEA,OAAO,WAAuF;AAC5F,UAAM,OAAO,MAAM,QAAQ,SAAS,IAAI,YAAY,CAAC,SAAS;AAC9D,QAAI,CAAC,KAAK,OAAQ,QAAO;AACzB,WAAO,KAAK,MAAM,KAAK,MAAM,WAAW,IAAI,CAAC;AAAA,EAC/C;AAAA,EAEA,aAAa,SAA4D;AACvE,QAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,UAAM,QAAQ,QAAQ,IAAI,YAAU,gBAAgB,KAAK,OAAO,MAAM,CAAC;AACvE,WAAO,KAAK,MAAM,KAAK,MAAM,cAAc,KAAK,CAAC;AAAA,EACnD;AAAA,EASA,QAAQ,KAAyD;AAC/D,QAAI,OAAQ,IAAY,kBAAkB,YAAY;AAEpD,aAAQ,IAAuB,cAAc,KAAK,MAAM,GAAG;AAAA,IAC7D;AAGA,UAAM,UAAU,oBAAoB,GAAyB;AAC7D,WAAO,QAAQ,cAAc,KAAK,MAAM,GAAG;AAAA,EAC7C;AAAA,EAEA,MAAM,KAAkD;AACtD,WAAO,KAAK,QAAQ,GAAU,EAAE;AAAA,EAClC;AAAA,EAEA,SAA0B;AACxB,WAAO,KAAK,MAAM;AAAA,EACpB;AACF;;;ACzDA,IAAM,gBAAgB,CAAC,UAAyC;AAC9D,MAAI,UAAU,KAAM,QAAO;AAC3B,UAAQ,OAAO,OAAO;AAAA,IACpB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO,cAAc,KAAK;AAAA,EAC9B;AACF;AAKO,IAAM,mBAAN,MAAM,kBAAiB;AAAA,EAI5B,YAAY,OAAiB,KAAuB;AAClD,SAAK,QAAQ;AACb,SAAK,MAAM,OAAO;AAAA,MAChB,MAAM;AAAA,MACN,OAAO,gBAAgB,KAAK;AAAA,MAC5B,KAAK,CAAC;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,MAAM,SAA4C;AACxD,WAAO,IAAI,kBAAiB,KAAK,OAAO,OAAO;AAAA,EACjD;AAAA,EAEA,QAAQ,QAAmD;AACzD,UAAM,cAAsC,OAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,QAAQ,QAAQ,MAAM;AAC7F,UAAI,CAAC,cAAc,QAAQ,GAAG;AAC5B,cAAM,IAAI;AAAA,UACR,oCAAoC,MAAM;AAAA,QAC5C;AAAA,MACF;AAEA,aAAO;AAAA,QACL,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,OAAO,KAAK,MAAM;AAAA,UAClB,MAAM;AAAA,QACR;AAAA,QACA,OAAO,eAAe,QAAQ;AAAA,MAChC;AAAA,IACF,CAAC;AAED,WAAO,KAAK,MAAM;AAAA,MAChB,GAAG,KAAK;AAAA,MACR,KAAK;AAAA,IACP,CAAC;AAAA,EACH;AAAA,EAEA,UAAU,MAAwC;AAChD,WAAO,KAAK,MAAM;AAAA,MAChB,GAAG,KAAK;AAAA,MACR,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,cAAc,SAAyC;AACrD,WAAO,KAAK,MAAM;AAAA,MAChB,GAAG,KAAK;AAAA,MACR,WAAW,CAAC,GAAG,OAAO;AAAA,IACxB,CAAC;AAAA,EACH;AACF;;;AC9DO,IAAM,qBAAN,MAAM,oBAAsB;AAAA,EAIjC,YAAY,OAAiB,OAA0B;AACrD,SAAK,QAAQ;AACb,SAAK,QAAQ,SAAS,IAAI,iBAAiB,KAAK;AAAA,EAClD;AAAA,EAEQ,MAAM,OAAgD;AAC5D,WAAO,IAAI,oBAAmB,KAAK,OAAO,KAAK;AAAA,EACjD;AAAA,EAEA,IAAI,QAAwD;AAC1D,WAAO,KAAK,MAAM,KAAK,MAAM,QAAQ,MAAM,CAAC;AAAA,EAC9C;AAAA,EAEA,MAAM,MAA6C;AACjD,WAAO,KAAK,MAAM,KAAK,MAAM,UAAU,IAAI,CAAC;AAAA,EAC9C;AAAA,EAEA,aAAa,SAA4D;AACvE,QAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,UAAM,QAAQ,QAAQ,IAAI,YAAU,gBAAgB,KAAK,OAAO,MAAM,CAAC;AACvE,WAAO,KAAK,MAAM,KAAK,MAAM,cAAc,KAAK,CAAC;AAAA,EACnD;AAAA,EASA,QAAQ,KAAyD;AAC/D,QAAI,OAAQ,IAAY,kBAAkB,YAAY;AAEpD,aAAQ,IAAuB,cAAc,KAAK,MAAM,GAAG;AAAA,IAC7D;AAGA,UAAM,UAAU,oBAAoB,GAAyB;AAC7D,WAAO,QAAQ,cAAc,KAAK,MAAM,GAAG;AAAA,EAC7C;AAAA,EAEA,MAAM,KAAkD;AACtD,WAAO,KAAK,QAAQ,GAAU,EAAE;AAAA,EAClC;AAAA,EAEA,SAA0B;AACxB,WAAO,KAAK,MAAM;AAAA,EACpB;AACF;;;AC1DO,IAAM,mBAAN,MAAM,kBAAiB;AAAA,EAI5B,YAAY,OAAiB,KAAuB;AAClD,SAAK,QAAQ;AACb,SAAK,MAAM,OAAO;AAAA,MAChB,MAAM;AAAA,MACN,MAAM,gBAAgB,KAAK;AAAA,IAC7B;AAAA,EACF;AAAA,EAEQ,MAAM,SAA4C;AACxD,WAAO,IAAI,kBAAiB,KAAK,OAAO,OAAO;AAAA,EACjD;AAAA,EAEA,UAAU,MAAwC;AAChD,WAAO,KAAK,MAAM;AAAA,MAChB,GAAG,KAAK;AAAA,MACR,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,cAAc,SAAyC;AACrD,WAAO,KAAK,MAAM;AAAA,MAChB,GAAG,KAAK;AAAA,MACR,WAAW,CAAC,GAAG,OAAO;AAAA,IACxB,CAAC;AAAA,EACH;AACF;;;ACvBO,IAAM,qBAAN,MAAM,oBAAsB;AAAA,EAIjC,YAAY,OAAiB,OAA0B;AACrD,SAAK,QAAQ;AACb,SAAK,QAAQ,SAAS,IAAI,iBAAiB,KAAK;AAAA,EAClD;AAAA,EAEQ,MAAM,OAAgD;AAC5D,WAAO,IAAI,oBAAmB,KAAK,OAAO,KAAK;AAAA,EACjD;AAAA,EAEA,MAAM,MAA6C;AACjD,WAAO,KAAK,MAAM,KAAK,MAAM,UAAU,IAAI,CAAC;AAAA,EAC9C;AAAA,EAEA,aAAa,SAA4D;AACvE,QAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,UAAM,QAAQ,QAAQ,IAAI,YAAU,gBAAgB,KAAK,OAAO,MAAM,CAAC;AACvE,WAAO,KAAK,MAAM,KAAK,MAAM,cAAc,KAAK,CAAC;AAAA,EACnD;AAAA,EASA,QAAQ,KAAyD;AAC/D,QAAI,OAAQ,IAAY,kBAAkB,YAAY;AAEpD,aAAQ,IAAuB,cAAc,KAAK,MAAM,GAAG;AAAA,IAC7D;AAGA,UAAM,UAAU,oBAAoB,GAAyB;AAC7D,WAAO,QAAQ,cAAc,KAAK,MAAM,GAAG;AAAA,EAC7C;AAAA,EAEA,MAAM,KAAkD;AACtD,WAAO,KAAK,QAAQ,GAAU,EAAE;AAAA,EAClC;AAAA,EAEA,SAA0B;AACxB,WAAO,KAAK,MAAM;AAAA,EACpB;AACF;;;ACgGO,IAAM,oBAAoB,CAAC,UAA8B;AAC9D,MAAI,MAAM,QAAQ,MAAM,UAAU,KAAK,MAAM,WAAW,SAAS,GAAG;AAClE,WAAO,MAAM;AAAA,EACf;AAEA,QAAM,UAAU,OAAO,OAAO,MAAM,WAAW,CAAC,CAAC;AAGjD,SAAO,QACJ,OAAO,CAACC,SAAaA,KAAI,OAAO,EAChC,IAAI,CAACA,SAAaA,KAAI,IAAI;AAC/B;;;AClJO,IAAM,yBAAyB,CACpC,OACAC,MACA,SACA,UAA+B,CAAC,MACY;AAC5C,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,QAAQ,gBAAgBA,KAAI,IAAI,CAAC;AAC5C,QAAM,KAAK,QAAQ,iBAAiBA,IAAG,CAAC;AAExC,QAAM,UAAU,QAAQ,oBAAoBA,MAAK,KAAK;AACtD,MAAI,QAAS,OAAM,KAAK,OAAO;AAE/B,MAAIA,KAAI,QAAS,OAAM,KAAK,UAAU;AACtC,MAAIA,KAAI,OAAQ,OAAM,KAAK,QAAQ;AACnC,MAAIA,KAAI,YAAY,QAAW;AAC7B,UAAM,KAAK,WAAW,QAAQ,cAAcA,KAAI,SAASA,IAAG,CAAC,EAAE;AAAA,EACjE;AACA,MAAI,QAAQ,kBAAkBA,KAAI,SAAS;AACzC,UAAM,KAAK,aAAa;AAAA,EAC1B;AACA,MAAIA,KAAI,OAAO;AACb,UAAM,KAAK,UAAUA,KAAI,KAAK,GAAG;AAAA,EACnC;AACA,MAAIA,KAAI,YAAY;AAClB,UAAM,KAAK,QAAQ,gBAAgBA,KAAI,YAAY,KAAK,CAAC;AAAA,EAC3D;AAEA,SAAO,EAAE,KAAK,MAAM,KAAK,GAAG,GAAG,eAAe,CAAC,EAAE,QAAQ,kBAAkBA,KAAI,SAAS;AAC1F;AAEO,IAAM,yBAAyB,CACpC,OACA,YACyB;AACzB,QAAM,KAAK,kBAAkB,KAAK;AAClC,QAAM,kBAAkB,oBAAI,IAAY;AAExC,QAAM,cAAc,OAAO,OAAO,MAAM,OAAO,EAAE,IAAI,CAAAA,SAAO;AAC1D,UAAM,YAAa,QAAgB,8BAA8BA,MAAK,OAAO,EAAE,KAAK,GAAG,SAASA,KAAI,IAAI;AACxG,QAAI,WAAW;AACb,sBAAgB,IAAIA,KAAI,IAAI;AAAA,IAC9B;AACA,WAAO,uBAAuB,OAAOA,MAAK,SAAS,EAAE,gBAAgB,UAAU,CAAC,EAAE;AAAA,EACpF,CAAC;AAED,QAAM,kBAA4B,CAAC;AAEnC,MAAI,GAAG,SAAS,KAAK,EAAE,GAAG,WAAW,KAAK,gBAAgB,IAAI,GAAG,CAAC,CAAC,IAAI;AACrE,UAAM,OAAO,GAAG,IAAI,OAAK,QAAQ,gBAAgB,CAAC,CAAC,EAAE,KAAK,IAAI;AAC9D,oBAAgB,KAAK,gBAAgB,IAAI,GAAG;AAAA,EAC9C;AAEA,MAAI,MAAM,QAAQ;AAChB,UAAM,OAAO,QAAQ,WAAS;AAC5B,YAAM,OAAO,MAAM,OAAO,GAAG,QAAQ,gBAAgB,MAAM,IAAI,CAAC,MAAM;AACtE,sBAAgB,KAAK,cAAc,IAAI,UAAU,MAAM,UAAU,GAAG;AAAA,IACtE,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,CAAC,GAAG,aAAa,GAAG,eAAe;AACpD,QAAM,OAAO,SAAS,IAAI,UAAQ,KAAK,IAAI,EAAE,EAAE,KAAK,KAAK;AACzD,QAAM,eAAe,QAAQ,mBAAmB,KAAK;AACrD,QAAM,WAAW,gBAAgB,QAAQ,gBAAgB,KAAK,CAAC;AAAA,EAAO,IAAI;AAAA,GAAM,eAAe,MAAM,eAAe,EAAE;AAEtH,QAAM,WAAqB,CAAC;AAC5B,MAAI,MAAM,WAAW,MAAM,QAAQ,SAAS,GAAG;AAC7C,eAAW,OAAO,MAAM,SAAS;AAC/B,UAAI,IAAI,SAAS,CAAC,QAAQ,uBAAuB,GAAG;AAClD,cAAM,IAAI,MAAM,WAAW,QAAQ,IAAI,+CAA+C,IAAI,QAAQ,IAAI,QAAQ,KAAK,GAAG,CAAC,IAAI;AAAA,MAC7H;AACA,eAAS,KAAK,QAAQ,YAAY,OAAO,GAAG,CAAC;AAAA,IAC/C;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,SAAS;AAC9B;AAEO,IAAM,oBAAoB,CAC/B,QACA,YACa;AACb,QAAM,UAAU,0BAA0B,MAAM;AAChD,QAAM,aAAuB,CAAC;AAC9B,UAAQ,QAAQ,WAAS;AACvB,UAAM,EAAE,UAAU,SAAS,IAAI,uBAAuB,OAAO,OAAO;AACpE,eAAW,KAAK,UAAU,GAAG,QAAQ;AAAA,EACvC,CAAC;AACD,SAAO;AACT;AAEA,IAAM,4BAA4B,CAAC,WAAmC;AACpE,QAAM,MAAM,oBAAI,IAAsB;AACtC,SAAO,QAAQ,OAAK,IAAI,IAAI,EAAE,MAAM,CAAC,CAAC;AAEtC,QAAM,OAAO,oBAAI,IAAyB;AAC1C,aAAW,SAAS,QAAQ;AAC1B,UAAM,YAAY,oBAAI,IAAY;AAClC,WAAO,OAAO,MAAM,OAAO,EAAE,QAAQ,CAAAA,SAAO;AAC1C,UAAIA,KAAI,YAAY,OAAO;AACzB,kBAAU,IAAIA,KAAI,WAAW,KAAK;AAAA,MACpC;AAAA,IACF,CAAC;AACD,SAAK,IAAI,MAAM,MAAM,SAAS;AAAA,EAChC;AAEA,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,UAAsB,CAAC;AAE7B,QAAM,QAAQ,CAAC,MAAc,UAAuB;AAClD,QAAI,QAAQ,IAAI,IAAI,EAAG;AACvB,UAAM,QAAQ,IAAI,IAAI,IAAI;AAC1B,QAAI,CAAC,MAAO;AACZ,QAAI,MAAM,IAAI,IAAI,GAAG;AACnB,cAAQ,KAAK,KAAK;AAClB,cAAQ,IAAI,IAAI;AAChB;AAAA,IACF;AACA,UAAM,IAAI,IAAI;AACd,eAAW,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG;AACtC,YAAM,KAAK,KAAK;AAAA,IAClB;AACA,UAAM,OAAO,IAAI;AACjB,YAAQ,IAAI,IAAI;AAChB,YAAQ,KAAK,KAAK;AAAA,EACpB;AAEA,SAAO,QAAQ,OAAK,MAAM,EAAE,MAAM,oBAAI,IAAI,CAAC,CAAC;AAC5C,SAAO;AACT;;;ACtJO,IAAM,kBAAkB,CAAC,OAAiB,UAA4B;AAC3E,QAAM,QAAQ,MAAM,WAAW,CAAC,GAC7B,IAAI,CAAAC,SAAQ,OAAOA,SAAQ,WAAWA,OAAMA,KAAI,MAAO,EACvD,KAAK,GAAG;AAEX,QAAM,SAAS,MAAM,SAAS,SAAS;AACvC,SAAO,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI,MAAM;AACxC;;;AC0BA,IAAM,WAAW,CAAC,MAAc,WAAqB,SAAS,GAAG,MAAM,IAAI,IAAI,KAAK;AAEpF,IAAM,YAAY,CAAC,WAA2B;AAC5C,QAAM,MAAM,oBAAI,IAA2B;AAC3C,aAAW,SAAS,OAAO,QAAQ;AACjC,QAAI,IAAI,SAAS,MAAM,MAAM,MAAM,MAAM,GAAG,KAAK;AAAA,EACnD;AACA,SAAO;AACT;AAEA,IAAM,oBAAoB,CAAC,OAAiB,SAAiB,YAAmC;AAC9F,QAAM,SAAS,MAAM,QAAQ,OAAO;AACpC,QAAM,WAAW,uBAAuB,OAAO,QAAQ,OAAO;AAC9D,SAAO,eAAe,QAAQ,gBAAgB,KAAK,CAAC,QAAQ,SAAS,GAAG;AAC1E;AAEA,IAAM,gBAAgB,CAAC,WAAuC,SAAS,IAAI,YAAY,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACnH,IAAM,mBAAmB,CAAC,UAAuC;AAC/D,MAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAClD,SAAO,OAAO,KAAK,EAAE,KAAK;AAC5B;AAEA,IAAM,aAAa,CAAC,UAAqB,QAAwB,YAAuC;AACtG,QAAM,eAAe,cAAc,QAAQ,iBAAiB,QAAQ,CAAC;AACrE,QAAM,aAAa,cAAc,OAAO,IAAI;AAC5C,QAAM,kBACJ,SAAS,YAAY,SAAY,iBAAiB,QAAQ,cAAc,SAAS,SAAS,QAAQ,CAAC,IAAI;AACzG,QAAM,gBAAgB,iBAAiB,OAAO,OAAO;AACrD,SAAO;AAAA,IACL,aAAa,iBAAiB;AAAA,IAC9B,oBAAoB,CAAC,CAAC,SAAS,YAAY,CAAC,CAAC,OAAO;AAAA,IACpD,gBAAgB,oBAAoB;AAAA,IACpC,sBAAsB,CAAC,CAAC,SAAS,kBAAkB,CAAC,CAAC,OAAO;AAAA,EAC9D;AACF;AAEO,IAAM,aAAa,CACxB,gBACA,cACA,SACA,UAA6B,CAAC,MACf;AACf,QAAM,mBAAmB,QAAQ,oBAAoB;AACrD,QAAM,OAAmB,EAAE,SAAS,CAAC,GAAG,UAAU,CAAC,EAAE;AAErD,QAAM,YAAY,UAAU,YAAY;AAGxC,aAAW,SAAS,gBAAgB;AAClC,UAAM,MAAM,SAAS,MAAM,MAAM,MAAM,MAAM;AAC7C,UAAM,SAAS,UAAU,IAAI,GAAG;AAChC,QAAI,CAAC,QAAQ;AACX,YAAM,EAAE,UAAU,SAAS,IAAI,uBAAuB,OAAO,OAAO;AACpE,WAAK,QAAQ,KAAK;AAAA,QAChB,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa,gBAAgB,GAAG;AAAA,QAChC,YAAY,CAAC,UAAU,GAAG,QAAQ;AAAA,QAClC,MAAM;AAAA,MACR,CAAC;AACD;AAAA,IACF;AAGA,UAAM,aAAa,IAAI,IAAI,OAAO,QAAQ,IAAI,OAAK,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAC/D,eAAW,WAAW,OAAO,KAAK,MAAM,OAAO,GAAG;AAChD,UAAI,CAAC,WAAW,IAAI,OAAO,GAAG;AAC5B,aAAK,QAAQ,KAAK;AAAA,UAChB,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aAAa,cAAc,OAAO,OAAO,GAAG;AAAA,UAC5C,YAAY,CAAC,kBAAkB,OAAO,SAAS,OAAO,CAAC;AAAA,UACvD,MAAM;AAAA,QACR,CAAC;AAAA,MACH,OAAO;AACL,cAAM,cAAc,MAAM,QAAQ,OAAO;AACzC,cAAM,YAAY,WAAW,IAAI,OAAO;AACxC,cAAM,UAAU,WAAW,aAAa,WAAW,OAAO;AAC1D,cAAM,cACJ,QAAQ,eAAe,QAAQ,sBAAsB,QAAQ,kBAAkB,QAAQ;AACzF,YAAI,aAAa;AACf,gBAAM,aAAa,QAAQ,iBAAiB,OAAO,aAAa,WAAW,OAAO,KAAK,CAAC;AACxF,cAAI,WAAW,SAAS,GAAG;AACzB,iBAAK,QAAQ,KAAK;AAAA,cAChB,MAAM;AAAA,cACN,OAAO;AAAA,cACP,aAAa,gBAAgB,OAAO,OAAO,GAAG;AAAA,cAC9C;AAAA,cACA,MAAM;AAAA,YACR,CAAC;AAAA,UACH;AACA,gBAAM,UAAU,QAAQ,kBAAkB,OAAO,aAAa,WAAW,OAAO;AAChF,cAAI,QAAS,MAAK,SAAS,KAAK,OAAO;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AACA,eAAW,WAAW,WAAW,KAAK,GAAG;AACvC,UAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAC3B,aAAK,QAAQ,KAAK;AAAA,UAChB,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aAAa,eAAe,OAAO,SAAS,GAAG;AAAA,UAC/C,YAAY,mBAAmB,QAAQ,cAAc,QAAQ,OAAO,IAAI,CAAC;AAAA,UACzE,MAAM;AAAA,QACR,CAAC;AACD,cAAM,UAAU,QAAQ,iBAAiB,QAAQ,OAAO;AACxD,YAAI,QAAS,MAAK,SAAS,KAAK,OAAO;AAAA,MACzC;AAAA,IACF;AAGA,UAAM,kBAAkB,MAAM,WAAW,CAAC;AAC1C,UAAM,gBAAgB,OAAO,WAAW,CAAC;AACzC,UAAM,iBAAiB,IAAI,IAAI,cAAc,IAAI,SAAO,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC;AAExE,eAAW,OAAO,iBAAiB;AACjC,YAAM,OAAO,IAAI,QAAQ,gBAAgB,OAAO,GAAG;AACnD,UAAI,CAAC,eAAe,IAAI,IAAI,GAAG;AAC7B,aAAK,QAAQ,KAAK;AAAA,UAChB,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aAAa,gBAAgB,IAAI,OAAO,GAAG;AAAA,UAC3C,YAAY,CAAC,QAAQ,YAAY,OAAO,EAAE,GAAG,KAAK,KAAK,CAAC,CAAC;AAAA,UACzD,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAEA,eAAW,OAAO,eAAe;AAC/B,UAAI,IAAI,QAAQ,CAAC,gBAAgB,KAAK,eAAa,SAAS,QAAQ,gBAAgB,OAAO,QAAQ,OAAO,IAAI,IAAI,GAAG;AACnH,aAAK,QAAQ,KAAK;AAAA,UAChB,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aAAa,cAAc,IAAI,IAAI,OAAO,GAAG;AAAA,UAC7C,YAAY,mBAAmB,QAAQ,aAAa,QAAQ,IAAI,IAAI,IAAI,CAAC;AAAA,UACzE,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,aAAW,UAAU,aAAa,QAAQ;AACxC,UAAM,MAAM,SAAS,OAAO,MAAM,OAAO,MAAM;AAC/C,QAAI,CAAC,eAAe,KAAK,OAAK,SAAS,EAAE,MAAM,EAAE,MAAM,MAAM,GAAG,GAAG;AACjE,WAAK,QAAQ,KAAK;AAAA,QAChB,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa,cAAc,GAAG;AAAA,QAC9B,YAAY,mBAAmB,QAAQ,aAAa,MAAM,IAAI,CAAC;AAAA,QAC/D,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAMO,IAAM,oBAAoB,OAC/B,gBACA,cACA,SACA,UACA,UAA8B,CAAC,MACP;AACxB,QAAM,OAAO,WAAW,gBAAgB,cAAc,SAAS,OAAO;AACtE,MAAI,CAAC,QAAQ,QAAQ;AACnB,UAAM,EAAE,mBAAAC,mBAAkB,IAAI,MAAM;AACpC,UAAMA,mBAAkB,MAAM,UAAU,OAAO;AAAA,EACjD;AACA,SAAO;AACT;;;AC/MO,IAAM,SAAS,CAAC,WAA2D;AAChF,MAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,SAAO,OAAO,OAAO;AAAA,IAAI,SACvB,OAAO,QAAQ,OAA4B,CAAC,KAAKC,MAAK,QAAQ;AAC5D,UAAIA,IAAG,IAAI,IAAI,GAAG;AAClB,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AAAA,EACP;AACF;AAEO,IAAM,YAAY,OACvB,UACA,KACA,SAAoB,CAAC,MACc;AACnC,QAAM,CAAC,KAAK,IAAI,MAAM,SAAS,WAAW,KAAK,MAAM;AACrD,SAAO,OAAO,KAAK;AACrB;AAEO,IAAM,qBAAqB,CAAC,MAAc,YAAwC;AACvF,MAAI,QAAQ,iBAAiB,CAAC,QAAQ,cAAc,SAAS,IAAI,EAAG,QAAO;AAC3E,MAAI,QAAQ,iBAAiB,QAAQ,cAAc,SAAS,IAAI,EAAG,QAAO;AAC1E,SAAO;AACT;;;ACvBO,IAAM,6BAA6B;AAAA,EACxC;AAAA,EACA;AAAA,IACE,cAAc,IAAI,QAAQ,GAAG;AAAA,IAC7B,YAAY,IAAI,QAAQ,GAAG;AAAA,IAC3B,aAAa,IAAI,QAAQ,GAAG;AAAA,IAC5B,WAAW,IAAI,QAAQ,GAAG;AAAA,IAC1B,aAAa,IAAI,QAAQ,CAAC;AAAA,IAC1B,gBAAgB,IAAI,QAAQ,IAAI;AAAA,IAChC,kBAAkB,IAAI,IAAI;AAAA,EAC5B;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,EAAE,QAAQ,qBAAqB;AACjC;AAEO,IAAM,UAAU;AAAA,EACrB;AAAA,EACA;AAAA,IACE,KAAK,IAAI,IAAI;AAAA,IACb,SAAS,IAAI,QAAQ,GAAG;AAAA,IACxB,cAAc,IAAI,IAAI;AAAA,IACtB,SAAS,IAAI,QAAQ,CAAC;AAAA,EACxB;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,EAAE,QAAQ,aAAa;AACzB;AAEO,IAAM,cAAc;AAAA,EACzB;AAAA,EACA;AAAA,IACE,KAAK,IAAI,IAAI;AAAA,IACb,SAAS,IAAI,QAAQ,GAAG;AAAA,EAC1B;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,EAAE,QAAQ,aAAa;AACzB;AAEO,IAAM,UAAU;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU,IAAI,IAAI;AAAA,IAClB,YAAY,IAAI,IAAI;AAAA,IACpB,cAAc,IAAI,QAAQ;AAAA,IAC1B,QAAQ,IAAI,QAAQ,GAAG;AAAA,IACvB,SAAS,IAAI,QAAQ,IAAI;AAAA,EAC3B;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,EAAE,QAAQ,aAAa;AACzB;AAEO,IAAM,cAAc;AAAA,EACzB;AAAA,EACA;AAAA,IACE,UAAU,IAAI,IAAI;AAAA,IAClB,SAAS,IAAI,QAAQ,GAAG;AAAA,IACxB,QAAQ,IAAI,IAAI;AAAA,EAClB;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,EAAE,QAAQ,aAAa;AACzB;AAEO,IAAM,qBAAqB;AAAA,EAChC;AAAA,EACA;AAAA,IACE,oBAAoB,IAAI,QAAQ,GAAG;AAAA,IACnC,mBAAmB,IAAI,QAAQ,GAAG;AAAA,IAClC,iBAAiB,IAAI,QAAQ,GAAG;AAAA,IAChC,eAAe,IAAI,QAAQ,GAAG;AAAA,IAC9B,cAAc,IAAI,QAAQ,GAAG;AAAA,IAC7B,YAAY,IAAI,QAAQ,GAAG;AAAA,IAC3B,iBAAiB,IAAI,QAAQ,GAAG;AAAA,EAClC;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,EAAE,QAAQ,qBAAqB;AACjC;AAEO,IAAM,mBAAmB;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,oBAAoB,IAAI,QAAQ,GAAG;AAAA,IACnC,mBAAmB,IAAI,QAAQ,GAAG;AAAA,IAClC,iBAAiB,IAAI,QAAQ,GAAG;AAAA,IAChC,eAAe,IAAI,QAAQ,GAAG;AAAA,IAC9B,cAAc,IAAI,QAAQ,GAAG;AAAA,IAC7B,YAAY,IAAI,QAAQ,GAAG;AAAA,IAC3B,aAAa,IAAI,QAAQ,GAAG;AAAA,IAC5B,kBAAkB,IAAI,IAAI;AAAA,EAC5B;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,EAAE,QAAQ,qBAAqB;AACjC;AAEO,IAAM,0BAA0B;AAAA,EACrC;AAAA,EACA;AAAA,IACE,oBAAoB,IAAI,QAAQ,GAAG;AAAA,IACnC,mBAAmB,IAAI,QAAQ,GAAG;AAAA,IAClC,iBAAiB,IAAI,QAAQ,GAAG;AAAA,IAChC,eAAe,IAAI,QAAQ,GAAG;AAAA,IAC9B,cAAc,IAAI,QAAQ,GAAG;AAAA,IAC7B,YAAY,IAAI,QAAQ,GAAG;AAAA,IAC3B,aAAa,IAAI,QAAQ,GAAG;AAAA,EAC9B;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,EAAE,QAAQ,qBAAqB;AACjC;AAEO,IAAM,2BAA2B;AAAA,EACtC;AAAA,EACA;AAAA,IACE,oBAAoB,IAAI,QAAQ,GAAG;AAAA,IACnC,mBAAmB,IAAI,QAAQ,GAAG;AAAA,IAClC,iBAAiB,IAAI,QAAQ,GAAG;AAAA,IAChC,2BAA2B,IAAI,QAAQ,GAAG;AAAA,IAC1C,0BAA0B,IAAI,QAAQ,GAAG;AAAA,IACzC,wBAAwB,IAAI,QAAQ,GAAG;AAAA,IACvC,cAAc,IAAI,QAAQ,EAAE;AAAA,IAC5B,aAAa,IAAI,QAAQ,EAAE;AAAA,IAC3B,aAAa,IAAI,QAAQ,EAAE;AAAA,EAC7B;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,EAAE,QAAQ,qBAAqB;AACjC;;;ACjIA,eAAsB,UACpB,IACA,KACc;AACd,QAAM,MAAM,GAAG,OAAO;AACtB,QAAM,WAAW,IAAI,QAAQ,cAAc,GAAG;AAC9C,QAAM,UAAU,MAAM,IAAI,SAAS,WAAW,SAAS,KAAK,SAAS,MAAM;AAE3E,QAAM,CAAC,KAAK,IAAI;AAChB,SAAO,OAAO,KAAK;AACrB;AAIA,eAAsB,cAAuC,KAAU,KAAsC;AAC3G,QAAM,WAAW,IAAI,QAAQ,cAAc,GAAG;AAC9C,QAAM,UAAU,MAAM,IAAI,SAAS,WAAW,SAAS,KAAK,SAAS,MAAM;AAC3E,QAAM,CAAC,KAAK,IAAI;AAChB,SAAO,OAAO,KAAK;AACrB;;;ACTO,IAAM,uBAA2C;AAAA,EACtD,MAAM,WAAW,KAAwB,SAAqD;AAC5F,UAAM,SAAS,QAAQ,UAAU;AACjC,UAAM,SAA0B,CAAC;AAGjC,UAAM,YAAY,IAAI,mBAAmB,0BAAiC,EACvE,OAAO;AAAA,MACN,cAAc,2BAA2B,QAAQ;AAAA,MACjD,YAAY,2BAA2B,QAAQ;AAAA,MAC/C,aAAa,2BAA2B,QAAQ;AAAA,MAChD,WAAW,2BAA2B,QAAQ;AAAA,MAC9C,aAAa,2BAA2B,QAAQ;AAAA,MAChD,gBAAgB,2BAA2B,QAAQ;AAAA,MACnD,kBAAkB,2BAA2B,QAAQ;AAAA,IACvD,CAAC,EACA,MAAM,GAAG,2BAA2B,QAAQ,cAAc,MAAM,CAAC,EACjE,QAAQ,2BAA2B,QAAQ,UAAU,EACrD,QAAQ,2BAA2B,QAAQ,gBAAgB;AAE9D,UAAM,aAAa,MAAM,UAAU,WAAW,GAAG;AAGjD,UAAM,OAAO,IAAI,mBAAmB,gBAAuB,EACxD,OAAO;AAAA,MACN,cAAc,iBAAiB,QAAQ;AAAA,MACvC,YAAY,iBAAiB,QAAQ;AAAA,MACrC,aAAa,iBAAiB,QAAQ;AAAA,MACtC,kBAAkB,iBAAiB,QAAQ;AAAA,MAC3C,iBAAiB,iBAAiB,QAAQ;AAAA,IAC5C,CAAC,EACA,UAAU,oBAA2B,GAAG,mBAAmB,QAAQ,iBAAiB,iBAAiB,QAAQ,eAAe,CAAC,EAC7H,MAAM,GAAG,mBAAmB,QAAQ,iBAAiB,aAAa,CAAC,EACnE,MAAM,GAAG,iBAAiB,QAAQ,cAAc,MAAM,CAAC,EACvD,QAAQ,iBAAiB,QAAQ,UAAU,EAC3C,QAAQ,iBAAiB,QAAQ,gBAAgB;AAEpD,UAAM,SAAS,MAAM,UAAU,MAAM,GAAG;AAGxC,UAAM,QAAQ,oBAAI,IAAsB;AACxC,UAAM,YAAY,oBAAI,IAA4C;AAClE,eAAW,KAAK,QAAQ;AACtB,YAAM,MAAM,GAAG,EAAE,YAAY,IAAI,EAAE,UAAU;AAC7C,YAAM,MAAM,UAAU,IAAI,GAAG,KAAK,CAAC;AACnC,UAAI,KAAK,EAAE,KAAK,EAAE,oBAAoB,GAAG,KAAK,EAAE,YAAY,CAAC;AAC7D,gBAAU,IAAI,KAAK,GAAG;AAAA,IACxB;AACA,eAAW,CAAC,GAAG,IAAI,KAAK,UAAU,QAAQ,GAAG;AAC3C,WAAK,KAAK,CAAC,GAAG,OAAO,EAAE,OAAO,MAAM,EAAE,OAAO,EAAE;AAC/C,YAAM,IAAI,GAAG,KAAK,IAAI,OAAK,EAAE,GAAG,CAAC;AAAA,IACnC;AAGA,UAAM,OAAO,IAAI,mBAAmB,gBAAuB,EACxD,OAAO;AAAA,MACN,cAAc,iBAAiB,QAAQ;AAAA,MACvC,YAAY,iBAAiB,QAAQ;AAAA,MACrC,aAAa,iBAAiB,QAAQ;AAAA,MACtC,iBAAiB,iBAAiB,QAAQ;AAAA,MAC1C,sBAAsB,wBAAwB,QAAQ;AAAA,MACtD,oBAAoB,wBAAwB,QAAQ;AAAA,MACpD,qBAAqB,wBAAwB,QAAQ;AAAA,IACvD,CAAC,EACA,UAAU,oBAA2B,GAAG,mBAAmB,QAAQ,iBAAiB,iBAAiB,QAAQ,eAAe,CAAC,EAC7H,UAAU,yBAAgC,GAAG,wBAAwB,QAAQ,iBAAiB,mBAAmB,QAAQ,eAAe,CAAC,EACzI,UAAU,0BAAiC,GAAG,yBAAyB,QAAQ,iBAAiB,mBAAmB,QAAQ,eAAe,CAAC,EAC3I,MAAM,GAAG,mBAAmB,QAAQ,iBAAiB,aAAa,CAAC,EACnE,MAAM,GAAG,iBAAiB,QAAQ,cAAc,MAAM,CAAC;AAE1D,UAAM,SAAS,MAAM,UAAU,MAAM,GAAG;AAGxC,UAAM,QAAQ,oBAAI,IAAmB;AACrC,eAAW,KAAK,QAAQ;AACtB,YAAM,MAAM,GAAG,EAAE,YAAY,IAAI,EAAE,UAAU,IAAI,EAAE,WAAW;AAC9D,YAAM,WAAW,MAAM,IAAI,GAAG,KAAK,CAAC;AACpC,eAAS,KAAK;AAAA,QACZ,OAAO,GAAG,EAAE,oBAAoB,IAAI,EAAE,kBAAkB;AAAA,QACxD,QAAQ,EAAE;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,MACZ,CAAC;AACD,YAAM,IAAI,KAAK,QAAQ;AAAA,IACzB;AAGA,UAAM,aAA8B;AAAA,MAClC,MAAM;AAAA,MACN,MAAM,EAAE,MAAM,SAAS,MAAM,YAAY,QAAQ,cAAc,OAAO,IAAI;AAAA,MAC1E,SAAS;AAAA,QACP,EAAE,MAAM,UAAU,OAAO,MAAM,MAAM,WAAW,OAAO,eAAe;AAAA,QACtE,EAAE,MAAM,UAAU,OAAO,OAAO,MAAM,WAAW,OAAO,aAAa;AAAA,QACrE,EAAE,MAAM,UAAU,OAAO,OAAO,MAAM,WAAW,OAAO,aAAa;AAAA,QACrE,EAAE,MAAM,UAAU,OAAO,KAAK,MAAM,eAAe,OAAO,YAAY;AAAA,QACtE,EAAE,MAAM,UAAU,OAAO,KAAK,MAAM,WAAW,OAAO,YAAY;AAAA,QAClE,EAAE,MAAM,UAAU,OAAO,OAAO,MAAM,WAAW,OAAO,UAAU;AAAA,QAClE,EAAE,MAAM,UAAU,OAAO,OAAO,MAAM,OAAO,OAAO,MAAM;AAAA,MAC5D;AAAA,MACA,OAAO;AAAA;AAAA,QAEL;AAAA,UACE,MAAM;AAAA,UACN,MAAM;AAAA,UACN,OAAO,EAAE,MAAM,SAAS,MAAM,YAAY,QAAQ,cAAc,OAAO,MAAM;AAAA,UAC7E,WAAW,GAAG,EAAE,OAAO,OAAO,MAAM,MAAM,GAAG,EAAE,OAAO,KAAK,MAAM,WAAW,CAAC;AAAA,QAC/E;AAAA;AAAA,QAEA;AAAA,UACE,MAAM;AAAA,UACN,MAAM;AAAA,UACN,OAAO,EAAE,MAAM,SAAS,MAAM,gBAAgB,QAAQ,cAAc,OAAO,KAAK;AAAA,UAChF,WAAW,GAAG,EAAE,OAAO,MAAM,MAAM,MAAM,GAAG,EAAE,OAAO,OAAO,MAAM,eAAe,CAAC;AAAA,QACpF;AAAA;AAAA,QAEA;AAAA,UACE,MAAM;AAAA,UACN,MAAM;AAAA,UACN,OAAO,EAAE,MAAM,SAAS,MAAM,YAAY,QAAQ,cAAc,OAAO,MAAM;AAAA,UAC7E,WAAW,GAAG,EAAE,OAAO,OAAO,MAAM,MAAM,GAAG,EAAE,OAAO,KAAK,MAAM,aAAa,CAAC;AAAA,QACjF;AAAA;AAAA,QAEA;AAAA,UACE,MAAM;AAAA,UACN,MAAM;AAAA,UACN,OAAO,QAAQ,UAAU,CAAC,EAAE,MAAM,UAAU,OAAO,KAAK,MAAM,SAAS,CAAe,GAAG,OAAO;AAAA,YAC9F,SAAS;AAAA,YACT,gBAAgB;AAAA,YAChB,eAAe,CAAC,UAAU,KAAK;AAAA,UACjC,CAAC;AAAA,UACD,WAAW,EAAE,MAAM,oBAAoB,MAAM,EAAE,MAAM,WAAW,OAAO,EAAE,GAAG,UAAU,KAAK,OAAO,EAAE,MAAM,WAAW,OAAO,EAAE,EAAE;AAAA,QAClI;AAAA;AAAA,QAEA;AAAA,UACE,MAAM;AAAA,UACN,MAAM;AAAA,UACN,OAAO,EAAE,MAAM,SAAS,MAAM,gBAAgB,QAAQ,cAAc,OAAO,MAAM;AAAA,UACjF,WAAW;AAAA,YACT,GAAG,EAAE,OAAO,OAAO,MAAM,WAAW,GAAG,EAAE,OAAO,OAAO,MAAM,MAAM,CAAC;AAAA,YACpE,GAAG,EAAE,OAAO,OAAO,MAAM,SAAS,GAAG,EAAE,OAAO,OAAO,MAAM,SAAS,CAAC;AAAA,UACvE;AAAA,QACF;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,GAAG,EAAE,OAAO,MAAM,MAAM,UAAU,GAAG,MAAM;AAAA,QAC3C,GAAG,EAAE,OAAO,KAAK,MAAM,eAAe,GAAG,EAAE,MAAM,WAAW,OAAO,MAAM,CAAQ;AAAA,MACnF;AAAA,IACF;AAEA,UAAM,iBAAiB,MAAM,cAAc,YAAY,GAAG;AAG1D,UAAM,eAAe,oBAAI,IAA2J;AACpL,eAAW,KAAK,gBAAgB;AAC9B,YAAM,MAAM,GAAG,EAAE,YAAY,IAAI,EAAE,UAAU,IAAI,EAAE,UAAU;AAC7D,YAAM,QAAQ,aAAa,IAAI,GAAG,KAAK;AAAA,QACrC,cAAc,EAAE;AAAA,QAChB,YAAY,EAAE;AAAA,QACd,YAAY,EAAE;AAAA,QACd,WAAW,EAAE;AAAA,QACb,WAAW,EAAE;AAAA,QACb,MAAM,CAAC;AAAA,MACT;AACA,YAAM,KAAK,KAAK,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,WAAW,KAAK,CAAC;AAC3D,mBAAa,IAAI,KAAK,KAAK;AAAA,IAC7B;AAEA,UAAM,YAAY,MAAM,KAAK,aAAa,OAAO,CAAC,EAAE,IAAI,QAAM;AAAA,MAC5D,cAAc,EAAE;AAAA,MAChB,YAAY,EAAE;AAAA,MACd,YAAY,EAAE;AAAA,MACd,WAAW,EAAE;AAAA,MACb,WAAW,EAAE;AAAA,MACb,cAAc,EAAE,KAAK,KAAK,CAAC,GAAG,OAAO,EAAE,OAAO,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,OAAK,EAAE,GAAG,EAAE,OAAO,OAAO;AAAA,IACjG,EAAE;AAGF,UAAM,cAAc,oBAAI,IAA2B;AAEnD,eAAW,QAAQ,OAAK;AACtB,YAAM,MAAM,GAAG,EAAE,YAAY,IAAI,EAAE,UAAU;AAC7C,UAAI,CAAC,mBAAmB,EAAE,YAAY,OAAO,GAAG;AAC9C;AAAA,MACF;AACA,UAAI,CAAC,YAAY,IAAI,GAAG,GAAG;AACzB,oBAAY,IAAI,KAAK;AAAA,UACnB,MAAM,EAAE;AAAA,UACR,QAAQ,EAAE;AAAA,UACV,SAAS,CAAC;AAAA,UACV,YAAY,MAAM,IAAI,GAAG,KAAK,CAAC;AAAA,UAC/B,SAAS,CAAC;AAAA,QACZ,CAAC;AAAA,MACH;AACA,YAAM,OAAO,YAAY,IAAI,GAAG;AAChC,YAAM,KAAK,MAAM,IAAI,GAAG,EAAE,YAAY,IAAI,EAAE,UAAU,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC;AAC9E,YAAM,SAAyB;AAAA,QAC7B,MAAM,EAAE;AAAA,QACR,MAAM,EAAE;AAAA,QACR,SAAS,EAAE,gBAAgB;AAAA,QAC3B,SAAS,EAAE,kBAAkB;AAAA,QAC7B,YAAY,KACR;AAAA,UACE,OAAO,GAAG;AAAA,UACV,QAAQ,GAAG;AAAA,UACX,UAAU,GAAG;AAAA,UACb,UAAU,GAAG;AAAA,QACf,IACA;AAAA,MACN;AACA,WAAK,QAAQ,KAAK,MAAM;AAAA,IAC1B,CAAC;AAED,cAAU,QAAQ,OAAK;AACrB,YAAM,MAAM,GAAG,EAAE,YAAY,IAAI,EAAE,UAAU;AAC7C,YAAM,QAAQ,YAAY,IAAI,GAAG;AACjC,UAAI,CAAC,MAAO;AACZ,YAAM,MAAqB;AAAA,QACzB,MAAM,EAAE;AAAA,QACR,UAAU,EAAE,gBAAgB,CAAC,GAAG,IAAI,CAAC,OAAe,EAAE,QAAQ,EAAE,EAAE;AAAA,QAClE,QAAQ,CAAC,CAAC,EAAE;AAAA,QACZ,OAAO,EAAE,aAAa;AAAA,MACxB;AACA,YAAM,UAAU,MAAM,WAAW,CAAC;AAClC,YAAM,QAAQ,KAAK,GAAG;AAAA,IACxB,CAAC;AAED,WAAO,KAAK,GAAG,YAAY,OAAO,CAAC;AACnC,WAAO,EAAE,OAAO;AAAA,EAClB;AACF;;;AC/OO,IAAM,oBAAwC;AAAA,EACnD,MAAM,WAAW,KAA+B,SAAqD;AACnG,UAAM,SAAS,QAAQ;AACvB,UAAM,eAAe,SAAS,qBAAqB;AACnD,UAAM,SAAS,SAAS,CAAC,MAAM,IAAI,CAAC;AAEpC,UAAM,aAAa,MAAM;AAAA,MACvB,IAAI;AAAA,MACJ;AAAA;AAAA;AAAA,cAGQ,YAAY;AAAA;AAAA;AAAA,MAGpB;AAAA,IACF;AAEA,UAAM,SAAS,MAAM;AAAA,MACnB,IAAI;AAAA,MACJ;AAAA;AAAA;AAAA,8CAGwC,YAAY;AAAA;AAAA;AAAA,MAGpD;AAAA,IACF;AAEA,UAAM,QAAQ,oBAAI,IAAsB;AACxC,WAAO,QAAQ,OAAK;AAClB,YAAM,MAAM,GAAG,EAAE,YAAY,IAAI,EAAE,UAAU;AAC7C,YAAM,OAAO,MAAM,IAAI,GAAG,KAAK,CAAC;AAChC,WAAK,KAAK,EAAE,WAAW;AACvB,YAAM,IAAI,KAAK,IAAI;AAAA,IACrB,CAAC;AAED,UAAM,YAAY,MAAM;AAAA,MACtB,IAAI;AAAA,MACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAQQ,YAAY;AAAA;AAAA;AAAA,MAGpB;AAAA,IACF;AAEA,UAAM,cAAc,oBAAI,IAA2B;AAEnD,eAAW,QAAQ,OAAK;AACtB,YAAM,MAAM,GAAG,EAAE,YAAY,IAAI,EAAE,UAAU;AAC7C,UAAI,CAAC,mBAAmB,EAAE,YAAY,OAAO,EAAG;AAChD,UAAI,CAAC,YAAY,IAAI,GAAG,GAAG;AACzB,oBAAY,IAAI,KAAK;AAAA,UACnB,MAAM,EAAE;AAAA,UACR,QAAQ,EAAE;AAAA,UACV,SAAS,CAAC;AAAA,UACV,YAAY,MAAM,IAAI,GAAG,KAAK,CAAC;AAAA,UAC/B,SAAS,CAAC;AAAA,QACZ,CAAC;AAAA,MACH;AACA,YAAM,OAAO,YAAY,IAAI,GAAG;AAChC,YAAM,SAAyB;AAAA,QAC7B,MAAM,EAAE;AAAA,QACR,MAAM,EAAE;AAAA,QACR,SAAS,EAAE,gBAAgB;AAAA,QAC3B,SAAS,EAAE,kBAAkB;AAAA,QAC7B,eAAe,OAAO,EAAE,UAAU,YAAY,EAAE,MAAM,SAAS,gBAAgB;AAAA,MACjF;AACA,WAAK,QAAQ,KAAK,MAAM;AAAA,IAC1B,CAAC;AAED,cAAU,QAAQ,OAAK;AACrB,YAAM,MAAM,GAAG,EAAE,YAAY,IAAI,EAAE,UAAU;AAC7C,YAAM,QAAQ,YAAY,IAAI,GAAG;AACjC,UAAI,CAAC,MAAO;AACZ,YAAM,QAAQ,OAAO,EAAE,SAAS,WAAW,EAAE,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,OAAe,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;AAC5G,YAAM,MAAqB;AAAA,QACzB,MAAM,EAAE;AAAA,QACR,SAAS;AAAA,QACT,QAAQ,EAAE,eAAe;AAAA,MAC3B;AACA,YAAM,UAAU,MAAM,WAAW,CAAC;AAClC,YAAM,QAAQ,KAAK,GAAG;AAAA,IACxB,CAAC;AAED,WAAO,EAAE,QAAQ,MAAM,KAAK,YAAY,OAAO,CAAC,EAAE;AAAA,EACpD;AACF;;;AC7FA,IAAM,qBAAqB,CAAC,SAAiB,KAAK,QAAQ,MAAM,IAAI;AAE7D,IAAM,qBAAyC;AAAA,EACpD,MAAM,WAAW,KAA+B,SAAqD;AACnG,UAAM,SAA0B,CAAC;AACjC,UAAM,YAAY,MAAM;AAAA,MACtB,IAAI;AAAA,MACJ;AAAA,IACF;AAEA,eAAW,OAAO,WAAW;AAC3B,YAAM,OAAO,IAAI;AACjB,UAAI,CAAC,mBAAmB,MAAM,OAAO,EAAG;AACxC,YAAM,QAAuB,EAAE,MAAM,SAAS,CAAC,GAAG,YAAY,CAAC,GAAG,SAAS,CAAC,EAAE;AAE9E,YAAM,OAAO,MAAM,UAAU,IAAI,UAAU,sBAAsB,mBAAmB,IAAI,CAAC,KAAK;AAC9F,WAAK,QAAQ,OAAK;AAChB,cAAM,QAAQ,KAAK;AAAA,UACjB,MAAM,EAAE;AAAA,UACR,MAAM,EAAE;AAAA,UACR,SAAS,EAAE,YAAY;AAAA,UACvB,SAAS,EAAE,cAAc;AAAA,UACzB,eAAe;AAAA,QACjB,CAAC;AACD,YAAI,EAAE,MAAM,EAAE,KAAK,GAAG;AACpB,gBAAM,aAAa,MAAM,cAAc,CAAC;AACxC,gBAAM,WAAW,KAAK,EAAE,IAAI;AAAA,QAC9B;AAAA,MACF,CAAC;AAED,YAAM,SAAS,MAAM,UAAU,IAAI,UAAU,4BAA4B,mBAAmB,IAAI,CAAC,KAAK;AACtG,aAAO,QAAQ,QAAM;AACnB,cAAMC,OAAM,MAAM,QAAQ,KAAK,OAAK,EAAE,SAAS,GAAG,IAAI;AACtD,YAAIA,MAAK;AACP,UAAAA,KAAI,aAAa;AAAA,YACf,OAAO,GAAG;AAAA,YACV,QAAQ,GAAG;AAAA,YACX,UAAU,GAAG,WAAW,YAAY;AAAA,YACpC,UAAU,GAAG,WAAW,YAAY;AAAA,UACtC;AAAA,QACF;AAAA,MACF,CAAC;AAED,YAAM,UAAU,MAAM,UAAU,IAAI,UAAU,sBAAsB,mBAAmB,IAAI,CAAC,KAAK;AACjG,iBAAW,OAAO,SAAS;AACzB,cAAM,UAAU,IAAI;AACpB,cAAM,cAAc,MAAM,UAAU,IAAI,UAAU,sBAAsB,mBAAmB,OAAO,CAAC,KAAK;AACxG,cAAM,WAA0B;AAAA,UAC9B,MAAM;AAAA,UACN,SAAS,YAAY,IAAI,SAAO,EAAE,QAAQ,GAAG,KAAe,EAAE;AAAA,UAC9D,QAAQ,IAAI,WAAW;AAAA,QACzB;AACA,cAAM,QAAS,KAAK,QAAQ;AAAA,MAC9B;AAEA,aAAO,KAAK,KAAK;AAAA,IACnB;AAEA,WAAO,EAAE,OAAO;AAAA,EAClB;AACF;;;AC5DO,IAAM,oBAAwC;AAAA,EACnD,MAAM,WAAW,KAA+B,SAAqD;AACnG,UAAM,SAAS,QAAQ;AACvB,UAAM,eAAe,SAAS,mBAAmB;AACjD,UAAM,SAAS,SAAS,CAAC,MAAM,IAAI,CAAC;AAEpC,UAAM,aAAa,MAAM;AAAA,MACvB,IAAI;AAAA,MACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sCAagC,YAAY;AAAA;AAAA,MAE5C;AAAA,IACF;AAEA,UAAM,SAAS,MAAM;AAAA,MACnB,IAAI;AAAA,MACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uCAWiC,YAAY;AAAA;AAAA;AAAA,MAG7C;AAAA,IACF;AAEA,UAAM,QAAQ,oBAAI,IAAsB;AACxC,WAAO,QAAQ,OAAK;AAClB,YAAM,MAAM,GAAG,EAAE,YAAY,IAAI,EAAE,UAAU;AAC7C,YAAM,OAAO,MAAM,IAAI,GAAG,KAAK,CAAC;AAChC,WAAK,KAAK,EAAE,WAAW;AACvB,YAAM,IAAI,KAAK,IAAI;AAAA,IACrB,CAAC;AAED,UAAM,YAAY,MAAM;AAAA,MACtB,IAAI;AAAA,MACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iEAW2D,YAAY;AAAA;AAAA,MAEvE;AAAA,IACF;AAEA,UAAM,gBAAgB,MAAM;AAAA,MAC1B,IAAI;AAAA,MACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uCAYiC,YAAY;AAAA;AAAA;AAAA,MAG7C;AAAA,IACF;AAEA,UAAM,kBAAkB,oBAAI,IAAiD;AAC7E,kBAAc,QAAQ,OAAK;AACzB,YAAM,MAAM,GAAG,EAAE,YAAY,IAAI,EAAE,UAAU,IAAI,EAAE,UAAU;AAC7D,YAAM,OAAO,gBAAgB,IAAI,GAAG,KAAK,CAAC;AAC1C,WAAK,KAAK,EAAE,QAAQ,EAAE,aAAa,OAAO,EAAE,YAAY,CAAC;AACzD,sBAAgB,IAAI,KAAK,IAAI;AAAA,IAC/B,CAAC;AAED,UAAM,cAAc,oBAAI,IAA2B;AAEnD,eAAW,QAAQ,OAAK;AACtB,UAAI,CAAC,mBAAmB,EAAE,YAAY,OAAO,EAAG;AAChD,YAAM,MAAM,GAAG,EAAE,YAAY,IAAI,EAAE,UAAU;AAC7C,UAAI,CAAC,YAAY,IAAI,GAAG,GAAG;AACzB,oBAAY,IAAI,KAAK;AAAA,UACnB,MAAM,EAAE;AAAA,UACR,QAAQ,EAAE;AAAA,UACV,SAAS,CAAC;AAAA,UACV,YAAY,MAAM,IAAI,GAAG,KAAK,CAAC;AAAA,UAC/B,SAAS,CAAC;AAAA,QACZ,CAAC;AAAA,MACH;AACA,YAAM,IAAI,YAAY,IAAI,GAAG;AAC7B,YAAM,SAAyB;AAAA,QAC7B,MAAM,EAAE;AAAA,QACR,MAAM,EAAE;AAAA,QACR,SAAS,EAAE,gBAAgB,SAAS,EAAE,gBAAgB;AAAA,QACtD,SAAS,EAAE,kBAAkB;AAAA,QAC7B,eAAe,CAAC,CAAC,EAAE;AAAA,MACrB;AACA,QAAE,QAAQ,KAAK,MAAM;AAAA,IACvB,CAAC;AAED,cAAU,QAAQ,OAAK;AACrB,YAAM,MAAM,GAAG,EAAE,YAAY,IAAI,EAAE,UAAU;AAC7C,YAAM,QAAQ,YAAY,IAAI,GAAG;AACjC,UAAI,CAAC,MAAO;AACZ,YAAM,QAAQ,gBAAgB,IAAI,GAAG,EAAE,YAAY,IAAI,EAAE,UAAU,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,GACxF,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAChC,IAAI,QAAM,EAAE,QAAQ,EAAE,OAAO,EAAE;AAClC,YAAM,MAAqB;AAAA,QACzB,MAAM,EAAE;AAAA,QACR,SAAS;AAAA,QACT,QAAQ,CAAC,CAAC,EAAE;AAAA,QACZ,OAAO,EAAE,aAAa,EAAE,oBAAoB;AAAA,MAC9C;AACA,YAAM,UAAU,MAAM,WAAW,CAAC;AAClC,YAAM,QAAQ,KAAK,GAAG;AAAA,IACxB,CAAC;AAED,WAAO,EAAE,QAAQ,MAAM,KAAK,YAAY,OAAO,CAAC,EAAE;AAAA,EACpD;AACF;;;AC7IA,IAAM,WAAW,oBAAI,IAAqC;AAE1D,IAAM,+BAA+B,MAAM;AACzC,WAAS,IAAI,YAAY,oBAAoB;AAC7C,WAAS,IAAI,SAAS,iBAAiB;AACvC,WAAS,IAAI,UAAU,kBAAkB;AACzC,WAAS,IAAI,SAAS,iBAAiB;AACzC;AAEA,6BAA6B;AAEtB,IAAM,6BAA6B,CAAC,SAAsB,iBAA2C;AAC1G,WAAS,IAAI,SAAS,YAAY;AACpC;AAEO,IAAM,wBAAwB,CAAC,YAAyD;AAC7F,SAAO,SAAS,IAAI,OAAO;AAC7B;;;ACdO,IAAM,mBAAmB,OAC9B,UACA,SACA,UAA6B,CAAC,MACF;AAC5B,QAAM,UAAU,sBAAsB,OAAO;AAC7C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,0CAA0C,OAAO,EAAE;AAAA,EACrE;AACA,QAAM,kBAAkB,eAAe,OAAO,OAAO;AACrD,QAAM,MAAyB,EAAE,UAAU,SAAS,gBAAgB;AACpE,SAAO,QAAQ,WAAW,KAAK,OAAO;AACxC;;;ACdA,IAAM,cAAc,CAAC,QAA+B,CAAC,CAAC,OAAO,OAAO,QAAQ,YAAY,UAAU,OAAO,UAAU;AAEnH,IAAMC,aAAY,CAAC,UAAqC;AACtD,MAAI,cAAc,KAAK,EAAG,QAAO;AACjC,MAAI,YAAY,KAAK,EAAG,QAAO,cAAc,KAAK;AAElD,SAAO,eAAe,KAAK;AAC7B;AAEA,IAAM,KAAK,CAAC,KAAa,UAAwC;AAAA,EAC/D,MAAM;AAAA,EACN,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,MAAM,KAAK,IAAIA,UAAS;AAC1B;AAKO,IAAM,QAAQ,CAAC,UAAsC,GAAG,SAAS,CAAC,KAAK,CAAC;AAKxE,IAAM,QAAQ,CAAC,UAAsC,GAAG,SAAS,CAAC,KAAK,CAAC;AAKxE,IAAM,QAAQ,CAAC,UAAsC,GAAG,SAAS,CAAC,KAAK,CAAC;AAKxE,IAAM,OAAO,IAAI,UAAwC;AAC9D,MAAI,MAAM,WAAW,EAAG,OAAM,IAAI,MAAM,oCAAoC;AAC5E,SAAO,GAAG,QAAQ,KAAK;AACzB;AAKO,IAAM,aAAa,CAAC,UAAsC,GAAG,eAAe,CAAC,KAAK,CAAC;AAKnF,IAAM,SAAS,CAAC,UAAsC,GAAG,UAAU,CAAC,KAAK,CAAC;AAK1E,IAAM,OAAO,CAAC,OAAqB,UACxC,UAAU,SAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,QAAQ,CAAC,OAAO,KAAK,CAAC;AAKhE,IAAM,QAAQ,CAAC,UAAsC,GAAG,SAAS,CAAC,KAAK,CAAC;AAKxE,IAAM,QAAQ,CAAC,UAAsC,GAAG,SAAS,CAAC,KAAK,CAAC;AAKxE,IAAM,SAAS,IAAI,SAAuC;AAC/D,MAAI,KAAK,SAAS,EAAG,OAAM,IAAI,MAAM,uCAAuC;AAC5E,SAAO,GAAG,UAAU,IAAI;AAC1B;AAKO,IAAM,WAAW,CAAC,cAA4B,SAAuC;AAC1F,MAAI,KAAK,SAAS,EAAG,OAAM,IAAI,MAAM,iEAAiE;AACtG,SAAO,GAAG,aAAa,CAAC,WAAW,GAAG,IAAI,CAAC;AAC7C;AAKO,IAAM,SAAS,CAAC,OAAqB,OAAqBC,YAC/DA,YAAW,SAAY,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,IAAI,GAAG,UAAU,CAAC,OAAO,OAAOA,OAAM,CAAC;AAKpF,IAAM,OAAO,CAAC,OAAqB,QAAoC,GAAG,QAAQ,CAAC,OAAO,GAAG,CAAC;AAK9F,IAAM,QAAQ,CAAC,OAAqB,QAAoC,GAAG,SAAS,CAAC,OAAO,GAAG,CAAC;AAKhG,IAAM,WAAW,CAAC,WAAyB,UAAsC,GAAG,YAAY,CAAC,WAAW,KAAK,CAAC;AAKlH,IAAM,QAAQ,CAAC,OAAqB,cAA0C,GAAG,SAAS,CAAC,OAAO,SAAS,CAAC;AAK5G,IAAM,SAAS,CAAC,WAAyB,OAAqB,UACnE,UAAU,SAAY,GAAG,UAAU,CAAC,WAAW,KAAK,CAAC,IAAI,GAAG,UAAU,CAAC,WAAW,OAAO,KAAK,CAAC;AAK1F,IAAM,UAAU,CAAC,OAAqB,QAAsB,gBACjE,GAAG,WAAW,CAAC,OAAO,QAAQ,WAAW,CAAC;AAKrC,IAAM,SAAS,CAAC,OAAqBC,WAAsC,GAAG,UAAU,CAAC,OAAOA,MAAK,CAAC;AAKtG,IAAM,OAAO,CAAC,OAAqB,KAAmB,QAC3D,GAAG,QAAQ,CAAC,OAAO,KAAK,GAAG,CAAC;AAKvB,IAAM,OAAO,CAAC,OAAqB,KAAmB,QAC3D,GAAG,QAAQ,CAAC,OAAO,KAAK,GAAG,CAAC;AAKvB,IAAM,QAAQ,CAACA,WAAsC,GAAG,SAAS,CAACA,MAAK,CAAC;;;AC3I/E,IAAMC,eAAc,CAAC,QAA+B,CAAC,CAAC,OAAO,OAAO,QAAQ,YAAY,UAAU,OAAO,UAAU;AAEnH,IAAMC,aAAY,CAAC,UAAqC;AACpD,MAAI,cAAc,KAAK,EAAG,QAAO;AACjC,MAAID,aAAY,KAAK,EAAG,QAAO,cAAc,KAAK;AAElD,SAAO,eAAe,KAAK;AAC/B;AAEA,IAAME,MAAK,CAAC,KAAa,UAAwC;AAAA,EAC7D,MAAM;AAAA,EACN,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,MAAM,KAAK,IAAID,UAAS;AAC5B;AASO,IAAM,MAAM,CAAC,UAAsCC,IAAG,OAAO,CAAC,KAAK,CAAC;AAKpE,IAAM,OAAO,CAAC,UAAsCA,IAAG,QAAQ,CAAC,KAAK,CAAC;AAKtE,IAAM,OAAO,CAAC,UAAsCA,IAAG,QAAQ,CAAC,KAAK,CAAC;AAKtE,IAAM,OAAO,CAAC,UAAsCA,IAAG,QAAQ,CAAC,KAAK,CAAC;AAKtE,IAAM,QAAQ,CAAC,GAAiB,MAAkCA,IAAG,SAAS,CAAC,GAAG,CAAC,CAAC;AAKpF,IAAM,OAAO,CAAC,UAAsCA,IAAG,QAAQ,CAAC,KAAK,CAAC;AAKtE,IAAM,UAAU,CAAC,UAAsCA,IAAG,WAAW,CAAC,KAAK,CAAC;AAK5E,IAAM,MAAM,CAAC,UAAsCA,IAAG,OAAO,CAAC,KAAK,CAAC;AAKpE,IAAM,MAAM,CAAC,UAAsCA,IAAG,OAAO,CAAC,KAAK,CAAC;AAKpE,IAAM,UAAU,CAAC,UAAsCA,IAAG,WAAW,CAAC,KAAK,CAAC;AAK5E,IAAM,MAAM,CAAC,UAAsCA,IAAG,OAAO,CAAC,KAAK,CAAC;AAKpE,IAAM,QAAQ,CAAC,UAAsCA,IAAG,SAAS,CAAC,KAAK,CAAC;AAKxE,IAAM,KAAK,CAAC,UAAsCA,IAAG,MAAM,CAAC,KAAK,CAAC;AAKlE,IAAM,MAAM,CAAC,UAAsCA,IAAG,OAAO,CAAC,KAAK,CAAC;AAKpE,IAAM,QAAQ,CAAC,UAAsCA,IAAG,SAAS,CAAC,KAAK,CAAC;AAKxE,IAAM,UAAU,CAAC,MAAoB,UAAsCA,IAAG,YAAY,CAAC,MAAM,KAAK,CAAC;AAKvG,IAAM,MAAM,CAAC,GAAiB,MAAkCA,IAAG,OAAO,CAAC,GAAG,CAAC,CAAC;AAKhF,IAAM,KAAK,MAAoBA,IAAG,MAAM,CAAC,CAAC;AAK1C,IAAM,QAAQ,CAAC,GAAiB,MAAkCA,IAAG,SAAS,CAAC,GAAG,CAAC,CAAC;AAKpF,IAAM,MAAM,CAAC,GAAiB,MAAkCA,IAAG,OAAO,CAAC,GAAG,CAAC,CAAC;AAKhF,IAAM,UAAU,CAAC,UAAsCA,IAAG,WAAW,CAAC,KAAK,CAAC;AAK5E,IAAM,SAAS,MAAoBA,IAAG,UAAU,CAAC,CAAC;AAKlD,IAAM,OAAO,MAAoBA,IAAG,QAAQ,CAAC,CAAC;AAK9C,IAAM,QAAQ,CAAC,OAAqB,aACvC,aAAa,SAAYA,IAAG,SAAS,CAAC,KAAK,CAAC,IAAIA,IAAG,SAAS,CAAC,OAAO,QAAQ,CAAC;AAK1E,IAAM,OAAO,CAAC,UAAsCA,IAAG,QAAQ,CAAC,KAAK,CAAC;AAKtE,IAAM,MAAM,CAAC,UAAsCA,IAAG,OAAO,CAAC,KAAK,CAAC;AAKpE,IAAM,OAAO,CAAC,UAAsCA,IAAG,QAAQ,CAAC,KAAK,CAAC;AAKtE,IAAM,MAAM,CAAC,UAAsCA,IAAG,OAAO,CAAC,KAAK,CAAC;AAKpE,IAAM,QAAQ,CAAC,OAAqB,aACvC,aAAa,SAAYA,IAAG,SAAS,CAAC,KAAK,CAAC,IAAIA,IAAG,SAAS,CAAC,OAAO,QAAQ,CAAC;AAK1E,IAAM,WAAW,CAAC,OAAqB,aAC1CA,IAAG,YAAY,CAAC,OAAO,QAAQ,CAAC;;;AC3KpC,IAAMC,eAAc,CAAC,QAA+B,CAAC,CAAC,OAAO,OAAO,QAAQ,YAAY,UAAU,OAAO,UAAU;AAEnH,IAAMC,aAAY,CAAC,UAAqC;AACpD,MAAI,cAAc,KAAK,EAAG,QAAO;AACjC,MAAID,aAAY,KAAK,EAAG,QAAO,cAAc,KAAK;AAElD,SAAO,eAAe,KAAK;AAC/B;AAEA,IAAME,MAAK,CAAC,KAAa,UAAwC;AAAA,EAC7D,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM,KAAK,IAAID,UAAS;AAC5B;AASO,IAAM,MAAM,MAAoBC,IAAG,OAAO,CAAC,CAAC;AAK5C,IAAM,cAAc,MAAoBA,IAAG,gBAAgB,CAAC,CAAC;AAK7D,IAAM,cAAc,MAAoBA,IAAG,gBAAgB,CAAC,CAAC;AAK7D,IAAM,SAAS,MAAoBA,IAAG,WAAW,CAAC,CAAC;AAOnD,IAAM,UAAU,CAAC,MAAoB,SAAqCA,IAAG,WAAW,CAAC,MAAM,IAAI,CAAC;AAKpG,IAAM,OAAO,CAAC,SAAqCA,IAAG,QAAQ,CAAC,IAAI,CAAC;AAKpE,IAAM,QAAQ,CAAC,SAAqCA,IAAG,SAAS,CAAC,IAAI,CAAC;AAKtE,IAAM,MAAM,CAAC,SAAqCA,IAAG,OAAO,CAAC,IAAI,CAAC;AAQlE,IAAM,UAAU,CAAC,MAAoB,UAAwB,SAChEA,IAAG,YAAY,CAAC,MAAM,UAAU,IAAI,CAAC;AAQlC,IAAM,UAAU,CAAC,MAAoB,UAAwB,SAChEA,IAAG,YAAY,CAAC,MAAM,UAAU,IAAI,CAAC;AAOlC,IAAM,WAAW,CAAC,OAAqB,UAAsCA,IAAG,aAAa,CAAC,OAAO,KAAK,CAAC;AAO3G,IAAM,aAAa,CAAC,MAAoB,WAAuCA,IAAG,eAAe,CAAC,MAAM,MAAM,CAAC;AAK/G,IAAM,gBAAgB,MAAoBA,IAAG,kBAAkB,CAAC,CAAC;AAMjE,IAAM,eAAe,CAAC,cAA0CA,IAAG,iBAAiB,CAAC,SAAS,CAAC;AAK/F,IAAM,aAAa,CAAC,SAAqCA,IAAG,gBAAgB,CAAC,IAAI,CAAC;AAKlF,IAAM,YAAY,CAAC,SAAqCA,IAAG,eAAe,CAAC,IAAI,CAAC;AAKhF,IAAM,aAAa,CAAC,SAAqCA,IAAG,gBAAgB,CAAC,IAAI,CAAC;AAOlF,IAAM,YAAY,CAAC,MAAoB,SAAqCA,IAAG,cAAc,CAAC,MAAM,IAAI,CAAC;;;AC7HzG,IAAM,oBAAN,MAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAShC,IAAO,OAAU,UAAsB;AACrC,SAAK,QAAQ;AACb,QAAI;AACF,aAAO,SAAS;AAAA,IAClB,UAAE;AACA,WAAK,QAAQ;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAA0B;AACxB,WAAO,KAAK;AAAA,EACd;AACF;;;ACbO,IAAM,wBAAgE;AAAA,EAC3E,CAAC,cAAc,MAAM,GAAG,EAAE,KAAK,cAAc,QAAQ,QAAQ,KAAK;AAAA,EAClE,CAAC,cAAc,UAAU,GAAG,EAAE,KAAK,cAAc,YAAY,QAAQ,MAAM;AAAA,EAC3E,CAAC,cAAc,YAAY,GAAG,EAAE,KAAK,cAAc,cAAc,QAAQ,KAAK;AAAA,EAC9E,CAAC,cAAc,gBAAgB,GAAG,EAAE,KAAK,cAAc,kBAAkB,QAAQ,MAAM;AAAA,EACvF,CAAC,cAAc,SAAS,GAAG,EAAE,KAAK,cAAc,WAAW,QAAQ,KAAK;AAAA,EACxE,CAAC,cAAc,aAAa,GAAG,EAAE,KAAK,cAAc,eAAe,QAAQ,MAAM;AAAA,EACjF,CAAC,cAAc,IAAI,GAAG,EAAE,KAAK,cAAc,MAAM,QAAQ,OAAO;AAAA,EAChE,CAAC,cAAc,QAAQ,GAAG,EAAE,KAAK,cAAc,UAAU,QAAQ,UAAU;AAAA,EAC3E,CAAC,cAAc,EAAE,GAAG,EAAE,KAAK,cAAc,IAAI,QAAQ,SAAS;AAAA,EAC9D,CAAC,cAAc,MAAM,GAAG,EAAE,KAAK,cAAc,QAAQ,QAAQ,YAAY;AAAA,EACzE,CAAC,cAAc,OAAO,GAAG,EAAE,KAAK,cAAc,SAAS,QAAQ,SAAS;AAAA,EACxE,CAAC,cAAc,WAAW,GAAG,EAAE,KAAK,cAAc,aAAa,QAAQ,YAAY;AAAA,EACnF,CAAC,cAAc,GAAG,GAAG,EAAE,KAAK,cAAc,KAAK,QAAQ,MAAM;AAAA,EAC7D,CAAC,cAAc,EAAE,GAAG,EAAE,KAAK,cAAc,IAAI,QAAQ,KAAK;AAAA,EAC1D,CAAC,cAAc,OAAO,GAAG,EAAE,KAAK,cAAc,SAAS,QAAQ,UAAU;AAAA,EACzE,CAAC,cAAc,WAAW,GAAG,EAAE,KAAK,cAAc,aAAa,QAAQ,aAAa;AAAA,EACpF,CAAC,cAAc,MAAM,GAAG,EAAE,KAAK,cAAc,QAAQ,QAAQ,SAAS;AAAA,EACtE,CAAC,cAAc,UAAU,GAAG,EAAE,KAAK,cAAc,YAAY,QAAQ,YAAY;AACnF;;;ACZO,IAAM,wBAAN,MAAsD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM3D,cAAc,OAA0E;AACtF,UAAM,YACJ,OAAO,UAAU,WACb,QACA,MAAM,SAAS,iBACb,MAAM,QACN,MAAM;AAGd,QAAI,UAAU,SAAS,GAAG,GAAG;AAC3B,aAAO,UAAU,MAAM,GAAG,EACvB,IAAI,UAAQ,KAAK,WAAW,IAAI,CAAC,EACjC,KAAK,EAAE;AAAA,IACZ;AAEA,WAAO,KAAK,WAAW,SAAS;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiB,QAA4B;AAC3C,WAAO,OAAO;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,WAAW,GAAmB;AACpC,QAAI,CAAC,EAAG,QAAO;AACf,WAAO,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC;AAAA,EAC9C;AACF;;;ACvCA,IAAMC,eAAc,CAAC,UAAwB;AAC3C,QAAM,IAAI,MAAM,2BAA2B,KAAK,EAAE;AACpD;AAKO,IAAM,sBAAN,MAAuF;AAAA,EAC5F,YAAoB,iBAAiC,IAAI,sBAAsB,GAAG;AAA9D;AAAA,EAA+D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOnF,SAAS,KAA8B;AACrC,UAAM,aAAa,KAAK,iBAAiB,GAAG;AAC5C,UAAM,QAAQ,WAAW,IAAI,CAAC,MAAM,UAAW,UAAU,IAAI,iBAAiB,IAAI,KAAK,IAAK;AAC5F,UAAM,KAAK,KAAK,IAAI,wBAAwB;AAC5C,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,iBAAiB,KAAgC;AACvD,UAAM,QAAkB,CAAC;AACzB,UAAM,YAAa,IAAI,MAAwC;AAC/D,UAAM,oBAAoB,IAAI,IAAI,WAAW,WAAW,IAAI,OAAK,EAAE,IAAI,KAAK,CAAC,CAAC;AAE9E,UAAM,aAAa,IAAI,QACpB,OAAO,CAAAC,SAAO,EAAE,aAAa,gBAAiBA,KAAY,KAAK,EAAE,EACjE,IAAI,CAAAA,SAAO;AACV,YAAM,MAAOA,KAAY,SAAUA,KAAY;AAC/C,YAAM,UAAUA;AAChB,aAAO,GAAG,GAAG,KAAK,KAAK,aAAa,OAAO,CAAC;AAAA,IAC9C,CAAC;AAEH,UAAM,KAAK,aAAa;AACxB,eAAW,QAAQ,CAACC,MAAK,UAAU;AACjC,YAAM,KAAK,KAAKA,IAAG,GAAG,QAAQ,WAAW,SAAS,IAAI,MAAM,EAAE,EAAE;AAAA,IAClE,CAAC;AACD,UAAM,KAAK,IAAI;AACf,UAAM,KAAK,SAAS,KAAK,eAAe,cAAc,IAAI,IAAI,CAAC,GAAG;AAElE,QAAI,IAAI,YAAY,IAAI,SAAS,QAAQ;AACvC,YAAM,OAAO,IAAI,SAAS,IAAI,OAAK,GAAG,KAAK,eAAe,cAAc,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,IAAI;AACvG,YAAM,KAAK,aAAa,IAAI,GAAG;AAAA,IACjC;AAEA,QAAI,MAAM,QAAQ,UAAQ;AACxB,YAAM,eAAe,oBAAoB,IAAI;AAC7C,UAAI,gBAAgB,kBAAkB,IAAI,YAAY,GAAG;AACvD;AAAA,MACF;AAEA,UAAI,cAAc;AAChB,YAAI,KAAK,SAAS,SAAS;AACzB,gBAAM,KAAK,kBAAkB,YAAY,IAAI;AAAA,QAC/C,OAAO;AACL,gBAAM,KAAK,kBAAkB,YAAY,OAAO,KAAK,IAAI,IAAI;AAAA,QAC/D;AAAA,MACF,OAAO;AACL,cAAM,QAAQ,KAAK,eAAe,cAAc,KAAK,KAAK;AAC1D,cAAM,OAAO,KAAK,gBAAgB,KAAK,SAAS;AAChD,YAAI,SAAS;AACb,YAAI,KAAK,SAAS,OAAQ,UAAS;AACnC,YAAI,KAAK,SAAS,QAAS,UAAS;AACpC,cAAM,KAAK,IAAI,MAAM,IAAI,KAAK,KAAK,IAAI,GAAG;AAAA,MAC5C;AAAA,IACF,CAAC;AAED,QAAI,WAAW,WAAW,QAAQ;AAChC,gBAAU,UAAU,QAAQ,SAAO;AACjC,cAAM,UAAoB,CAAC;AAC3B,YAAI,IAAI,QAAQ,OAAQ,SAAQ,KAAK,aAAa,IAAI,QAAQ,IAAI,OAAK,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,GAAG;AAC9F,YAAI,IAAI,gBAAgB,IAAI,KAAM,SAAQ,KAAK,iBAAiB,IAAI,WAAW,GAAG;AAClF,cAAM,OAAO,QAAQ,SAAS,OAAO,QAAQ,KAAK,IAAI,CAAC,OAAO;AAC9D,cAAM,KAAK,aAAa,IAAI,IAAI,IAAI,IAAI,GAAG;AAAA,MAC7C,CAAC;AAAA,IACH;AAEA,QAAI,IAAI,OAAO;AACb,YAAM,KAAK,UAAU,KAAK,gBAAgB,IAAI,KAAK,CAAC,GAAG;AAAA,IACzD;AAEA,QAAI,IAAI,WAAW,IAAI,QAAQ,QAAQ;AACrC,YAAM,OAAO,IAAI,QAAQ,IAAI,OAAK,GAAG,KAAK,eAAe,cAAc,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,IAAI;AACtG,YAAM,KAAK,YAAY,IAAI,GAAG;AAAA,IAChC;AAEA,QAAI,IAAI,QAAQ;AACd,YAAM,KAAK,WAAW,KAAK,gBAAgB,IAAI,MAAM,CAAC,GAAG;AAAA,IAC3D;AAEA,QAAI,IAAI,WAAW,IAAI,QAAQ,QAAQ;AACrC,UAAI,QAAQ,QAAQ,OAAK;AACvB,cAAM,KAAK,YAAY,KAAK,eAAe,cAAc,EAAE,OAAO,KAAK,CAAC,IAAI,EAAE,OAAO,IAAI,MAAM,EAAE,SAAS,IAAI;AAAA,MAChH,CAAC;AAAA,IACH;AAEA,QAAI,IAAI,MAAO,OAAM,KAAK,UAAU,IAAI,KAAK,GAAG;AAChD,QAAI,IAAI,OAAQ,OAAM,KAAK,WAAW,IAAI,MAAM,GAAG;AAEnD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,gBAAgB,MAA8B;AACpD,WAAO,gBAAgB,MAAM,IAAI;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,aAAa,MAA2B;AAC9C,WAAO,aAAa,MAAM,IAAI;AAAA,EAChC;AAAA,EAEO,sBAAsB,QAAsC;AACjE,WAAO,KAAK,sBAAsB,MAAM;AAAA,EAC1C;AAAA,EAEO,uBAAuB,SAAwC;AACpE,WAAO,KAAK,uBAAuB,OAAO;AAAA,EAC5C;AAAA,EAEO,oBAAoB,UAAsC;AAC/D,WAAO,KAAK,oBAAoB,QAAQ;AAAA,EAC1C;AAAA,EAEO,kBAAkB,QAAkC;AACzD,WAAO,KAAK,kBAAkB,MAAM;AAAA,EACtC;AAAA,EAEO,sBAAsB,YAA0C;AACrE,WAAO,KAAK,sBAAsB,UAAU;AAAA,EAC9C;AAAA,EAEO,uBAAuB,aAA4C;AACxE,WAAO,KAAK,uBAAuB,WAAW;AAAA,EAChD;AAAA,EAEO,YAAY,MAA0B;AAC3C,WAAO,KAAK,mBAAmB,IAAI;AAAA,EACrC;AAAA,EAEO,aAAa,MAA2B;AAC7C,WAAO,KAAK,oBAAoB,IAAI;AAAA,EACtC;AAAA,EAEO,cAAc,MAA4B;AAC/C,WAAO,KAAK,qBAAqB,IAAI;AAAA,EACvC;AAAA,EAEO,cAAc,MAA4B;AAC/C,WAAO,KAAK,qBAAqB,IAAI;AAAA,EACvC;AAAA,EAEO,oBAAoB,MAAkC;AAC3D,WAAO,KAAK,2BAA2B,IAAI;AAAA,EAC7C;AAAA,EAEO,oBAAoB,MAAkC;AAC3D,WAAO,KAAK,2BAA2B,IAAI;AAAA,EAC7C;AAAA,EAEO,oBAAoB,MAAkC;AAC3D,WAAO,KAAK,2BAA2B,IAAI;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,sBAAsB,QAAsC;AAClE,UAAMC,QAAO,KAAK,aAAa,OAAO,IAAI;AAC1C,UAAMC,SAAQ,KAAK,aAAa,OAAO,KAAK;AAC5C,UAAMC,MAAK,KAAK,MAAM,OAAO,QAAQ;AACrC,UAAM,OAAO,CAACF,OAAMC,MAAK;AACzB,QAAI,OAAO,QAAQ;AACjB,WAAK,KAAK,KAAK,aAAa,OAAO,MAAM,CAAC;AAAA,IAC5C;AACA,WAAO,GAAGC,GAAE,IAAI,KAAK,KAAK,IAAI,CAAC;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,uBAAuB,SAAwC;AACrE,QAAI,QAAQ,SAAS,WAAW,EAAG,QAAO;AAC1C,UAAM,QAAQ,QAAQ,SAAS,IAAI,QAAM;AACvC,YAAM,WAAW,KAAK,gBAAgB,EAAE;AACxC,aAAO,GAAG,SAAS,sBAAsB,IAAI,QAAQ,MAAM;AAAA,IAC7D,CAAC;AACD,WAAO,GAAG,KAAK,MAAM,QAAQ,QAAQ,CAAC;AAAA,MAAU,MAAM,KAAK,SAAS,CAAC;AAAA;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,kBAAkB,QAAkC;AAC1D,UAAMF,QAAO,KAAK,aAAa,OAAO,IAAI;AAC1C,UAAM,SAAS,OAAO,MAAM,IAAI,OAAK,KAAK,aAAa,CAAC,CAAC,EAAE,KAAK,IAAI;AACpE,UAAME,MAAK,KAAK,MAAM,OAAO,QAAQ;AACrC,WAAO,GAAGA,GAAE,IAAIF,KAAI,MAAM,MAAM;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,oBAAoB,UAAsC;AAChE,UAAMA,QAAO,KAAK,aAAa,SAAS,IAAI;AAC5C,UAAME,MAAK,KAAK,MAAM,SAAS,QAAQ;AACvC,WAAO,GAAGA,GAAE,IAAIF,KAAI;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,uBAAuB,aAA4C;AACzE,UAAMA,QAAO,KAAK,aAAa,YAAY,IAAI;AAC/C,UAAMG,SAAQ,KAAK,aAAa,YAAY,KAAK;AACjD,UAAMC,SAAQ,KAAK,aAAa,YAAY,KAAK;AACjD,WAAO,GAAG,KAAK,MAAM,YAAY,QAAQ,CAAC,IAAIJ,KAAI,KAAKG,MAAK,KAAKC,MAAK;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,sBAAsB,YAA0C;AACtE,UAAM,WAAW,KAAK,YAAY,KAAK,iBAAiB,WAAW,QAAQ,CAAC;AAC5E,WAAO,GAAG,KAAK,MAAM,WAAW,QAAQ,CAAC,IAAI,QAAQ;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,mBAAmB,QAA4B;AACrD,WAAO,GAAG,KAAK,eAAe,cAAc,OAAO,KAAK,CAAC,IAAI,OAAO,IAAI;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,oBAAoB,SAA8B;AACxD,QAAI,QAAQ,UAAU,KAAM,QAAO;AACnC,WAAO,OAAO,QAAQ,UAAU,WAAW,IAAI,QAAQ,KAAK,MAAM,OAAO,QAAQ,KAAK;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,qBAAqBF,KAA0B;AACrD,UAAM,OAAOA,IAAG,KAAK,IAAI,OAAK,KAAK,aAAa,CAAC,CAAC,EAAE,KAAK,IAAI;AAC7D,WAAO,GAAGA,IAAG,KAAK,YAAY,CAAC,IAAI,IAAI;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,qBAAqB,MAA4B;AACvD,WAAO,YAAY,KAAK,eAAe,cAAc,KAAK,OAAO,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,KAAK,IAAI;AAAA,EAC5G;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,2BAA2B,MAAkC;AACnE,UAAM,WAAW,KAAK,YAAY,KAAK,iBAAiB,KAAK,KAAK,CAAC;AACnE,WAAO,IAAI,QAAQ;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,2BAA2B,MAAkC;AACnE,UAAM,UAAU,KAAK,WAAW;AAAA,MAC9B,eACE,WAAW,KAAK,gBAAgB,UAAU,IAAI,CAAC,WAAW,KAAK,aAAa,UAAU,IAAI,CAAC;AAAA,IAC/F;AACA,UAAM,YAAY,KAAK,OAAO,KAAK,KAAK,aAAa,KAAK,IAAI,CAAC,KAAK;AACpE,WAAO,aAAa,QAAQ,KAAK,IAAI,CAAC,IAAI,SAAS;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,2BAA2B,MAAkC;AACnE,QAAI,SAAS,GAAG,KAAK,IAAI;AACzB,QAAI,KAAK,KAAK,SAAS,GAAG;AACxB,gBAAU,KAAK,KAAK,IAAI,SAAO,KAAK,aAAa,GAAG,CAAC,EAAE,KAAK,IAAI;AAAA,IAClE;AACA,cAAU;AAEV,UAAM,QAAkB,CAAC;AAEzB,QAAI,KAAK,eAAe,KAAK,YAAY,SAAS,GAAG;AACnD,YAAM,kBACJ,kBAAkB,KAAK,YAAY,IAAI,CAAAJ,SAAO,GAAG,KAAK,eAAe,cAAcA,KAAI,KAAK,CAAC,IAAIA,KAAI,IAAI,EAAE,EAAE,KAAK,IAAI;AACxH,YAAM,KAAK,eAAe;AAAA,IAC5B;AAEA,QAAI,KAAK,WAAW,KAAK,QAAQ,SAAS,GAAG;AAC3C,YAAM,cACJ,cACA,KAAK,QAAQ,IAAI,OAAK,GAAG,KAAK,eAAe,cAAc,EAAE,OAAO,KAAK,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,IAAI;AACzH,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,cAAU,MAAM,KAAK,GAAG;AACxB,cAAU;AAEV,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,YAAY,OAAyB;AAC3C,WAAO,MACJ,IAAI,UAAQ,KAAK,KAAK,CAAC,EACvB,OAAO,UAAQ,KAAK,SAAS,CAAC,EAC9B,KAAK,GAAG;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,MAAM,IAAyB;AACrC,UAAM,SAAS,sBAAsB,EAAE;AACvC,QAAI,CAAC,QAAQ;AACX,aAAOD,aAAY,EAAW;AAAA,IAChC;AACA,WAAO,OAAO;AAAA,EAChB;AACF;;;AC/YO,IAAM,cAAN,MAAkB;AAAA,EAAlB;AACL,SAAiB,UAAU,oBAAI,IAAwC;AAAA;AAAA,EAEvE,IAAI,aAAsD;AACxD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,UAAU,OAAiB,IAAsC;AAC/D,UAAM,SAAS,KAAK,QAAQ,IAAI,MAAM,IAAI;AAC1C,WAAO,QAAQ,IAAI,KAAK,cAAc,EAAE,CAAC,GAAG;AAAA,EAC9C;AAAA,EAEA,SAAS,SAA8B;AACrC,QAAI,QAAQ,MAAM,KAAM;AACxB,UAAM,SAAS,KAAK,QAAQ,IAAI,QAAQ,MAAM,IAAI,KAAK,oBAAI,IAA2B;AACtF,WAAO,IAAI,KAAK,cAAc,QAAQ,EAAE,GAAG,OAAO;AAClD,SAAK,QAAQ,IAAI,QAAQ,MAAM,MAAM,MAAM;AAAA,EAC7C;AAAA,EAEA,OAAO,SAA8B;AACnC,QAAI,QAAQ,MAAM,KAAM;AACxB,UAAM,SAAS,KAAK,QAAQ,IAAI,QAAQ,MAAM,IAAI;AAClD,YAAQ,OAAO,KAAK,cAAc,QAAQ,EAAE,CAAC;AAAA,EAC/C;AAAA,EAEA,oBAAoB,OAAkC;AACpD,UAAM,SAAS,KAAK,QAAQ,IAAI,MAAM,IAAI;AAC1C,WAAO,SAAS,MAAM,KAAK,OAAO,OAAO,CAAC,IAAI,CAAC;AAAA,EACjD;AAAA,EAEA,QAAc;AACZ,SAAK,QAAQ,MAAM;AAAA,EACrB;AAAA,EAEQ,cAAc,IAA6B;AACjD,WAAO,OAAO,EAAE;AAAA,EAClB;AACF;;;AClCO,IAAK,eAAL,kBAAKQ,kBAAL;AAEL,EAAAA,cAAA,SAAM;AAEN,EAAAA,cAAA,aAAU;AAEV,EAAAA,cAAA,WAAQ;AAER,EAAAA,cAAA,aAAU;AAEV,EAAAA,cAAA,cAAW;AAVD,SAAAA;AAAA,GAAA;;;ACML,IAAM,aAAN,MAAiB;AAAA,EAGtB,YACmB,SACA,UACA,aACA,aACjB;AAJiB;AACA;AACA;AACA;AANnB,SAAiB,kBAAkB,oBAAI,IAAwB;AAAA,EAO3D;AAAA,EAEJ,IAAI,kBAA2D;AAC7D,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA,EAEA,aAA8B;AAC5B,WAAO,MAAM,KAAK,KAAK,gBAAgB,OAAO,CAAC;AAAA,EACjD;AAAA,EAEA,UAAU,OAAiB,IAAsC;AAC/D,WAAO,KAAK,YAAY,UAAU,OAAO,EAAE;AAAA,EAC7C;AAAA,EAEA,oBAAoB,OAAkC;AACpD,WAAO,KAAK,YAAY,oBAAoB,KAAK;AAAA,EACnD;AAAA,EAEA,YAAY,QAAwC;AAClD,WAAO,KAAK,gBAAgB,IAAI,MAAM;AAAA,EACxC;AAAA,EAEA,UAAU,OAAiB,IAAqB,QAAmB;AACjE,QAAI,OAAO,QAAQ,OAAO,OAAW;AACrC,QAAI,UAAU,KAAK,gBAAgB,IAAI,MAAM;AAC7C,QAAI,CAAC,SAAS;AACZ,gBAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,KAAK,eAAe,OAAO,MAAM;AAAA,MAC7C;AACA,WAAK,gBAAgB,IAAI,QAAQ,OAAO;AAAA,IAC1C,OAAO;AACL,cAAQ,KAAK;AAAA,IACf;AAEA,SAAK,iBAAiB,OAAO;AAAA,EAC/B;AAAA,EAEA,SAAS,OAAiB,QAAa,IAA4B;AACjE,UAAM,UAAyB;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,IAAI,MAAM;AAAA,MACV;AAAA,MACA,UAAU;AAAA,IACZ;AACA,SAAK,gBAAgB,IAAI,QAAQ,OAAO;AACxC,QAAI,MAAM,MAAM;AACd,WAAK,iBAAiB,OAAO;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,aAAa,OAAiB,IAAqB,QAAmB;AACpE,UAAM,UAAyB;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU,KAAK,eAAe,OAAO,MAAM;AAAA,IAC7C;AACA,SAAK,gBAAgB,IAAI,QAAQ,OAAO;AACxC,SAAK,iBAAiB,OAAO;AAAA,EAC/B;AAAA,EAEA,UAAU,QAAmB;AAC3B,UAAM,UAAU,KAAK,gBAAgB,IAAI,MAAM;AAC/C,QAAI,CAAC,QAAS;AACd,QAAI,QAAQ,8BAA+B,QAAQ,mCAAiC;AACpF,YAAQ;AAAA,EACV;AAAA,EAEA,YAAY,QAAmB;AAC7B,UAAM,UAAU,KAAK,gBAAgB,IAAI,MAAM;AAC/C,QAAI,CAAC,QAAS;AACd,YAAQ;AAAA,EACV;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,UAAU,MAAM,KAAK,KAAK,gBAAgB,OAAO,CAAC;AACxD,eAAW,WAAW,SAAS;AAC7B,cAAQ,QAAQ,QAAQ;AAAA,QACtB;AACE,gBAAM,KAAK,YAAY,OAAO;AAC9B;AAAA,QACF;AACE,gBAAM,KAAK,YAAY,OAAO;AAC9B;AAAA,QACF;AACE,gBAAM,KAAK,YAAY,OAAO;AAC9B;AAAA,QACF;AACE;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAAA,EAEA,QAAc;AACZ,SAAK,gBAAgB,MAAM;AAC3B,SAAK,YAAY,MAAM;AAAA,EACzB;AAAA,EAEA,MAAc,YAAY,SAAuC;AAC/D,UAAM,KAAK,QAAQ,QAAQ,MAAM,OAAO,cAAc,OAAO;AAE7D,UAAM,UAAU,KAAK,eAAe,QAAQ,OAAO,QAAQ,MAAM;AACjE,QAAI,UAAU,IAAI,mBAAmB,QAAQ,KAAK,EAAE,OAAO,OAAO;AAClE,QAAI,KAAK,QAAQ,kBAAkB,GAAG;AACpC,gBAAU,QAAQ,UAAU,GAAG,KAAK,oBAAoB,QAAQ,KAAK,CAAC;AAAA,IACxE;AACA,UAAM,WAAW,QAAQ,QAAQ,KAAK,OAAO;AAC7C,UAAM,UAAU,MAAM,KAAK,gBAAgB,QAAQ;AACnD,SAAK,sBAAsB,SAAS,OAAO;AAE3C,YAAQ;AACR,YAAQ,WAAW,KAAK,eAAe,QAAQ,OAAO,QAAQ,MAAM;AACpE,YAAQ,KAAK,KAAK,mBAAmB,OAAO;AAC5C,SAAK,iBAAiB,OAAO;AAE7B,UAAM,KAAK,QAAQ,QAAQ,MAAM,OAAO,aAAa,OAAO;AAAA,EAC9D;AAAA,EAEA,MAAc,YAAY,SAAuC;AAC/D,QAAI,QAAQ,MAAM,KAAM;AACxB,UAAM,UAAU,KAAK,eAAe,OAAO;AAC3C,QAAI,CAAC,OAAO,KAAK,OAAO,EAAE,QAAQ;AAChC,cAAQ;AACR;AAAA,IACF;AAEA,UAAM,KAAK,QAAQ,QAAQ,MAAM,OAAO,cAAc,OAAO;AAE7D,UAAM,WAAW,QAAQ,MAAM,QAAQ,eAAe,QAAQ,KAAK,CAAC;AACpE,QAAI,CAAC,SAAU;AAEf,QAAI,UAAU,IAAI,mBAAmB,QAAQ,KAAK,EAC/C,IAAI,OAAO,EACX,MAAM,GAAG,UAAU,QAAQ,EAAE,CAAC;AAEjC,QAAI,KAAK,QAAQ,kBAAkB,GAAG;AACpC,gBAAU,QAAQ,UAAU,GAAG,KAAK,oBAAoB,QAAQ,KAAK,CAAC;AAAA,IACxE;AAEA,UAAM,WAAW,QAAQ,QAAQ,KAAK,OAAO;AAC7C,UAAM,UAAU,MAAM,KAAK,gBAAgB,QAAQ;AACnD,SAAK,sBAAsB,SAAS,OAAO;AAE3C,YAAQ;AACR,YAAQ,WAAW,KAAK,eAAe,QAAQ,OAAO,QAAQ,MAAM;AACpE,SAAK,iBAAiB,OAAO;AAE7B,UAAM,KAAK,QAAQ,QAAQ,MAAM,OAAO,aAAa,OAAO;AAAA,EAC9D;AAAA,EAEA,MAAc,YAAY,SAAuC;AAC/D,QAAI,QAAQ,MAAM,KAAM;AACxB,UAAM,KAAK,QAAQ,QAAQ,MAAM,OAAO,cAAc,OAAO;AAE7D,UAAM,WAAW,QAAQ,MAAM,QAAQ,eAAe,QAAQ,KAAK,CAAC;AACpE,QAAI,CAAC,SAAU;AAEf,UAAM,UAAU,IAAI,mBAAmB,QAAQ,KAAK,EAAE,MAAM,GAAG,UAAU,QAAQ,EAAE,CAAC;AACpF,UAAM,WAAW,QAAQ,QAAQ,KAAK,OAAO;AAC7C,UAAM,KAAK,gBAAgB,QAAQ;AAEnC,YAAQ;AACR,SAAK,gBAAgB,OAAO,QAAQ,MAAM;AAC1C,SAAK,YAAY,OAAO,OAAO;AAE/B,UAAM,KAAK,QAAQ,QAAQ,MAAM,OAAO,aAAa,OAAO;AAAA,EAC9D;AAAA,EAEA,MAAc,QACZ,MACA,SACe;AACf,QAAI,CAAC,KAAM;AACX,UAAM,KAAK,KAAK,YAAY,GAAU,QAAQ,MAAM;AAAA,EACtD;AAAA,EAEQ,eAAe,SAAiD;AACtE,UAAM,WAAW,QAAQ,YAAY,CAAC;AACtC,UAAM,UAAmC,CAAC;AAC1C,eAAW,UAAU,OAAO,KAAK,QAAQ,MAAM,OAAO,GAAG;AACvD,YAAM,UAAU,QAAQ,OAAO,MAAM;AACrC,UAAI,SAAS,MAAM,MAAM,SAAS;AAChC,gBAAQ,MAAM,IAAI;AAAA,MACpB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,OAAiB,QAAsC;AAC5E,UAAM,UAAmC,CAAC;AAC1C,eAAW,UAAU,OAAO,KAAK,MAAM,OAAO,GAAG;AAC/C,UAAI,OAAO,MAAM,MAAM,OAAW;AAClC,cAAQ,MAAM,IAAI,OAAO,MAAM;AAAA,IACjC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,gBAAgB,UAAiD;AAC7E,WAAO,KAAK,SAAS,WAAW,SAAS,KAAK,SAAS,MAAM;AAAA,EAC/D;AAAA,EAEQ,oBAAoB,OAA+B;AACzD,WAAO,OAAO,OAAO,MAAM,OAAO,EAAE,IAAI,aAAW;AAAA,MACjD,MAAM;AAAA,MACN,OAAO,MAAM;AAAA,MACb,MAAM,OAAO;AAAA,MACb,OAAO,OAAO;AAAA,IAChB,EAAE;AAAA,EACJ;AAAA,EAEQ,sBAAsB,SAAwB,SAA8B;AAClF,QAAI,CAAC,KAAK,QAAQ,kBAAkB,EAAG;AACvC,UAAM,QAAQ,QAAQ,CAAC;AACvB,QAAI,CAAC,SAAS,MAAM,OAAO,WAAW,EAAG;AAEzC,UAAM,MAAM,MAAM,OAAO,CAAC;AAC1B,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,QAAQ,KAAK;AAC7C,YAAM,aAAa,KAAK,oBAAoB,MAAM,QAAQ,CAAC,CAAC;AAC5D,UAAI,EAAE,cAAc,QAAQ,MAAM,SAAU;AAC5C,cAAQ,OAAO,UAAU,IAAI,IAAI,CAAC;AAAA,IACpC;AAAA,EACF;AAAA,EAEQ,oBAAoB,QAAwB;AAClD,UAAM,QAAQ,OAAO,MAAM,GAAG;AAC9B,UAAM,YAAY,MAAM,MAAM,SAAS,CAAC;AACxC,WAAO,UAAU,QAAQ,wBAAwB,EAAE;AAAA,EACrD;AAAA,EAEQ,iBAAiB,SAA8B;AACrD,QAAI,QAAQ,MAAM,KAAM;AACxB,SAAK,YAAY,SAAS,OAAO;AAAA,EACnC;AAAA,EAEQ,eAAe,OAAiB,QAAkC;AACxE,UAAM,WAAgC,CAAC;AACvC,eAAW,UAAU,OAAO,KAAK,MAAM,OAAO,GAAG;AAC/C,eAAS,MAAM,IAAI,OAAO,MAAM;AAAA,IAClC;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,mBAAmB,SAAgD;AACzE,UAAM,MAAM,eAAe,QAAQ,KAAK;AACxC,UAAM,MAAM,QAAQ,OAAO,GAAG;AAC9B,QAAI,QAAQ,UAAa,QAAQ,KAAM,QAAO;AAC9C,WAAO;AAAA,EACT;AACF;;;ACtQO,IAAM,iBAAN,MAAqD;AAAA,EAG1D,YAAY,iBAA+C;AAF3D,SAAiB,WAAW,oBAAI,IAAiD;AAG/E,QAAI,iBAAiB;AACnB,iBAAW,OAAO,iBAAiB;AACjC,cAAM,OAAO;AACb,cAAM,OAAO,gBAAgB,IAAI,KAAK,CAAC;AACvC,aAAK,SAAS,IAAI,MAAM,CAAC,GAAI,IAAyC,CAAC;AAAA,MACzE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,GACE,MACA,SACM;AACN,UAAM,MAAM;AACZ,UAAM,WAAW,KAAK,SAAS,IAAI,GAAG,KAAK,CAAC;AAC5C,aAAS,KAAK,OAAoD;AAClE,SAAK,SAAS,IAAI,KAAK,QAAQ;AAAA,EACjC;AAAA,EAEA,SACE,MACA,SACM;AACN,SAAK,GAAG,MAAM,OAAO;AAAA,EACvB;AAAA,EAEA,MAAM,SAAS,iBAA0C,KAA6B;AACpF,eAAW,WAAW,iBAAiB;AACrC,YAAM,SAAS,QAAQ;AACvB,UAAI,CAAC,OAAO,cAAc,OAAQ;AAElC,iBAAW,SAAS,OAAO,cAAc;AACvC,cAAM,WAAW,KAAK,SAAS,IAAI,MAAM,IAAiB;AAC1D,YAAI,CAAC,UAAU,OAAQ;AAEvB,mBAAW,WAAW,UAAU;AAC9B,gBAAM,QAAQ,OAAO,GAAG;AAAA,QAC1B;AAAA,MACF;AAEA,aAAO,eAAe,CAAC;AAAA,IACzB;AAAA,EACF;AACF;AAEO,IAAM,iBAAiB,CAC5B,QACA,UACS;AACT,MAAI,CAAC,OAAO,cAAc;AACxB,WAAO,eAAe,CAAC;AAAA,EACzB;AACA,SAAO,aAAa,KAAK,KAAK;AAChC;;;ACzDO,IAAM,0BAAN,MAA8B;AAAA,EAGnC,YACmB,YACA,SACA,UACjB;AAHiB;AACA;AACA;AALnB,SAAiB,kBAAyC,CAAC;AAAA,EAMvD;AAAA,EAEJ,eAAe,OAAkC;AAC/C,SAAK,gBAAgB,KAAK,KAAK;AAAA,EACjC;AAAA,EAEA,QAAc;AACZ,SAAK,gBAAgB,SAAS;AAAA,EAChC;AAAA,EAEA,MAAM,UAAyB;AAC7B,QAAI,CAAC,KAAK,gBAAgB,OAAQ;AAClC,UAAM,UAAU,CAAC,GAAG,KAAK,eAAe;AACxC,SAAK,gBAAgB,SAAS;AAE9B,eAAW,SAAS,SAAS;AAC3B,cAAQ,MAAM,SAAS,MAAM;AAAA,QAC3B,KAAK,cAAc;AACjB,gBAAM,KAAK,oBAAoB,KAAK;AACpC;AAAA,QACF,KAAK,cAAc;AACjB,gBAAM,KAAK,mBAAmB,KAAK;AACnC;AAAA,QACF,KAAK,cAAc;AACjB,gBAAM,KAAK,0BAA0B,KAAK;AAC1C;AAAA,QACF,KAAK,cAAc;AACjB,gBAAM,KAAK,sBAAsB,KAAK;AACtC;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,oBAAoB,OAA2C;AAC3E,UAAM,WAAW,MAAM;AACvB,UAAM,SAAS,MAAM,OAAO;AAC5B,QAAI,CAAC,OAAQ;AAEb,UAAM,UAAU,KAAK,WAAW,YAAY,MAAM;AAClD,QAAI,CAAC,QAAS;AAEd,UAAM,WAAW,SAAS,YAAY,eAAe,MAAM,SAAS;AACpE,UAAM,YAAY,MAAM,KAAK,QAAQ;AACrC,QAAI,cAAc,UAAa,cAAc,KAAM;AAEnD,QAAI,MAAM,OAAO,SAAS,SAAS,MAAM,OAAO,SAAS,UAAU;AACjE,WAAK,wBAAwB,QAAQ,QAAQ,UAAU,SAAS;AAChE,WAAK,WAAW,UAAU,QAAQ,MAAM;AACxC;AAAA,IACF;AAEA,QAAI,MAAM,OAAO,SAAS,UAAU;AAClC,WAAK,mBAAmB,QAAQ,QAAQ,QAAQ;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,MAAc,mBAAmB,OAA2C;AAC1E,UAAM,WAAW,MAAM;AACvB,UAAM,SAAS,MAAM,OAAO;AAC5B,QAAI,CAAC,OAAQ;AAEb,UAAM,UAAU,KAAK,WAAW,YAAY,MAAM;AAClD,QAAI,CAAC,QAAS;AAEd,UAAM,WAAW,SAAS,YAAY,eAAe,MAAM,SAAS;AACpE,UAAM,YAAY,MAAM,KAAK,QAAQ;AACrC,QAAI,cAAc,UAAa,cAAc,KAAM;AAEnD,QAAI,MAAM,OAAO,SAAS,YAAY,MAAM,OAAO,SAAS,OAAO;AACjE,WAAK,uBAAuB,QAAQ,QAAQ,UAAU,SAAS;AAC/D,WAAK,WAAW,UAAU,QAAQ,MAAM;AACxC;AAAA,IACF;AAEA,QAAI,MAAM,OAAO,SAAS,UAAU;AAClC,WAAK,kBAAkB,QAAQ,QAAQ,QAAQ;AAAA,IACjD;AAAA,EACF;AAAA,EAEA,MAAc,sBAAsB,QAA4C;AAAA,EAEhF;AAAA,EAEA,MAAc,0BAA0B,OAA2C;AACjF,UAAM,WAAW,MAAM;AACvB,UAAM,UAAU,SAAS,YAAY,eAAe,MAAM,SAAS;AACnE,UAAM,SAAS,MAAM,KAAK,OAAO;AACjC,QAAI,WAAW,UAAa,WAAW,KAAM;AAE7C,UAAM,WAAW,KAAK,uBAAuB,MAAM,OAAO,QAAQ,SAAS,MAAM;AACjF,QAAI,aAAa,KAAM;AAEvB,QAAI,MAAM,OAAO,SAAS,YAAY,MAAM,OAAO,SAAS,OAAO;AACjE,YAAM,KAAK,eAAe,UAAU,QAAQ,QAAQ;AACpD;AAAA,IACF;AAEA,QAAI,MAAM,OAAO,SAAS,YAAY,MAAM,OAAO,SAAS,UAAU;AACpE,YAAM,KAAK,eAAe,UAAU,QAAQ,QAAQ;AAEpD,UAAI,SAAS,YAAY,SAAS,SAAS,YAAY,UAAU;AAC/D,aAAK,WAAW,YAAY,MAAM,OAAO,MAAM;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,wBAAwB,OAAY,UAA2B,WAA0B;AAC/F,UAAM,UAAU,MAAM,SAAS,UAAU;AACzC,QAAI,YAAY,UAAW;AAC3B,UAAM,SAAS,UAAU,IAAI;AAAA,EAC/B;AAAA,EAEQ,mBAAmB,OAAY,UAAiC;AACtE,QAAI,SAAS,YAAY,SAAS,SAAS,YAAY,UAAU;AAC/D,WAAK,WAAW,YAAY,KAAK;AACjC;AAAA,IACF;AACA,UAAM,SAAS,UAAU,IAAI;AAC7B,SAAK,WAAW,UAAU,KAAK;AAAA,EACjC;AAAA,EAEQ,uBAAuB,OAAY,UAA0B,WAA0B;AAC7F,UAAM,UAAU,MAAM,SAAS,UAAU;AACzC,QAAI,YAAY,UAAW;AAC3B,UAAM,SAAS,UAAU,IAAI;AAAA,EAC/B;AAAA,EAEQ,kBAAkB,OAAY,UAAgC;AACpE,QAAI,SAAS,YAAY,SAAS,SAAS,YAAY,UAAU;AAC/D,WAAK,WAAW,YAAY,KAAK;AACjC;AAAA,IACF;AACA,UAAM,SAAS,UAAU,IAAI;AAC7B,SAAK,WAAW,UAAU,KAAK;AAAA,EACjC;AAAA,EAEA,MAAc,eAAe,UAAiC,QAAyB,UAA0C;AAC/H,UAAM,UAAU;AAAA,MACd,CAAC,SAAS,qBAAqB,GAAG;AAAA,MAClC,CAAC,SAAS,uBAAuB,GAAG;AAAA,IACtC;AACA,UAAM,UAAU,IAAI,mBAAmB,SAAS,UAAU,EAAE,OAAO,OAAO;AAC1E,UAAM,WAAW,QAAQ,QAAQ,KAAK,OAAO;AAC7C,UAAM,KAAK,SAAS,WAAW,SAAS,KAAK,SAAS,MAAM;AAAA,EAC9D;AAAA,EAEA,MAAc,eAAe,UAAiC,QAAyB,UAA0C;AAC/H,UAAM,UAAU,SAAS,WAAW,QAAQ,SAAS,qBAAqB;AAC1E,UAAM,YAAY,SAAS,WAAW,QAAQ,SAAS,uBAAuB;AAC9E,QAAI,CAAC,WAAW,CAAC,UAAW;AAE5B,UAAM,UAAU,IAAI,mBAAmB,SAAS,UAAU,EAAE;AAAA,MAC1D,IAAI,GAAG,SAAS,MAAM,GAAG,GAAG,WAAW,QAAQ,CAAC;AAAA,IAClD;AACA,UAAM,WAAW,QAAQ,QAAQ,KAAK,OAAO;AAC7C,UAAM,KAAK,SAAS,WAAW,SAAS,KAAK,SAAS,MAAM;AAAA,EAC9D;AAAA,EAEQ,uBAAuB,QAAa,OAAyC;AACnF,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,MAAM,eAAe,KAAK;AAChC,UAAM,QAAQ,OAAO,GAAG;AACxB,QAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAClD,WAAO;AAAA,EACT;AACF;;;AChKO,IAAM,6BAA6B,CACxC,UACA,WACe;AACf,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,UAAsB;AAAA,IAC1B,MAAM,WAAW,KAAK,QAAQ;AAC5B,aAAO,EAAE,KAAK,OAAO,CAAC;AACtB,aAAO,SAAS,WAAW,KAAK,MAAM;AAAA,IACxC;AAAA,EACF;AAEA,MAAI,SAAS,kBAAkB;AAC7B,YAAQ,mBAAmB,SAAS,iBAAiB,KAAK,QAAQ;AAAA,EACpE;AAEA,MAAI,SAAS,mBAAmB;AAC9B,YAAQ,oBAAoB,SAAS,kBAAkB,KAAK,QAAQ;AAAA,EACtE;AAEA,MAAI,SAAS,qBAAqB;AAChC,YAAQ,sBAAsB,SAAS,oBAAoB,KAAK,QAAQ;AAAA,EAC1E;AAEA,SAAO;AACT;;;AC3CO,IAAM,mBAAmB,OAAO,UAAsB,WAA+C;AAC1G,MAAI,CAAC,SAAS,kBAAkB;AAC9B,UAAM,OAAO;AACb;AAAA,EACF;AAEA,QAAM,SAAS,iBAAiB;AAChC,MAAI;AACF,UAAM,OAAO;AACb,UAAM,SAAS,oBAAoB;AAAA,EACrC,SAAS,OAAO;AACd,UAAM,SAAS,sBAAsB;AACrC,UAAM;AAAA,EACR;AACF;;;ACsBO,IAAM,aAAN,MAAkF;AAAA,EAUvF,YAAY,MAA4B;AA+CxC,kCAAyB,CACvB,MACA,aACA,WACA,cACA,UACA,WACS;AACT,WAAK,gBAAgB;AAAA,QACnB,yBAAyB,MAAM,aAAa,WAAW,cAAc,UAAU,MAAM;AAAA,MACvF;AAAA,IACF;AAzDE,SAAK,MAAM,KAAK;AAChB,SAAK,WAAW,2BAA2B,KAAK,UAAU,KAAK,WAAW;AAC1E,SAAK,eAAe,CAAC,GAAI,KAAK,gBAAgB,CAAC,CAAE;AAEjD,SAAK,cAAc,IAAI,YAAY;AACnC,SAAK,aAAa,IAAI,WAAW,KAAK,IAAI,SAAS,KAAK,UAAU,KAAK,aAAa,MAAM,IAAI;AAC9F,SAAK,kBAAkB,IAAI,wBAAwB,KAAK,YAAY,KAAK,IAAI,SAAS,KAAK,QAAQ;AACnG,SAAK,eAAe,IAAI,eAAiC,KAAK,mBAAmB;AAAA,EACnF;AAAA,EAEA,IAAI,UAAmB;AACrB,WAAO,KAAK,IAAI;AAAA,EAClB;AAAA,EAEA,IAAI,kBAA2D;AAC7D,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEA,IAAI,UAA2B;AAC7B,WAAO,KAAK,WAAW,WAAW;AAAA,EACpC;AAAA,EAEA,UAAU,OAAiB,IAA0B;AACnD,WAAO,KAAK,WAAW,UAAU,OAAO,EAAE;AAAA,EAC5C;AAAA,EAEA,UAAU,OAAiB,IAAS,QAAmB;AACrD,SAAK,WAAW,UAAU,OAAO,IAAI,MAAM;AAAA,EAC7C;AAAA,EAEA,SAAS,OAAiB,QAAa,IAAgB;AACrD,SAAK,WAAW,SAAS,OAAO,QAAQ,EAAE;AAAA,EAC5C;AAAA,EAEA,aAAa,OAAiB,IAAS,QAAmB;AACxD,SAAK,WAAW,aAAa,OAAO,IAAI,MAAM;AAAA,EAChD;AAAA,EAEA,UAAU,QAAmB;AAC3B,SAAK,WAAW,UAAU,MAAM;AAAA,EAClC;AAAA,EAEA,YAAY,QAAmB;AAC7B,SAAK,WAAW,YAAY,MAAM;AAAA,EACpC;AAAA,EAeA,oBAAoB,OAAkC;AACpD,WAAO,KAAK,WAAW,oBAAoB,KAAK;AAAA,EAClD;AAAA,EAEA,oBAAoB,aAAmC;AACrD,SAAK,aAAa,KAAK,WAAW;AAAA,EACpC;AAAA,EAEA,2BACE,MACA,SACM;AACN,SAAK,aAAa,GAAG,MAAM,OAAO;AAAA,EACpC;AAAA,EAEA,MAAM,KAA8B,aAAgC,IAAiD;AACnH,UAAM,QAAQ,sBAAsB,WAAW;AAC/C,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AACA,UAAM,aAAa,eAAe,KAAK;AACvC,UAAM,SAAS,MAAM,QAAQ,UAAU;AACvC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,4CAA4C;AAAA,IAC9D;AACA,UAAM,mBAAmB,OAAO,OAAO,MAAM,OAAO,EAAE,OAAkC,CAAC,KAAKC,SAAQ;AACpG,UAAIA,KAAI,IAAI,IAAIA;AAChB,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AACL,UAAM,KAAK,iBAAyB,WAAW,EAC5C,OAAO,gBAAgB,EACvB,MAAM,GAAG,QAAQ,EAAE,CAAC,EACpB,MAAM,CAAC;AACV,UAAM,OAAO,MAAM,gBAAgB,MAAM,EAAE;AAC3C,WAAO,KAAK,CAAC,KAAK;AAAA,EACpB;AAAA,EAEA,MAAM,QAAiC,IAA6E;AAClH,UAAM,UAAU,GAAG,MAAM,CAAC;AAC1B,UAAM,OAAO,MAAM,gBAAgB,MAAM,OAAO;AAChD,WAAO,KAAK,CAAC,KAAK;AAAA,EACpB;AAAA,EAEA,MAAM,SAAkC,IAAwE;AAC9G,WAAO,gBAAgB,MAAM,EAAE;AAAA,EACjC;AAAA,EAEA,MAAM,QAAQ,QAA+B;AAC3C,QAAI,KAAK,WAAW,YAAY,MAAM,GAAG;AACvC;AAAA,IACF;AACA,UAAM,QAAQ,sBAAuB,OAAe,WAAgC;AACpF,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AACA,UAAM,aAAa,eAAe,KAAK;AACvC,UAAM,UAAW,OAA+B,UAAU;AAC1D,QAAI,YAAY,UAAa,YAAY,MAAM;AAC7C,WAAK,aAAa,OAAO,SAAS,MAAM;AAAA,IAC1C,OAAO;AACL,WAAK,SAAS,OAAO,MAAM;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,QAA+B;AAC1C,SAAK,YAAY,MAAM;AAAA,EACzB;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,KAAK,WAAW,MAAM;AAAA,EAC9B;AAAA,EAEA,MAAM,SAAwB;AAC5B,UAAM,iBAAiB,KAAK,UAAU,YAAY;AAChD,iBAAW,eAAe,KAAK,cAAc;AAC3C,cAAM,YAAY,cAAc,IAAI;AAAA,MACtC;AAEA,YAAM,KAAK,WAAW,MAAM;AAC5B,YAAM,KAAK,gBAAgB,QAAQ;AACnC,YAAM,KAAK,WAAW,MAAM;AAE5B,iBAAW,eAAe,KAAK,cAAc;AAC3C,cAAM,YAAY,aAAa,IAAI;AAAA,MACrC;AAAA,IACF,CAAC;AAED,UAAM,KAAK,aAAa,SAAS,KAAK,WAAW,WAAW,GAAG,IAAI;AAAA,EACrE;AAAA,EAEA,MAAM,WAA0B;AAC9B,UAAM,KAAK,SAAS,sBAAsB;AAC1C,SAAK,WAAW,MAAM;AACtB,SAAK,gBAAgB,MAAM;AAAA,EAC7B;AAAA,EAEA,sBAAwC;AACtC,WAAO;AAAA,MACL,SAAS,KAAK,IAAI;AAAA,MAClB,UAAU,KAAK;AAAA,MACf,cAAc,KAAK,IAAI;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,sBAA2C;AACzC,WAAO;AAAA,MACL,aAAa,KAAK;AAAA,MAClB,YAAY,KAAK;AAAA,MACjB,cAAc,KAAK;AAAA,MACnB,iBAAiB,KAAK;AAAA,MACtB,eAAe;AAAA,IACjB;AAAA,EACF;AACF;AAEA,IAAM,2BAA2B,CAC/B,MACA,aACA,WACA,cACA,UACA,YACyB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;AC1OO,IAAM,sBAAN,MAA0B;AAAA,EAA1B;AACL,SAAQ,eAAmC,CAAC;AAAA;AAAA,EAE5C,IAAI,aAA+B;AACjC,SAAK,aAAa,KAAK,WAAW;AAAA,EACpC;AAAA,EAEA,MAAM,IAAI,KAAmB,UAA8C;AACzE,QAAI,IAAI;AACR,UAAM,WAAW,YAAoC;AACnD,YAAM,cAAc,KAAK,aAAa,GAAG;AACzC,UAAI,CAAC,aAAa;AAChB,eAAO,SAAS,WAAW,IAAI,KAAK,IAAI,MAAM;AAAA,MAChD;AACA,aAAO,YAAY,KAAK,QAAQ;AAAA,IAClC;AACA,WAAO,SAAS;AAAA,EAClB;AACF;;;ACHO,IAAM,MAAN,MAAkD;AAAA,EAMvD,YAAY,MAAqB;AAC/B,SAAK,UAAU,KAAK;AACpB,SAAK,eAAe,KAAK,gBAAgB,IAAI,oBAAoB;AACjE,SAAK,iBAAiB,KAAK,kBAAkB,IAAI,sBAAsB;AACvE,SAAK,kBAAkB,KAAK;AAAA,EAC9B;AAAA,EAEA,cAAc,SAAuD;AACnE,UAAM,WAAW,KAAK,gBAAgB,eAAe,SAAS,EAAE;AAChE,WAAO,IAAI,WAAc,EAAE,KAAK,MAAM,SAAS,CAAC;AAAA,EAClD;AAAA,EAEA,MAAM,YAAeC,KAAwD;AAC3E,UAAM,WAAW,KAAK,gBAAgB,4BAA4B;AAClE,UAAM,UAAU,IAAI,WAAc,EAAE,KAAK,MAAM,SAAS,CAAC;AACzD,QAAI;AACF,YAAM,SAAS,MAAMA,IAAG,OAAO;AAC/B,YAAM,QAAQ,OAAO;AACrB,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,YAAM,QAAQ,SAAS;AACvB,YAAM;AAAA,IACR,UAAE;AAAA,IAEF;AAAA,EACF;AACF;;;AC/BA,IAAM,eAAe;AAEd,IAAM,6BAA6B,CAAC,UAAsD;AAC/F,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAW;AACnE;AAEO,IAAM,yBAAyB,CAAC,YAA4D;AACjG,QAAM,WAAW,QAAQ,aAAa,QAAQ,WAAW,CAAC;AAC1D,QAAM,WAAW,SAAS,YAAY;AACtC,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AACA,QAAM,MAA4B,EAAE,SAAS,CAAC,GAAG,WAAW,CAAC,EAAE;AAC/D,WAAS,YAAY,IAAI;AACzB,SAAO;AACT;AAEO,IAAM,kBAAkB,CAAC,YAAwE;AACtG,SAAO,QAAQ,WAAW,YAAY;AACxC;AAEO,IAAM,sBAAsB,CACjC,SACA,gBACS;AACT,UAAQ,iBAAiB,WAAW;AACtC;;;ACrCA,IAAM,cAAc,CAAC,UAA0B;AAC7C,SAAO,MACJ,QAAQ,sBAAsB,OAAO,EACrC,QAAQ,iBAAiB,GAAG,EAC5B,QAAQ,QAAQ,GAAG,EACnB,QAAQ,UAAU,EAAE,EACpB,YAAY;AACjB;AAEA,IAAM,iCAAiC,CAAC,SAA2B;AACjE,QAAM,WAAW;AACjB,QAAM,UAAU,KAAK,QAAQ;AAC7B,QAAM,eAAe,QAAQ,QAAQ,YAAY,EAAE;AACnD,QAAM,aAAa,YAAY,gBAAgB,OAAO;AACtD,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AACA,SAAO,WAAW,SAAS,GAAG,IAAI,aAAa,GAAG,UAAU;AAC9D;AAEO,SAAS,OAAO,UAAyB,CAAC,GAAG;AAClD,QAAM,YAAoC,WAAS;AACjD,UAAM,YAAY,QAAQ,aAAa,+BAA+B,KAAK;AAC3E,uBAAmB,OAA4B,WAAW,QAAQ,KAAK;AAEvE,WAAO;AAAA,EACT;AAEA,QAAM,uBAA+C,CAAC,OAAO,YAAa;AACxE,UAAM,OAAO;AACb,cAAU,IAAI;AAEd,QAAI,WAAW,2BAA2B,OAAO,GAAG;AAClD,YAAM,MAAM,gBAAgB,OAAO;AACnC,UAAI,KAAK;AACP,cAAM,OAAO,qBAAqB,IAAI;AACtC,mBAAW,SAAS,IAAI,SAAS;AAC/B,cAAI,CAAC,KAAK,QAAQ,MAAM,YAAY,GAAG;AACrC,8BAAkB,MAAM,MAAM,cAAc,EAAE,GAAG,MAAM,OAAO,CAAC;AAAA,UACjE;AAAA,QACF;AACA,mBAAW,SAAS,IAAI,WAAW;AACjC,cAAI,CAAC,KAAK,UAAU,MAAM,YAAY,GAAG;AACvC,gCAAoB,MAAM,MAAM,cAAc,MAAM,QAAQ;AAAA,UAC9D;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;AC5CA,IAAM,uBAAuB,CAAC,UAAsC;AAClE,QAAM,YAAY;AAClB,QAAM,eAAe;AACrB,QAAM,SAAwB;AAAA,IAC5B,MAAM,UAAU,QAAQ,aAAa;AAAA,IACrC,MAAM,UAAU,QAAQ,aAAa;AAAA,IACrC,SAAS,UAAU,WAAW,aAAa;AAAA,IAC3C,SAAS,UAAU,WAAW,aAAa;AAAA,IAC3C,QAAQ,aAAa;AAAA,IACrB,SAAS,aAAa;AAAA,IACtB,eAAe,aAAa;AAAA,IAC5B,WAAW,aAAa;AAAA,IACxB,OAAO,aAAa;AAAA,IACpB,YAAY,aAAa;AAAA,IACzB,SAAS,aAAa;AAAA,EACxB;AAEA,MAAI,CAAC,OAAO,MAAM;AAChB,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAEA,SAAO;AACT;AAEA,IAAM,wBAAwB,CAAC,SAAkC;AAC/D,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO,KAAK,eAAe,KAAK,SAAS;AAAA,EAC3C;AACA,SAAO;AACT;AAEA,IAAM,qBAAqB,CAAC,WAAmD;AAC7E,MAAI,OAAO,WAAW,YAAY;AAChC,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,OAAQ,OAAe,gBAAgB,YAAY;AAC/D,WAAQ,OAAe;AAAA,EACzB;AAEA,SAAO;AACT;AAEA,IAAM,iBAAiB,CAAC,MAAyB,cAAsB,WAAgC;AACrG,QAAM,OAAO,qBAAqB,IAAI;AACtC,MAAI,KAAK,QAAQ,YAAY,GAAG;AAC9B;AAAA,EACF;AACA,oBAAkB,MAAM,cAAc,MAAM;AAC9C;AAEA,IAAM,4BAA4B,CAChC,SACA,WACS;AACT,MAAI,CAAC,QAAQ,MAAM;AACjB,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AACA,QAAM,eAAe,sBAAsB,QAAQ,IAAI;AACvD,QAAM,MAAM,uBAAuB,OAAO;AAC1C,MAAI,CAAC,IAAI,QAAQ,KAAK,WAAS,MAAM,iBAAiB,YAAY,GAAG;AACnE,QAAI,QAAQ,KAAK,EAAE,cAAc,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC;AAAA,EAC1D;AAEA,sBAAoB,SAAS,WAAY;AACvC,UAAM,OAAO,mBAAmB,IAAI;AACpC,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AACA,mBAAe,MAAM,cAAc,MAAM;AAAA,EAC3C,CAAC;AACH;AAEO,SAAS,OAAO,YAAyB;AAC9C,QAAM,aAAa,qBAAqB,UAAU;AAClD,QAAM,YAAuC,CAAC,eAAe,yBAAyB;AACpF,QAAI,2BAA2B,oBAAoB,GAAG;AACpD,gCAA0B,sBAAsB,UAAU;AAC1D;AAAA,IACF;AAEA,UAAM,eAAe,sBAAsB,oBAAoB;AAC/D,UAAM,OAAO,mBAAmB,aAAa;AAC7C,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,gEAAgE;AAAA,IAClF;AACA,mBAAe,MAAM,cAAc,EAAE,GAAG,WAAW,CAAC;AAAA,EACtD;AAEA,SAAO;AACT;AAEO,SAAS,WAAW,YAAyB;AAClD,QAAM,aAAa,qBAAqB,UAAU;AAClD,aAAW,UAAU;AACrB,SAAO,OAAO,UAAU;AAC1B;;;AC3EA,IAAMC,yBAAwB,CAAC,SAAkC;AAC/D,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO,KAAK,eAAe,KAAK,SAAS;AAAA,EAC3C;AACA,SAAO;AACT;AAEA,IAAMC,sBAAqB,CAAC,mBAA2D;AACrF,MAAI,OAAO,mBAAmB,YAAY;AACxC,WAAO;AAAA,EACT;AACA,MAAI,kBAAkB,OAAQ,eAAuB,gBAAgB,YAAY;AAC/E,WAAQ,eAAuB;AAAA,EACjC;AACA,SAAO;AACT;AAEA,IAAM,mBAAmB,CAAC,MAAyB,cAAsB,aAAqC;AAC5G,sBAAoB,MAAM,cAAc,QAAQ;AAClD;AAEA,IAAM,uBAAuB,CAC3B,oBACG;AACH,QAAM,YAAuC,CAAC,eAAe,yBAAyB;AACpF,QAAI,2BAA2B,oBAAoB,GAAG;AACpD,YAAM,MAAM;AACZ,UAAI,CAAC,IAAI,MAAM;AACb,cAAM,IAAI,MAAM,6CAA6C;AAAA,MAC/D;AACA,YAAMC,gBAAeF,uBAAsB,IAAI,IAAI;AACnD,YAAM,MAAM,uBAAuB,GAAG;AACtC,YAAM,mBAAmB,gBAAgBE,aAAY;AAErD,UAAI,CAAC,IAAI,UAAU,KAAK,WAAS,MAAM,iBAAiBA,aAAY,GAAG;AACrE,YAAI,UAAU,KAAK,EAAE,cAAAA,eAAc,UAAU,iBAAiB,CAAC;AAAA,MACjE;AAEA,0BAAoB,KAAK,WAAY;AACnC,cAAMC,QAAOF,oBAAmB,IAAI;AACpC,YAAI,CAACE,OAAM;AACT;AAAA,QACF;AACA,yBAAiBA,OAAMD,eAAc,gBAAgB;AAAA,MACvD,CAAC;AACD;AAAA,IACF;AAEA,UAAM,eAAeF,uBAAsB,oBAAoB;AAC/D,UAAM,OAAOC,oBAAmB,aAAa;AAC7C,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,kEAAkE;AAAA,IACpF;AACA,qBAAiB,MAAM,cAAc,gBAAgB,YAAY,CAAC;AAAA,EACpE;AAEA,SAAO;AACT;AAEO,SAAS,QAAQ,SAAyB;AAC/C,SAAO,qBAAqB,mBAAiB;AAAA,IAC3C,MAAM,cAAc;AAAA,IACpB,aAAa;AAAA,IACb,QAAQ,QAAQ;AAAA,IAChB,YAAY,QAAQ;AAAA,IACpB,UAAU,QAAQ;AAAA,IAClB,SAAS,QAAQ;AAAA,EACnB,EAAE;AACJ;AAEO,SAAS,OAAO,SAAwB;AAC7C,SAAO,qBAAqB,mBAAiB;AAAA,IAC3C,MAAM,cAAc;AAAA,IACpB,aAAa;AAAA,IACb,QAAQ,QAAQ;AAAA,IAChB,YAAY,QAAQ;AAAA,IACpB,UAAU,QAAQ;AAAA,IAClB,SAAS,QAAQ;AAAA,EACnB,EAAE;AACJ;AAEO,SAAS,UAAU,SAA2B;AACnD,SAAO,qBAAqB,mBAAiB;AAAA,IAC3C,MAAM,cAAc;AAAA,IACpB,aAAa;AAAA,IACb,QAAQ,QAAQ;AAAA,IAChB,YAAY,QAAQ;AAAA,IACpB,UAAU,QAAQ;AAAA,IAClB,SAAS,QAAQ;AAAA,EACnB,EAAE;AACJ;AAEO,SAAS,cAAc,SAA+B;AAC3D,SAAO,qBAAqB,mBAAiB;AAAA,IAC3C,MAAM,cAAc;AAAA,IACpB,aAAa;AAAA,IACb,QAAQ,QAAQ;AAAA,IAChB,YAAY,QAAQ;AAAA,IACpB,uBAAuB,QAAQ;AAAA,IAC/B,yBAAyB,QAAQ;AAAA,IACjC,UAAU,QAAQ;AAAA,IAClB,WAAW,QAAQ;AAAA,IACnB,iBAAiB,QAAQ;AAAA,IACzB,qBAAqB,QAAQ;AAAA,IAC7B,SAAS,QAAQ;AAAA,EACnB,EAAE;AACJ;;;AClIO,SAAS,kBACd,MACa;AACb,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EACnC;AAEA,QAAM,UAAU,OAAO,KAAK,KAAK,CAAC,CAAC;AACnC,QAAM,SAAS,KAAK,IAAI,SAAO,QAAQ,IAAI,OAAM,IAAY,CAAC,CAAC,CAAC;AAChE,SAAO,EAAE,SAAS,OAAO;AAC3B;AAkBO,SAAS,8BACd,QACY;AACZ,SAAO;AAAA,IACL,MAAM,WAAW,KAAK,QAAQ;AAC5B,YAAM,OAAO,MAAM,OAAO,MAAM,KAAK,MAAM;AAC3C,YAAM,SAAS,kBAAkB,IAAI;AACrC,aAAO,CAAC,MAAM;AAAA,IAChB;AAAA,IACA,kBAAkB,OAAO,kBAAkB,KAAK,MAAM;AAAA,IACtD,mBAAmB,OAAO,mBAAmB,KAAK,MAAM;AAAA,IACxD,qBAAqB,OAAO,qBAAqB,KAAK,MAAM;AAAA,EAC9D;AACF;;;ACjDO,SAAS,uBACd,QACY;AACZ,SAAO,8BAA8B;AAAA,IACnC,MAAM,MAAM,KAAK,QAAQ;AACvB,YAAM,EAAE,KAAK,IAAI,MAAM,OAAO,MAAM,KAAK,MAAe;AACxD,aAAO;AAAA,IACT;AAAA,IACA,MAAM,mBAAmB;AACvB,YAAM,OAAO,MAAM,OAAO;AAAA,IAC5B;AAAA,IACA,MAAM,oBAAoB;AACxB,YAAM,OAAO,MAAM,QAAQ;AAAA,IAC7B;AAAA,IACA,MAAM,sBAAsB;AAC1B,YAAM,OAAO,MAAM,UAAU;AAAA,IAC/B;AAAA,EACF,CAAC;AACH;;;ACfO,SAAS,oBACd,QACY;AACZ,SAAO;AAAA,IACL,MAAM,WAAW,KAAK,QAAQ;AAC5B,YAAM,CAAC,IAAI,IAAI,MAAM,OAAO,MAAM,KAAK,MAAe;AAEtD,UAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AAExB,eAAO,CAAC,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;AAAA,MACrC;AAEA,YAAM,SAAS;AAAA,QACb;AAAA,MACF;AACA,aAAO,CAAC,MAAM;AAAA,IAChB;AAAA,IACA,MAAM,mBAAmB;AACvB,UAAI,CAAC,OAAO,iBAAkB;AAC9B,YAAM,OAAO,iBAAiB;AAAA,IAChC;AAAA,IACA,MAAM,oBAAoB;AACxB,UAAI,CAAC,OAAO,OAAQ;AACpB,YAAM,OAAO,OAAO;AAAA,IACtB;AAAA,IACA,MAAM,sBAAsB;AAC1B,UAAI,CAAC,OAAO,SAAU;AACtB,YAAM,OAAO,SAAS;AAAA,IACxB;AAAA,EACF;AACF;;;AC7BO,SAAS,qBACd,QACY;AACZ,SAAO;AAAA,IACL,MAAM,WAAW,KAAK,QAAQ;AAC5B,YAAM,OAAO,MAAM,OAAO,IAAI,KAAK,MAAM;AACzC,YAAM,SAAS,kBAAkB,IAAI;AACrC,aAAO,CAAC,MAAM;AAAA,IAChB;AAAA,IACA,kBAAkB,OAAO,kBAAkB,KAAK,MAAM;AAAA,IACtD,mBAAmB,OAAO,mBAAmB,KAAK,MAAM;AAAA,IACxD,qBAAqB,OAAO,qBAAqB,KAAK,MAAM;AAAA,EAC9D;AACF;;;ACdO,SAAS,oBACd,QACY;AACZ,SAAO;AAAA,IACL,MAAM,WAAW,KAAK,QAAQ;AAC5B,YAAM,EAAE,UAAU,IAAI,MAAM,OAAO,MAAM,KAAK,MAAM;AACpD,YAAM,SAAS,kBAAkB,aAAa,CAAC,CAAC;AAChD,aAAO,CAAC,MAAM;AAAA,IAChB;AAAA,IACA,MAAM,mBAAmB;AACvB,UAAI,CAAC,OAAO,iBAAkB;AAC9B,YAAM,OAAO,iBAAiB;AAAA,IAChC;AAAA,IACA,MAAM,oBAAoB;AACxB,UAAI,CAAC,OAAO,OAAQ;AACpB,YAAM,OAAO,OAAO;AAAA,IACtB;AAAA,IACA,MAAM,sBAAsB;AAC1B,UAAI,CAAC,OAAO,SAAU;AACtB,YAAM,OAAO,SAAS;AAAA,IACxB;AAAA,EACF;AACF;AA8CA,IAAM,mBAAmB,CAAC,OAAgB,UAAiC;AACzE,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO,MAAM;AACxD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,OAAO,UAAU,KAAK,IAAI,MAAM,MAAM,MAAM;AAAA,EACrD;AACA,MAAI,OAAO,UAAU,SAAU,QAAO,MAAM;AAC5C,MAAI,OAAO,UAAU,UAAW,QAAO,MAAM;AAC7C,MAAI,iBAAiB,KAAM,QAAO,MAAM;AACxC,MAAI,OAAO,WAAW,eAAe,OAAO,SAAS,KAAK,GAAG;AAC3D,WAAO,MAAM;AAAA,EACf;AACA,SAAO,MAAM;AACf;AAEO,SAAS,yBACd,YACA,EAAE,SAAS,MAAM,GACjB,SACiB;AACjB,QAAM,YAAY,SAAS,aAAa;AAExC,SAAO;AAAA,IACL,MAAM,MAAM,KAAa,SAAoB,CAAC,GAAG;AAC/C,YAAM,OAAO,MAAM,IAAI;AAAA,QACrB,CAAC,SAAS,WAAW;AACnB,gBAAM,YAAuC,CAAC;AAE9C,gBAAM,UAAU,IAAI,QAAQ,KAAK,SAAO;AACtC,gBAAI,IAAK,QAAO,OAAO,GAAG;AAC1B,oBAAQ,SAAS;AAAA,UACnB,CAAC;AAED,iBAAO,QAAQ,CAAC,OAAO,QAAQ;AAC7B,kBAAM,UAAU,UAAU,OAAO,KAAK;AACtC,oBAAQ;AAAA,cACN,IAAI,MAAM,CAAC;AAAA,cACX;AAAA,cACA;AAAA,YACF;AAAA,UACF,CAAC;AAED,kBAAQ,GAAG,OAAO,UAAQ;AACxB,kBAAM,MAA+B,CAAC;AACtC,uBAAWG,QAAO,MAAM;AACtB,kBAAIA,KAAI,SAAS,OAAO,IAAIA,KAAI;AAAA,YAClC;AACA,sBAAU,KAAK,GAAG;AAAA,UACpB,CAAC;AAED,qBAAW,QAAQ,OAAO;AAAA,QAC5B;AAAA,MACF;AAEA,aAAO,EAAE,WAAW,KAAK;AAAA,IAC3B;AAAA,IAEA,kBAAkB,WAAW,mBACzB,MACE,IAAI,QAAc,CAAC,SAAS,WAAW;AACrC,iBAAW;AAAA,QAAkB,SAC3B,MAAM,OAAO,GAAG,IAAI,QAAQ;AAAA,MAC9B;AAAA,IACF,CAAC,IACH;AAAA,IAEJ,QAAQ,WAAW,oBACf,MACE,IAAI,QAAc,CAAC,SAAS,WAAW;AACrC,iBAAW;AAAA,QAAmB,SAC5B,MAAM,OAAO,GAAG,IAAI,QAAQ;AAAA,MAC9B;AAAA,IACF,CAAC,IACH;AAAA,IAEJ,UAAU,WAAW,sBACjB,MACE,IAAI,QAAc,CAAC,SAAS,WAAW;AACrC,iBAAW;AAAA,QAAqB,SAC9B,MAAM,OAAO,GAAG,IAAI,QAAQ;AAAA,MAC9B;AAAA,IACF,CAAC,IACH;AAAA,EACN;AACF;AAEO,SAAS,sBACd,YACAC,SACA,SACY;AACZ,QAAM,SAAS,yBAAyB,YAAYA,SAAQ,OAAO;AACnE,SAAO,oBAAoB,MAAM;AACnC;","names":["length","col","left","right","lower","upper","col","col","col","upper","left","right","lower","col","fn","col","col","fn","col","col","col","col","col","col","col","fn","col","col","state","hydration","relationSelectionResult","col","col","toKey","toKey","hideInternal","toKey","hideInternal","toKey","hideInternal","toKey","toKey","hasOne","hasMany","belongsTo","col","col","col","col","col","executeSchemaPlan","col","col","toOperand","length","count","isColumnDef","toOperand","fn","isColumnDef","toOperand","fn","assertNever","col","sel","left","right","fn","lower","upper","EntityStatus","col","fn","normalizePropertyName","resolveConstructor","propertyName","ctor","col","module"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/ddl/schema-plan-executor.ts","../src/index.ts","../src/schema/table.ts","../src/schema/column.ts","../src/schema/relation.ts","../src/core/ast/expression-nodes.ts","../src/core/ast/expression-builders.ts","../src/core/ast/window-functions.ts","../src/core/sql/sql.ts","../src/core/ast/aggregate-functions.ts","../src/core/ast/expression-visitor.ts","../src/core/ast/adapters.ts","../src/core/ast/builders.ts","../src/core/functions/standard-strategy.ts","../src/core/dialect/abstract.ts","../src/core/dialect/base/function-table-formatter.ts","../src/core/dialect/base/pagination-strategy.ts","../src/core/dialect/base/cte-compiler.ts","../src/core/dialect/base/returning-strategy.ts","../src/core/dialect/base/join-compiler.ts","../src/core/dialect/base/groupby-compiler.ts","../src/core/dialect/base/orderby-compiler.ts","../src/core/dialect/base/sql-dialect.ts","../src/core/dialect/postgres/functions.ts","../src/core/dialect/postgres/index.ts","../src/core/dialect/mysql/functions.ts","../src/core/dialect/mysql/index.ts","../src/core/dialect/sqlite/functions.ts","../src/core/dialect/sqlite/index.ts","../src/core/dialect/mssql/functions.ts","../src/core/dialect/mssql/index.ts","../src/core/dialect/dialect-factory.ts","../src/query-builder/select-query-state.ts","../src/core/ast/join-node.ts","../src/query-builder/hydration-manager.ts","../src/query-builder/relation-alias.ts","../src/query-builder/relation-utils.ts","../src/query-builder/hydration-planner.ts","../src/query-builder/raw-column-parser.ts","../src/query-builder/query-ast-service.ts","../src/query-builder/relation-projection-helper.ts","../src/query-builder/relation-conditions.ts","../src/core/ast/join-metadata.ts","../src/query-builder/relation-service.ts","../src/query-builder/select-query-builder-deps.ts","../src/query-builder/column-selector.ts","../src/query-builder/relation-manager.ts","../src/orm/hydration.ts","../src/orm/entity-meta.ts","../src/orm/relations/has-many.ts","../src/orm/relations/has-one.ts","../src/orm/relations/belongs-to.ts","../src/orm/relations/many-to-many.ts","../src/orm/lazy-batch.ts","../src/orm/entity.ts","../src/orm/execute.ts","../src/query-builder/select.ts","../src/orm/entity-metadata.ts","../src/decorators/bootstrap.ts","../src/query-builder/select-helpers.ts","../src/query-builder/insert-query-state.ts","../src/query-builder/insert.ts","../src/query-builder/update-query-state.ts","../src/query-builder/update.ts","../src/query-builder/delete-query-state.ts","../src/query-builder/delete.ts","../src/core/ddl/sql-writing.ts","../src/core/ddl/schema-generator.ts","../src/core/ddl/naming-strategy.ts","../src/core/ddl/schema-diff.ts","../src/core/ddl/introspect/utils.ts","../src/core/ddl/introspect/catalogs/postgres.ts","../src/core/ddl/introspect/run-select.ts","../src/core/ddl/introspect/postgres.ts","../src/core/ddl/introspect/mysql.ts","../src/core/ddl/introspect/sqlite.ts","../src/core/ddl/introspect/mssql.ts","../src/core/ddl/introspect/registry.ts","../src/core/ddl/schema-introspect.ts","../src/core/functions/text.ts","../src/core/functions/numeric.ts","../src/core/functions/datetime.ts","../src/orm/als.ts","../src/core/sql/sql-operator-config.ts","../src/codegen/naming-strategy.ts","../src/codegen/typescript.ts","../src/orm/identity-map.ts","../src/orm/runtime-types.ts","../src/orm/unit-of-work.ts","../src/orm/domain-event-bus.ts","../src/orm/relation-change-processor.ts","../src/orm/query-logger.ts","../src/orm/transaction-runner.ts","../src/orm/orm-session.ts","../src/orm/interceptor-pipeline.ts","../src/orm/orm.ts","../src/decorators/decorator-metadata.ts","../src/decorators/entity.ts","../src/decorators/column.ts","../src/decorators/relations.ts","../src/core/execution/db-executor.ts","../src/core/execution/executors/postgres-executor.ts","../src/core/execution/executors/mysql-executor.ts","../src/core/execution/executors/sqlite-executor.ts","../src/core/execution/executors/mssql-executor.ts"],"sourcesContent":["import { DbExecutor } from '../execution/db-executor.js';\nimport type { SchemaPlan, SynchronizeOptions } from './schema-diff.js';\n\nexport const executeSchemaPlan = async (\n plan: SchemaPlan,\n executor: DbExecutor,\n options: SynchronizeOptions = {}\n): Promise<void> => {\n for (const change of plan.changes) {\n if (!change.statements.length) continue;\n if (!change.safe && !options.allowDestructive) continue;\n for (const stmt of change.statements) {\n if (!stmt.trim()) continue;\n await executor.executeSql(stmt);\n }\n }\n};\n","export * from './schema/table.js';\r\nexport * from './schema/column.js';\r\nexport * from './schema/relation.js';\r\nexport * from './schema/types.js';\r\nexport * from './query-builder/select.js';\r\nexport * from './query-builder/select-helpers.js';\r\nexport * from './query-builder/insert.js';\r\nexport * from './query-builder/update.js';\r\nexport * from './query-builder/delete.js';\r\nexport * from './core/ast/expression.js';\r\nexport * from './core/hydration/types.js';\r\nexport * from './core/dialect/mysql/index.js';\r\nexport * from './core/dialect/mssql/index.js';\r\nexport * from './core/dialect/sqlite/index.js';\r\nexport * from './core/dialect/postgres/index.js';\r\nexport * from './core/ddl/schema-generator.js';\r\nexport * from './core/ddl/schema-types.js';\r\nexport * from './core/ddl/schema-diff.js';\r\nexport * from './core/ddl/schema-introspect.js';\r\nexport * from './core/ddl/introspect/registry.js';\r\nexport * from './core/functions/text.js';\r\nexport * from './core/functions/numeric.js';\r\nexport * from './core/functions/datetime.js';\r\nexport * from './orm/als.js';\r\nexport * from './orm/hydration.js';\r\nexport * from './codegen/typescript.js';\r\nexport * from './orm/orm-session.js';\r\nexport * from './orm/orm.js';\r\nexport * from './orm/entity.js';\r\nexport * from './orm/lazy-batch.js';\r\nexport * from './orm/relations/has-many.js';\r\nexport * from './orm/relations/belongs-to.js';\r\nexport * from './orm/relations/many-to-many.js';\r\nexport * from './orm/execute.js';\r\nexport * from './orm/entity-context.js';\r\nexport * from './orm/execution-context.js';\r\nexport * from './orm/hydration-context.js';\r\nexport * from './orm/domain-event-bus.js';\r\nexport * from './orm/runtime-types.js';\r\nexport * from './orm/query-logger.js';\r\nexport * from './decorators/index.js';\r\n\r\n// NEW: execution abstraction + helpers\r\nexport * from './core/execution/db-executor.js';\r\nexport * from './core/execution/executors/postgres-executor.js';\r\nexport * from './core/execution/executors/mysql-executor.js';\r\nexport * from './core/execution/executors/sqlite-executor.js';\r\nexport * from './core/execution/executors/mssql-executor.js';\r\n","import type { ColumnDef } from './column.js';\nimport type { RelationDef } from './relation.js';\n\nexport interface IndexColumn {\n column: string;\n order?: 'ASC' | 'DESC';\n nulls?: 'FIRST' | 'LAST';\n}\n\nexport interface IndexDef {\n name?: string;\n columns: (string | IndexColumn)[];\n unique?: boolean;\n where?: string;\n}\n\nexport interface CheckConstraint {\n name?: string;\n expression: string;\n}\n\nexport interface TableOptions {\n schema?: string;\n primaryKey?: string[];\n indexes?: IndexDef[];\n checks?: CheckConstraint[];\n comment?: string;\n engine?: string;\n charset?: string;\n collation?: string;\n}\n\nexport interface TableHooks {\n beforeInsert?(ctx: unknown, entity: any): Promise<void> | void;\n afterInsert?(ctx: unknown, entity: any): Promise<void> | void;\n beforeUpdate?(ctx: unknown, entity: any): Promise<void> | void;\n afterUpdate?(ctx: unknown, entity: any): Promise<void> | void;\n beforeDelete?(ctx: unknown, entity: any): Promise<void> | void;\n afterDelete?(ctx: unknown, entity: any): Promise<void> | void;\n}\n\n/**\n * Definition of a database table with its columns and relationships\n * @typeParam T - Type of the columns record\n */\nexport interface TableDef<T extends Record<string, ColumnDef> = Record<string, ColumnDef>> {\n /** Name of the table */\n name: string;\n /** Optional schema/catalog name */\n schema?: string;\n /** Record of column definitions keyed by column name */\n columns: T;\n /** Record of relationship definitions keyed by relation name */\n relations: Record<string, RelationDef>;\n /** Optional lifecycle hooks */\n hooks?: TableHooks;\n /** Composite primary key definition (falls back to column.primary flags) */\n primaryKey?: string[];\n /** Secondary indexes */\n indexes?: IndexDef[];\n /** Table-level check constraints */\n checks?: CheckConstraint[];\n /** Table comment/description */\n comment?: string;\n /** Dialect-specific options */\n engine?: string;\n charset?: string;\n collation?: string;\n}\n\n/**\n * Creates a table definition with columns and relationships\n * @typeParam T - Type of the columns record\n * @param name - Name of the table\n * @param columns - Record of column definitions\n * @param relations - Record of relationship definitions (optional)\n * @returns Complete table definition with runtime-filled column metadata\n *\n * @example\n * ```typescript\n * const usersTable = defineTable('users', {\n * id: col.primaryKey(col.int()),\n * name: col.varchar(255),\n * email: col.varchar(255)\n * });\n * ```\n */\nexport const defineTable = <T extends Record<string, ColumnDef>>(\n name: string,\n columns: T,\n relations: Record<string, RelationDef> = {},\n hooks?: TableHooks,\n options: TableOptions = {}\n): TableDef<T> => {\n // Runtime mutability to assign names to column definitions for convenience\n const colsWithNames = Object.entries(columns).reduce((acc, [key, def]) => {\n (acc as any)[key] = { ...def, name: key, table: name };\n return acc;\n }, {} as T);\n\n return {\n name,\n schema: options.schema,\n columns: colsWithNames,\n relations,\n hooks,\n primaryKey: options.primaryKey,\n indexes: options.indexes,\n checks: options.checks,\n comment: options.comment,\n engine: options.engine,\n charset: options.charset,\n collation: options.collation\n };\n};\n","/**\n * Supported column data types for database schema definitions\n */\nexport type ColumnType =\n | 'INT'\n | 'INTEGER'\n | 'BIGINT'\n | 'VARCHAR'\n | 'TEXT'\n | 'JSON'\n | 'ENUM'\n | 'DECIMAL'\n | 'FLOAT'\n | 'DOUBLE'\n | 'UUID'\n | 'BINARY'\n | 'VARBINARY'\n | 'BLOB'\n | 'BYTEA'\n | 'DATE'\n | 'DATETIME'\n | 'TIMESTAMP'\n | 'TIMESTAMPTZ'\n | 'BOOLEAN'\n | 'int'\n | 'integer'\n | 'bigint'\n | 'varchar'\n | 'text'\n | 'json'\n | 'enum'\n | 'decimal'\n | 'float'\n | 'double'\n | 'uuid'\n | 'binary'\n | 'varbinary'\n | 'blob'\n | 'bytea'\n | 'date'\n | 'datetime'\n | 'timestamp'\n | 'timestamptz'\n | 'boolean';\n\nexport type ReferentialAction =\n | 'NO ACTION'\n | 'RESTRICT'\n | 'CASCADE'\n | 'SET NULL'\n | 'SET DEFAULT';\n\nexport interface RawDefaultValue {\n raw: string;\n}\n\nexport type DefaultValue = unknown | RawDefaultValue;\n\nexport interface ForeignKeyReference {\n /** Target table name */\n table: string;\n /** Target column name */\n column: string;\n /** Optional constraint name */\n name?: string;\n /** ON DELETE action */\n onDelete?: ReferentialAction;\n /** ON UPDATE action */\n onUpdate?: ReferentialAction;\n /** Whether the constraint is deferrable (Postgres) */\n deferrable?: boolean;\n}\n\n/**\n * Definition of a database column\n */\nexport interface ColumnDef<T extends ColumnType = ColumnType, TRuntime = unknown> {\n /** Column name (filled at runtime by defineTable) */\n name: string;\n /** Data type of the column */\n type: T;\n /** Optional override for the inferred TypeScript type */\n tsType?: TRuntime;\n /** Whether this column is a primary key */\n primary?: boolean;\n /** Whether this column cannot be null */\n notNull?: boolean;\n /** Whether this column must be unique (or name of the unique constraint) */\n unique?: boolean | string;\n /** Default value for the column */\n default?: DefaultValue;\n /** Whether the column auto-increments / identity */\n autoIncrement?: boolean;\n /** Identity strategy where supported */\n generated?: 'always' | 'byDefault';\n /** Inline check constraint expression */\n check?: string;\n /** Foreign key reference */\n references?: ForeignKeyReference;\n /** Column comment/description */\n comment?: string;\n /** Additional arguments for the column type (e.g., VARCHAR length) */\n args?: any[];\n /** Table name this column belongs to (filled at runtime by defineTable) */\n table?: string;\n}\n\n/**\n * Factory for creating column definitions with common data types\n */\nexport const col = {\n /**\n * Creates an integer column definition\n * @returns ColumnDef with INT type\n */\n int: (): ColumnDef<'INT'> => ({ name: '', type: 'INT' }),\n\n /**\n * Creates a big integer column definition\n */\n bigint: (): ColumnDef<'BIGINT'> => ({ name: '', type: 'BIGINT' }),\n\n /**\n * Creates a variable character column definition\n * @param length - Maximum length of the string\n * @returns ColumnDef with VARCHAR type\n */\n varchar: (length: number): ColumnDef<'VARCHAR'> => ({ name: '', type: 'VARCHAR', args: [length] }),\n\n /**\n * Creates a fixed precision decimal column definition\n */\n decimal: (precision: number, scale = 0): ColumnDef<'DECIMAL'> => ({\n name: '',\n type: 'DECIMAL',\n args: [precision, scale]\n }),\n\n /**\n * Creates a floating point column definition\n */\n float: (precision?: number): ColumnDef<'FLOAT'> => ({\n name: '',\n type: 'FLOAT',\n args: precision !== undefined ? [precision] : undefined\n }),\n\n /**\n * Creates a UUID column definition\n */\n uuid: (): ColumnDef<'UUID'> => ({ name: '', type: 'UUID' }),\n\n /**\n * Creates a binary large object column definition\n */\n blob: (): ColumnDef<'BLOB'> => ({ name: '', type: 'BLOB' }),\n\n /**\n * Creates a fixed-length binary column definition\n */\n binary: (length?: number): ColumnDef<'BINARY'> => ({\n name: '',\n type: 'BINARY',\n args: length !== undefined ? [length] : undefined\n }),\n\n /**\n * Creates a variable-length binary column definition\n */\n varbinary: (length?: number): ColumnDef<'VARBINARY'> => ({\n name: '',\n type: 'VARBINARY',\n args: length !== undefined ? [length] : undefined\n }),\n\n /**\n * Creates a Postgres bytea column definition\n */\n bytea: (): ColumnDef<'BYTEA'> => ({ name: '', type: 'BYTEA' }),\n\n /**\n * Creates a timestamp column definition\n */\n timestamp: <TRuntime = string>(): ColumnDef<'TIMESTAMP', TRuntime> => ({ name: '', type: 'TIMESTAMP' }),\n\n /**\n * Creates a timestamptz column definition\n */\n timestamptz: <TRuntime = string>(): ColumnDef<'TIMESTAMPTZ', TRuntime> => ({ name: '', type: 'TIMESTAMPTZ' }),\n\n /**\n * Creates a date column definition\n */\n date: <TRuntime = string>(): ColumnDef<'DATE', TRuntime> => ({ name: '', type: 'DATE' }),\n\n /**\n * Creates a datetime column definition\n */\n datetime: <TRuntime = string>(): ColumnDef<'DATETIME', TRuntime> => ({ name: '', type: 'DATETIME' }),\n\n /**\n * Creates a JSON column definition\n * @returns ColumnDef with JSON type\n */\n json: (): ColumnDef<'JSON'> => ({ name: '', type: 'JSON' }),\n\n /**\n * Creates a boolean column definition\n * @returns ColumnDef with BOOLEAN type\n */\n boolean: (): ColumnDef<'BOOLEAN'> => ({ name: '', type: 'BOOLEAN' }),\n\n /**\n * Creates an enum column definition\n * @param values - Enum values\n */\n enum: (values: string[]): ColumnDef<'ENUM'> => ({ name: '', type: 'ENUM', args: values }),\n\n /**\n * Marks a column definition as a primary key\n * @param def - Column definition to modify\n * @returns Modified ColumnDef with primary: true\n */\n primaryKey: <T extends ColumnType>(def: ColumnDef<T>): ColumnDef<T> =>\n ({ ...def, primary: true }),\n\n /**\n * Marks a column as NOT NULL\n */\n notNull: <T extends ColumnType>(def: ColumnDef<T>): ColumnDef<T> =>\n ({ ...def, notNull: true }),\n\n /**\n * Marks a column as UNIQUE\n */\n unique: <T extends ColumnType>(def: ColumnDef<T>, name?: string): ColumnDef<T> =>\n ({\n ...def,\n unique: name ?? true\n }),\n\n /**\n * Sets a default value for the column\n */\n default: <T extends ColumnType>(def: ColumnDef<T>, value: unknown): ColumnDef<T> =>\n ({\n ...def,\n default: value\n }),\n\n /**\n * Sets a raw SQL default value for the column\n */\n defaultRaw: <T extends ColumnType>(def: ColumnDef<T>, expression: string): ColumnDef<T> =>\n ({\n ...def,\n default: { raw: expression }\n }),\n\n /**\n * Marks a column as auto-increment / identity\n */\n autoIncrement: <T extends ColumnType>(\n def: ColumnDef<T>,\n strategy: ColumnDef['generated'] = 'byDefault'\n ): ColumnDef<T> =>\n ({\n ...def,\n autoIncrement: true,\n generated: strategy\n }),\n\n /**\n * Adds a foreign key reference\n */\n references: <T extends ColumnType>(def: ColumnDef<T>, ref: ForeignKeyReference): ColumnDef<T> =>\n ({\n ...def,\n references: ref\n }),\n\n /**\n * Adds a check constraint to the column\n */\n check: <T extends ColumnType>(def: ColumnDef<T>, expression: string): ColumnDef<T> =>\n ({\n ...def,\n check: expression\n })\n};\n","import type { TableDef } from './table.js';\r\n\r\n/**\r\n * Types of relationships supported between tables\r\n */\r\nexport const RelationKinds = {\r\n /** One-to-one relationship */\r\n HasOne: 'HAS_ONE',\r\n /** One-to-many relationship */\r\n HasMany: 'HAS_MANY',\r\n /** Many-to-one relationship */\r\n BelongsTo: 'BELONGS_TO',\r\n /** Many-to-many relationship with pivot metadata */\r\n BelongsToMany: 'BELONGS_TO_MANY'\r\n} as const;\r\n\r\n/**\r\n * Type representing the supported relationship kinds\r\n */\r\nexport type RelationType = (typeof RelationKinds)[keyof typeof RelationKinds];\r\n\r\nexport type CascadeMode = 'none' | 'all' | 'persist' | 'remove' | 'link';\r\n\r\n/**\r\n * One-to-many relationship definition\r\n */\r\nexport interface HasManyRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.HasMany;\r\n target: TTarget;\r\n foreignKey: string;\r\n localKey?: string;\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * One-to-one relationship definition\r\n */\r\nexport interface HasOneRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.HasOne;\r\n target: TTarget;\r\n foreignKey: string;\r\n localKey?: string;\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * Many-to-one relationship definition\r\n */\r\nexport interface BelongsToRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.BelongsTo;\r\n target: TTarget;\r\n foreignKey: string;\r\n localKey?: string;\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * Many-to-many relationship definition with rich pivot metadata\r\n */\r\nexport interface BelongsToManyRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.BelongsToMany;\r\n target: TTarget;\r\n pivotTable: TableDef;\r\n pivotForeignKeyToRoot: string;\r\n pivotForeignKeyToTarget: string;\r\n localKey?: string;\r\n targetKey?: string;\r\n pivotPrimaryKey?: string;\r\n defaultPivotColumns?: string[];\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * Union type representing any supported relationship definition\r\n */\r\nexport type RelationDef =\r\n | HasManyRelation\r\n | HasOneRelation\r\n | BelongsToRelation\r\n | BelongsToManyRelation;\r\n\r\n/**\r\n * Creates a one-to-many relationship definition\r\n * @param target - Target table of the relationship\r\n * @param foreignKey - Foreign key column name on the child table\r\n * @param localKey - Local key column name (optional)\r\n * @returns HasManyRelation definition\r\n *\r\n * @example\r\n * ```typescript\r\n * hasMany(usersTable, 'user_id')\r\n * ```\r\n */\r\nexport const hasMany = <TTarget extends TableDef>(\r\n target: TTarget,\r\n foreignKey: string,\r\n localKey?: string,\r\n cascade?: CascadeMode\r\n): HasManyRelation<TTarget> => ({\r\n type: RelationKinds.HasMany,\r\n target,\r\n foreignKey,\r\n localKey,\r\n cascade\r\n});\r\n\r\n/**\r\n * Creates a one-to-one relationship definition\r\n * @param target - Target table of the relationship\r\n * @param foreignKey - Foreign key column name on the child table\r\n * @param localKey - Local key column name (optional)\r\n * @returns HasOneRelation definition\r\n */\r\nexport const hasOne = <TTarget extends TableDef>(\r\n target: TTarget,\r\n foreignKey: string,\r\n localKey?: string,\r\n cascade?: CascadeMode\r\n): HasOneRelation<TTarget> => ({\r\n type: RelationKinds.HasOne,\r\n target,\r\n foreignKey,\r\n localKey,\r\n cascade\r\n});\r\n\r\n/**\r\n * Creates a many-to-one relationship definition\r\n * @param target - Target table of the relationship\r\n * @param foreignKey - Foreign key column name on the child table\r\n * @param localKey - Local key column name (optional)\r\n * @returns BelongsToRelation definition\r\n *\r\n * @example\r\n * ```typescript\r\n * belongsTo(usersTable, 'user_id')\r\n * ```\r\n */\r\nexport const belongsTo = <TTarget extends TableDef>(\r\n target: TTarget,\r\n foreignKey: string,\r\n localKey?: string,\r\n cascade?: CascadeMode\r\n): BelongsToRelation<TTarget> => ({\r\n type: RelationKinds.BelongsTo,\r\n target,\r\n foreignKey,\r\n localKey,\r\n cascade\r\n});\r\n\r\n/**\r\n * Creates a many-to-many relationship definition with pivot metadata\r\n * @param target - Target table\r\n * @param pivotTable - Intermediate pivot table definition\r\n * @param options - Pivot metadata configuration\r\n * @returns BelongsToManyRelation definition\r\n */\r\nexport const belongsToMany = <\r\n TTarget extends TableDef\r\n>(\r\n target: TTarget,\r\n pivotTable: TableDef,\r\n options: {\r\n pivotForeignKeyToRoot: string;\r\n pivotForeignKeyToTarget: string;\r\n localKey?: string;\r\n targetKey?: string;\r\n pivotPrimaryKey?: string;\r\n defaultPivotColumns?: string[];\r\n cascade?: CascadeMode;\r\n }\r\n): BelongsToManyRelation<TTarget> => ({\r\n type: RelationKinds.BelongsToMany,\r\n target,\r\n pivotTable,\r\n pivotForeignKeyToRoot: options.pivotForeignKeyToRoot,\r\n pivotForeignKeyToTarget: options.pivotForeignKeyToTarget,\r\n localKey: options.localKey,\r\n targetKey: options.targetKey,\r\n pivotPrimaryKey: options.pivotPrimaryKey,\r\n defaultPivotColumns: options.defaultPivotColumns,\r\n cascade: options.cascade\r\n});\r\n","import type { SelectQueryNode, OrderByNode } from './query.js';\nimport { SqlOperator } from '../sql/sql.js';\nimport { ColumnRef } from './types.js';\n\r\n/**\r\n * AST node representing a literal value\r\n */\r\nexport interface LiteralNode {\r\n type: 'Literal';\r\n /** The literal value (string, number, boolean, or null) */\r\n value: string | number | boolean | null;\r\n}\r\n\r\n/**\r\n * AST node representing a column reference\r\n */\r\nexport interface ColumnNode {\n type: 'Column';\n /** Table name the column belongs to */\n table: string;\n /** Column name */\n name: string;\n /** Optional alias for the column */\n alias?: string;\n /** Optional scope marker (e.g., 'outer' for correlated references) */\n scope?: 'outer' | 'default';\n}\n\r\n/**\r\n * AST node representing a function call\r\n */\r\nexport interface FunctionNode {\n type: 'Function';\n /** Function name (e.g., COUNT, SUM) */\n name: string;\n /** Optional canonical function key for dialect-aware rendering */\n fn?: string;\n /** Function arguments */\n args: OperandNode[];\n /** Optional alias for the function result */\n alias?: string;\n /** Optional ORDER BY clause used by aggregations like GROUP_CONCAT */\n orderBy?: OrderByNode[];\n /** Optional separator argument used by GROUP_CONCAT-like functions */\n separator?: OperandNode;\n /** Optional DISTINCT modifier */\n distinct?: boolean;\n}\n\r\n/**\r\n * AST node representing a JSON path expression\r\n */\r\nexport interface JsonPathNode {\r\n type: 'JsonPath';\r\n /** Source column */\r\n column: ColumnNode;\r\n /** JSON path expression */\r\n path: string;\r\n /** Optional alias for the result */\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * AST node representing a scalar subquery\r\n */\r\nexport interface ScalarSubqueryNode {\r\n type: 'ScalarSubquery';\r\n /** Subquery to execute */\r\n query: SelectQueryNode;\r\n /** Optional alias for the subquery result */\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * AST node representing a CASE expression\r\n */\r\nexport interface CaseExpressionNode {\r\n type: 'CaseExpression';\r\n /** WHEN-THEN conditions */\r\n conditions: { when: ExpressionNode; then: OperandNode }[];\r\n /** Optional ELSE clause */\r\n else?: OperandNode;\r\n /** Optional alias for the result */\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * AST node representing a window function\r\n */\r\nexport interface WindowFunctionNode {\r\n type: 'WindowFunction';\r\n /** Window function name (e.g., ROW_NUMBER, RANK) */\r\n name: string;\r\n /** Function arguments */\r\n args: (ColumnNode | LiteralNode | JsonPathNode)[];\r\n /** Optional PARTITION BY clause */\r\n partitionBy?: ColumnNode[];\r\n /** Optional ORDER BY clause */\r\n orderBy?: OrderByNode[];\r\n /** Optional alias for the result */\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * Union type representing any operand that can be used in expressions\r\n */\r\nexport type OperandNode =\r\n | ColumnNode\r\n | LiteralNode\r\n | FunctionNode\r\n | JsonPathNode\r\n | ScalarSubqueryNode\r\n | CaseExpressionNode\r\n | WindowFunctionNode;\r\n\r\nconst operandTypes = new Set<OperandNode['type']>([\r\n 'Column',\r\n 'Literal',\r\n 'Function',\r\n 'JsonPath',\r\n 'ScalarSubquery',\r\n 'CaseExpression',\r\n 'WindowFunction'\r\n]);\r\n\r\nexport const isOperandNode = (node: any): node is OperandNode => node && operandTypes.has(node.type);\r\n\r\nexport const isFunctionNode = (node: any): node is FunctionNode => node?.type === 'Function';\r\nexport const isCaseExpressionNode = (node: any): node is CaseExpressionNode => node?.type === 'CaseExpression';\r\nexport const isWindowFunctionNode = (node: any): node is WindowFunctionNode => node?.type === 'WindowFunction';\r\nexport const isExpressionSelectionNode = (\n node: ColumnRef | FunctionNode | CaseExpressionNode | WindowFunctionNode\n): node is FunctionNode | CaseExpressionNode | WindowFunctionNode =>\n isFunctionNode(node) || isCaseExpressionNode(node) || isWindowFunctionNode(node);\n\r\n/**\r\n * AST node representing a binary expression (e.g., column = value)\r\n */\r\nexport interface BinaryExpressionNode {\r\n type: 'BinaryExpression';\r\n /** Left operand */\r\n left: OperandNode;\r\n /** Comparison operator */\r\n operator: SqlOperator;\r\n /** Right operand */\r\n right: OperandNode;\r\n /** Optional escape character for LIKE expressions */\r\n escape?: LiteralNode;\r\n}\r\n\r\n/**\r\n * AST node representing a logical expression (AND/OR)\r\n */\r\nexport interface LogicalExpressionNode {\r\n type: 'LogicalExpression';\r\n /** Logical operator (AND or OR) */\r\n operator: 'AND' | 'OR';\r\n /** Operands to combine */\r\n operands: ExpressionNode[];\r\n}\r\n\r\n/**\r\n * AST node representing a null check expression\r\n */\r\nexport interface NullExpressionNode {\r\n type: 'NullExpression';\r\n /** Operand to check for null */\r\n left: OperandNode;\r\n /** Null check operator */\r\n operator: 'IS NULL' | 'IS NOT NULL';\r\n}\r\n\r\n/**\r\n * AST node representing an IN/NOT IN expression\r\n */\r\nexport interface InExpressionNode {\r\n type: 'InExpression';\r\n /** Left operand to check */\r\n left: OperandNode;\r\n /** IN/NOT IN operator */\r\n operator: 'IN' | 'NOT IN';\r\n /** Values to check against */\r\n right: OperandNode[];\r\n}\r\n\r\n/**\r\n * AST node representing an EXISTS/NOT EXISTS expression\r\n */\r\nexport interface ExistsExpressionNode {\r\n type: 'ExistsExpression';\r\n /** EXISTS/NOT EXISTS operator */\r\n operator: SqlOperator;\r\n /** Subquery to check */\r\n subquery: SelectQueryNode;\r\n}\r\n\r\n/**\r\n * AST node representing a BETWEEN/NOT BETWEEN expression\r\n */\r\nexport interface BetweenExpressionNode {\r\n type: 'BetweenExpression';\r\n /** Operand to check */\r\n left: OperandNode;\r\n /** BETWEEN/NOT BETWEEN operator */\r\n operator: 'BETWEEN' | 'NOT BETWEEN';\r\n /** Lower bound */\r\n lower: OperandNode;\r\n /** Upper bound */\r\n upper: OperandNode;\r\n}\r\n\r\n/**\r\n * Union type representing any supported expression node\r\n */\r\nexport type ExpressionNode =\r\n | BinaryExpressionNode\r\n | LogicalExpressionNode\r\n | NullExpressionNode\r\n | InExpressionNode\r\n | ExistsExpressionNode\r\n | BetweenExpressionNode;\r\n","import { SelectQueryNode } from './query.js';\r\nimport { SqlOperator } from '../sql/sql.js';\r\nimport { ColumnRef } from './types.js';\r\nimport {\r\n ColumnNode,\r\n FunctionNode,\r\n LiteralNode,\r\n JsonPathNode,\r\n OperandNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode,\r\n BinaryExpressionNode,\r\n ExpressionNode,\r\n LogicalExpressionNode,\r\n NullExpressionNode,\r\n InExpressionNode,\r\n ExistsExpressionNode,\r\n BetweenExpressionNode,\r\n isOperandNode\r\n} from './expression-nodes.js';\r\n\r\nexport type LiteralValue = LiteralNode['value'];\r\nexport type ValueOperandInput = OperandNode | LiteralValue;\r\n\r\n/**\r\n * Converts a primitive or existing operand into an operand node\r\n * @param value - Value or operand to normalize\r\n * @returns OperandNode representing the value\r\n */\r\nexport const valueToOperand = (value: ValueOperandInput): OperandNode => {\r\n if (isOperandNode(value)) {\r\n return value;\r\n }\r\n\r\n return {\r\n type: 'Literal',\r\n value\r\n } as LiteralNode;\r\n};\r\n\r\nconst toNode = (col: ColumnRef | OperandNode): OperandNode => {\r\n if (isOperandNode(col)) return col as OperandNode;\r\n const def = col as ColumnRef;\r\n return { type: 'Column', table: def.table || 'unknown', name: def.name };\r\n};\r\n\r\nconst toLiteralNode = (value: string | number | boolean | null): LiteralNode => ({\r\n type: 'Literal',\r\n value\r\n});\r\n\r\nconst isLiteralValue = (value: unknown): value is LiteralValue =>\r\n value === null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\r\n\r\nexport const isValueOperandInput = (value: unknown): value is ValueOperandInput =>\r\n isOperandNode(value) || isLiteralValue(value);\r\n\r\nconst toOperand = (val: OperandNode | ColumnRef | LiteralValue): OperandNode => {\r\n if (isLiteralValue(val)) {\r\n return valueToOperand(val);\r\n }\r\n\r\n return toNode(val);\r\n};\r\n\r\nexport const columnOperand = (col: ColumnRef | ColumnNode): ColumnNode => toNode(col) as ColumnNode;\n/**\n * Marks a column reference as an outer-scope reference for correlated subqueries.\n * Primarily semantic; SQL rendering still uses the provided table/alias name.\n */\nexport const outerRef = (col: ColumnRef | ColumnNode): ColumnNode => ({\n ...columnOperand(col),\n scope: 'outer'\n});\n\n/**\n * Creates an outer-scoped column reference using a specific table or alias name.\n */\nexport const correlateBy = (table: string, column: string): ColumnNode => outerRef({ name: column, table });\n\r\nconst createBinaryExpression = (\r\n operator: SqlOperator,\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number | boolean | null,\r\n escape?: string\r\n): BinaryExpressionNode => {\r\n const node: BinaryExpressionNode = {\r\n type: 'BinaryExpression',\r\n left: toNode(left),\r\n operator,\r\n right: toOperand(right)\r\n };\r\n\r\n if (escape !== undefined) {\r\n node.escape = toLiteralNode(escape);\r\n }\r\n\r\n return node;\r\n};\r\n\r\n/**\r\n * Creates an equality expression (left = right)\r\n * @param left - Left operand\r\n * @param right - Right operand\r\n * @returns Binary expression node with equality operator\r\n */\r\nexport const eq = (left: OperandNode | ColumnRef, right: OperandNode | ColumnRef | string | number | boolean): BinaryExpressionNode =>\r\n createBinaryExpression('=', left, right);\r\n\r\n/**\r\n * Creates a not equal expression (left != right)\r\n */\r\nexport const neq = (\r\n left: OperandNode | ColumnRef,\r\n right: OperandNode | ColumnRef | string | number | boolean\r\n): BinaryExpressionNode => createBinaryExpression('!=', left, right);\r\n\r\n/**\r\n * Creates a greater-than expression (left > right)\r\n * @param left - Left operand\r\n * @param right - Right operand\r\n * @returns Binary expression node with greater-than operator\r\n */\r\nexport const gt = (left: OperandNode | ColumnRef, right: OperandNode | ColumnRef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('>', left, right);\r\n\r\n/**\r\n * Creates a greater than or equal expression (left >= right)\r\n */\r\nexport const gte = (left: OperandNode | ColumnRef, right: OperandNode | ColumnRef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('>=', left, right);\r\n\r\n/**\r\n * Creates a less-than expression (left < right)\r\n * @param left - Left operand\r\n * @param right - Right operand\r\n * @returns Binary expression node with less-than operator\r\n */\r\nexport const lt = (left: OperandNode | ColumnRef, right: OperandNode | ColumnRef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('<', left, right);\r\n\r\n/**\r\n * Creates a less than or equal expression (left <= right)\r\n */\r\nexport const lte = (left: OperandNode | ColumnRef, right: OperandNode | ColumnRef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('<=', left, right);\r\n\r\n/**\r\n * Creates a LIKE pattern matching expression\r\n * @param left - Left operand\r\n * @param pattern - Pattern to match\r\n * @param escape - Optional escape character\r\n * @returns Binary expression node with LIKE operator\r\n */\r\nexport const like = (left: OperandNode | ColumnRef, pattern: string, escape?: string): BinaryExpressionNode =>\r\n createBinaryExpression('LIKE', left, pattern, escape);\r\n\r\n/**\r\n * Creates a NOT LIKE pattern matching expression\r\n * @param left - Left operand\r\n * @param pattern - Pattern to match\r\n * @param escape - Optional escape character\r\n * @returns Binary expression node with NOT LIKE operator\r\n */\r\nexport const notLike = (left: OperandNode | ColumnRef, pattern: string, escape?: string): BinaryExpressionNode =>\r\n createBinaryExpression('NOT LIKE', left, pattern, escape);\r\n\r\n/**\r\n * Creates a logical AND expression\r\n * @param operands - Expressions to combine with AND\r\n * @returns Logical expression node with AND operator\r\n */\r\nexport const and = (...operands: ExpressionNode[]): LogicalExpressionNode => ({\r\n type: 'LogicalExpression',\r\n operator: 'AND',\r\n operands\r\n});\r\n\r\n/**\r\n * Creates a logical OR expression\r\n * @param operands - Expressions to combine with OR\r\n * @returns Logical expression node with OR operator\r\n */\r\nexport const or = (...operands: ExpressionNode[]): LogicalExpressionNode => ({\r\n type: 'LogicalExpression',\r\n operator: 'OR',\r\n operands\r\n});\r\n\r\n/**\r\n * Creates an IS NULL expression\r\n * @param left - Operand to check for null\r\n * @returns Null expression node with IS NULL operator\r\n */\r\nexport const isNull = (left: OperandNode | ColumnRef): NullExpressionNode => ({\r\n type: 'NullExpression',\r\n left: toNode(left),\r\n operator: 'IS NULL'\r\n});\r\n\r\n/**\r\n * Creates an IS NOT NULL expression\r\n * @param left - Operand to check for non-null\r\n * @returns Null expression node with IS NOT NULL operator\r\n */\r\nexport const isNotNull = (left: OperandNode | ColumnRef): NullExpressionNode => ({\r\n type: 'NullExpression',\r\n left: toNode(left),\r\n operator: 'IS NOT NULL'\r\n});\r\n\r\nconst createInExpression = (\r\n operator: 'IN' | 'NOT IN',\r\n left: OperandNode | ColumnRef,\r\n values: (string | number | LiteralNode)[]\r\n): InExpressionNode => ({\r\n type: 'InExpression',\r\n left: toNode(left),\r\n operator,\r\n right: values.map(v => toOperand(v))\r\n});\r\n\r\n/**\r\n * Creates an IN expression (value IN list)\r\n * @param left - Operand to check\r\n * @param values - Values to check against\r\n * @returns IN expression node\r\n */\r\nexport const inList = (left: OperandNode | ColumnRef, values: (string | number | LiteralNode)[]): InExpressionNode =>\r\n createInExpression('IN', left, values);\r\n\r\n/**\r\n * Creates a NOT IN expression (value NOT IN list)\r\n * @param left - Operand to check\r\n * @param values - Values to check against\r\n * @returns NOT IN expression node\r\n */\r\nexport const notInList = (left: OperandNode | ColumnRef, values: (string | number | LiteralNode)[]): InExpressionNode =>\r\n createInExpression('NOT IN', left, values);\r\n\r\nconst createBetweenExpression = (\r\n operator: 'BETWEEN' | 'NOT BETWEEN',\r\n left: OperandNode | ColumnRef,\r\n lower: OperandNode | ColumnRef | string | number,\r\n upper: OperandNode | ColumnRef | string | number\r\n): BetweenExpressionNode => ({\r\n type: 'BetweenExpression',\r\n left: toNode(left),\r\n operator,\r\n lower: toOperand(lower),\r\n upper: toOperand(upper)\r\n});\r\n\r\n/**\r\n * Creates a BETWEEN expression (value BETWEEN lower AND upper)\r\n * @param left - Operand to check\r\n * @param lower - Lower bound\r\n * @param upper - Upper bound\r\n * @returns BETWEEN expression node\r\n */\r\nexport const between = (\r\n left: OperandNode | ColumnRef,\r\n lower: OperandNode | ColumnRef | string | number,\r\n upper: OperandNode | ColumnRef | string | number\r\n): BetweenExpressionNode => createBetweenExpression('BETWEEN', left, lower, upper);\r\n\r\n/**\r\n * Creates a NOT BETWEEN expression (value NOT BETWEEN lower AND upper)\r\n * @param left - Operand to check\r\n * @param lower - Lower bound\r\n * @param upper - Upper bound\r\n * @returns NOT BETWEEN expression node\r\n */\r\nexport const notBetween = (\r\n left: OperandNode | ColumnRef,\r\n lower: OperandNode | ColumnRef | string | number,\r\n upper: OperandNode | ColumnRef | string | number\r\n): BetweenExpressionNode => createBetweenExpression('NOT BETWEEN', left, lower, upper);\r\n\r\n/**\r\n * Creates a JSON path expression\r\n * @param col - Source column\r\n * @param path - JSON path expression\r\n * @returns JSON path node\r\n */\r\nexport const jsonPath = (col: ColumnRef | ColumnNode, path: string): JsonPathNode => ({\r\n type: 'JsonPath',\r\n column: columnOperand(col),\r\n path\r\n});\r\n\r\n/**\r\n * Creates a CASE expression\r\n * @param conditions - Array of WHEN-THEN conditions\r\n * @param elseValue - Optional ELSE value\r\n * @returns CASE expression node\r\n */\r\nexport const caseWhen = (\r\n conditions: { when: ExpressionNode; then: OperandNode | ColumnRef | string | number | boolean | null }[],\r\n elseValue?: OperandNode | ColumnRef | string | number | boolean | null\r\n): CaseExpressionNode => ({\r\n type: 'CaseExpression',\r\n conditions: conditions.map(c => ({\r\n when: c.when,\r\n then: toOperand(c.then)\r\n })),\r\n else: elseValue !== undefined ? toOperand(elseValue) : undefined\r\n});\r\n\r\n/**\r\n * Creates an EXISTS expression\r\n * @param subquery - Subquery to check for existence\r\n * @returns EXISTS expression node\r\n */\r\nexport const exists = (subquery: SelectQueryNode): ExistsExpressionNode => ({\r\n type: 'ExistsExpression',\r\n operator: 'EXISTS',\r\n subquery\r\n});\r\n\r\n/**\r\n * Creates a NOT EXISTS expression\r\n * @param subquery - Subquery to check for non-existence\r\n * @returns NOT EXISTS expression node\r\n */\r\nexport const notExists = (subquery: SelectQueryNode): ExistsExpressionNode => ({\r\n type: 'ExistsExpression',\r\n operator: 'NOT EXISTS',\r\n subquery\r\n});\r\n","import { ColumnNode, LiteralNode, JsonPathNode, WindowFunctionNode } from './expression-nodes.js';\nimport { columnOperand } from './expression-builders.js';\nimport { OrderDirection } from '../sql/sql.js';\nimport { OrderByNode } from './query.js';\nimport { ColumnRef } from './types.js';\n\r\nconst buildWindowFunction = (\r\n name: string,\r\n args: (ColumnNode | LiteralNode | JsonPathNode)[] = [],\r\n partitionBy?: ColumnNode[],\r\n orderBy?: OrderByNode[]\r\n): WindowFunctionNode => {\r\n const node: WindowFunctionNode = {\r\n type: 'WindowFunction',\r\n name,\r\n args\r\n };\r\n\r\n if (partitionBy && partitionBy.length) {\r\n node.partitionBy = partitionBy;\r\n }\r\n\r\n if (orderBy && orderBy.length) {\r\n node.orderBy = orderBy;\r\n }\r\n\r\n return node;\r\n};\r\n\r\n/**\r\n * Creates a ROW_NUMBER window function\r\n * @returns Window function node for ROW_NUMBER\r\n */\r\nexport const rowNumber = (): WindowFunctionNode => buildWindowFunction('ROW_NUMBER');\r\n\r\n/**\r\n * Creates a RANK window function\r\n * @returns Window function node for RANK\r\n */\r\nexport const rank = (): WindowFunctionNode => buildWindowFunction('RANK');\r\n\r\n/**\r\n * Creates a DENSE_RANK window function\r\n * @returns Window function node for DENSE_RANK\r\n */\r\nexport const denseRank = (): WindowFunctionNode => buildWindowFunction('DENSE_RANK');\r\n\r\n/**\r\n * Creates an NTILE window function\r\n * @param n - Number of buckets\r\n * @returns Window function node for NTILE\r\n */\r\nexport const ntile = (n: number): WindowFunctionNode =>\n buildWindowFunction('NTILE', [{ type: 'Literal', value: n }]);\n\r\n/**\r\n * Creates a LAG window function\r\n * @param col - Column to lag\r\n * @param offset - Offset (defaults to 1)\r\n * @param defaultValue - Default value if no row exists\n * @returns Window function node for LAG\n */\nexport const lag = (col: ColumnRef | ColumnNode, offset: number = 1, defaultValue?: any): WindowFunctionNode => {\n const args: (ColumnNode | LiteralNode | JsonPathNode)[] = [\n columnOperand(col),\n { type: 'Literal', value: offset }\n ];\n if (defaultValue !== undefined) {\r\n args.push({ type: 'Literal', value: defaultValue });\r\n }\r\n return buildWindowFunction('LAG', args);\r\n};\r\n\r\n/**\r\n * Creates a LEAD window function\r\n * @param col - Column to lead\r\n * @param offset - Offset (defaults to 1)\r\n * @param defaultValue - Default value if no row exists\n * @returns Window function node for LEAD\n */\nexport const lead = (col: ColumnRef | ColumnNode, offset: number = 1, defaultValue?: any): WindowFunctionNode => {\n const args: (ColumnNode | LiteralNode | JsonPathNode)[] = [\n columnOperand(col),\n { type: 'Literal', value: offset }\n ];\n if (defaultValue !== undefined) {\r\n args.push({ type: 'Literal', value: defaultValue });\r\n }\r\n return buildWindowFunction('LEAD', args);\r\n};\r\n\r\n/**\r\n * Creates a FIRST_VALUE window function\r\n * @param col - Column to get first value from\n * @returns Window function node for FIRST_VALUE\n */\nexport const firstValue = (col: ColumnRef | ColumnNode): WindowFunctionNode =>\n buildWindowFunction('FIRST_VALUE', [columnOperand(col)]);\n\r\n/**\r\n * Creates a LAST_VALUE window function\r\n * @param col - Column to get last value from\n * @returns Window function node for LAST_VALUE\n */\nexport const lastValue = (col: ColumnRef | ColumnNode): WindowFunctionNode =>\n buildWindowFunction('LAST_VALUE', [columnOperand(col)]);\n\r\n/**\r\n * Creates a custom window function\r\n * @param name - Window function name\r\n * @param args - Function arguments\r\n * @param partitionBy - Optional PARTITION BY columns\r\n * @param orderBy - Optional ORDER BY clauses\r\n * @returns Window function node\r\n */\r\nexport const windowFunction = (\n name: string,\n args: (ColumnRef | ColumnNode | LiteralNode | JsonPathNode)[] = [],\n partitionBy?: (ColumnRef | ColumnNode)[],\n orderBy?: { column: ColumnRef | ColumnNode; direction: OrderDirection }[]\n): WindowFunctionNode => {\n const nodeArgs = args.map(arg => {\n if (typeof (arg as LiteralNode).value !== 'undefined') {\n return arg as LiteralNode;\n }\n if ('path' in arg) {\n return arg as JsonPathNode;\n }\n return columnOperand(arg as ColumnRef | ColumnNode);\n });\n\n const partitionNodes = partitionBy?.map(col => columnOperand(col)) ?? undefined;\n const orderNodes: OrderByNode[] | undefined = orderBy?.map(o => ({\n type: 'OrderBy',\n column: columnOperand(o.column),\n direction: o.direction\n }));\n\r\n return buildWindowFunction(name, nodeArgs, partitionNodes, orderNodes);\r\n};\r\n","/**\r\n * SQL keywords used in query generation\r\n */\r\nexport const SQL_KEYWORDS = {\r\n /** SELECT clause keyword */\r\n SELECT: 'SELECT',\r\n /** FROM clause keyword */\r\n FROM: 'FROM',\r\n /** WHERE clause keyword */\r\n WHERE: 'WHERE',\r\n /** JOIN keyword */\r\n JOIN: 'JOIN',\r\n /** INNER JOIN keyword */\r\n INNER_JOIN: 'INNER JOIN',\r\n /** LEFT JOIN keyword */\r\n LEFT_JOIN: 'LEFT JOIN',\r\n /** RIGHT JOIN keyword */\r\n RIGHT_JOIN: 'RIGHT JOIN',\r\n /** ORDER BY clause keyword */\r\n ORDER_BY: 'ORDER BY',\r\n /** GROUP BY clause keyword */\r\n GROUP_BY: 'GROUP BY',\r\n /** HAVING clause keyword */\r\n HAVING: 'HAVING',\r\n /** DISTINCT keyword */\r\n DISTINCT: 'DISTINCT',\r\n /** EXISTS operator */\r\n EXISTS: 'EXISTS',\r\n /** NOT EXISTS operator */\r\n NOT_EXISTS: 'NOT EXISTS'\r\n} as const;\r\n\r\n/**\r\n * SQL operators used in query conditions\r\n */\r\nexport const SQL_OPERATORS = {\n /** Equality operator */\n EQUALS: '=',\n /** Not equals operator */\n NOT_EQUALS: '!=',\n /** Greater than operator */\n GREATER_THAN: '>',\n /** Greater than or equal operator */\n GREATER_OR_EQUAL: '>=',\n /** Less than operator */\n LESS_THAN: '<',\n /** Less than or equal operator */\n LESS_OR_EQUAL: '<=',\n /** LIKE pattern matching operator */\n LIKE: 'LIKE',\n /** NOT LIKE pattern matching operator */\n NOT_LIKE: 'NOT LIKE',\n /** IN membership operator */\n IN: 'IN',\n /** NOT IN membership operator */\n NOT_IN: 'NOT IN',\n /** BETWEEN range operator */\n BETWEEN: 'BETWEEN',\n /** NOT BETWEEN range operator */\n NOT_BETWEEN: 'NOT BETWEEN',\n /** IS NULL null check operator */\n IS_NULL: 'IS NULL',\n /** IS NOT NULL null check operator */\n IS_NOT_NULL: 'IS NOT NULL',\n /** Logical AND operator */\n AND: 'AND',\n /** Logical OR operator */\n OR: 'OR',\n /** EXISTS operator */\n EXISTS: 'EXISTS',\n /** NOT EXISTS operator */\n NOT_EXISTS: 'NOT EXISTS'\n} as const;\n\r\n/**\r\n * Type representing any supported SQL operator\r\n */\r\nexport type SqlOperator = (typeof SQL_OPERATORS)[keyof typeof SQL_OPERATORS];\r\n\r\n/**\r\n * Types of SQL joins supported\r\n */\r\nexport const JOIN_KINDS = {\r\n /** INNER JOIN type */\r\n INNER: 'INNER',\r\n /** LEFT JOIN type */\r\n LEFT: 'LEFT',\r\n /** RIGHT JOIN type */\r\n RIGHT: 'RIGHT',\r\n /** CROSS JOIN type */\r\n CROSS: 'CROSS'\r\n} as const;\r\n\r\n/**\r\n * Type representing any supported join kind\r\n */\r\nexport type JoinKind = (typeof JOIN_KINDS)[keyof typeof JOIN_KINDS];\r\n\r\n/**\r\n * Ordering directions for result sorting\r\n */\r\nexport const ORDER_DIRECTIONS = {\r\n /** Ascending order */\r\n ASC: 'ASC',\r\n /** Descending order */\r\n DESC: 'DESC'\r\n} as const;\r\n\r\n/**\r\n * Type representing any supported order direction\r\n */\r\nexport type OrderDirection = (typeof ORDER_DIRECTIONS)[keyof typeof ORDER_DIRECTIONS];\r\n\r\n/**\r\n * Supported database dialects\r\n */\r\nexport const SUPPORTED_DIALECTS = {\r\n /** MySQL database dialect */\r\n MYSQL: 'mysql',\r\n /** SQLite database dialect */\r\n SQLITE: 'sqlite',\r\n /** Microsoft SQL Server dialect */\r\n MSSQL: 'mssql',\r\n /** PostgreSQL database dialect */\r\n POSTGRES: 'postgres'\r\n} as const;\r\n\r\n/**\r\n * Type representing any supported database dialect\r\n */\r\nexport type DialectName = (typeof SUPPORTED_DIALECTS)[keyof typeof SUPPORTED_DIALECTS];\r\n","import { ColumnNode, FunctionNode } from './expression-nodes.js';\nimport { columnOperand, valueToOperand, ValueOperandInput } from './expression-builders.js';\nimport { ColumnRef } from './types.js';\nimport { OrderByNode } from './query.js';\nimport { ORDER_DIRECTIONS, OrderDirection } from '../sql/sql.js';\n\nconst buildAggregate = (name: string) => (col: ColumnRef | ColumnNode): FunctionNode => ({\n type: 'Function',\n name,\n args: [columnOperand(col)]\n});\n\r\n/**\r\n * Creates a COUNT function expression\r\n * @param col - Column to count\r\n * @returns Function node with COUNT\r\n */\r\nexport const count = buildAggregate('COUNT');\r\n\r\n/**\r\n * Creates a SUM function expression\r\n * @param col - Column to sum\n * @returns Function node with SUM\n */\nexport const sum = buildAggregate('SUM');\n\r\n/**\r\n * Creates an AVG function expression\r\n * @param col - Column to average\r\n * @returns Function node with AVG\n */\nexport const avg = buildAggregate('AVG');\n\n/**\n * Creates a MIN function expression\n * @param col - Column to take the minimum of\n * @returns Function node with MIN\n */\nexport const min = buildAggregate('MIN');\n\n/**\n * Creates a MAX function expression\n * @param col - Column to take the maximum of\n * @returns Function node with MAX\n */\nexport const max = buildAggregate('MAX');\n\ntype GroupConcatOrderByInput = {\n column: ColumnRef | ColumnNode;\n direction?: OrderDirection;\n};\n\nexport type GroupConcatOptions = {\n separator?: ValueOperandInput;\n orderBy?: GroupConcatOrderByInput[];\n};\n\nconst toOrderByNode = (order: GroupConcatOrderByInput): OrderByNode => ({\n type: 'OrderBy',\n column: columnOperand(order.column),\n direction: order.direction ?? ORDER_DIRECTIONS.ASC\n});\n\n/**\n * Aggregates grouped strings into a single value.\n */\nexport const groupConcat = (\n col: ColumnRef | ColumnNode,\n options?: GroupConcatOptions\n): FunctionNode => ({\n type: 'Function',\n name: 'GROUP_CONCAT',\n args: [columnOperand(col)],\n orderBy: options?.orderBy?.map(toOrderByNode),\n separator: options?.separator !== undefined ? valueToOperand(options.separator) : undefined\n});\n","import {\r\n BinaryExpressionNode,\r\n LogicalExpressionNode,\r\n NullExpressionNode,\r\n InExpressionNode,\r\n ExistsExpressionNode,\r\n BetweenExpressionNode,\r\n ExpressionNode,\r\n OperandNode,\r\n ColumnNode,\r\n LiteralNode,\r\n FunctionNode,\r\n JsonPathNode,\r\n ScalarSubqueryNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode\r\n} from './expression-nodes.js';\r\n\r\n/**\r\n * Visitor for expression nodes\r\n */\r\nexport interface ExpressionVisitor<R> {\n visitBinaryExpression?(node: BinaryExpressionNode): R;\n visitLogicalExpression?(node: LogicalExpressionNode): R;\n visitNullExpression?(node: NullExpressionNode): R;\n visitInExpression?(node: InExpressionNode): R;\n visitExistsExpression?(node: ExistsExpressionNode): R;\n visitBetweenExpression?(node: BetweenExpressionNode): R;\n otherwise?(node: ExpressionNode): R;\n}\n\n/**\n * Visitor for operand nodes\n */\nexport interface OperandVisitor<R> {\n visitColumn?(node: ColumnNode): R;\n visitLiteral?(node: LiteralNode): R;\n visitFunction?(node: FunctionNode): R;\n visitJsonPath?(node: JsonPathNode): R;\n visitScalarSubquery?(node: ScalarSubqueryNode): R;\n visitCaseExpression?(node: CaseExpressionNode): R;\n visitWindowFunction?(node: WindowFunctionNode): R;\n otherwise?(node: OperandNode): R;\n}\n\ntype ExpressionDispatch = <R>(node: any, visitor: ExpressionVisitor<R>) => R;\ntype OperandDispatch = <R>(node: any, visitor: OperandVisitor<R>) => R;\n\nconst expressionDispatchers = new Map<string, ExpressionDispatch>();\nconst operandDispatchers = new Map<string, OperandDispatch>();\n\n/**\n * Registers a dispatcher for a custom expression node type.\n * Allows new node kinds without modifying the core switch.\n */\nexport const registerExpressionDispatcher = (type: string, dispatcher: ExpressionDispatch): void => {\n expressionDispatchers.set(type, dispatcher);\n};\n\n/**\n * Registers a dispatcher for a custom operand node type.\n * Allows new node kinds without modifying the core switch.\n */\nexport const registerOperandDispatcher = (type: string, dispatcher: OperandDispatch): void => {\n operandDispatchers.set(type, dispatcher);\n};\n\n/**\n * Clears all registered dispatchers. Primarily for tests.\n */\nexport const clearExpressionDispatchers = (): void => expressionDispatchers.clear();\nexport const clearOperandDispatchers = (): void => operandDispatchers.clear();\n\nconst unsupportedExpression = (node: ExpressionNode): never => {\n throw new Error(`Unsupported expression type \"${(node as any)?.type ?? 'unknown'}\"`);\n};\n\r\nconst unsupportedOperand = (node: OperandNode): never => {\r\n throw new Error(`Unsupported operand type \"${(node as any)?.type ?? 'unknown'}\"`);\r\n};\r\n/**\r\n * Dispatches an expression node to the visitor\r\n * @param node - Expression node to visit\n * @param visitor - Visitor implementation\n */\nexport const visitExpression = <R>(node: ExpressionNode, visitor: ExpressionVisitor<R>): R => {\n const dynamic = expressionDispatchers.get((node as any)?.type);\n if (dynamic) return dynamic(node as any, visitor);\n\n switch (node.type) {\n case 'BinaryExpression':\n if (visitor.visitBinaryExpression) return visitor.visitBinaryExpression(node);\n break;\n case 'LogicalExpression':\n if (visitor.visitLogicalExpression) return visitor.visitLogicalExpression(node);\n break;\n case 'NullExpression':\n if (visitor.visitNullExpression) return visitor.visitNullExpression(node);\n break;\n case 'InExpression':\n if (visitor.visitInExpression) return visitor.visitInExpression(node);\n break;\n case 'ExistsExpression':\n if (visitor.visitExistsExpression) return visitor.visitExistsExpression(node);\n break;\n case 'BetweenExpression':\n if (visitor.visitBetweenExpression) return visitor.visitBetweenExpression(node);\n break;\n default:\n break;\n }\n if (visitor.otherwise) return visitor.otherwise(node);\n return unsupportedExpression(node);\n};\n\r\n/**\r\n * Dispatches an operand node to the visitor\r\n * @param node - Operand node to visit\n * @param visitor - Visitor implementation\n */\nexport const visitOperand = <R>(node: OperandNode, visitor: OperandVisitor<R>): R => {\n const dynamic = operandDispatchers.get((node as any)?.type);\n if (dynamic) return dynamic(node as any, visitor);\n\n switch (node.type) {\n case 'Column':\n if (visitor.visitColumn) return visitor.visitColumn(node);\n break;\n case 'Literal':\n if (visitor.visitLiteral) return visitor.visitLiteral(node);\n break;\n case 'Function':\n if (visitor.visitFunction) return visitor.visitFunction(node);\n break;\n case 'JsonPath':\n if (visitor.visitJsonPath) return visitor.visitJsonPath(node);\n break;\n case 'ScalarSubquery':\n if (visitor.visitScalarSubquery) return visitor.visitScalarSubquery(node);\n break;\n case 'CaseExpression':\n if (visitor.visitCaseExpression) return visitor.visitCaseExpression(node);\n break;\n case 'WindowFunction':\n if (visitor.visitWindowFunction) return visitor.visitWindowFunction(node);\n break;\n default:\n break;\n }\n if (visitor.otherwise) return visitor.otherwise(node);\n return unsupportedOperand(node);\n};\n","import { ColumnDef } from '../../schema/column.js';\nimport { TableDef } from '../../schema/table.js';\nimport { ColumnRef, TableRef } from './types.js';\n\n/**\n * Adapts a schema ColumnDef to an AST-friendly ColumnRef.\n */\nexport const toColumnRef = (col: ColumnRef | ColumnDef): ColumnRef => ({\n name: col.name,\n table: col.table,\n alias: (col as ColumnRef).alias\n});\n\n/**\n * Adapts a schema TableDef to an AST-friendly TableRef.\n */\nexport const toTableRef = (table: TableRef | TableDef): TableRef => ({\n name: table.name,\n schema: table.schema,\n alias: (table as TableRef).alias\n});\n","import { ColumnNode } from './expression-nodes.js';\nimport { TableNode, FunctionTableNode, DerivedTableNode } from './query.js';\nimport { ColumnRef, TableRef } from './types.js';\n\n/**\n * Builds or normalizes a column AST node from a column definition or existing node\n * @param table - Table definition providing a default table name\n * @param column - Column definition or existing column node\n */\nexport const buildColumnNode = (table: TableRef, column: ColumnRef | ColumnNode): ColumnNode => {\n if ((column as ColumnNode).type === 'Column') {\n return column as ColumnNode;\n }\n\n const def = column as ColumnRef;\n const baseTable = def.table\n ? table.alias && def.table === table.name\n ? table.alias\n : def.table\n : table.alias || table.name;\n\n return {\n type: 'Column',\n table: baseTable,\n name: def.name\n };\n};\n\n/**\n * Builds column AST nodes for a list of column names\n * @param table - Table definition providing the table name\n * @param names - Column names\n */\nexport const buildColumnNodes = (table: TableRef, names: string[]): ColumnNode[] =>\n names.map(name => ({\n type: 'Column',\n table: table.alias || table.name,\n name\n }));\n\n/**\n * Builds a table AST node for the provided table definition\n * @param table - Table definition\n */\nexport const createTableNode = (table: TableRef): TableNode => ({\n type: 'Table',\n name: table.name\n});\n\n/**\n * Creates a FunctionTable node for expressions like `function_name(args...)` used in FROM\n */\nexport const fnTable = (name: string, args: any[] = [], alias?: string, opts?: { lateral?: boolean; withOrdinality?: boolean; columnAliases?: string[]; schema?: string }): FunctionTableNode => ({\n type: 'FunctionTable',\n name,\n args,\n alias,\n lateral: opts?.lateral,\n withOrdinality: opts?.withOrdinality,\n columnAliases: opts?.columnAliases,\n schema: opts?.schema\n});\n\n/**\n * Creates a derived table node wrapping a subquery.\n */\nexport const derivedTable = (\n query: import('./query.js').SelectQueryNode,\n alias: string,\n columnAliases?: string[]\n): DerivedTableNode => ({\n type: 'DerivedTable',\n query,\n alias,\n columnAliases\n});\n","import { FunctionStrategy, FunctionRenderer, FunctionRenderContext } from './types.js';\nimport { LiteralNode, OperandNode } from '../ast/expression.js';\n\r\nexport class StandardFunctionStrategy implements FunctionStrategy {\r\n protected renderers: Map<string, FunctionRenderer> = new Map();\r\n\r\n constructor() {\r\n this.registerStandard();\r\n }\r\n\r\n protected registerStandard() {\n // Register ANSI standard implementations\n this.add('COUNT', ({ compiledArgs }) => `COUNT(${compiledArgs.join(', ')})`);\n this.add('SUM', ({ compiledArgs }) => `SUM(${compiledArgs[0]})`);\n this.add('AVG', ({ compiledArgs }) => `AVG(${compiledArgs[0]})`);\n this.add('MIN', ({ compiledArgs }) => `MIN(${compiledArgs[0]})`);\n this.add('MAX', ({ compiledArgs }) => `MAX(${compiledArgs[0]})`);\n this.add('ABS', ({ compiledArgs }) => `ABS(${compiledArgs[0]})`);\n this.add('UPPER', ({ compiledArgs }) => `UPPER(${compiledArgs[0]})`);\n this.add('LOWER', ({ compiledArgs }) => `LOWER(${compiledArgs[0]})`);\n this.add('LENGTH', ({ compiledArgs }) => `LENGTH(${compiledArgs[0]})`);\r\n this.add('TRIM', ({ compiledArgs }) => `TRIM(${compiledArgs[0]})`);\r\n this.add('LTRIM', ({ compiledArgs }) => `LTRIM(${compiledArgs[0]})`);\r\n this.add('RTRIM', ({ compiledArgs }) => `RTRIM(${compiledArgs[0]})`);\r\n this.add('SUBSTRING', ({ compiledArgs }) => `SUBSTRING(${compiledArgs.join(', ')})`);\r\n this.add('CONCAT', ({ compiledArgs }) => `CONCAT(${compiledArgs.join(', ')})`);\r\n this.add('NOW', () => `NOW()`);\r\n this.add('CURRENT_DATE', () => `CURRENT_DATE`);\r\n this.add('CURRENT_TIME', () => `CURRENT_TIME`);\r\n this.add('EXTRACT', ({ compiledArgs }) => `EXTRACT(${compiledArgs[0]} FROM ${compiledArgs[1]})`);\r\n this.add('YEAR', ({ compiledArgs }) => `EXTRACT(YEAR FROM ${compiledArgs[0]})`);\r\n this.add('MONTH', ({ compiledArgs }) => `EXTRACT(MONTH FROM ${compiledArgs[0]})`);\r\n this.add('DAY', ({ compiledArgs }) => `EXTRACT(DAY FROM ${compiledArgs[0]})`);\r\n this.add('DATE_ADD', ({ compiledArgs }) => `(${compiledArgs[0]} + INTERVAL ${compiledArgs[1]} ${compiledArgs[2]})`);\r\n this.add('DATE_SUB', ({ compiledArgs }) => `(${compiledArgs[0]} - INTERVAL ${compiledArgs[1]} ${compiledArgs[2]})`);\r\n this.add('DATE_DIFF', ({ compiledArgs }) => `DATEDIFF(${compiledArgs[0]}, ${compiledArgs[1]})`);\r\n this.add('DATE_FORMAT', ({ compiledArgs }) => `DATE_FORMAT(${compiledArgs[0]}, ${compiledArgs[1]})`);\r\n this.add('UNIX_TIMESTAMP', () => `UNIX_TIMESTAMP()`);\r\n this.add('FROM_UNIXTIME', ({ compiledArgs }) => `FROM_UNIXTIME(${compiledArgs[0]})`);\r\n this.add('END_OF_MONTH', ({ compiledArgs }) => `LAST_DAY(${compiledArgs[0]})`);\r\n this.add('DAY_OF_WEEK', ({ compiledArgs }) => `DAYOFWEEK(${compiledArgs[0]})`);\r\n this.add('WEEK_OF_YEAR', ({ compiledArgs }) => `WEEKOFYEAR(${compiledArgs[0]})`);\n this.add('DATE_TRUNC', ({ compiledArgs }) => `DATE_TRUNC(${compiledArgs[0]}, ${compiledArgs[1]})`);\n this.add('GROUP_CONCAT', ctx => this.renderGroupConcat(ctx));\n }\r\n\r\n protected add(name: string, renderer: FunctionRenderer) {\r\n this.renderers.set(name, renderer);\r\n }\r\n\r\n getRenderer(name: string): FunctionRenderer | undefined {\n return this.renderers.get(name);\n }\n\n private renderGroupConcat(ctx: FunctionRenderContext): string {\n const arg = ctx.compiledArgs[0];\n const orderClause = this.buildOrderByExpression(ctx);\n const orderSegment = orderClause ? ` ${orderClause}` : '';\n const separatorClause = this.formatGroupConcatSeparator(ctx);\n return `GROUP_CONCAT(${arg}${orderSegment}${separatorClause})`;\n }\n\n protected buildOrderByExpression(ctx: FunctionRenderContext): string {\n const orderBy = ctx.node.orderBy;\n if (!orderBy || orderBy.length === 0) {\n return '';\n }\n const parts = orderBy.map(order => `${ctx.compileOperand(order.column)} ${order.direction}`);\n return `ORDER BY ${parts.join(', ')}`;\n }\n\n protected formatGroupConcatSeparator(ctx: FunctionRenderContext): string {\n if (!ctx.node.separator) {\n return '';\n }\n return ` SEPARATOR ${ctx.compileOperand(ctx.node.separator)}`;\n }\n\n protected getGroupConcatSeparatorOperand(ctx: FunctionRenderContext): OperandNode {\n return ctx.node.separator ?? StandardFunctionStrategy.DEFAULT_GROUP_CONCAT_SEPARATOR;\n }\n\n protected static readonly DEFAULT_GROUP_CONCAT_SEPARATOR: LiteralNode = {\n type: 'Literal',\n value: ','\n };\n}\n","import {\r\n SelectQueryNode,\r\n InsertQueryNode,\r\n UpdateQueryNode,\r\n DeleteQueryNode,\r\n SetOperationKind,\r\n CommonTableExpressionNode\r\n} from '../ast/query.js';\r\nimport {\r\n ExpressionNode,\r\n BinaryExpressionNode,\r\n LogicalExpressionNode,\r\n NullExpressionNode,\r\n InExpressionNode,\r\n ExistsExpressionNode,\r\n LiteralNode,\r\n ColumnNode,\r\n OperandNode,\r\n FunctionNode,\r\n JsonPathNode,\r\n ScalarSubqueryNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode,\r\n BetweenExpressionNode\r\n} from '../ast/expression.js';\r\nimport { DialectName } from '../sql/sql.js';\r\nimport type { FunctionStrategy } from '../functions/types.js';\r\nimport { StandardFunctionStrategy } from '../functions/standard-strategy.js';\r\n\r\n/**\r\n * Context for SQL compilation with parameter management\r\n */\r\nexport interface CompilerContext {\r\n /** Array of parameters */\r\n params: unknown[];\r\n /** Function to add a parameter and get its placeholder */\r\n addParameter(value: unknown): string;\r\n}\r\n\r\n/**\r\n * Result of SQL compilation\r\n */\r\nexport interface CompiledQuery {\r\n /** Generated SQL string */\r\n sql: string;\r\n /** Parameters for the query */\r\n params: unknown[];\r\n}\r\n\r\nexport interface SelectCompiler {\r\n compileSelect(ast: SelectQueryNode): CompiledQuery;\r\n}\r\n\r\nexport interface InsertCompiler {\r\n compileInsert(ast: InsertQueryNode): CompiledQuery;\r\n}\r\n\r\nexport interface UpdateCompiler {\r\n compileUpdate(ast: UpdateQueryNode): CompiledQuery;\r\n}\r\n\r\nexport interface DeleteCompiler {\r\n compileDelete(ast: DeleteQueryNode): CompiledQuery;\r\n}\r\n\r\n/**\r\n * Abstract base class for SQL dialect implementations\r\n */\r\nexport abstract class Dialect\r\n implements SelectCompiler, InsertCompiler, UpdateCompiler, DeleteCompiler {\r\n /** Dialect identifier used for function rendering and formatting */\r\n protected abstract readonly dialect: DialectName;\r\n\r\n /**\r\n * Compiles a SELECT query AST to SQL\r\n * @param ast - Query AST to compile\r\n * @returns Compiled query with SQL and parameters\r\n */\r\n compileSelect(ast: SelectQueryNode): CompiledQuery {\r\n const ctx = this.createCompilerContext();\r\n const normalized = this.normalizeSelectAst(ast);\r\n const rawSql = this.compileSelectAst(normalized, ctx).trim();\r\n const sql = rawSql.endsWith(';') ? rawSql : `${rawSql};`;\r\n return {\r\n sql,\r\n params: [...ctx.params]\r\n };\r\n }\r\n\r\n compileInsert(ast: InsertQueryNode): CompiledQuery {\r\n const ctx = this.createCompilerContext();\r\n const rawSql = this.compileInsertAst(ast, ctx).trim();\r\n const sql = rawSql.endsWith(';') ? rawSql : `${rawSql};`;\r\n return {\r\n sql,\r\n params: [...ctx.params]\r\n };\r\n }\r\n\r\n compileUpdate(ast: UpdateQueryNode): CompiledQuery {\r\n const ctx = this.createCompilerContext();\r\n const rawSql = this.compileUpdateAst(ast, ctx).trim();\r\n const sql = rawSql.endsWith(';') ? rawSql : `${rawSql};`;\r\n return {\r\n sql,\r\n params: [...ctx.params]\r\n };\r\n }\r\n\r\n compileDelete(ast: DeleteQueryNode): CompiledQuery {\r\n const ctx = this.createCompilerContext();\r\n const rawSql = this.compileDeleteAst(ast, ctx).trim();\r\n const sql = rawSql.endsWith(';') ? rawSql : `${rawSql};`;\r\n return {\r\n sql,\r\n params: [...ctx.params]\r\n };\r\n }\r\n\r\n supportsReturning(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Compiles SELECT query AST to SQL (to be implemented by concrete dialects)\r\n * @param ast - Query AST\r\n * @param ctx - Compiler context\r\n * @returns SQL string\r\n */\r\n protected abstract compileSelectAst(ast: SelectQueryNode, ctx: CompilerContext): string;\r\n\r\n protected abstract compileInsertAst(ast: InsertQueryNode, ctx: CompilerContext): string;\r\n protected abstract compileUpdateAst(ast: UpdateQueryNode, ctx: CompilerContext): string;\r\n protected abstract compileDeleteAst(ast: DeleteQueryNode, ctx: CompilerContext): string;\r\n\r\n /**\r\n * Quotes an SQL identifier (to be implemented by concrete dialects)\r\n * @param id - Identifier to quote\r\n * @returns Quoted identifier\r\n */\r\n abstract quoteIdentifier(id: string): string;\r\n\r\n /**\r\n * Compiles a WHERE clause\r\n * @param where - WHERE expression\r\n * @param ctx - Compiler context\r\n * @returns SQL WHERE clause or empty string\r\n */\r\n protected compileWhere(where: ExpressionNode | undefined, ctx: CompilerContext): string {\r\n if (!where) return '';\r\n return ` WHERE ${this.compileExpression(where, ctx)}`;\r\n }\r\n\r\n protected compileReturning(\r\n returning: ColumnNode[] | undefined,\r\n ctx: CompilerContext\r\n ): string {\r\n if (!returning || returning.length === 0) return '';\r\n throw new Error('RETURNING is not supported by this dialect.');\r\n }\r\n\r\n /**\r\n * Generates subquery for EXISTS expressions\r\n * Rule: Always forces SELECT 1, ignoring column list\r\n * Maintains FROM, JOINs, WHERE, GROUP BY, ORDER BY, LIMIT/OFFSET\r\n * Does not add ';' at the end\r\n * @param ast - Query AST\r\n * @param ctx - Compiler context\r\n * @returns SQL for EXISTS subquery\r\n */\r\n protected compileSelectForExists(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n const normalized = this.normalizeSelectAst(ast);\r\n const full = this.compileSelectAst(normalized, ctx).trim().replace(/;$/, '');\r\n\r\n // When the subquery is a set operation, wrap it as a derived table to keep valid syntax.\r\n if (normalized.setOps && normalized.setOps.length > 0) {\r\n return `SELECT 1 FROM (${full}) AS _exists`;\r\n }\r\n\r\n const upper = full.toUpperCase();\r\n const fromIndex = upper.indexOf(' FROM ');\r\n if (fromIndex === -1) {\r\n return full;\r\n }\r\n\r\n const tail = full.slice(fromIndex);\r\n return `SELECT 1${tail}`;\r\n }\r\n\r\n /**\r\n * Creates a new compiler context\r\n * @returns Compiler context with parameter management\r\n */\r\n protected createCompilerContext(): CompilerContext {\r\n const params: unknown[] = [];\r\n let counter = 0;\r\n return {\r\n params,\r\n addParameter: (value: unknown) => {\r\n counter += 1;\r\n params.push(value);\r\n return this.formatPlaceholder(counter);\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Formats a parameter placeholder\r\n * @param index - Parameter index\r\n * @returns Formatted placeholder string\r\n */\r\n protected formatPlaceholder(index: number): string {\r\n return '?';\r\n }\r\n\r\n /**\r\n * Whether the current dialect supports a given set operation.\r\n * Override in concrete dialects to restrict support.\r\n */\r\n protected supportsSetOperation(kind: SetOperationKind): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * Validates set-operation semantics:\r\n * - Ensures the dialect supports requested operators.\r\n * - Enforces that only the outermost compound query may have ORDER/LIMIT/OFFSET.\r\n * @param ast - Query to validate\r\n * @param isOutermost - Whether this node is the outermost compound query\r\n */\r\n protected validateSetOperations(ast: SelectQueryNode, isOutermost = true): void {\r\n const hasSetOps = !!(ast.setOps && ast.setOps.length);\r\n if (!isOutermost && (ast.orderBy || ast.limit !== undefined || ast.offset !== undefined)) {\r\n throw new Error('ORDER BY / LIMIT / OFFSET are only allowed on the outermost compound query.');\r\n }\r\n\r\n if (hasSetOps) {\r\n for (const op of ast.setOps!) {\r\n if (!this.supportsSetOperation(op.operator)) {\r\n throw new Error(`Set operation ${op.operator} is not supported by this dialect.`);\r\n }\r\n this.validateSetOperations(op.query, false);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Hoists CTEs from set-operation operands to the outermost query so WITH appears once.\r\n * @param ast - Query AST\r\n * @returns Normalized AST without inner CTEs and a list of hoisted CTEs\r\n */\r\n private hoistCtes(ast: SelectQueryNode): { normalized: SelectQueryNode; hoistedCtes: CommonTableExpressionNode[] } {\r\n let hoisted: CommonTableExpressionNode[] = [];\r\n\r\n const normalizedSetOps = ast.setOps?.map(op => {\r\n const { normalized: child, hoistedCtes: childHoisted } = this.hoistCtes(op.query);\r\n const childCtes = child.ctes ?? [];\r\n if (childCtes.length) {\r\n hoisted = hoisted.concat(childCtes);\r\n }\r\n hoisted = hoisted.concat(childHoisted);\r\n const queryWithoutCtes = childCtes.length ? { ...child, ctes: undefined } : child;\r\n return { ...op, query: queryWithoutCtes };\r\n });\r\n\r\n const normalized: SelectQueryNode = normalizedSetOps ? { ...ast, setOps: normalizedSetOps } : ast;\r\n return { normalized, hoistedCtes: hoisted };\r\n }\r\n\r\n /**\r\n * Normalizes a SELECT AST before compilation (validation + CTE hoisting).\r\n * @param ast - Query AST\r\n * @returns Normalized query AST\r\n */\r\n protected normalizeSelectAst(ast: SelectQueryNode): SelectQueryNode {\r\n this.validateSetOperations(ast, true);\r\n const { normalized, hoistedCtes } = this.hoistCtes(ast);\r\n const combinedCtes = [...(normalized.ctes ?? []), ...hoistedCtes];\r\n return combinedCtes.length ? { ...normalized, ctes: combinedCtes } : normalized;\r\n }\r\n\r\n private readonly expressionCompilers: Map<string, (node: ExpressionNode, ctx: CompilerContext) => string>;\r\n private readonly operandCompilers: Map<string, (node: OperandNode, ctx: CompilerContext) => string>;\r\n protected readonly functionStrategy: FunctionStrategy;\r\n\r\n protected constructor(functionStrategy?: FunctionStrategy) {\r\n this.expressionCompilers = new Map();\r\n this.operandCompilers = new Map();\r\n this.functionStrategy = functionStrategy || new StandardFunctionStrategy();\r\n this.registerDefaultOperandCompilers();\r\n this.registerDefaultExpressionCompilers();\r\n }\r\n\r\n /**\r\n * Creates a new Dialect instance (for testing purposes)\r\n * @param functionStrategy - Optional function strategy\r\n * @returns New Dialect instance\r\n */\r\n static create(functionStrategy?: FunctionStrategy): Dialect {\r\n // Create a minimal concrete implementation for testing\r\n class TestDialect extends Dialect {\r\n protected readonly dialect: DialectName = 'sqlite';\r\n quoteIdentifier(id: string): string {\r\n return `\"${id}\"`;\r\n }\r\n protected compileSelectAst(): never {\r\n throw new Error('Not implemented');\r\n }\r\n protected compileInsertAst(): never {\r\n throw new Error('Not implemented');\r\n }\r\n protected compileUpdateAst(): never {\r\n throw new Error('Not implemented');\r\n }\r\n protected compileDeleteAst(): never {\r\n throw new Error('Not implemented');\r\n }\r\n }\r\n return new TestDialect(functionStrategy);\r\n }\r\n\r\n /**\r\n * Registers an expression compiler for a specific node type\r\n * @param type - Expression node type\r\n * @param compiler - Compiler function\r\n */\r\n protected registerExpressionCompiler<T extends ExpressionNode>(type: T['type'], compiler: (node: T, ctx: CompilerContext) => string): void {\r\n this.expressionCompilers.set(type, compiler as (node: ExpressionNode, ctx: CompilerContext) => string);\r\n }\r\n\r\n /**\r\n * Registers an operand compiler for a specific node type\r\n * @param type - Operand node type\r\n * @param compiler - Compiler function\r\n */\r\n protected registerOperandCompiler<T extends OperandNode>(type: T['type'], compiler: (node: T, ctx: CompilerContext) => string): void {\r\n this.operandCompilers.set(type, compiler as (node: OperandNode, ctx: CompilerContext) => string);\r\n }\r\n\r\n /**\r\n * Compiles an expression node\r\n * @param node - Expression node to compile\r\n * @param ctx - Compiler context\r\n * @returns Compiled SQL expression\r\n */\r\n protected compileExpression(node: ExpressionNode, ctx: CompilerContext): string {\r\n const compiler = this.expressionCompilers.get(node.type);\r\n if (!compiler) {\r\n throw new Error(`Unsupported expression node type \"${node.type}\" for ${this.constructor.name}`);\r\n }\r\n return compiler(node, ctx);\r\n }\r\n\r\n /**\r\n * Compiles an operand node\r\n * @param node - Operand node to compile\r\n * @param ctx - Compiler context\r\n * @returns Compiled SQL operand\r\n */\r\n protected compileOperand(node: OperandNode, ctx: CompilerContext): string {\r\n const compiler = this.operandCompilers.get(node.type);\r\n if (!compiler) {\r\n throw new Error(`Unsupported operand node type \"${node.type}\" for ${this.constructor.name}`);\r\n }\r\n return compiler(node, ctx);\r\n }\r\n\r\n private registerDefaultExpressionCompilers(): void {\r\n this.registerExpressionCompiler('BinaryExpression', (binary: BinaryExpressionNode, ctx) => {\r\n const left = this.compileOperand(binary.left, ctx);\r\n const right = this.compileOperand(binary.right, ctx);\r\n const base = `${left} ${binary.operator} ${right}`;\r\n if (binary.escape) {\r\n const escapeOperand = this.compileOperand(binary.escape, ctx);\r\n return `${base} ESCAPE ${escapeOperand}`;\r\n }\r\n return base;\r\n });\r\n\r\n this.registerExpressionCompiler('LogicalExpression', (logical: LogicalExpressionNode, ctx) => {\r\n if (logical.operands.length === 0) return '';\r\n const parts = logical.operands.map(op => {\r\n const compiled = this.compileExpression(op, ctx);\r\n return op.type === 'LogicalExpression' ? `(${compiled})` : compiled;\r\n });\r\n return parts.join(` ${logical.operator} `);\r\n });\r\n\r\n this.registerExpressionCompiler('NullExpression', (nullExpr: NullExpressionNode, ctx) => {\r\n const left = this.compileOperand(nullExpr.left, ctx);\r\n return `${left} ${nullExpr.operator}`;\r\n });\r\n\r\n this.registerExpressionCompiler('InExpression', (inExpr: InExpressionNode, ctx) => {\r\n const left = this.compileOperand(inExpr.left, ctx);\r\n const values = inExpr.right.map(v => this.compileOperand(v, ctx)).join(', ');\r\n return `${left} ${inExpr.operator} (${values})`;\r\n });\r\n\r\n this.registerExpressionCompiler('ExistsExpression', (existsExpr: ExistsExpressionNode, ctx) => {\r\n const subquerySql = this.compileSelectForExists(existsExpr.subquery, ctx);\r\n return `${existsExpr.operator} (${subquerySql})`;\r\n });\r\n\r\n this.registerExpressionCompiler('BetweenExpression', (betweenExpr: BetweenExpressionNode, ctx) => {\r\n const left = this.compileOperand(betweenExpr.left, ctx);\r\n const lower = this.compileOperand(betweenExpr.lower, ctx);\r\n const upper = this.compileOperand(betweenExpr.upper, ctx);\r\n return `${left} ${betweenExpr.operator} ${lower} AND ${upper}`;\r\n });\r\n }\r\n\r\n private registerDefaultOperandCompilers(): void {\r\n this.registerOperandCompiler('Literal', (literal: LiteralNode, ctx) => ctx.addParameter(literal.value));\r\n\r\n this.registerOperandCompiler('Column', (column: ColumnNode, _ctx) => {\r\n return `${this.quoteIdentifier(column.table)}.${this.quoteIdentifier(column.name)}`;\r\n });\r\n this.registerOperandCompiler('Function', (fnNode: FunctionNode, ctx) =>\r\n this.compileFunctionOperand(fnNode, ctx)\r\n );\r\n this.registerOperandCompiler('JsonPath', (path: JsonPathNode, _ctx) => this.compileJsonPath(path));\r\n\r\n this.registerOperandCompiler('ScalarSubquery', (node: ScalarSubqueryNode, ctx) => {\r\n const sql = this.compileSelectAst(node.query, ctx).trim().replace(/;$/, '');\r\n return `(${sql})`;\r\n });\r\n\r\n this.registerOperandCompiler('CaseExpression', (node: CaseExpressionNode, ctx) => {\r\n const parts = ['CASE'];\r\n for (const { when, then } of node.conditions) {\r\n parts.push(`WHEN ${this.compileExpression(when, ctx)} THEN ${this.compileOperand(then, ctx)}`);\r\n }\r\n if (node.else) {\r\n parts.push(`ELSE ${this.compileOperand(node.else, ctx)}`);\r\n }\r\n parts.push('END');\r\n return parts.join(' ');\r\n });\r\n\r\n this.registerOperandCompiler('WindowFunction', (node: WindowFunctionNode, ctx) => {\r\n let result = `${node.name}(`;\r\n if (node.args.length > 0) {\r\n result += node.args.map(arg => this.compileOperand(arg, ctx)).join(', ');\r\n }\r\n result += ') OVER (';\r\n\r\n const parts: string[] = [];\r\n\r\n if (node.partitionBy && node.partitionBy.length > 0) {\r\n const partitionClause = 'PARTITION BY ' + node.partitionBy.map(col =>\r\n `${this.quoteIdentifier(col.table)}.${this.quoteIdentifier(col.name)}`\r\n ).join(', ');\r\n parts.push(partitionClause);\r\n }\r\n\r\n if (node.orderBy && node.orderBy.length > 0) {\r\n const orderClause = 'ORDER BY ' + node.orderBy.map(o =>\r\n `${this.quoteIdentifier(o.column.table)}.${this.quoteIdentifier(o.column.name)} ${o.direction}`\r\n ).join(', ');\r\n parts.push(orderClause);\r\n }\r\n\r\n result += parts.join(' ');\r\n result += ')';\r\n\r\n return result;\r\n });\r\n }\r\n\r\n // Default fallback, should be overridden by dialects if supported\r\n protected compileJsonPath(node: JsonPathNode): string {\r\n throw new Error(\"JSON Path not supported by this dialect\");\r\n }\r\n\r\n /**\r\n * Compiles a function operand, using the dialect's function strategy.\r\n */\r\n protected compileFunctionOperand(fnNode: FunctionNode, ctx: CompilerContext): string {\n const compiledArgs = fnNode.args.map(arg => this.compileOperand(arg, ctx));\n const renderer = this.functionStrategy.getRenderer(fnNode.name);\n if (renderer) {\n return renderer({\n node: fnNode,\n compiledArgs,\n compileOperand: operand => this.compileOperand(operand, ctx)\n });\n }\n return `${fnNode.name}(${compiledArgs.join(', ')})`;\n }\n}\r\n","import { CompilerContext } from '../abstract.js';\r\nimport { SqlDialectBase } from './sql-dialect.js';\r\n\r\nexport interface FunctionTableNode {\r\n type: 'FunctionTable';\r\n schema?: string;\r\n name: string;\r\n args?: unknown[];\r\n lateral?: boolean;\r\n withOrdinality?: boolean;\r\n alias?: string;\r\n columnAliases?: string[];\r\n}\r\n\r\n/**\r\n * Formatter for function table expressions (e.g., LATERAL unnest(...) WITH ORDINALITY).\r\n * Encapsulates logic for generating SQL function table syntax including LATERAL, aliases, and column lists.\r\n */\r\nexport class FunctionTableFormatter {\r\n /**\r\n * Formats a function table node into SQL syntax.\r\n * @param fn - The function table node containing schema, name, args, and aliases.\r\n * @param ctx - Optional compiler context for operand compilation.\r\n * @param dialect - The dialect instance for compiling operands.\r\n * @returns SQL function table expression (e.g., \"LATERAL schema.func(args) WITH ORDINALITY AS alias(col1, col2)\").\r\n */\r\n static format(fn: FunctionTableNode, ctx?: CompilerContext, dialect?: SqlDialectBase): string {\r\n const schemaPart = this.formatSchema(fn, dialect);\r\n const args = this.formatArgs(fn, ctx, dialect);\r\n const base = this.formatBase(fn, schemaPart, args, dialect);\r\n const lateral = this.formatLateral(fn);\r\n const alias = this.formatAlias(fn, dialect);\r\n const colAliases = this.formatColumnAliases(fn, dialect);\r\n return `${lateral}${base}${alias}${colAliases}`;\r\n }\r\n\r\n /**\r\n * Formats the schema prefix for the function name.\r\n * @param fn - The function table node.\r\n * @param dialect - The dialect instance for quoting identifiers.\r\n * @returns Schema prefix (e.g., \"schema.\") or empty string.\r\n * @internal\r\n */\r\n private static formatSchema(fn: FunctionTableNode, dialect?: SqlDialectBase): string {\r\n if (!fn.schema) return '';\r\n const quoted = dialect ? dialect.quoteIdentifier(fn.schema) : fn.schema;\r\n return `${quoted}.`;\r\n }\r\n\r\n /**\r\n * Formats function arguments into SQL syntax.\r\n * @param fn - The function table node containing arguments.\r\n * @param ctx - Optional compiler context for operand compilation.\r\n * @param dialect - The dialect instance for compiling operands.\r\n * @returns Comma-separated function arguments.\r\n * @internal\r\n */\r\n private static formatArgs(fn: FunctionTableNode, ctx?: CompilerContext, dialect?: SqlDialectBase): string {\r\n return (fn.args || [])\r\n .map((a: any) => {\r\n if (ctx && dialect) {\r\n return (dialect as any).compileOperand(a, ctx);\r\n }\r\n return String(a);\r\n })\r\n .join(', ');\r\n }\r\n\r\n /**\r\n * Formats the base function call with WITH ORDINALITY if present.\r\n * @param fn - The function table node.\r\n * @param schemaPart - Formatted schema prefix.\r\n * @param args - Formatted function arguments.\r\n * @param dialect - The dialect instance for quoting identifiers.\r\n * @returns Base function call expression (e.g., \"schema.func(args) WITH ORDINALITY\").\r\n * @internal\r\n */\r\n private static formatBase(fn: FunctionTableNode, schemaPart: string, args: string, dialect?: SqlDialectBase): string {\r\n const ordinality = fn.withOrdinality ? ' WITH ORDINALITY' : '';\r\n const quoted = dialect ? dialect.quoteIdentifier(fn.name) : fn.name;\r\n return `${schemaPart}${quoted}(${args})${ordinality}`;\r\n }\r\n\r\n /**\r\n * Formats the LATERAL keyword if present.\r\n * @param fn - The function table node.\r\n * @returns \"LATERAL \" or empty string.\r\n * @internal\r\n */\r\n private static formatLateral(fn: FunctionTableNode): string {\r\n return fn.lateral ? 'LATERAL ' : '';\r\n }\r\n\r\n /**\r\n * Formats the table alias for the function table.\r\n * @param fn - The function table node.\r\n * @param dialect - The dialect instance for quoting identifiers.\r\n * @returns \" AS alias\" or empty string.\r\n * @internal\r\n */\r\n private static formatAlias(fn: FunctionTableNode, dialect?: SqlDialectBase): string {\r\n if (!fn.alias) return '';\r\n const quoted = dialect ? dialect.quoteIdentifier(fn.alias) : fn.alias;\r\n return ` AS ${quoted}`;\r\n }\r\n\r\n /**\r\n * Formats column aliases for the function table result columns.\r\n * @param fn - The function table node containing column aliases.\r\n * @param dialect - The dialect instance for quoting identifiers.\r\n * @returns \"(col1, col2, ...)\" or empty string.\r\n * @internal\r\n */\r\n private static formatColumnAliases(fn: FunctionTableNode, dialect?: SqlDialectBase): string {\r\n if (!fn.columnAliases || !fn.columnAliases.length) return '';\r\n const aliases = fn.columnAliases\r\n .map(col => dialect ? dialect.quoteIdentifier(col) : col)\r\n .join(', ');\r\n return `(${aliases})`;\r\n }\r\n}\r\n\r\nexport interface FunctionTableNode {\r\n type: 'FunctionTable';\r\n schema?: string;\r\n name: string;\r\n args?: unknown[];\r\n lateral?: boolean;\r\n withOrdinality?: boolean;\r\n alias?: string;\r\n columnAliases?: string[];\r\n}\r\n","/**\r\n * Strategy interface for compiling pagination clauses.\r\n * Allows dialects to customize how pagination (LIMIT/OFFSET, ROWS FETCH, etc.) is generated.\r\n */\r\nexport interface PaginationStrategy {\r\n /**\r\n * Compiles pagination logic into SQL clause.\r\n * @param limit - The limit value, if present.\r\n * @param offset - The offset value, if present.\r\n * @returns SQL pagination clause (e.g., \" LIMIT 10 OFFSET 0\") or empty string if no pagination.\r\n */\r\n compilePagination(limit?: number, offset?: number): string;\r\n}\r\n\r\n/**\r\n * Standard SQL pagination using LIMIT and OFFSET.\r\n * Implements the ANSI SQL-style pagination with LIMIT/OFFSET syntax.\r\n */\r\nexport class StandardLimitOffsetPagination implements PaginationStrategy {\r\n /**\r\n * Compiles LIMIT/OFFSET pagination clause.\r\n * @param limit - The maximum number of rows to return.\r\n * @param offset - The number of rows to skip.\r\n * @returns SQL pagination clause with LIMIT and/or OFFSET.\r\n */\r\n compilePagination(limit?: number, offset?: number): string {\r\n const parts: string[] = [];\r\n if (limit !== undefined) parts.push(`LIMIT ${limit}`);\r\n if (offset !== undefined) parts.push(`OFFSET ${offset}`);\r\n return parts.length ? ` ${parts.join(' ')}` : '';\r\n }\r\n}\r\n","import { SelectQueryNode } from '../../ast/query.js';\r\nimport { CompilerContext } from '../abstract.js';\r\n\r\n/**\r\n * Compiler for Common Table Expressions (CTEs).\r\n * Handles compilation of WITH and WITH RECURSIVE clauses.\r\n */\r\nexport class CteCompiler {\r\n /**\r\n * Compiles CTEs (WITH clauses) including recursive CTEs.\r\n * @param ast - The SELECT query AST containing CTE definitions.\r\n * @param ctx - The compiler context for expression compilation.\r\n * @param quoteIdentifier - Function to quote identifiers according to dialect rules.\r\n * @param compileSelectAst - Function to recursively compile SELECT query ASTs.\r\n * @param normalizeSelectAst - Function to normalize SELECT query ASTs before compilation.\r\n * @param stripTrailingSemicolon - Function to remove trailing semicolons from SQL.\r\n * @returns SQL WITH clause string (e.g., \"WITH cte_name AS (...) \") or empty string if no CTEs.\r\n */\r\n static compileCtes(ast: SelectQueryNode, ctx: CompilerContext, quoteIdentifier: (id: string) => string, compileSelectAst: (ast: SelectQueryNode, ctx: CompilerContext) => string, normalizeSelectAst: (ast: SelectQueryNode) => SelectQueryNode, stripTrailingSemicolon: (sql: string) => string): string {\r\n if (!ast.ctes || ast.ctes.length === 0) return '';\r\n const hasRecursive = ast.ctes.some(cte => cte.recursive);\r\n const prefix = hasRecursive ? 'WITH RECURSIVE ' : 'WITH ';\r\n const cteDefs = ast.ctes.map(cte => {\r\n const name = quoteIdentifier(cte.name);\r\n const cols = cte.columns && cte.columns.length\r\n ? `(${cte.columns.map(c => quoteIdentifier(c)).join(', ')})`\r\n : '';\r\n const query = stripTrailingSemicolon(compileSelectAst(normalizeSelectAst(cte.query), ctx));\r\n return `${name}${cols} AS (${query})`;\r\n }).join(', ');\r\n return `${prefix}${cteDefs} `;\r\n }\r\n}\r\n","import { ColumnNode } from '../../ast/expression.js';\r\nimport { CompilerContext } from '../abstract.js';\r\n\r\n/**\r\n * Strategy interface for handling RETURNING clauses in DML statements (INSERT, UPDATE, DELETE).\r\n * Different SQL dialects have varying levels of support for RETURNING clauses.\r\n */\r\nexport interface ReturningStrategy {\r\n /**\r\n * Compiles a RETURNING clause for DML statements.\r\n * @param returning - Array of columns to return, or undefined if none.\r\n * @param ctx - The compiler context for expression compilation.\r\n * @returns SQL RETURNING clause or empty string if not supported.\r\n * @throws Error if RETURNING is not supported by this dialect.\r\n */\r\n compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string;\r\n /**\r\n * Formats column list for RETURNING clause.\r\n * @param returning - Array of columns to format.\r\n * @param quoteIdentifier - Function to quote identifiers according to dialect rules.\r\n * @returns Formatted column list (e.g., \"table.col1, table.col2\").\r\n */\r\n formatReturningColumns(returning: ColumnNode[], quoteIdentifier: (id: string) => string): string;\r\n}\r\n\r\n/**\r\n * Default RETURNING strategy that throws an error when RETURNING is used.\r\n * Use this for dialects that don't support RETURNING clauses.\r\n */\r\nexport class NoReturningStrategy implements ReturningStrategy {\r\n /**\r\n * Throws an error as RETURNING is not supported.\r\n * @param returning - Columns to return (causes error if non-empty).\r\n * @param _ctx - Compiler context (unused).\r\n * @throws Error indicating RETURNING is not supported.\r\n */\r\n compileReturning(returning: ColumnNode[] | undefined, _ctx: CompilerContext): string {\r\n if (!returning || returning.length === 0) return '';\r\n throw new Error('RETURNING is not supported by this dialect.');\r\n }\r\n /**\r\n * Formats column names for RETURNING clause.\r\n * @param returning - Columns to format.\r\n * @param quoteIdentifier - Function to quote identifiers according to dialect rules.\r\n * @returns Simple comma-separated column names.\r\n */\r\n formatReturningColumns(returning: ColumnNode[], quoteIdentifier: (id: string) => string): string {\r\n return returning\r\n .map(column => {\r\n const tablePart = column.table ? `${quoteIdentifier(column.table)}.` : '';\r\n const aliasPart = column.alias ? ` AS ${quoteIdentifier(column.alias)}` : '';\r\n return `${tablePart}${quoteIdentifier(column.name)}${aliasPart}`;\r\n })\r\n .join(', ');\r\n }\r\n}\r\n","import { SelectQueryNode } from '../../ast/query.js';\r\nimport { CompilerContext } from '../abstract.js';\r\n\r\n/**\r\n * Compiler for JOIN clauses in SELECT statements.\r\n * Handles compilation of all join types (INNER, LEFT, RIGHT, FULL, CROSS).\r\n */\r\nexport class JoinCompiler {\r\n /**\r\n * Compiles all JOIN clauses from a SELECT query AST.\r\n * @param ast - The SELECT query AST containing join definitions.\r\n * @param ctx - The compiler context for expression compilation.\r\n * @param compileFrom - Function to compile table sources (tables or subqueries).\r\n * @param compileExpression - Function to compile join condition expressions.\r\n * @returns SQL JOIN clauses (e.g., \" LEFT JOIN table ON condition\") or empty string if no joins.\r\n */\r\n static compileJoins(ast: SelectQueryNode, ctx: CompilerContext, compileFrom: (from: any, ctx: CompilerContext) => string, compileExpression: (expr: any, ctx: CompilerContext) => string): string {\r\n if (!ast.joins || ast.joins.length === 0) return '';\r\n const parts = ast.joins.map(j => {\r\n const table = compileFrom(j.table as any, ctx);\r\n const cond = compileExpression(j.condition, ctx);\r\n return `${j.kind} JOIN ${table} ON ${cond}`;\r\n });\r\n return ` ${parts.join(' ')}`;\r\n }\r\n}\r\n","import { SelectQueryNode } from '../../ast/query.js';\r\n\r\n/**\r\n * Compiler for GROUP BY clauses in SELECT statements.\r\n * Handles compilation of column grouping expressions.\r\n */\r\nexport class GroupByCompiler {\r\n /**\r\n * Compiles GROUP BY clause from a SELECT query AST.\r\n * @param ast - The SELECT query AST containing grouping columns.\r\n * @param quoteIdentifier - Function to quote identifiers according to dialect rules.\r\n * @returns SQL GROUP BY clause (e.g., \" GROUP BY table.col1, table.col2\") or empty string if no grouping.\r\n */\r\n static compileGroupBy(ast: SelectQueryNode, quoteIdentifier: (id: string) => string): string {\r\n if (!ast.groupBy || ast.groupBy.length === 0) return '';\r\n const cols = ast.groupBy\r\n .map(c => `${quoteIdentifier(c.table)}.${quoteIdentifier(c.name)}`)\r\n .join(', ');\r\n return ` GROUP BY ${cols}`;\r\n }\r\n}\r\n","import { SelectQueryNode } from '../../ast/query.js';\r\n\r\n/**\r\n * Compiler for ORDER BY clauses in SELECT statements.\r\n * Handles compilation of sorting expressions with direction (ASC/DESC).\r\n */\r\nexport class OrderByCompiler {\r\n /**\r\n * Compiles ORDER BY clause from a SELECT query AST.\r\n * @param ast - The SELECT query AST containing sort specifications.\r\n * @param quoteIdentifier - Function to quote identifiers according to dialect rules.\r\n * @returns SQL ORDER BY clause (e.g., \" ORDER BY table.col1 ASC, table.col2 DESC\") or empty string if no ordering.\r\n */\r\n static compileOrderBy(ast: SelectQueryNode, quoteIdentifier: (id: string) => string): string {\r\n if (!ast.orderBy || ast.orderBy.length === 0) return '';\r\n const parts = ast.orderBy\r\n .map(o => `${quoteIdentifier(o.column.table)}.${quoteIdentifier(o.column.name)} ${o.direction}`)\r\n .join(', ');\r\n return ` ORDER BY ${parts}`;\r\n }\r\n}\r\n","import { CompilerContext, Dialect } from '../abstract.js';\r\nimport { SelectQueryNode, InsertQueryNode, UpdateQueryNode, DeleteQueryNode, TableSourceNode, DerivedTableNode, FunctionTableNode } from '../../ast/query.js';\nimport { ColumnNode } from '../../ast/expression.js';\r\nimport { FunctionTableFormatter } from './function-table-formatter.js';\nimport { PaginationStrategy, StandardLimitOffsetPagination } from './pagination-strategy.js';\r\nimport { CteCompiler } from './cte-compiler.js';\r\nimport { ReturningStrategy, NoReturningStrategy } from './returning-strategy.js';\r\nimport { JoinCompiler } from './join-compiler.js';\r\nimport { GroupByCompiler } from './groupby-compiler.js';\r\nimport { OrderByCompiler } from './orderby-compiler.js';\r\n\r\n\r\nexport abstract class SqlDialectBase extends Dialect {\r\n abstract quoteIdentifier(id: string): string;\r\n\r\n protected paginationStrategy: PaginationStrategy = new StandardLimitOffsetPagination();\r\n protected returningStrategy: ReturningStrategy = new NoReturningStrategy();\r\n\r\n protected compileSelectAst(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n const hasSetOps = !!(ast.setOps && ast.setOps.length);\r\n const ctes = CteCompiler.compileCtes(\r\n ast,\r\n ctx,\r\n this.quoteIdentifier.bind(this),\r\n this.compileSelectAst.bind(this),\r\n this.normalizeSelectAst?.bind(this) ?? ((a) => a),\r\n this.stripTrailingSemicolon.bind(this)\r\n );\r\n const baseAst: SelectQueryNode = hasSetOps\r\n ? { ...ast, setOps: undefined, orderBy: undefined, limit: undefined, offset: undefined }\r\n : ast;\r\n const baseSelect = this.compileSelectCore(baseAst, ctx);\r\n if (!hasSetOps) {\r\n return `${ctes}${baseSelect}`;\r\n }\r\n return this.compileSelectWithSetOps(ast, baseSelect, ctes, ctx);\r\n }\r\n\r\n private compileSelectWithSetOps(\r\n ast: SelectQueryNode,\r\n baseSelect: string,\r\n ctes: string,\r\n ctx: CompilerContext\r\n ): string {\r\n const compound = ast.setOps!\r\n .map(op => `${op.operator} ${this.wrapSetOperand(this.compileSelectAst(op.query, ctx))}`)\r\n .join(' ');\r\n const orderBy = OrderByCompiler.compileOrderBy(ast, this.quoteIdentifier.bind(this));\r\n const pagination = this.paginationStrategy.compilePagination(ast.limit, ast.offset);\r\n const combined = `${this.wrapSetOperand(baseSelect)} ${compound}`;\r\n return `${ctes}${combined}${orderBy}${pagination}`;\r\n }\r\n\r\n protected compileInsertAst(ast: InsertQueryNode, ctx: CompilerContext): string {\r\n const table = this.compileTableName(ast.into);\r\n const columnList = this.compileInsertColumnList(ast.columns);\r\n const values = this.compileInsertValues(ast.values, ctx);\r\n const returning = this.compileReturning(ast.returning, ctx);\r\n return `INSERT INTO ${table} (${columnList}) VALUES ${values}${returning}`;\r\n }\r\n\r\n protected compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string {\r\n return this.returningStrategy.compileReturning(returning, ctx);\r\n }\r\n\r\n private compileInsertColumnList(columns: ColumnNode[]): string {\n return columns.map(column => this.quoteIdentifier(column.name)).join(', ');\n }\n\r\n private compileInsertValues(values: any[][], ctx: CompilerContext): string {\r\n return values\r\n .map(row => `(${row.map(value => this.compileOperand(value, ctx)).join(', ')})`)\r\n .join(', ');\r\n }\r\n\r\n private compileSelectCore(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n const columns = this.compileSelectColumns(ast, ctx);\r\n const from = this.compileFrom(ast.from, ctx);\r\n const joins = JoinCompiler.compileJoins(ast, ctx, this.compileFrom.bind(this), this.compileExpression.bind(this));\r\n const whereClause = this.compileWhere(ast.where, ctx);\r\n const groupBy = GroupByCompiler.compileGroupBy(ast, this.quoteIdentifier.bind(this));\r\n const having = this.compileHaving(ast, ctx);\r\n const orderBy = OrderByCompiler.compileOrderBy(ast, this.quoteIdentifier.bind(this));\r\n const pagination = this.paginationStrategy.compilePagination(ast.limit, ast.offset);\r\n return `SELECT ${this.compileDistinct(ast)}${columns} FROM ${from}${joins}${whereClause}${groupBy}${having}${orderBy}${pagination}`;\r\n }\r\n\r\n protected compileUpdateAst(ast: UpdateQueryNode, ctx: CompilerContext): string {\r\n const table = this.compileTableName(ast.table);\r\n const assignments = this.compileUpdateAssignments(ast.set, ctx);\r\n const whereClause = this.compileWhere(ast.where, ctx);\r\n const returning = this.compileReturning(ast.returning, ctx);\r\n return `UPDATE ${table} SET ${assignments}${whereClause}${returning}`;\r\n }\r\n\r\n private compileUpdateAssignments(\r\n assignments: { column: ColumnNode; value: any }[],\r\n ctx: CompilerContext\r\n ): string {\r\n return assignments\n .map(assignment => {\n const col = assignment.column;\n const target = this.quoteIdentifier(col.name);\n const value = this.compileOperand(assignment.value, ctx);\n return `${target} = ${value}`;\n })\n .join(', ');\n }\n\r\n protected compileDeleteAst(ast: DeleteQueryNode, ctx: CompilerContext): string {\r\n const table = this.compileTableName(ast.from);\r\n const whereClause = this.compileWhere(ast.where, ctx);\r\n const returning = this.compileReturning(ast.returning, ctx);\r\n return `DELETE FROM ${table}${whereClause}${returning}`;\r\n }\r\n\r\n protected formatReturningColumns(returning: ColumnNode[]): string {\r\n return this.returningStrategy.formatReturningColumns(returning, this.quoteIdentifier.bind(this));\r\n }\r\n\r\n protected compileDistinct(ast: SelectQueryNode): string {\r\n return ast.distinct ? 'DISTINCT ' : '';\r\n }\r\n\r\n protected compileSelectColumns(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n return ast.columns.map(c => {\r\n const expr = this.compileOperand(c, ctx);\r\n if (c.alias) {\r\n if (c.alias.includes('(')) return c.alias;\r\n return `${expr} AS ${this.quoteIdentifier(c.alias)}`;\r\n }\r\n return expr;\r\n }).join(', ');\r\n }\r\n\r\n protected compileFrom(ast: SelectQueryNode['from'], ctx?: CompilerContext): string {\n const tableSource = ast as any;\n if (tableSource.type === 'FunctionTable') {\n return this.compileFunctionTable(tableSource, ctx);\n }\n if (tableSource.type === 'DerivedTable') {\n return this.compileDerivedTable(tableSource, ctx);\n }\n return this.compileTableSource(tableSource);\n }\n\n protected compileFunctionTable(fn: FunctionTableNode, ctx?: CompilerContext): string {\n return FunctionTableFormatter.format(fn, ctx, this);\n }\n\n protected compileDerivedTable(table: DerivedTableNode, ctx?: CompilerContext): string {\n if (!table.alias) {\n throw new Error('Derived tables must have an alias.');\n }\n const subquery = this.compileSelectAst(this.normalizeSelectAst(table.query), ctx!).trim().replace(/;$/, '');\n const columns = table.columnAliases?.length\n ? ` (${table.columnAliases.map(c => this.quoteIdentifier(c)).join(', ')})`\n : '';\n return `(${subquery}) AS ${this.quoteIdentifier(table.alias)}${columns}`;\n }\n\n protected compileTableSource(table: TableSourceNode): string {\n if (table.type === 'FunctionTable') {\n return this.compileFunctionTable(table as FunctionTableNode);\n }\n if (table.type === 'DerivedTable') {\n return this.compileDerivedTable(table as DerivedTableNode);\n }\n const base = this.compileTableName(table);\n return table.alias ? `${base} AS ${this.quoteIdentifier(table.alias)}` : base;\n }\n\n protected compileTableName(table: { name: string; schema?: string }): string {\n if (table.schema) {\n return `${this.quoteIdentifier(table.schema)}.${this.quoteIdentifier(table.name)}`;\n }\n return this.quoteIdentifier(table.name);\n }\n\r\n protected compileHaving(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n if (!ast.having) return '';\r\n return ` HAVING ${this.compileExpression(ast.having, ctx)}`;\r\n }\r\n\r\n protected stripTrailingSemicolon(sql: string): string {\r\n return sql.trim().replace(/;$/, '');\r\n }\r\n\r\n protected wrapSetOperand(sql: string): string {\r\n const trimmed = this.stripTrailingSemicolon(sql);\r\n return `(${trimmed})`;\r\n }\r\n}\n","import { StandardFunctionStrategy } from '../../functions/standard-strategy.js';\r\nimport { FunctionRenderContext } from '../../functions/types.js';\r\nimport { LiteralNode } from '../../ast/expression.js';\r\n\r\nexport class PostgresFunctionStrategy extends StandardFunctionStrategy {\r\n constructor() {\r\n super();\r\n this.registerOverrides();\r\n }\r\n\r\n private registerOverrides() {\r\n // Override Standard/Abstract definitions with PostgreSQL specifics\r\n\r\n // Date/Time functions\r\n this.add('UTC_NOW', () => `(NOW() AT TIME ZONE 'UTC')`);\r\n this.add('UNIX_TIMESTAMP', () => `EXTRACT(EPOCH FROM NOW())::INTEGER`);\r\n this.add('FROM_UNIXTIME', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('FROM_UNIXTIME expects 1 argument');\r\n return `to_timestamp(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('EXTRACT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('EXTRACT expects 2 arguments (part, date)');\r\n const [part, date] = compiledArgs;\r\n const partClean = part.replace(/['\"]/g, '');\r\n return `EXTRACT(${partClean} FROM ${date})`;\r\n });\r\n\r\n this.add('YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('YEAR expects 1 argument');\r\n return `EXTRACT(YEAR FROM ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('MONTH expects 1 argument');\r\n return `EXTRACT(MONTH FROM ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY expects 1 argument');\r\n return `EXTRACT(DAY FROM ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DATE_ADD', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_ADD expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `(${date} + (${interval} || ' ${unitClean}')::INTERVAL)`;\r\n });\r\n\r\n this.add('DATE_SUB', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_SUB expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `(${date} - (${interval} || ' ${unitClean}')::INTERVAL)`;\r\n });\r\n\r\n this.add('DATE_DIFF', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_DIFF expects 2 arguments');\r\n const [date1, date2] = compiledArgs;\r\n return `(${date1}::DATE - ${date2}::DATE)`;\r\n });\r\n\r\n this.add('DATE_FORMAT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_FORMAT expects 2 arguments');\r\n const [date, format] = compiledArgs;\r\n return `TO_CHAR(${date}, ${format})`;\r\n });\r\n\r\n this.add('END_OF_MONTH', ({ compiledArgs }) => {\n if (compiledArgs.length !== 1) throw new Error('END_OF_MONTH expects 1 argument');\n return `(date_trunc('month', ${compiledArgs[0]}) + interval '1 month' - interval '1 day')::DATE`;\n });\n\n this.add('DAY_OF_WEEK', ({ compiledArgs }) => {\n if (compiledArgs.length !== 1) throw new Error('DAY_OF_WEEK expects 1 argument');\n return `EXTRACT(DOW FROM ${compiledArgs[0]})`;\n });\n\n this.add('WEEK_OF_YEAR', ({ compiledArgs }) => {\n if (compiledArgs.length !== 1) throw new Error('WEEK_OF_YEAR expects 1 argument');\n return `EXTRACT(WEEK FROM ${compiledArgs[0]})`;\n });\n\n this.add('DATE_TRUNC', ({ node, compiledArgs }) => {\n if (compiledArgs.length !== 2) throw new Error('DATE_TRUNC expects 2 arguments (part, date)');\n const [, date] = compiledArgs;\n const partArg = node.args[0] as LiteralNode;\n const partClean = String(partArg.value).replace(/['\"]/g, '').toLowerCase();\n return `DATE_TRUNC('${partClean}', ${date})`;\n });\n\n this.add('GROUP_CONCAT', ctx => {\n const arg = ctx.compiledArgs[0];\n const orderClause = this.buildOrderByExpression(ctx);\n const orderSegment = orderClause ? ` ${orderClause}` : '';\n const separatorOperand = this.getGroupConcatSeparatorOperand(ctx);\n const separator = ctx.compileOperand(separatorOperand);\n return `STRING_AGG(${arg}, ${separator}${orderSegment})`;\n });\n }\n}\n","import { CompilerContext } from '../abstract.js';\r\nimport { JsonPathNode, ColumnNode } from '../../ast/expression.js';\r\nimport { SqlDialectBase } from '../base/sql-dialect.js';\r\nimport { PostgresFunctionStrategy } from './functions.js';\r\n\r\n/**\r\n * PostgreSQL dialect implementation\r\n */\r\nexport class PostgresDialect extends SqlDialectBase {\r\n protected readonly dialect = 'postgres';\r\n /**\r\n * Creates a new PostgresDialect instance\r\n */\r\n public constructor() {\r\n super(new PostgresFunctionStrategy());\r\n }\r\n\r\n /**\r\n * Quotes an identifier using PostgreSQL double-quote syntax\r\n * @param id - Identifier to quote\r\n * @returns Quoted identifier\r\n */\r\n quoteIdentifier(id: string): string {\r\n return `\"${id}\"`;\r\n }\r\n\r\n /**\r\n * Compiles JSON path expression using PostgreSQL syntax\r\n * @param node - JSON path node\r\n * @returns PostgreSQL JSON path expression\r\n */\r\n protected compileJsonPath(node: JsonPathNode): string {\r\n const col = `${this.quoteIdentifier(node.column.table)}.${this.quoteIdentifier(node.column.name)}`;\r\n // Postgres uses col->>'path' for text extraction\r\n return `${col}->>'${node.path}'`;\r\n }\r\n\r\n protected compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string {\r\n if (!returning || returning.length === 0) return '';\r\n const columns = this.formatReturningColumns(returning);\r\n return ` RETURNING ${columns}`;\r\n }\r\n\r\n supportsReturning(): boolean {\r\n return true;\r\n }\r\n}\r\n","import { StandardFunctionStrategy } from '../../functions/standard-strategy.js';\r\nimport { FunctionRenderContext } from '../../functions/types.js';\r\nimport { LiteralNode } from '../../ast/expression.js';\r\n\r\nexport class MysqlFunctionStrategy extends StandardFunctionStrategy {\r\n constructor() {\r\n super();\r\n this.registerOverrides();\r\n }\r\n\r\n private registerOverrides() {\r\n // Override Standard/Abstract definitions with MySQL specifics\r\n\r\n // Date/Time functions\r\n this.add('NOW', () => `NOW()`);\r\n this.add('CURRENT_DATE', () => `CURDATE()`);\r\n this.add('CURRENT_TIME', () => `CURTIME()`);\r\n this.add('UTC_NOW', () => `UTC_TIMESTAMP()`);\r\n\r\n this.add('EXTRACT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('EXTRACT expects 2 arguments (part, date)');\r\n const [part, date] = compiledArgs;\r\n const partClean = part.replace(/['\"]/g, '');\r\n return `EXTRACT(${partClean} FROM ${date})`;\r\n });\r\n\r\n this.add('YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('YEAR expects 1 argument');\r\n return `YEAR(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('MONTH expects 1 argument');\r\n return `MONTH(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY expects 1 argument');\r\n return `DAY(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DATE_ADD', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_ADD expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toUpperCase();\r\n return `DATE_ADD(${date}, INTERVAL ${interval} ${unitClean})`;\r\n });\r\n\r\n this.add('DATE_SUB', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_SUB expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toUpperCase();\r\n return `DATE_SUB(${date}, INTERVAL ${interval} ${unitClean})`;\r\n });\r\n\r\n this.add('DATE_DIFF', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_DIFF expects 2 arguments');\r\n const [date1, date2] = compiledArgs;\r\n return `DATEDIFF(${date1}, ${date2})`;\r\n });\r\n\r\n this.add('DATE_FORMAT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_FORMAT expects 2 arguments');\r\n const [date, format] = compiledArgs;\r\n return `DATE_FORMAT(${date}, ${format})`;\r\n });\r\n\r\n this.add('END_OF_MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('END_OF_MONTH expects 1 argument');\r\n return `LAST_DAY(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY_OF_WEEK', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY_OF_WEEK expects 1 argument');\r\n return `DAYOFWEEK(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('WEEK_OF_YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('WEEK_OF_YEAR expects 1 argument');\r\n return `WEEKOFYEAR(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DATE_TRUNC', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_TRUNC expects 2 arguments (part, date)');\r\n const [, date] = compiledArgs;\r\n const partArg = node.args[0] as LiteralNode;\r\n const partClean = String(partArg.value).replace(/['\"]/g, '').toLowerCase();\r\n // MySQL doesn't have DATE_TRUNC, use DATE_FORMAT workaround\r\n if (partClean === 'year') {\r\n return `DATE_FORMAT(${date}, '%Y-01-01')`;\r\n } else if (partClean === 'month') {\r\n return `DATE_FORMAT(${date}, '%Y-%m-01')`;\r\n } else if (partClean === 'day') {\r\n return `DATE(${date})`;\r\n }\r\n return `DATE(${date})`;\r\n });\r\n }\r\n}\r\n","import { JsonPathNode } from '../../ast/expression.js';\r\nimport { SqlDialectBase } from '../base/sql-dialect.js';\r\nimport { MysqlFunctionStrategy } from './functions.js';\r\n\r\n/**\r\n * MySQL dialect implementation\r\n */\r\nexport class MySqlDialect extends SqlDialectBase {\r\n protected readonly dialect = 'mysql';\r\n /**\r\n * Creates a new MySqlDialect instance\r\n */\r\n public constructor() {\r\n super(new MysqlFunctionStrategy());\r\n }\r\n\r\n /**\r\n * Quotes an identifier using MySQL backtick syntax\r\n * @param id - Identifier to quote\r\n * @returns Quoted identifier\r\n */\r\n quoteIdentifier(id: string): string {\r\n return `\\`${id}\\``;\r\n }\r\n\r\n /**\r\n * Compiles JSON path expression using MySQL syntax\r\n * @param node - JSON path node\r\n * @returns MySQL JSON path expression\r\n */\r\n protected compileJsonPath(node: JsonPathNode): string {\r\n const col = `${this.quoteIdentifier(node.column.table)}.${this.quoteIdentifier(node.column.name)}`;\r\n // MySQL 5.7+ uses col->'$.path'\r\n return `${col}->'${node.path}'`;\r\n }\r\n}\r\n","import { StandardFunctionStrategy } from '../../functions/standard-strategy.js';\nimport { FunctionRenderContext } from '../../functions/types.js';\nimport { LiteralNode } from '../../ast/expression.js';\n\nexport class SqliteFunctionStrategy extends StandardFunctionStrategy {\n constructor() {\n super();\n this.registerOverrides();\n }\n\r\n private registerOverrides() {\r\n // Override Standard/Abstract definitions with SQLite specifics\r\n\r\n // Date/Time functions\r\n this.add('NOW', () => `datetime('now', 'localtime')`);\r\n this.add('CURRENT_DATE', () => `date('now', 'localtime')`);\r\n this.add('CURRENT_TIME', () => `time('now', 'localtime')`);\r\n this.add('UTC_NOW', () => `datetime('now')`);\r\n\r\n this.add('EXTRACT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('EXTRACT expects 2 arguments (part, date)');\r\n const [part, date] = compiledArgs;\r\n // Map common parts to strftime format\r\n const partUpper = part.replace(/['\"]/g, '').toUpperCase();\r\n const formatMap: Record<string, string> = {\r\n 'YEAR': '%Y', 'MONTH': '%m', 'DAY': '%d',\r\n 'HOUR': '%H', 'MINUTE': '%M', 'SECOND': '%S',\r\n 'DOW': '%w', 'WEEK': '%W'\r\n };\r\n const format = formatMap[partUpper] || '%Y';\r\n return `CAST(strftime('${format}', ${date}) AS INTEGER)`;\r\n });\r\n\r\n this.add('YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('YEAR expects 1 argument');\r\n return `CAST(strftime('%Y', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('MONTH expects 1 argument');\r\n return `CAST(strftime('%m', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('DAY', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY expects 1 argument');\r\n return `CAST(strftime('%d', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('DATE_ADD', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_ADD expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `datetime(${date}, '+' || ${interval} || ' ${unitClean}')`;\r\n });\r\n\r\n this.add('DATE_SUB', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_SUB expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `datetime(${date}, '-' || ${interval} || ' ${unitClean}')`;\r\n });\r\n\r\n this.add('DATE_DIFF', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_DIFF expects 2 arguments');\r\n const [date1, date2] = compiledArgs;\r\n return `CAST(julianday(${date1}) - julianday(${date2}) AS INTEGER)`;\r\n });\r\n\r\n this.add('DATE_FORMAT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_FORMAT expects 2 arguments');\r\n const [date, format] = compiledArgs;\r\n return `strftime(${format}, ${date})`;\r\n });\r\n\r\n this.add('UNIX_TIMESTAMP', () => `CAST(strftime('%s', 'now') AS INTEGER)`);\r\n\r\n this.add('FROM_UNIXTIME', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('FROM_UNIXTIME expects 1 argument');\r\n return `datetime(${compiledArgs[0]}, 'unixepoch')`;\r\n });\r\n\r\n this.add('END_OF_MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('END_OF_MONTH expects 1 argument');\r\n return `date(${compiledArgs[0]}, 'start of month', '+1 month', '-1 day')`;\r\n });\r\n\r\n this.add('DAY_OF_WEEK', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY_OF_WEEK expects 1 argument');\r\n return `CAST(strftime('%w', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('WEEK_OF_YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('WEEK_OF_YEAR expects 1 argument');\r\n return `CAST(strftime('%W', ${compiledArgs[0]}) AS INTEGER)`;\r\n });\r\n\r\n this.add('DATE_TRUNC', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_TRUNC expects 2 arguments (part, date)');\r\n const [, date] = compiledArgs;\r\n const partArg = node.args[0] as LiteralNode;\r\n const partClean = String(partArg.value).replace(/['\"]/g, '').toLowerCase();\r\n // SQLite uses date modifiers\r\n if (partClean === 'year') {\r\n return `date(${date}, 'start of year')`;\r\n } else if (partClean === 'month') {\r\n return `date(${date}, 'start of month')`;\r\n } else if (partClean === 'day') {\r\n return `date(${date})`;\r\n }\r\n return `date(${date}, 'start of ${partClean}')`;\r\n });\n\n this.add('GROUP_CONCAT', ctx => {\n const arg = ctx.compiledArgs[0];\n const separatorOperand = this.getGroupConcatSeparatorOperand(ctx);\n const separator = ctx.compileOperand(separatorOperand);\n return `GROUP_CONCAT(${arg}, ${separator})`;\n });\n }\n}\n","import { CompilerContext } from '../abstract.js';\r\nimport { JsonPathNode, ColumnNode } from '../../ast/expression.js';\r\nimport { SqlDialectBase } from '../base/sql-dialect.js';\r\nimport { SqliteFunctionStrategy } from './functions.js';\r\n\r\n/**\r\n * SQLite dialect implementation\r\n */\r\nexport class SqliteDialect extends SqlDialectBase {\n protected readonly dialect = 'sqlite';\n /**\n * Creates a new SqliteDialect instance\n */\n public constructor() {\n super(new SqliteFunctionStrategy());\n }\n\r\n /**\r\n * Quotes an identifier using SQLite double-quote syntax\r\n * @param id - Identifier to quote\r\n * @returns Quoted identifier\r\n */\r\n quoteIdentifier(id: string): string {\r\n return `\"${id}\"`;\r\n }\r\n\r\n /**\r\n * Compiles JSON path expression using SQLite syntax\r\n * @param node - JSON path node\r\n * @returns SQLite JSON path expression\r\n */\r\n protected compileJsonPath(node: JsonPathNode): string {\r\n const col = `${this.quoteIdentifier(node.column.table)}.${this.quoteIdentifier(node.column.name)}`;\r\n // SQLite uses json_extract(col, '$.path')\r\n return `json_extract(${col}, '${node.path}')`;\r\n }\r\n\r\n protected compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string {\n if (!returning || returning.length === 0) return '';\n const columns = this.formatReturningColumns(returning);\n return ` RETURNING ${columns}`;\n }\n\n protected formatReturningColumns(returning: ColumnNode[]): string {\n return returning\n .map(column => {\n const alias = column.alias ? ` AS ${this.quoteIdentifier(column.alias)}` : '';\n return `${this.quoteIdentifier(column.name)}${alias}`;\n })\n .join(', ');\n }\n\r\n supportsReturning(): boolean {\r\n return true;\r\n }\r\n}\r\n","import { StandardFunctionStrategy } from '../../functions/standard-strategy.js';\r\nimport { FunctionRenderContext } from '../../functions/types.js';\r\nimport { LiteralNode } from '../../ast/expression.js';\r\n\r\nexport class MssqlFunctionStrategy extends StandardFunctionStrategy {\r\n constructor() {\r\n super();\r\n this.registerOverrides();\r\n }\r\n\r\n private registerOverrides() {\r\n // Override Standard/Abstract definitions with MSSQL specifics\r\n\r\n // Date/Time functions\r\n this.add('NOW', () => `GETDATE()`);\r\n this.add('CURRENT_DATE', () => `CAST(GETDATE() AS DATE)`);\r\n this.add('CURRENT_TIME', () => `CAST(GETDATE() AS TIME)`);\r\n this.add('UTC_NOW', () => `GETUTCDATE()`);\r\n\r\n this.add('EXTRACT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('EXTRACT expects 2 arguments (part, date)');\r\n const [part, date] = compiledArgs;\r\n const partClean = part.replace(/['\"]/g, '').toLowerCase();\r\n return `DATEPART(${partClean}, ${date})`;\r\n });\r\n\r\n this.add('YEAR', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('YEAR expects 1 argument');\r\n return `YEAR(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('MONTH expects 1 argument');\r\n return `MONTH(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY expects 1 argument');\r\n return `DAY(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DATE_ADD', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_ADD expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `DATEADD(${unitClean}, ${interval}, ${date})`;\r\n });\r\n\r\n this.add('DATE_SUB', ({ node, compiledArgs }) => {\r\n if (compiledArgs.length !== 3) throw new Error('DATE_SUB expects 3 arguments (date, interval, unit)');\r\n const [date, interval] = compiledArgs;\r\n const unitArg = node.args[2] as LiteralNode;\r\n const unitClean = String(unitArg.value).replace(/['\"]/g, '').toLowerCase();\r\n return `DATEADD(${unitClean}, -${interval}, ${date})`;\r\n });\r\n\r\n this.add('DATE_DIFF', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_DIFF expects 2 arguments');\r\n const [date1, date2] = compiledArgs;\r\n return `DATEDIFF(day, ${date2}, ${date1})`;\r\n });\r\n\r\n this.add('DATE_FORMAT', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 2) throw new Error('DATE_FORMAT expects 2 arguments');\r\n const [date, format] = compiledArgs;\r\n return `FORMAT(${date}, ${format})`;\r\n });\r\n\r\n this.add('UNIX_TIMESTAMP', () => `DATEDIFF(SECOND, '1970-01-01', GETUTCDATE())`);\r\n\r\n this.add('FROM_UNIXTIME', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('FROM_UNIXTIME expects 1 argument');\r\n return `DATEADD(SECOND, ${compiledArgs[0]}, '1970-01-01')`;\r\n });\r\n\r\n this.add('END_OF_MONTH', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('END_OF_MONTH expects 1 argument');\r\n return `EOMONTH(${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('DAY_OF_WEEK', ({ compiledArgs }) => {\r\n if (compiledArgs.length !== 1) throw new Error('DAY_OF_WEEK expects 1 argument');\r\n return `DATEPART(dw, ${compiledArgs[0]})`;\r\n });\r\n\r\n this.add('WEEK_OF_YEAR', ({ compiledArgs }) => {\n if (compiledArgs.length !== 1) throw new Error('WEEK_OF_YEAR expects 1 argument');\n return `DATEPART(wk, ${compiledArgs[0]})`;\n });\n\n this.add('DATE_TRUNC', ({ node, compiledArgs }) => {\n if (compiledArgs.length !== 2) throw new Error('DATE_TRUNC expects 2 arguments (part, date)');\n const [, date] = compiledArgs;\n const partArg = node.args[0] as LiteralNode;\n const partClean = String(partArg.value).replace(/['\"]/g, '').toLowerCase();\n // SQL Server 2022+ has DATETRUNC\n return `DATETRUNC(${partClean}, ${date})`;\n });\n\n this.add('GROUP_CONCAT', ctx => {\n const arg = ctx.compiledArgs[0];\n const separatorOperand = this.getGroupConcatSeparatorOperand(ctx);\n const separator = ctx.compileOperand(separatorOperand);\n const orderClause = this.buildOrderByExpression(ctx);\n const withinGroup = orderClause ? ` WITHIN GROUP (${orderClause})` : '';\n return `STRING_AGG(${arg}, ${separator})${withinGroup}`;\n });\n }\n}\n","import { CompilerContext, Dialect } from '../abstract.js';\r\nimport { SelectQueryNode, InsertQueryNode, UpdateQueryNode, DeleteQueryNode, TableSourceNode, DerivedTableNode } from '../../ast/query.js';\nimport { JsonPathNode } from '../../ast/expression.js';\nimport { MssqlFunctionStrategy } from './functions.js';\nimport { FunctionTableFormatter } from '../base/function-table-formatter.js';\n\r\n/**\r\n * Microsoft SQL Server dialect implementation\r\n */\r\nexport class SqlServerDialect extends Dialect {\r\n protected readonly dialect = 'mssql';\r\n /**\r\n * Creates a new SqlServerDialect instance\r\n */\r\n public constructor() {\r\n super(new MssqlFunctionStrategy());\r\n }\r\n\r\n /**\r\n * Quotes an identifier using SQL Server bracket syntax\r\n * @param id - Identifier to quote\r\n * @returns Quoted identifier\r\n */\r\n quoteIdentifier(id: string): string {\r\n return `[${id}]`;\r\n }\r\n\r\n /**\r\n * Compiles JSON path expression using SQL Server syntax\r\n * @param node - JSON path node\r\n * @returns SQL Server JSON path expression\r\n */\r\n protected compileJsonPath(node: JsonPathNode): string {\r\n const col = `${this.quoteIdentifier(node.column.table)}.${this.quoteIdentifier(node.column.name)}`;\r\n // SQL Server uses JSON_VALUE(col, '$.path')\r\n return `JSON_VALUE(${col}, '${node.path}')`;\r\n }\r\n\r\n /**\r\n * Formats parameter placeholders using SQL Server named parameter syntax\r\n * @param index - Parameter index\r\n * @returns Named parameter placeholder\r\n */\r\n protected formatPlaceholder(index: number): string {\r\n return `@p${index}`;\r\n }\r\n\r\n /**\r\n * Compiles SELECT query AST to SQL Server SQL\r\n * @param ast - Query AST\r\n * @param ctx - Compiler context\r\n * @returns SQL Server SQL string\r\n */\r\n protected compileSelectAst(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n const hasSetOps = !!(ast.setOps && ast.setOps.length);\r\n const ctes = this.compileCtes(ast, ctx);\r\n\r\n const baseAst: SelectQueryNode = hasSetOps\r\n ? { ...ast, setOps: undefined, orderBy: undefined, limit: undefined, offset: undefined }\r\n : ast;\r\n\r\n const baseSelect = this.compileSelectCore(baseAst, ctx);\r\n\r\n if (!hasSetOps) {\r\n return `${ctes}${baseSelect}`;\r\n }\r\n\r\n const compound = ast.setOps!\r\n .map(op => `${op.operator} ${this.wrapSetOperand(this.compileSelectAst(op.query, ctx))}`)\r\n .join(' ');\r\n\r\n const orderBy = this.compileOrderBy(ast);\r\n const pagination = this.compilePagination(ast, orderBy);\r\n const combined = `${this.wrapSetOperand(baseSelect)} ${compound}`;\r\n const tail = pagination || orderBy;\r\n return `${ctes}${combined}${tail}`;\r\n }\r\n\r\n protected compileInsertAst(ast: InsertQueryNode, ctx: CompilerContext): string {\r\n const table = this.quoteIdentifier(ast.into.name);\r\n const columnList = ast.columns.map(column => `${this.quoteIdentifier(column.table)}.${this.quoteIdentifier(column.name)}`).join(', ');\r\n const values = ast.values.map(row => `(${row.map(value => this.compileOperand(value, ctx)).join(', ')})`).join(', ');\r\n return `INSERT INTO ${table} (${columnList}) VALUES ${values};`;\r\n }\r\n\r\n protected compileUpdateAst(ast: UpdateQueryNode, ctx: CompilerContext): string {\r\n const table = this.quoteIdentifier(ast.table.name);\r\n const assignments = ast.set.map(assignment => {\r\n const col = assignment.column;\r\n const target = `${this.quoteIdentifier(col.table)}.${this.quoteIdentifier(col.name)}`;\r\n const value = this.compileOperand(assignment.value, ctx);\r\n return `${target} = ${value}`;\r\n }).join(', ');\r\n const whereClause = this.compileWhere(ast.where, ctx);\r\n return `UPDATE ${table} SET ${assignments}${whereClause};`;\r\n }\r\n\r\n protected compileDeleteAst(ast: DeleteQueryNode, ctx: CompilerContext): string {\n if (ast.from.type !== 'Table') {\n throw new Error('DELETE only supports base tables in the MSSQL dialect.');\n }\n const table = this.quoteIdentifier(ast.from.name);\n const whereClause = this.compileWhere(ast.where, ctx);\n return `DELETE FROM ${table}${whereClause};`;\n }\n\n private compileSelectCore(ast: SelectQueryNode, ctx: CompilerContext): string {\n const columns = ast.columns.map(c => {\r\n let expr = '';\r\n if (c.type === 'Function') {\r\n expr = this.compileOperand(c, ctx);\r\n } else if (c.type === 'Column') {\r\n expr = `${this.quoteIdentifier(c.table)}.${this.quoteIdentifier(c.name)}`;\r\n } else if (c.type === 'ScalarSubquery') {\r\n expr = this.compileOperand(c, ctx);\r\n } else if (c.type === 'WindowFunction') {\r\n expr = this.compileOperand(c, ctx);\r\n }\r\n\r\n if (c.alias) {\r\n if (c.alias.includes('(')) return c.alias;\r\n return `${expr} AS ${this.quoteIdentifier(c.alias)}`;\r\n }\r\n return expr;\r\n }).join(', ');\r\n\n const distinct = ast.distinct ? 'DISTINCT ' : '';\n const from = this.compileTableSource(ast.from, ctx);\n\n const joins = ast.joins.map(j => {\n const table = this.compileTableSource(j.table, ctx);\n const cond = this.compileExpression(j.condition, ctx);\n return `${j.kind} JOIN ${table} ON ${cond}`;\n }).join(' ');\n const whereClause = this.compileWhere(ast.where, ctx);\r\n\r\n const groupBy = ast.groupBy && ast.groupBy.length > 0\r\n ? ' GROUP BY ' + ast.groupBy.map(c => `${this.quoteIdentifier(c.table)}.${this.quoteIdentifier(c.name)}`).join(', ')\r\n : '';\r\n\r\n const having = ast.having\r\n ? ` HAVING ${this.compileExpression(ast.having, ctx)}`\r\n : '';\r\n\r\n const orderBy = this.compileOrderBy(ast);\r\n const pagination = this.compilePagination(ast, orderBy);\r\n\r\n if (pagination) {\r\n return `SELECT ${distinct}${columns} FROM ${from}${joins ? ' ' + joins : ''}${whereClause}${groupBy}${having}${pagination}`;\r\n }\r\n\r\n return `SELECT ${distinct}${columns} FROM ${from}${joins ? ' ' + joins : ''}${whereClause}${groupBy}${having}${orderBy}`;\r\n }\r\n\r\n private compileOrderBy(ast: SelectQueryNode): string {\r\n if (!ast.orderBy || ast.orderBy.length === 0) return '';\r\n return ' ORDER BY ' + ast.orderBy\r\n .map(o => `${this.quoteIdentifier(o.column.table)}.${this.quoteIdentifier(o.column.name)} ${o.direction}`)\r\n .join(', ');\r\n }\r\n\r\n private compilePagination(ast: SelectQueryNode, orderBy: string): string {\n const hasLimit = ast.limit !== undefined;\n const hasOffset = ast.offset !== undefined;\n if (!hasLimit && !hasOffset) return '';\n\r\n const off = ast.offset ?? 0;\r\n const orderClause = orderBy || ' ORDER BY (SELECT NULL)';\r\n let pagination = `${orderClause} OFFSET ${off} ROWS`;\r\n if (hasLimit) {\n pagination += ` FETCH NEXT ${ast.limit} ROWS ONLY`;\n }\n return pagination;\n }\n\n private compileTableSource(table: TableSourceNode, ctx: CompilerContext): string {\n if (table.type === 'FunctionTable') {\n return FunctionTableFormatter.format(table, ctx, this as any);\n }\n if (table.type === 'DerivedTable') {\n return this.compileDerivedTable(table, ctx);\n }\n const base = table.schema\n ? `${this.quoteIdentifier(table.schema)}.${this.quoteIdentifier(table.name)}`\n : this.quoteIdentifier(table.name);\n return table.alias ? `${base} AS ${this.quoteIdentifier(table.alias)}` : base;\n }\n\n private compileDerivedTable(table: DerivedTableNode, ctx: CompilerContext): string {\n const sub = this.compileSelectAst(this.normalizeSelectAst(table.query), ctx).trim().replace(/;$/, '');\n const cols = table.columnAliases?.length\n ? ` (${table.columnAliases.map(c => this.quoteIdentifier(c)).join(', ')})`\n : '';\n return `(${sub}) AS ${this.quoteIdentifier(table.alias)}${cols}`;\n }\n\r\n private compileCtes(ast: SelectQueryNode, ctx: CompilerContext): string {\r\n if (!ast.ctes || ast.ctes.length === 0) return '';\r\n // MSSQL does not use RECURSIVE keyword, but supports recursion when CTE references itself.\r\n const defs = ast.ctes.map(cte => {\r\n const name = this.quoteIdentifier(cte.name);\r\n const cols = cte.columns ? `(${cte.columns.map(c => this.quoteIdentifier(c)).join(', ')})` : '';\r\n const query = this.compileSelectAst(this.normalizeSelectAst(cte.query), ctx).trim().replace(/;$/, '');\r\n return `${name}${cols} AS (${query})`;\r\n }).join(', ');\r\n return `WITH ${defs} `;\r\n }\r\n\r\n private wrapSetOperand(sql: string): string {\r\n const trimmed = sql.trim().replace(/;$/, '');\r\n return `(${trimmed})`;\r\n }\r\n}\r\n","// Dialect factory for the SQL DSL.\r\n// Centralizes how we go from a symbolic name (\"sqlite\") to a concrete Dialect instance.\r\n\r\nimport { Dialect } from './abstract.js';\r\nimport { PostgresDialect } from './postgres/index.js';\r\nimport { MySqlDialect } from './mysql/index.js';\r\nimport { SqliteDialect } from './sqlite/index.js';\r\nimport { SqlServerDialect } from './mssql/index.js';\r\n\r\nexport type DialectKey =\r\n | 'postgres'\r\n | 'mysql'\r\n | 'sqlite'\r\n | 'mssql'\r\n | (string & {}); // allow user-defined keys without constraining too much\r\n\r\ntype DialectFactoryFn = () => Dialect;\r\n\r\nexport class DialectFactory {\r\n private static registry = new Map<DialectKey, DialectFactoryFn>();\r\n private static defaultsInitialized = false;\r\n\r\n private static ensureDefaults(): void {\r\n if (this.defaultsInitialized) return;\r\n this.defaultsInitialized = true;\r\n\r\n // Register built-in dialects only if no override exists yet.\r\n if (!this.registry.has('postgres')) {\r\n this.registry.set('postgres', () => new PostgresDialect());\r\n }\r\n if (!this.registry.has('mysql')) {\r\n this.registry.set('mysql', () => new MySqlDialect());\r\n }\r\n if (!this.registry.has('sqlite')) {\r\n this.registry.set('sqlite', () => new SqliteDialect());\r\n }\r\n if (!this.registry.has('mssql')) {\r\n this.registry.set('mssql', () => new SqlServerDialect());\r\n }\r\n }\r\n\r\n /**\r\n * Register (or override) a dialect factory for a key.\r\n *\r\n * Examples:\r\n * DialectFactory.register('sqlite', () => new SqliteDialect());\r\n * DialectFactory.register('my-tenant-dialect', () => new CustomDialect());\r\n */\r\n public static register(key: DialectKey, factory: DialectFactoryFn): void {\r\n this.registry.set(key, factory);\r\n }\r\n\r\n /**\r\n * Resolve a key into a Dialect instance.\r\n * Throws if the key is not registered.\r\n */\r\n public static create(key: DialectKey): Dialect {\r\n this.ensureDefaults();\r\n const factory = this.registry.get(key);\r\n if (!factory) {\r\n throw new Error(\r\n `Dialect \"${String(\r\n key\r\n )}\" is not registered. Use DialectFactory.register(...) to register it.`\r\n );\r\n }\r\n return factory();\r\n }\r\n\r\n /**\r\n * Clear all registrations (mainly for tests).\r\n * Built-ins will be re-registered lazily on the next create().\r\n */\r\n public static clear(): void {\r\n this.registry.clear();\r\n this.defaultsInitialized = false;\r\n }\r\n}\r\n\r\n/**\r\n * Helper to normalize either a Dialect instance OR a key into a Dialect instance.\r\n * This is what query builders will use.\r\n */\r\nexport const resolveDialectInput = (\r\n dialect: Dialect | DialectKey\r\n): Dialect => {\r\n if (typeof dialect === 'string') {\r\n return DialectFactory.create(dialect);\r\n }\r\n return dialect;\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { SelectQueryNode, CommonTableExpressionNode, OrderByNode, SetOperationNode, TableSourceNode } from '../core/ast/query.js';\nimport {\r\n ColumnNode,\r\n ExpressionNode,\r\n FunctionNode,\r\n ScalarSubqueryNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode\r\n} from '../core/ast/expression.js';\r\nimport { JoinNode } from '../core/ast/join.js';\r\n\r\n/**\r\n * Node types that can be used in query projections\r\n */\r\nexport type ProjectionNode =\r\n | ColumnNode\r\n | FunctionNode\r\n | ScalarSubqueryNode\r\n | CaseExpressionNode\r\n | WindowFunctionNode;\r\n\r\n/**\r\n * Manages the state of a SELECT query being built\r\n */\r\nexport class SelectQueryState {\r\n /**\r\n * Table definition for the query\r\n */\r\n public readonly table: TableDef;\r\n /**\r\n * Abstract Syntax Tree (AST) representation of the query\r\n */\r\n public readonly ast: SelectQueryNode;\r\n\r\n /**\r\n * Creates a new SelectQueryState instance\r\n * @param table - Table definition\r\n * @param ast - Optional existing AST\r\n */\r\n constructor(table: TableDef, ast?: SelectQueryNode) {\r\n this.table = table;\r\n this.ast = ast ?? {\r\n type: 'SelectQuery',\r\n from: { type: 'Table', name: table.name },\r\n columns: [],\r\n joins: []\r\n };\r\n }\r\n\r\n /**\r\n * Creates a new SelectQueryState with updated AST\r\n * @param nextAst - Updated AST\r\n * @returns New SelectQueryState instance\r\n */\r\n private clone(nextAst: SelectQueryNode): SelectQueryState {\r\n return new SelectQueryState(this.table, nextAst);\r\n }\r\n\r\n /**\r\n * Adds columns to the query\r\n * @param newCols - Columns to add\r\n * @returns New SelectQueryState with added columns\r\n */\r\n withColumns(newCols: ProjectionNode[]): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n columns: [...(this.ast.columns ?? []), ...newCols]\r\n });\r\n }\r\n\r\n /**\r\n * Adds a join to the query\r\n * @param join - Join node to add\r\n * @returns New SelectQueryState with added join\r\n */\r\n withJoin(join: JoinNode): SelectQueryState {\n return this.clone({\n ...this.ast,\n joins: [...(this.ast.joins ?? []), join]\n });\n }\n\n /**\n * Replaces the FROM clause.\n * @param from - Table source for the FROM clause\n * @returns New SelectQueryState with updated FROM\n */\n withFrom(from: TableSourceNode): SelectQueryState {\n return this.clone({\n ...this.ast,\n from\n });\n }\n\r\n /**\r\n * Adds a WHERE clause to the query\r\n * @param predicate - WHERE predicate expression\r\n * @returns New SelectQueryState with WHERE clause\r\n */\r\n withWhere(predicate: ExpressionNode): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n where: predicate\r\n });\r\n }\r\n\r\n /**\r\n * Adds a HAVING clause to the query\r\n * @param predicate - HAVING predicate expression\r\n * @returns New SelectQueryState with HAVING clause\r\n */\r\n withHaving(predicate: ExpressionNode): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n having: predicate\r\n });\r\n }\r\n\r\n /**\r\n * Adds GROUP BY columns to the query\r\n * @param columns - Columns to group by\r\n * @returns New SelectQueryState with GROUP BY clause\r\n */\r\n withGroupBy(columns: ColumnNode[]): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n groupBy: [...(this.ast.groupBy ?? []), ...columns]\r\n });\r\n }\r\n\r\n /**\r\n * Adds ORDER BY clauses to the query\r\n * @param orderBy - ORDER BY nodes\r\n * @returns New SelectQueryState with ORDER BY clause\r\n */\r\n withOrderBy(orderBy: OrderByNode[]): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n orderBy: [...(this.ast.orderBy ?? []), ...orderBy]\r\n });\r\n }\r\n\r\n /**\r\n * Adds DISTINCT columns to the query\r\n * @param columns - Columns to make distinct\r\n * @returns New SelectQueryState with DISTINCT clause\r\n */\r\n withDistinct(columns: ColumnNode[]): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n distinct: [...(this.ast.distinct ?? []), ...columns]\r\n });\r\n }\r\n\r\n /**\r\n * Adds a LIMIT clause to the query\r\n * @param limit - Maximum number of rows to return\r\n * @returns New SelectQueryState with LIMIT clause\r\n */\r\n withLimit(limit: number): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n limit\r\n });\r\n }\r\n\r\n /**\r\n * Adds an OFFSET clause to the query\r\n * @param offset - Number of rows to skip\r\n * @returns New SelectQueryState with OFFSET clause\r\n */\r\n withOffset(offset: number): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n offset\r\n });\r\n }\r\n\r\n /**\r\n * Adds a Common Table Expression (CTE) to the query\n * @param cte - CTE node to add\n * @returns New SelectQueryState with CTE\n */\n withCte(cte: CommonTableExpressionNode): SelectQueryState {\n return this.clone({\n ...this.ast,\n ctes: [...(this.ast.ctes ?? []), cte]\n });\n }\n\n /**\n * Adds a set operation (UNION/INTERSECT/EXCEPT) to the query\n * @param op - Set operation node to add\n * @returns New SelectQueryState with set operation\n */\n withSetOperation(op: SetOperationNode): SelectQueryState {\n return this.clone({\n ...this.ast,\n setOps: [...(this.ast.setOps ?? []), op]\n });\n }\n}\n","import { JoinNode } from './join.js';\nimport { ExpressionNode } from './expression.js';\nimport { JoinKind } from '../sql/sql.js';\nimport { JoinMetadata } from './join-metadata.js';\nimport { TableSourceNode, TableNode, FunctionTableNode } from './query.js';\n\n/**\n * Creates a JoinNode ready for AST insertion.\n * Centralizing this avoids copy/pasted object literals when multiple services need to synthesize joins.\n */\nexport const createJoinNode = (\n kind: JoinKind,\n tableName: string | TableSourceNode,\n condition: ExpressionNode,\n relationName?: string\n): JoinNode => ({\n type: 'Join',\n kind,\n table: typeof tableName === 'string'\n ? ({ type: 'Table', name: tableName } as TableNode)\n : (tableName as TableSourceNode),\n condition,\n meta: relationName ? ({ relationName } as JoinMetadata) : undefined\n});\n","import { TableDef } from '../schema/table.js';\nimport { RelationDef, RelationKinds } from '../schema/relation.js';\nimport { CommonTableExpressionNode, OrderByNode, SelectQueryNode } from '../core/ast/query.js';\nimport { HydrationPlan } from '../core/hydration/types.js';\nimport { HydrationPlanner } from './hydration-planner.js';\nimport { ProjectionNode, SelectQueryState } from './select-query-state.js';\nimport { ColumnNode, eq } from '../core/ast/expression.js';\nimport { createJoinNode } from '../core/ast/join-node.js';\nimport { JOIN_KINDS } from '../core/sql/sql.js';\n\r\n/**\r\n * Manages hydration planning for query results\r\n */\r\nexport class HydrationManager {\r\n /**\r\n * Creates a new HydrationManager instance\r\n * @param table - Table definition\r\n * @param planner - Hydration planner\r\n */\r\n constructor(\r\n private readonly table: TableDef,\r\n private readonly planner: HydrationPlanner\r\n ) {}\r\n\r\n /**\r\n * Creates a new HydrationManager with updated planner\r\n * @param nextPlanner - Updated hydration planner\r\n * @returns New HydrationManager instance\r\n */\r\n private clone(nextPlanner: HydrationPlanner): HydrationManager {\r\n return new HydrationManager(this.table, nextPlanner);\r\n }\r\n\r\n /**\r\n * Handles column selection for hydration planning\r\n * @param state - Current query state\r\n * @param newColumns - Newly selected columns\r\n * @returns Updated HydrationManager with captured columns\r\n */\r\n onColumnsSelected(state: SelectQueryState, newColumns: ProjectionNode[]): HydrationManager {\r\n const updated = this.planner.captureRootColumns(newColumns);\r\n return this.clone(updated);\r\n }\r\n\r\n /**\r\n * Handles relation inclusion for hydration planning\r\n * @param state - Current query state\r\n * @param relation - Relation definition\r\n * @param relationName - Name of the relation\r\n * @param aliasPrefix - Alias prefix for the relation\r\n * @param targetColumns - Target columns to include\r\n * @returns Updated HydrationManager with included relation\r\n */\r\n onRelationIncluded(\r\n state: SelectQueryState,\r\n relation: RelationDef,\r\n relationName: string,\r\n aliasPrefix: string,\r\n targetColumns: string[],\r\n pivot?: { aliasPrefix: string; columns: string[] }\r\n ): HydrationManager {\r\n const withRoots = this.planner.captureRootColumns(state.ast.columns);\r\n const next = withRoots.includeRelation(relation, relationName, aliasPrefix, targetColumns, pivot);\r\n return this.clone(next);\r\n }\r\n\r\n /**\n * Applies hydration plan to the AST\n * @param ast - Query AST to modify\n * @returns AST with hydration metadata\n */\n applyToAst(ast: SelectQueryNode): SelectQueryNode {\n // Hydration is not applied to compound set queries since row identity is ambiguous.\n if (ast.setOps && ast.setOps.length > 0) {\n return ast;\n }\n\n const plan = this.planner.getPlan();\n if (!plan) return ast;\n\n const needsPaginationGuard = this.requiresParentPagination(ast, plan);\n const rewritten = needsPaginationGuard ? this.wrapForParentPagination(ast, plan) : ast;\n return this.attachHydrationMeta(rewritten, plan);\n }\n\r\n /**\r\n * Gets the current hydration plan\r\n * @returns Hydration plan or undefined if none exists\r\n */\r\n getPlan(): HydrationPlan | undefined {\n return this.planner.getPlan();\n }\n\n /**\n * Attaches hydration metadata to a query AST node.\n */\n private attachHydrationMeta(ast: SelectQueryNode, plan: HydrationPlan): SelectQueryNode {\n return {\n ...ast,\n meta: {\n ...(ast.meta || {}),\n hydration: plan\n }\n };\n }\n\n /**\n * Determines whether the query needs pagination rewriting to keep LIMIT/OFFSET\n * applied to parent rows when eager-loading multiplicative relations.\n */\n private requiresParentPagination(ast: SelectQueryNode, plan: HydrationPlan): boolean {\n const hasPagination = ast.limit !== undefined || ast.offset !== undefined;\n return hasPagination && this.hasMultiplyingRelations(plan);\n }\n\n private hasMultiplyingRelations(plan: HydrationPlan): boolean {\n return plan.relations.some(\n rel => rel.type === RelationKinds.HasMany || rel.type === RelationKinds.BelongsToMany\n );\n }\n\n /**\n * Rewrites the query using CTEs so LIMIT/OFFSET target distinct parent rows\n * instead of the joined result set.\n *\n * The strategy:\n * - Hoist the original query (minus limit/offset) into a base CTE.\n * - Select distinct parent ids from that base CTE with the original ordering and pagination.\n * - Join the base CTE against the paged ids to retrieve the joined rows for just that page.\n */\n private wrapForParentPagination(ast: SelectQueryNode, plan: HydrationPlan): SelectQueryNode {\n const projectionNames = this.getProjectionNames(ast.columns);\n if (!projectionNames) {\n return ast;\n }\n\n const projectionAliases = this.buildProjectionAliasMap(ast.columns);\n const projectionSet = new Set(projectionNames);\n const rootPkAlias = projectionAliases.get(`${plan.rootTable}.${plan.rootPrimaryKey}`) ?? plan.rootPrimaryKey;\n\n const baseCteName = this.nextCteName(ast.ctes, '__metal_pagination_base');\n const baseQuery: SelectQueryNode = {\n ...ast,\n ctes: undefined,\n limit: undefined,\n offset: undefined,\n orderBy: undefined,\n meta: undefined\n };\n\n const baseCte: CommonTableExpressionNode = {\n type: 'CommonTableExpression',\n name: baseCteName,\n query: baseQuery,\n recursive: false\n };\n\n const orderBy = this.mapOrderBy(ast.orderBy, plan, projectionAliases, baseCteName, projectionSet);\n // When an order-by uses child-table columns we cannot safely rewrite pagination,\n // so preserve the original query to avoid changing semantics.\n if (orderBy === null) {\n return ast;\n }\n\n const pageCteName = this.nextCteName([...(ast.ctes ?? []), baseCte], '__metal_pagination_page');\n const pagingColumns = this.buildPagingColumns(rootPkAlias, orderBy, baseCteName);\n\n const pageCte: CommonTableExpressionNode = {\n type: 'CommonTableExpression',\n name: pageCteName,\n query: {\n type: 'SelectQuery',\n from: { type: 'Table', name: baseCteName },\n columns: pagingColumns,\n joins: [],\n distinct: [{ type: 'Column', table: baseCteName, name: rootPkAlias }],\n orderBy,\n limit: ast.limit,\n offset: ast.offset\n },\n recursive: false\n };\n\n const joinCondition = eq(\n { type: 'Column', table: baseCteName, name: rootPkAlias },\n { type: 'Column', table: pageCteName, name: rootPkAlias }\n );\n\n const outerColumns: ColumnNode[] = projectionNames.map(name => ({\n type: 'Column',\n table: baseCteName,\n name,\n alias: name\n }));\n\n return {\n type: 'SelectQuery',\n from: { type: 'Table', name: baseCteName },\n columns: outerColumns,\n joins: [createJoinNode(JOIN_KINDS.INNER, pageCteName, joinCondition)],\n orderBy,\n ctes: [...(ast.ctes ?? []), baseCte, pageCte]\n };\n }\n\n private nextCteName(existing: CommonTableExpressionNode[] | undefined, baseName: string): string {\n const names = new Set((existing ?? []).map(cte => cte.name));\n let candidate = baseName;\n let suffix = 1;\n\n while (names.has(candidate)) {\n suffix += 1;\n candidate = `${baseName}_${suffix}`;\n }\n\n return candidate;\n }\n\n private getProjectionNames(columns: ProjectionNode[]): string[] | undefined {\n const names: string[] = [];\n for (const col of columns) {\n const alias = (col as any).alias ?? (col as any).name;\n if (!alias) return undefined;\n names.push(alias);\n }\n return names;\n }\n\n private buildProjectionAliasMap(columns: ProjectionNode[]): Map<string, string> {\n const map = new Map<string, string>();\n for (const col of columns) {\n if ((col as ColumnNode).type !== 'Column') continue;\n const node = col as ColumnNode;\n const key = `${node.table}.${node.name}`;\n map.set(key, node.alias ?? node.name);\n }\n return map;\n }\n\n private mapOrderBy(\n orderBy: OrderByNode[] | undefined,\n plan: HydrationPlan,\n projectionAliases: Map<string, string>,\n baseAlias: string,\n availableColumns: Set<string>\n ): OrderByNode[] | undefined | null {\n if (!orderBy || orderBy.length === 0) {\n return undefined;\n }\n\n const mapped: OrderByNode[] = [];\n\n for (const ob of orderBy) {\n // Only rewrite when ordering by root columns; child columns would reintroduce the pagination bug.\n if (ob.column.table !== plan.rootTable) {\n return null;\n }\n\n const alias = projectionAliases.get(`${ob.column.table}.${ob.column.name}`) ?? ob.column.name;\n if (!availableColumns.has(alias)) {\n return null;\n }\n\n mapped.push({\n type: 'OrderBy',\n column: { type: 'Column', table: baseAlias, name: alias },\n direction: ob.direction\n });\n }\n\n return mapped;\n }\n\n private buildPagingColumns(primaryKey: string, orderBy: OrderByNode[] | undefined, tableAlias: string): ColumnNode[] {\n const columns: ColumnNode[] = [{ type: 'Column', table: tableAlias, name: primaryKey, alias: primaryKey }];\n\n if (!orderBy) return columns;\n\n for (const ob of orderBy) {\n if (!columns.some(col => col.name === ob.column.name)) {\n columns.push({\n type: 'Column',\n table: tableAlias,\n name: ob.column.name,\n alias: ob.column.name\n });\n }\n }\n\n return columns;\n }\n}\n","/**\n * Separator used when projecting relational columns\n */\nconst RELATION_SEPARATOR = '__';\n\n/**\n * Parts of a relation alias\n */\nexport interface RelationAliasParts {\n /**\n * Relation name (left side of the separator)\n */\n relationName: string;\n /**\n * Column name (right side of the separator)\n */\n columnName: string;\n}\n\n/**\n * Builds a relation alias from the relation name and column name components.\n */\nexport const makeRelationAlias = (relationName: string, columnName: string): string =>\n `${relationName}${RELATION_SEPARATOR}${columnName}`;\n\n/**\n * Parses a relation alias into its relation/column components.\n * Returns `null` when the alias does not follow the `relation__column` pattern.\n */\nexport const parseRelationAlias = (alias: string): RelationAliasParts | null => {\n const idx = alias.indexOf(RELATION_SEPARATOR);\n if (idx === -1) return null;\n return {\n relationName: alias.slice(0, idx),\n columnName: alias.slice(idx + RELATION_SEPARATOR.length)\n };\n};\n\n/**\n * Determines whether an alias represents a relation column by checking the `__` convention.\n */\nexport const isRelationAlias = (alias?: string): boolean =>\n !!alias && alias.includes(RELATION_SEPARATOR);\n","import { BelongsToManyRelation } from '../schema/relation.js';\r\n\r\n/**\r\n * Builds a default set of pivot columns, excluding keys used for joins.\r\n */\r\nexport const buildDefaultPivotColumns = (\r\n rel: BelongsToManyRelation,\r\n pivotPk: string\r\n): string[] => {\r\n const excluded = new Set([pivotPk, rel.pivotForeignKeyToRoot, rel.pivotForeignKeyToTarget]);\r\n return Object.keys(rel.pivotTable.columns).filter(col => !excluded.has(col));\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { RelationDef, RelationKinds, BelongsToManyRelation } from '../schema/relation.js';\r\nimport { ProjectionNode } from './select-query-state.js';\r\nimport { HydrationPlan, HydrationRelationPlan } from '../core/hydration/types.js';\nimport { isRelationAlias } from './relation-alias.js';\r\nimport { buildDefaultPivotColumns } from './relation-utils.js';\r\n\r\n/**\r\n * Finds the primary key column name for a table\r\n * @param table - Table definition\r\n * @returns Name of the primary key column, defaults to 'id'\r\n */\r\nexport const findPrimaryKey = (table: TableDef): string => {\r\n const pk = Object.values(table.columns).find(c => c.primary);\r\n return pk?.name || 'id';\r\n};\r\n\r\n/**\r\n * Manages hydration planning for query results\r\n */\r\nexport class HydrationPlanner {\r\n /**\r\n * Creates a new HydrationPlanner instance\r\n * @param table - Table definition\r\n * @param plan - Optional existing hydration plan\r\n */\r\n constructor(private readonly table: TableDef, private readonly plan?: HydrationPlan) { }\r\n\r\n /**\r\n * Captures root table columns for hydration planning\r\n * @param columns - Columns to capture\r\n * @returns Updated HydrationPlanner with captured columns\r\n */\r\n captureRootColumns(columns: ProjectionNode[]): HydrationPlanner {\r\n const currentPlan = this.getPlanOrDefault();\r\n const rootCols = new Set(currentPlan.rootColumns);\r\n let changed = false;\r\n\r\n columns.forEach(node => {\r\n if (node.type !== 'Column') return;\r\n if (node.table !== this.table.name) return;\r\n\r\n const alias = node.alias || node.name;\r\n if (isRelationAlias(alias)) return;\r\n if (!rootCols.has(alias)) {\r\n rootCols.add(alias);\r\n changed = true;\r\n }\r\n });\r\n\r\n if (!changed) return this;\r\n return new HydrationPlanner(this.table, {\r\n ...currentPlan,\r\n rootColumns: Array.from(rootCols)\r\n });\r\n }\r\n\r\n /**\r\n * Includes a relation in the hydration plan\r\n * @param rel - Relation definition\r\n * @param relationName - Name of the relation\r\n * @param aliasPrefix - Alias prefix for relation columns\r\n * @param columns - Columns to include from the relation\r\n * @returns Updated HydrationPlanner with included relation\r\n */\r\n includeRelation(\r\n rel: RelationDef,\r\n relationName: string,\r\n aliasPrefix: string,\r\n columns: string[],\r\n pivot?: { aliasPrefix: string; columns: string[] }\r\n ): HydrationPlanner {\r\n const currentPlan = this.getPlanOrDefault();\r\n const relations = currentPlan.relations.filter(r => r.name !== relationName);\r\n relations.push(this.buildRelationPlan(rel, relationName, aliasPrefix, columns, pivot));\r\n return new HydrationPlanner(this.table, {\r\n ...currentPlan,\r\n relations\r\n });\r\n }\r\n\r\n /**\r\n * Gets the current hydration plan\r\n * @returns Current hydration plan or undefined\r\n */\r\n getPlan(): HydrationPlan | undefined {\r\n return this.plan;\r\n }\r\n\r\n /**\r\n * Gets the current hydration plan or creates a default one\r\n * @returns Current hydration plan or default plan\r\n */\r\n private getPlanOrDefault(): HydrationPlan {\r\n return this.plan ?? buildDefaultHydrationPlan(this.table);\r\n }\r\n\r\n /**\r\n * Builds a relation plan for hydration\r\n * @param rel - Relation definition\r\n * @param relationName - Name of the relation\r\n * @param aliasPrefix - Alias prefix for relation columns\r\n * @param columns - Columns to include from the relation\r\n * @returns Hydration relation plan\r\n */\r\n private buildRelationPlan(\r\n rel: RelationDef,\r\n relationName: string,\r\n aliasPrefix: string,\r\n columns: string[],\r\n pivot?: { aliasPrefix: string; columns: string[] }\r\n ): HydrationRelationPlan {\r\n switch (rel.type) {\r\n case RelationKinds.HasMany:\n case RelationKinds.HasOne: {\n const localKey = rel.localKey || findPrimaryKey(this.table);\n return {\n name: relationName,\n aliasPrefix,\n type: rel.type,\n targetTable: rel.target.name,\r\n targetPrimaryKey: findPrimaryKey(rel.target),\r\n foreignKey: rel.foreignKey,\r\n localKey,\r\n columns\r\n };\r\n }\r\n case RelationKinds.BelongsTo: {\r\n const localKey = rel.localKey || findPrimaryKey(rel.target);\r\n return {\r\n name: relationName,\r\n aliasPrefix,\r\n type: rel.type,\r\n targetTable: rel.target.name,\r\n targetPrimaryKey: findPrimaryKey(rel.target),\r\n foreignKey: rel.foreignKey,\r\n localKey,\r\n columns\r\n };\r\n }\r\n case RelationKinds.BelongsToMany: {\r\n const many = rel as BelongsToManyRelation;\r\n const localKey = many.localKey || findPrimaryKey(this.table);\r\n const targetPk = many.targetKey || findPrimaryKey(many.target);\r\n const pivotPk = many.pivotPrimaryKey || findPrimaryKey(many.pivotTable);\r\n const pivotAliasPrefix = pivot?.aliasPrefix ?? `${aliasPrefix}_pivot`;\r\n const pivotColumns =\r\n pivot?.columns ??\r\n many.defaultPivotColumns ??\r\n buildDefaultPivotColumns(many, pivotPk);\r\n\r\n return {\r\n name: relationName,\r\n aliasPrefix,\r\n type: rel.type,\r\n targetTable: many.target.name,\r\n targetPrimaryKey: targetPk,\r\n foreignKey: many.pivotForeignKeyToRoot,\r\n localKey,\r\n columns,\r\n pivot: {\r\n table: many.pivotTable.name,\r\n primaryKey: pivotPk,\r\n aliasPrefix: pivotAliasPrefix,\r\n columns: pivotColumns\r\n }\r\n };\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Builds a default hydration plan for a table\r\n * @param table - Table definition\r\n * @returns Default hydration plan\r\n */\r\nconst buildDefaultHydrationPlan = (table: TableDef): HydrationPlan => ({\r\n rootTable: table.name,\r\n rootPrimaryKey: findPrimaryKey(table),\r\n rootColumns: [],\r\n relations: []\r\n});\r\n","import { ColumnNode } from '../core/ast/expression.js';\r\nimport { CommonTableExpressionNode } from '../core/ast/query.js';\r\n\r\n/**\r\n * Best-effort helper that tries to convert a raw column expression into a `ColumnNode`.\r\n * This parser is intentionally limited; use it only for simple references or function calls.\r\n */\r\nexport const parseRawColumn = (\r\n col: string,\r\n tableName: string,\r\n ctes?: CommonTableExpressionNode[]\r\n): ColumnNode => {\r\n if (col.includes('(')) {\r\n const [fn, rest] = col.split('(');\r\n const colName = rest.replace(')', '');\r\n const [table, name] = colName.includes('.') ? colName.split('.') : [tableName, colName];\r\n return { type: 'Column', table, name, alias: col };\r\n }\r\n\r\n if (col.includes('.')) {\r\n const [potentialCteName, columnName] = col.split('.');\r\n const hasCte = ctes?.some(cte => cte.name === potentialCteName);\r\n\r\n if (hasCte) {\r\n return { type: 'Column', table: tableName, name: col };\r\n }\r\n\r\n return { type: 'Column', table: potentialCteName, name: columnName };\r\n }\r\n\r\n return { type: 'Column', table: tableName, name: col };\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { SelectQueryNode, CommonTableExpressionNode, SetOperationKind, SetOperationNode, TableSourceNode } from '../core/ast/query.js';\nimport { buildColumnNode } from '../core/ast/builders.js';\r\nimport {\r\n ColumnNode,\r\n ExpressionNode,\r\n FunctionNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode,\r\n ScalarSubqueryNode,\r\n and,\r\n isExpressionSelectionNode\r\n} from '../core/ast/expression.js';\r\nimport { JoinNode } from '../core/ast/join.js';\r\nimport { SelectQueryState, ProjectionNode } from './select-query-state.js';\r\nimport { OrderDirection } from '../core/sql/sql.js';\r\nimport { parseRawColumn } from './raw-column-parser.js';\r\n\r\n/**\r\n * Result of column selection operation\r\n */\r\nexport interface ColumnSelectionResult {\r\n /**\r\n * Updated query state\r\n */\r\n state: SelectQueryState;\r\n /**\r\n * Columns that were added\r\n */\r\n addedColumns: ProjectionNode[];\r\n}\r\n\r\n/**\r\n * Service for manipulating query AST (Abstract Syntax Tree)\r\n */\r\nexport class QueryAstService {\r\n /**\r\n * Creates a new QueryAstService instance\r\n * @param table - Table definition\r\n * @param state - Current query state\r\n */\r\n constructor(private readonly table: TableDef, private readonly state: SelectQueryState) {}\r\n\r\n /**\r\n * Selects columns for the query\r\n * @param columns - Columns to select (key: alias, value: column definition or expression)\r\n * @returns Column selection result with updated state and added columns\r\n */\r\n select(\n columns: Record<string, ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode>\n ): ColumnSelectionResult {\n const existingAliases = new Set(\n this.state.ast.columns.map(c => (c as ColumnNode).alias || (c as ColumnNode).name)\n );\n const from = this.state.ast.from;\n const rootTableName = from.type === 'Table' && from.alias ? from.alias : this.table.name;\n\n const newCols = Object.entries(columns).reduce<ProjectionNode[]>((acc, [alias, val]) => {\n if (existingAliases.has(alias)) return acc;\n\n if (isExpressionSelectionNode(val)) {\n acc.push({ ...(val as FunctionNode | CaseExpressionNode | WindowFunctionNode), alias } as ProjectionNode);\n return acc;\n }\n\n const colDef = val as ColumnDef;\n const resolvedTable =\n colDef.table && colDef.table === this.table.name && from.type === 'Table' && from.alias\n ? from.alias\n : colDef.table || rootTableName;\n acc.push({\n type: 'Column',\n table: resolvedTable,\n name: colDef.name,\n alias\n } as ColumnNode);\n return acc;\n }, []);\n\r\n const nextState = this.state.withColumns(newCols);\r\n return { state: nextState, addedColumns: newCols };\r\n }\r\n\r\n /**\r\n * Selects raw column expressions (best-effort parser for simple references/functions)\r\n * @param cols - Raw column expressions\r\n * @returns Column selection result with updated state and added columns\r\n */\r\n selectRaw(cols: string[]): ColumnSelectionResult {\n const from = this.state.ast.from;\n const defaultTable = from.type === 'Table' && from.alias ? from.alias : this.table.name;\n const newCols = cols.map(col => parseRawColumn(col, defaultTable, this.state.ast.ctes));\n const nextState = this.state.withColumns(newCols);\n return { state: nextState, addedColumns: newCols };\n }\n\r\n /**\r\n * Adds a Common Table Expression (CTE) to the query\r\n * @param name - Name of the CTE\r\n * @param query - Query for the CTE\r\n * @param columns - Optional column names for the CTE\r\n * @param recursive - Whether the CTE is recursive\r\n * @returns Updated query state with CTE\r\n */\r\n withCte(name: string, query: SelectQueryNode, columns?: string[], recursive = false): SelectQueryState {\n const cte: CommonTableExpressionNode = {\n type: 'CommonTableExpression',\n name,\n query,\n columns,\n recursive\n };\n\n return this.state.withCte(cte);\n }\n\n /**\n * Adds a set operation (UNION/UNION ALL/INTERSECT/EXCEPT) to the query\n * @param operator - Set operator\n * @param query - Right-hand side query\n * @returns Updated query state with set operation\n */\n withSetOperation(operator: SetOperationKind, query: SelectQueryNode): SelectQueryState {\n const op: SetOperationNode = {\n type: 'SetOperation',\n operator,\n query\n };\n return this.state.withSetOperation(op);\n }\n\n /**\n * Replaces the FROM clause for the current query.\n * @param from - Table source to use in the FROM clause\n * @returns Updated query state with new FROM\n */\n withFrom(from: TableSourceNode): SelectQueryState {\n return this.state.withFrom(from);\n }\n\r\n /**\r\n * Selects a subquery as a column\r\n * @param alias - Alias for the subquery\r\n * @param query - Subquery to select\r\n * @returns Updated query state with subquery selection\r\n */\r\n selectSubquery(alias: string, query: SelectQueryNode): SelectQueryState {\r\n const node: ScalarSubqueryNode = { type: 'ScalarSubquery', query, alias };\r\n return this.state.withColumns([node]);\r\n }\r\n\r\n /**\r\n * Adds a JOIN clause to the query\r\n * @param join - Join node to add\r\n * @returns Updated query state with JOIN\r\n */\r\n withJoin(join: JoinNode): SelectQueryState {\r\n return this.state.withJoin(join);\r\n }\r\n\r\n /**\r\n * Adds a WHERE clause to the query\r\n * @param expr - Expression for the WHERE clause\r\n * @returns Updated query state with WHERE clause\r\n */\r\n withWhere(expr: ExpressionNode): SelectQueryState {\r\n const combined = this.combineExpressions(this.state.ast.where, expr);\r\n return this.state.withWhere(combined);\r\n }\r\n\r\n /**\r\n * Adds a GROUP BY clause to the query\r\n * @param col - Column to group by\r\n * @returns Updated query state with GROUP BY clause\r\n */\r\n withGroupBy(col: ColumnDef | ColumnNode): SelectQueryState {\n const from = this.state.ast.from;\n const tableRef = from.type === 'Table' && from.alias ? { ...this.table, alias: from.alias } : this.table;\n const node = buildColumnNode(tableRef, col);\n return this.state.withGroupBy([node]);\n }\n\r\n /**\r\n * Adds a HAVING clause to the query\r\n * @param expr - Expression for the HAVING clause\r\n * @returns Updated query state with HAVING clause\r\n */\r\n withHaving(expr: ExpressionNode): SelectQueryState {\r\n const combined = this.combineExpressions(this.state.ast.having, expr);\r\n return this.state.withHaving(combined);\r\n }\r\n\r\n /**\r\n * Adds an ORDER BY clause to the query\r\n * @param col - Column to order by\r\n * @param direction - Order direction (ASC/DESC)\r\n * @returns Updated query state with ORDER BY clause\r\n */\r\n withOrderBy(col: ColumnDef | ColumnNode, direction: OrderDirection): SelectQueryState {\n const from = this.state.ast.from;\n const tableRef = from.type === 'Table' && from.alias ? { ...this.table, alias: from.alias } : this.table;\n const node = buildColumnNode(tableRef, col);\n return this.state.withOrderBy([{ type: 'OrderBy', column: node, direction }]);\n }\n\r\n /**\r\n * Adds a DISTINCT clause to the query\r\n * @param cols - Columns to make distinct\r\n * @returns Updated query state with DISTINCT clause\r\n */\r\n withDistinct(cols: ColumnNode[]): SelectQueryState {\r\n return this.state.withDistinct(cols);\r\n }\r\n\r\n /**\r\n * Adds a LIMIT clause to the query\r\n * @param limit - Maximum number of rows to return\r\n * @returns Updated query state with LIMIT clause\r\n */\r\n withLimit(limit: number): SelectQueryState {\r\n return this.state.withLimit(limit);\r\n }\r\n\r\n /**\r\n * Adds an OFFSET clause to the query\r\n * @param offset - Number of rows to skip\r\n * @returns Updated query state with OFFSET clause\r\n */\r\n withOffset(offset: number): SelectQueryState {\r\n return this.state.withOffset(offset);\r\n }\r\n\r\n /**\r\n * Combines expressions with AND operator\r\n * @param existing - Existing expression\r\n * @param next - New expression to combine\r\n * @returns Combined expression\r\n */\r\n private combineExpressions(existing: ExpressionNode | undefined, next: ExpressionNode): ExpressionNode {\r\n return existing ? and(existing, next) : next;\r\n }\r\n\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { SelectQueryState } from './select-query-state.js';\r\nimport { HydrationManager } from './hydration-manager.js';\r\nimport { ColumnNode } from '../core/ast/expression.js';\r\nimport { findPrimaryKey } from './hydration-planner.js';\r\nimport { isRelationAlias } from './relation-alias.js';\r\n\r\n/**\r\n * Result of a relation operation\r\n */\r\nexport interface RelationResult {\r\n /**\r\n * Updated query state\r\n */\r\n state: SelectQueryState;\r\n /**\r\n * Updated hydration manager\r\n */\r\n hydration: HydrationManager;\r\n}\r\n\r\n/**\r\n * Callback function for selecting columns\r\n */\r\ntype SelectColumnsCallback = (\r\n state: SelectQueryState,\r\n hydration: HydrationManager,\r\n columns: Record<string, ColumnDef>\r\n) => RelationResult;\r\n\r\n/**\r\n * Helper class for managing relation projections in queries\r\n */\r\nexport class RelationProjectionHelper {\r\n /**\r\n * Creates a new RelationProjectionHelper instance\r\n * @param table - Table definition\r\n * @param selectColumns - Callback for selecting columns\r\n */\r\n constructor(\r\n private readonly table: TableDef,\r\n private readonly selectColumns: SelectColumnsCallback\r\n ) {}\r\n\r\n /**\r\n * Ensures base projection is included in the query\r\n * @param state - Current query state\r\n * @param hydration - Hydration manager\r\n * @returns Relation result with updated state and hydration\r\n */\r\n ensureBaseProjection(state: SelectQueryState, hydration: HydrationManager): RelationResult {\r\n const primaryKey = findPrimaryKey(this.table);\r\n\r\n if (!this.hasBaseProjection(state)) {\r\n return this.selectColumns(state, hydration, this.getBaseColumns());\r\n }\r\n\r\n if (primaryKey && !this.hasPrimarySelected(state, primaryKey) && this.table.columns[primaryKey]) {\r\n return this.selectColumns(state, hydration, {\r\n [primaryKey]: this.table.columns[primaryKey]\r\n });\r\n }\r\n\r\n return { state, hydration };\r\n }\r\n\r\n /**\r\n * Checks if base projection exists in the query\r\n * @param state - Current query state\r\n * @returns True if base projection exists\r\n */\r\n private hasBaseProjection(state: SelectQueryState): boolean {\r\n return state.ast.columns.some(col => !isRelationAlias((col as ColumnNode).alias));\r\n }\r\n\r\n /**\r\n * Checks if primary key is selected in the query\r\n * @param state - Current query state\r\n * @param primaryKey - Primary key name\r\n * @returns True if primary key is selected\r\n */\r\n private hasPrimarySelected(state: SelectQueryState, primaryKey: string): boolean {\r\n return state.ast.columns.some(col => {\r\n const alias = (col as ColumnNode).alias;\r\n const name = alias || (col as ColumnNode).name;\r\n return !isRelationAlias(alias) && name === primaryKey;\r\n });\r\n }\r\n\r\n /**\r\n * Gets all base columns for the table\r\n * @returns Record of all table columns\r\n */\r\n private getBaseColumns(): Record<string, ColumnDef> {\r\n return Object.keys(this.table.columns).reduce((acc, key) => {\r\n acc[key] = (this.table.columns as Record<string, ColumnDef>)[key];\r\n return acc;\r\n }, {} as Record<string, ColumnDef>);\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { RelationDef, RelationKinds, BelongsToManyRelation } from '../schema/relation.js';\r\nimport { ExpressionNode, eq, and } from '../core/ast/expression.js';\r\nimport { findPrimaryKey } from './hydration-planner.js';\r\nimport { JoinNode } from '../core/ast/join.js';\r\nimport { JoinKind } from '../core/sql/sql.js';\r\nimport { createJoinNode } from '../core/ast/join-node.js';\r\n\r\n/**\r\n * Utility function to handle unreachable code paths\r\n * @param value - Value that should never occur\r\n * @throws Error indicating unhandled relation type\r\n */\r\nconst assertNever = (value: never): never => {\r\n throw new Error(`Unhandled relation type: ${JSON.stringify(value)}`);\r\n};\r\n\r\n/**\r\n * Builds the base condition for a relation join\r\n * @param root - Root table definition\r\n * @param relation - Relation definition\r\n * @returns Expression node representing the join condition\r\n */\r\nconst baseRelationCondition = (root: TableDef, relation: RelationDef, rootAlias?: string): ExpressionNode => {\n const rootTable = rootAlias || root.name;\n const defaultLocalKey =\n relation.type === RelationKinds.HasMany || relation.type === RelationKinds.HasOne\n ? findPrimaryKey(root)\n : findPrimaryKey(relation.target);\n const localKey = relation.localKey || defaultLocalKey;\n\r\n switch (relation.type) {\r\n case RelationKinds.HasMany:\n case RelationKinds.HasOne:\n return eq(\n { type: 'Column', table: relation.target.name, name: relation.foreignKey },\n { type: 'Column', table: rootTable, name: localKey }\n );\n case RelationKinds.BelongsTo:\n return eq(\n { type: 'Column', table: relation.target.name, name: localKey },\n { type: 'Column', table: rootTable, name: relation.foreignKey }\n );\n case RelationKinds.BelongsToMany:\r\n throw new Error('BelongsToMany relations do not support the standard join condition builder');\r\n default:\r\n return assertNever(relation);\r\n }\r\n};\r\n\r\n/**\r\n * Builds the join nodes required to include a BelongsToMany relation.\r\n */\r\nexport const buildBelongsToManyJoins = (\n root: TableDef,\n relationName: string,\n relation: BelongsToManyRelation,\n joinKind: JoinKind,\n extra?: ExpressionNode,\n rootAlias?: string\n): JoinNode[] => {\n const rootKey = relation.localKey || findPrimaryKey(root);\n const targetKey = relation.targetKey || findPrimaryKey(relation.target);\n const rootTable = rootAlias || root.name;\n\n const pivotCondition = eq(\n { type: 'Column', table: relation.pivotTable.name, name: relation.pivotForeignKeyToRoot },\n { type: 'Column', table: rootTable, name: rootKey }\n );\n\r\n const pivotJoin = createJoinNode(joinKind, relation.pivotTable.name, pivotCondition);\r\n\r\n let targetCondition: ExpressionNode = eq(\r\n { type: 'Column', table: relation.target.name, name: targetKey },\r\n { type: 'Column', table: relation.pivotTable.name, name: relation.pivotForeignKeyToTarget }\r\n );\r\n\r\n if (extra) {\r\n targetCondition = and(targetCondition, extra);\r\n }\r\n\r\n const targetJoin = createJoinNode(\r\n joinKind,\r\n relation.target.name,\r\n targetCondition,\r\n relationName\r\n );\r\n\r\n return [pivotJoin, targetJoin];\r\n};\r\n\r\n/**\r\n * Builds a relation join condition with optional extra conditions\r\n * @param root - Root table definition\r\n * @param relation - Relation definition\r\n * @param extra - Optional additional expression to combine with AND\r\n * @returns Expression node representing the complete join condition\r\n */\r\nexport const buildRelationJoinCondition = (\n root: TableDef,\n relation: RelationDef,\n extra?: ExpressionNode,\n rootAlias?: string\n): ExpressionNode => {\n const base = baseRelationCondition(root, relation, rootAlias);\n return extra ? and(base, extra) : base;\n};\n\r\n/**\r\n * Builds a relation correlation condition for subqueries\r\n * @param root - Root table definition\r\n * @param relation - Relation definition\r\n * @returns Expression node representing the correlation condition\r\n */\r\nexport const buildRelationCorrelation = (root: TableDef, relation: RelationDef, rootAlias?: string): ExpressionNode => {\n return baseRelationCondition(root, relation, rootAlias);\n};\n","import { JoinNode } from './join.js';\n\n/**\n * Metadata stored on JoinNode.meta for higher-level concerns.\n */\nexport interface JoinMetadata {\n relationName?: string;\n [key: string]: unknown;\n}\n\n/**\n * Retrieves the relation name from join metadata if present.\n */\nexport const getJoinRelationName = (join: JoinNode): string | undefined =>\n (join.meta as JoinMetadata | undefined)?.relationName;\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { RelationDef, RelationKinds, BelongsToManyRelation } from '../schema/relation.js';\r\nimport { SelectQueryNode } from '../core/ast/query.js';\r\nimport {\r\n ColumnNode,\r\n ExpressionNode,\r\n and\r\n} from '../core/ast/expression.js';\r\nimport { SelectQueryState } from './select-query-state.js';\r\nimport { HydrationManager } from './hydration-manager.js';\r\nimport { QueryAstService } from './query-ast-service.js';\r\nimport { findPrimaryKey } from './hydration-planner.js';\r\nimport { RelationProjectionHelper } from './relation-projection-helper.js';\r\nimport type { RelationResult } from './relation-projection-helper.js';\r\nimport {\r\n buildRelationJoinCondition,\r\n buildRelationCorrelation,\r\n buildBelongsToManyJoins\r\n} from './relation-conditions.js';\r\nimport { JoinKind, JOIN_KINDS } from '../core/sql/sql.js';\r\nimport { RelationIncludeOptions } from './relation-types.js';\r\nimport { createJoinNode } from '../core/ast/join-node.js';\nimport { getJoinRelationName } from '../core/ast/join-metadata.js';\nimport { makeRelationAlias } from './relation-alias.js';\r\nimport { buildDefaultPivotColumns } from './relation-utils.js';\r\n\r\n/**\r\n * Service for handling relation operations (joins, includes, etc.)\r\n */\r\nexport class RelationService {\r\n private readonly projectionHelper: RelationProjectionHelper;\r\n\r\n /**\r\n * Creates a new RelationService instance\r\n * @param table - Table definition\r\n * @param state - Current query state\r\n * @param hydration - Hydration manager\r\n */\r\n constructor(\r\n private readonly table: TableDef,\r\n private readonly state: SelectQueryState,\r\n private readonly hydration: HydrationManager,\r\n private readonly createQueryAstService: (table: TableDef, state: SelectQueryState) => QueryAstService\r\n ) {\r\n this.projectionHelper = new RelationProjectionHelper(table, (state, hydration, columns) =>\r\n this.selectColumns(state, hydration, columns)\r\n );\r\n }\r\n\r\n /**\r\n * Joins a relation to the query\r\n * @param relationName - Name of the relation to join\r\n * @param joinKind - Type of join to use\r\n * @param extraCondition - Additional join condition\r\n * @returns Relation result with updated state and hydration\r\n */\r\n joinRelation(\r\n relationName: string,\r\n joinKind: JoinKind,\r\n extraCondition?: ExpressionNode\r\n ): RelationResult {\r\n const nextState = this.withJoin(this.state, relationName, joinKind, extraCondition);\r\n return { state: nextState, hydration: this.hydration };\r\n }\r\n\r\n /**\r\n * Matches records based on a relation with an optional predicate\r\n * @param relationName - Name of the relation to match\r\n * @param predicate - Optional predicate expression\r\n * @returns Relation result with updated state and hydration\r\n */\r\n match(\n relationName: string,\n predicate?: ExpressionNode\n ): RelationResult {\n const joined = this.joinRelation(relationName, JOIN_KINDS.INNER, predicate);\n const pk = findPrimaryKey(this.table);\n const distinctCols: ColumnNode[] = [{ type: 'Column', table: this.rootTableName(), name: pk }];\n const existingDistinct = joined.state.ast.distinct ? joined.state.ast.distinct : [];\n const nextState = this.astService(joined.state).withDistinct([...existingDistinct, ...distinctCols]);\n return { state: nextState, hydration: joined.hydration };\n }\n\r\n /**\r\n * Includes a relation in the query result\r\n * @param relationName - Name of the relation to include\r\n * @param options - Options for relation inclusion\r\n * @returns Relation result with updated state and hydration\r\n */\r\n include(relationName: string, options?: RelationIncludeOptions): RelationResult {\r\n let state = this.state;\r\n let hydration = this.hydration;\r\n\r\n const relation = this.getRelation(relationName);\r\n const aliasPrefix = options?.aliasPrefix ?? relationName;\r\n const alreadyJoined = state.ast.joins.some(j => getJoinRelationName(j) === relationName);\n\r\n if (!alreadyJoined) {\r\n const joined = this.joinRelation(relationName, options?.joinKind ?? JOIN_KINDS.LEFT, options?.filter);\r\n state = joined.state;\r\n }\r\n\r\n const projectionResult = this.projectionHelper.ensureBaseProjection(state, hydration);\r\n state = projectionResult.state;\r\n hydration = projectionResult.hydration;\r\n\r\n const targetColumns = options?.columns?.length\r\n ? options.columns\r\n : Object.keys(relation.target.columns);\r\n\r\n const buildTypedSelection = (\r\n columns: Record<string, ColumnDef>,\r\n prefix: string,\r\n keys: string[],\r\n missingMsg: (col: string) => string\r\n ) : Record<string, ColumnDef> => {\r\n return keys.reduce((acc, key) => {\r\n const def = columns[key];\r\n if (!def) {\r\n throw new Error(missingMsg(key));\r\n }\r\n acc[makeRelationAlias(prefix, key)] = def;\r\n return acc;\r\n }, {} as Record<string, ColumnDef>);\r\n };\r\n\r\n const targetSelection = buildTypedSelection(\r\n relation.target.columns as Record<string, ColumnDef>,\r\n aliasPrefix,\r\n targetColumns,\r\n key => `Column '${key}' not found on relation '${relationName}'`\r\n );\r\n\r\n if (relation.type !== RelationKinds.BelongsToMany) {\r\n const relationSelectionResult = this.selectColumns(state, hydration, targetSelection);\r\n state = relationSelectionResult.state;\r\n hydration = relationSelectionResult.hydration;\r\n\r\n hydration = hydration.onRelationIncluded(\r\n state,\r\n relation,\r\n relationName,\r\n aliasPrefix,\r\n targetColumns\r\n );\r\n\r\n return { state, hydration };\r\n }\r\n\r\n const many = relation as BelongsToManyRelation;\r\n const pivotAliasPrefix = options?.pivot?.aliasPrefix ?? `${aliasPrefix}_pivot`;\r\n const pivotPk = many.pivotPrimaryKey || findPrimaryKey(many.pivotTable);\r\n const pivotColumns =\r\n options?.pivot?.columns ??\r\n many.defaultPivotColumns ??\r\n buildDefaultPivotColumns(many, pivotPk);\r\n\r\n const pivotSelection = buildTypedSelection(\r\n many.pivotTable.columns as Record<string, ColumnDef>,\r\n pivotAliasPrefix,\r\n pivotColumns,\r\n key => `Column '${key}' not found on pivot table '${many.pivotTable.name}'`\r\n );\r\n\r\n const combinedSelection = {\r\n ...targetSelection,\r\n ...pivotSelection\r\n };\r\n\r\n const relationSelectionResult = this.selectColumns(state, hydration, combinedSelection);\r\n state = relationSelectionResult.state;\r\n hydration = relationSelectionResult.hydration;\r\n\r\n hydration = hydration.onRelationIncluded(\r\n state,\r\n relation,\r\n relationName,\r\n aliasPrefix,\r\n targetColumns,\r\n { aliasPrefix: pivotAliasPrefix, columns: pivotColumns }\r\n );\r\n\r\n return { state, hydration };\r\n }\r\n\r\n /**\r\n * Applies relation correlation to a query AST\r\n * @param relationName - Name of the relation\r\n * @param ast - Query AST to modify\r\n * @returns Modified query AST with relation correlation\r\n */\r\n applyRelationCorrelation(\n relationName: string,\n ast: SelectQueryNode,\n additionalCorrelation?: ExpressionNode\n ): SelectQueryNode {\n const relation = this.getRelation(relationName);\n const rootAlias = this.state.ast.from.type === 'Table' ? this.state.ast.from.alias : undefined;\n let correlation = buildRelationCorrelation(this.table, relation, rootAlias);\n if (additionalCorrelation) {\n correlation = and(correlation, additionalCorrelation);\n }\n const whereInSubquery = ast.where\n ? and(correlation, ast.where)\n : correlation;\n\n return {\n ...ast,\r\n where: whereInSubquery\r\n };\r\n }\r\n\r\n /**\r\n * Creates a join node for a relation\r\n * @param state - Current query state\r\n * @param relationName - Name of the relation\r\n * @param joinKind - Type of join to use\r\n * @param extraCondition - Additional join condition\r\n * @returns Updated query state with join\r\n */\r\n private withJoin(\n state: SelectQueryState,\n relationName: string,\n joinKind: JoinKind,\n extraCondition?: ExpressionNode\n ): SelectQueryState {\n const relation = this.getRelation(relationName);\n const rootAlias = state.ast.from.type === 'Table' ? state.ast.from.alias : undefined;\n if (relation.type === RelationKinds.BelongsToMany) {\n const joins = buildBelongsToManyJoins(\n this.table,\n relationName,\n relation as BelongsToManyRelation,\n joinKind,\n extraCondition,\n rootAlias\n );\n return joins.reduce((current, join) => this.astService(current).withJoin(join), state);\n }\n\n const condition = buildRelationJoinCondition(this.table, relation, extraCondition, rootAlias);\n const joinNode = createJoinNode(joinKind, relation.target.name, condition, relationName);\n\r\n return this.astService(state).withJoin(joinNode);\r\n }\r\n\r\n /**\r\n * Selects columns for a relation\r\n * @param state - Current query state\r\n * @param hydration - Hydration manager\r\n * @param columns - Columns to select\r\n * @returns Relation result with updated state and hydration\r\n */\r\n private selectColumns(\r\n state: SelectQueryState,\r\n hydration: HydrationManager,\r\n columns: Record<string, ColumnDef>\r\n ): RelationResult {\r\n const { state: nextState, addedColumns } = this.astService(state).select(columns);\r\n return {\r\n state: nextState,\r\n hydration: hydration.onColumnsSelected(nextState, addedColumns)\r\n };\r\n }\r\n\r\n /**\r\n * Gets a relation definition by name\r\n * @param relationName - Name of the relation\r\n * @returns Relation definition\r\n * @throws Error if relation is not found\r\n */\r\n private getRelation(relationName: string): RelationDef {\r\n const relation = this.table.relations[relationName];\r\n if (!relation) {\r\n throw new Error(`Relation '${relationName}' not found on table '${this.table.name}'`);\r\n }\r\n\r\n return relation;\r\n }\r\n\r\n /**\r\n * Creates a QueryAstService instance\r\n * @param state - Current query state\r\n * @returns QueryAstService instance\r\n */\r\n private astService(state: SelectQueryState = this.state): QueryAstService {\n return this.createQueryAstService(this.table, state);\n }\n\n private rootTableName(): string {\n const from = this.state.ast.from;\n if (from.type === 'Table' && from.alias) return from.alias;\n return this.table.name;\n }\n}\n\r\nexport type { RelationResult } from './relation-projection-helper.js';\r\n","import { TableDef } from '../schema/table.js';\r\nimport { SelectQueryState } from './select-query-state.js';\r\nimport { HydrationManager } from './hydration-manager.js';\r\nimport { HydrationPlanner } from './hydration-planner.js';\r\nimport { QueryAstService } from './query-ast-service.js';\r\nimport { RelationService } from './relation-service.js';\r\n\r\n/**\r\n * Context for query building operations\r\n */\r\nexport interface SelectQueryBuilderContext {\r\n /**\r\n * Current query state\r\n */\r\n readonly state: SelectQueryState;\r\n /**\r\n * Hydration manager for the query\r\n */\r\n readonly hydration: HydrationManager;\r\n}\r\n\r\n/**\r\n * Dependencies for query builder operations\r\n */\r\nexport interface SelectQueryBuilderDependencies {\r\n /**\r\n * Creates a new query state\r\n * @param table - Table definition\r\n * @returns New query state\r\n */\r\n createState: (table: TableDef) => SelectQueryState;\r\n /**\r\n * Creates a new hydration manager\r\n * @param table - Table definition\r\n * @returns New hydration manager\r\n */\r\n createHydration: (table: TableDef) => HydrationManager;\r\n /**\r\n * Creates a new hydration planner\r\n * @param table - Table definition\r\n * @returns Hydration planner\r\n */\r\n createHydrationPlanner: (table: TableDef) => HydrationPlanner;\r\n /**\r\n * Creates a new query AST service\r\n * @param table - Table definition\r\n * @param state - Query state\r\n * @returns New query AST service\r\n */\r\n createQueryAstService: (table: TableDef, state: SelectQueryState) => QueryAstService;\r\n /**\r\n * Creates a new relation service\r\n * @param table - Table definition\r\n * @param state - Query state\r\n * @param hydration - Hydration manager\r\n * @returns New relation service\r\n */\r\n createRelationService: (\r\n table: TableDef,\r\n state: SelectQueryState,\r\n hydration: HydrationManager\r\n ) => RelationService;\r\n}\r\n\r\n/**\r\n * Environment for query builder operations\r\n */\r\nexport interface SelectQueryBuilderEnvironment {\r\n /**\r\n * Table definition\r\n */\r\n readonly table: TableDef;\r\n /**\r\n * Query builder dependencies\r\n */\r\n readonly deps: SelectQueryBuilderDependencies;\r\n}\r\n\r\n/**\r\n * Default implementations for query builder dependencies\r\n */\r\nconst defaultCreateQueryAstService = (table: TableDef, state: SelectQueryState) => new QueryAstService(table, state);\r\nconst defaultCreateHydrationPlanner = (table: TableDef) => new HydrationPlanner(table);\r\n\r\nconst defaultCreateHydration = (table: TableDef, plannerFactory: (table: TableDef) => HydrationPlanner) =>\r\n new HydrationManager(table, plannerFactory(table));\r\n\r\n/**\r\n * Resolves query builder dependencies by merging overrides with internal defaults\r\n * @param overrides - Partial overrides for dependency factories\r\n */\r\nexport const resolveSelectQueryBuilderDependencies = (\r\n overrides: Partial<SelectQueryBuilderDependencies> = {}\r\n): SelectQueryBuilderDependencies => {\r\n const createQueryAstService = overrides.createQueryAstService ?? defaultCreateQueryAstService;\r\n const createHydrationPlanner = overrides.createHydrationPlanner ?? defaultCreateHydrationPlanner;\r\n const createHydration =\r\n overrides.createHydration ?? (table => defaultCreateHydration(table, createHydrationPlanner));\r\n const createRelationService =\r\n overrides.createRelationService ??\r\n ((table, state, hydration) => new RelationService(table, state, hydration, createQueryAstService));\r\n\r\n return {\r\n createState: overrides.createState ?? (table => new SelectQueryState(table)),\r\n createHydration,\r\n createHydrationPlanner,\r\n createQueryAstService,\r\n createRelationService\r\n };\r\n};\r\n\r\nexport const defaultSelectQueryBuilderDependencies = resolveSelectQueryBuilderDependencies();\r\n","import { ColumnDef } from '../schema/column.js';\r\nimport { CaseExpressionNode, ColumnNode, FunctionNode, WindowFunctionNode } from '../core/ast/expression.js';\r\nimport { SelectQueryNode } from '../core/ast/query.js';\r\nimport { buildColumnNode } from '../core/ast/builders.js';\r\nimport { SelectQueryBuilderContext, SelectQueryBuilderEnvironment } from './select-query-builder-deps.js';\r\n\r\n/**\r\n * Type for column selection input\r\n */\r\ntype ColumnSelectionInput = Record<string, ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode>;\r\n\r\n/**\r\n * Handles column selection operations for the query builder\r\n */\r\nexport class ColumnSelector {\r\n /**\r\n * Creates a new ColumnSelector instance\r\n * @param env - Query builder environment\r\n */\r\n constructor(private readonly env: SelectQueryBuilderEnvironment) {}\r\n\r\n /**\r\n * Selects columns for the query\r\n * @param context - Current query context\r\n * @param columns - Columns to select\r\n * @returns Updated query context with selected columns\r\n */\r\n select(context: SelectQueryBuilderContext, columns: ColumnSelectionInput): SelectQueryBuilderContext {\r\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\r\n const { state: nextState, addedColumns } = astService.select(columns);\r\n return {\r\n state: nextState,\r\n hydration: context.hydration.onColumnsSelected(nextState, addedColumns)\r\n };\r\n }\r\n\r\n /**\r\n * Selects raw column expressions\r\n * @param context - Current query context\r\n * @param columns - Raw column expressions\r\n * @returns Updated query context with raw column selections\r\n */\r\n selectRaw(context: SelectQueryBuilderContext, columns: string[]): SelectQueryBuilderContext {\r\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\r\n const nextState = astService.selectRaw(columns).state;\r\n return { state: nextState, hydration: context.hydration };\r\n }\r\n\r\n /**\r\n * Selects a subquery as a column\r\n * @param context - Current query context\r\n * @param alias - Alias for the subquery\r\n * @param query - Subquery to select\r\n * @returns Updated query context with subquery selection\r\n */\r\n selectSubquery(\r\n context: SelectQueryBuilderContext,\r\n alias: string,\r\n query: SelectQueryNode\r\n ): SelectQueryBuilderContext {\r\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\r\n const nextState = astService.selectSubquery(alias, query);\r\n return { state: nextState, hydration: context.hydration };\r\n }\r\n\r\n /**\r\n * Adds DISTINCT clause to the query\r\n * @param context - Current query context\r\n * @param columns - Columns to make distinct\r\n * @returns Updated query context with DISTINCT clause\r\n */\r\n distinct(context: SelectQueryBuilderContext, columns: (ColumnDef | ColumnNode)[]): SelectQueryBuilderContext {\n const from = context.state.ast.from;\n const tableRef = from.type === 'Table' && from.alias ? { ...this.env.table, alias: from.alias } : this.env.table;\n const nodes = columns.map(col => buildColumnNode(tableRef, col));\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\n const nextState = astService.withDistinct(nodes);\n return { state: nextState, hydration: context.hydration };\n }\n}\n","import { ExpressionNode } from '../core/ast/expression.js';\r\nimport { SelectQueryNode } from '../core/ast/query.js';\r\nimport { SelectQueryBuilderContext, SelectQueryBuilderEnvironment } from './select-query-builder-deps.js';\r\nimport { JoinKind } from '../core/sql/sql.js';\r\nimport { RelationIncludeOptions } from './relation-types.js';\r\n\r\n/**\r\n * Manages relation operations (joins, includes, etc.) for query building\r\n */\r\nexport class RelationManager {\r\n /**\r\n * Creates a new RelationManager instance\r\n * @param env - Query builder environment\r\n */\r\n constructor(private readonly env: SelectQueryBuilderEnvironment) {}\r\n\r\n /**\r\n * Matches records based on a relation with an optional predicate\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation to match\r\n * @param predicate - Optional predicate expression\r\n * @returns Updated query context with relation match\r\n */\r\n match(context: SelectQueryBuilderContext, relationName: string, predicate?: ExpressionNode): SelectQueryBuilderContext {\r\n const result = this.createService(context).match(relationName, predicate);\r\n return { state: result.state, hydration: result.hydration };\r\n }\r\n\r\n /**\r\n * Joins a relation to the query\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation to join\r\n * @param joinKind - Type of join to use\r\n * @param extraCondition - Additional join condition\r\n * @returns Updated query context with relation join\r\n */\r\n joinRelation(\r\n context: SelectQueryBuilderContext,\r\n relationName: string,\r\n joinKind: JoinKind,\r\n extraCondition?: ExpressionNode\r\n ): SelectQueryBuilderContext {\r\n const result = this.createService(context).joinRelation(relationName, joinKind, extraCondition);\r\n return { state: result.state, hydration: result.hydration };\r\n }\r\n\r\n /**\r\n * Includes a relation in the query result\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation to include\r\n * @param options - Options for relation inclusion\r\n * @returns Updated query context with included relation\r\n */\r\n include(\r\n context: SelectQueryBuilderContext,\r\n relationName: string,\r\n options?: RelationIncludeOptions\r\n ): SelectQueryBuilderContext {\r\n const result = this.createService(context).include(relationName, options);\r\n return { state: result.state, hydration: result.hydration };\r\n }\r\n\r\n /**\r\n * Applies relation correlation to a query AST\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation\r\n * @param ast - Query AST to modify\r\n * @returns Modified query AST with relation correlation\r\n */\r\n applyRelationCorrelation(\n context: SelectQueryBuilderContext,\n relationName: string,\n ast: SelectQueryNode,\n additionalCorrelation?: ExpressionNode\n ): SelectQueryNode {\n return this.createService(context).applyRelationCorrelation(relationName, ast, additionalCorrelation);\n }\n\r\n /**\r\n * Creates a relation service instance\r\n * @param context - Current query context\r\n * @returns Relation service instance\r\n */\r\n private createService(context: SelectQueryBuilderContext) {\r\n return this.env.deps.createRelationService(this.env.table, context.state, context.hydration);\r\n }\r\n}\r\n","import { HydrationPlan, HydrationRelationPlan } from '../core/hydration/types.js';\nimport { RelationKinds } from '../schema/relation.js';\nimport { isRelationAlias, makeRelationAlias } from '../query-builder/relation-alias.js';\n\r\n/**\r\n * Hydrates query results according to a hydration plan\r\n * @param rows - Raw database rows\r\n * @param plan - Hydration plan\r\n * @returns Hydrated result objects with nested relations\r\n */\r\nexport const hydrateRows = (rows: Record<string, any>[], plan?: HydrationPlan): Record<string, any>[] => {\r\n if (!plan || !rows.length) return rows;\r\n\r\n const rootMap = new Map<any, Record<string, any>>();\r\n const relationIndex = new Map<any, Record<string, Set<any>>>();\r\n\r\n const getOrCreateParent = (row: Record<string, any>) => {\r\n const rootId = row[plan.rootPrimaryKey];\r\n if (rootId === undefined) return undefined;\r\n\r\n if (!rootMap.has(rootId)) {\r\n rootMap.set(rootId, createBaseRow(row, plan));\r\n }\r\n\r\n return rootMap.get(rootId);\r\n };\r\n\r\n const getRelationSeenSet = (rootId: any, relationName: string): Set<any> => {\r\n let byRelation = relationIndex.get(rootId);\r\n if (!byRelation) {\r\n byRelation = {};\r\n relationIndex.set(rootId, byRelation);\r\n }\r\n\r\n let seen = byRelation[relationName];\r\n if (!seen) {\r\n seen = new Set<any>();\r\n byRelation[relationName] = seen;\r\n }\r\n\r\n return seen;\r\n };\r\n\r\n for (const row of rows) {\r\n const rootId = row[plan.rootPrimaryKey];\r\n if (rootId === undefined) continue;\r\n\r\n const parent = getOrCreateParent(row);\r\n if (!parent) continue;\r\n\r\n for (const rel of plan.relations) {\n const childPkKey = makeRelationAlias(rel.aliasPrefix, rel.targetPrimaryKey);\n const childPk = row[childPkKey];\n if (childPk === null || childPk === undefined) continue;\n\n const seen = getRelationSeenSet(rootId, rel.name);\n if (seen.has(childPk)) continue;\n seen.add(childPk);\n\n if (rel.type === RelationKinds.HasOne) {\n if (!parent[rel.name]) {\n parent[rel.name] = buildChild(row, rel);\n }\n continue;\n }\n\n const bucket = parent[rel.name] as any[];\n bucket.push(buildChild(row, rel));\n }\n }\r\n\r\n return Array.from(rootMap.values());\r\n};\r\n\r\nconst createBaseRow = (row: Record<string, any>, plan: HydrationPlan): Record<string, any> => {\r\n const base: Record<string, any> = {};\r\n const baseKeys = plan.rootColumns.length\r\n ? plan.rootColumns\r\n : Object.keys(row).filter(k => !isRelationAlias(k));\r\n\r\n for (const key of baseKeys) {\r\n base[key] = row[key];\r\n }\r\n\r\n for (const rel of plan.relations) {\n base[rel.name] = rel.type === RelationKinds.HasOne ? null : [];\n }\n\r\n return base;\r\n};\r\n\r\nconst buildChild = (row: Record<string, any>, rel: HydrationRelationPlan): Record<string, any> => {\r\n const child: Record<string, any> = {};\r\n for (const col of rel.columns) {\r\n const key = makeRelationAlias(rel.aliasPrefix, col);\r\n child[col] = row[key];\r\n }\r\n\r\n const pivot = buildPivot(row, rel);\r\n if (pivot) {\r\n (child as any)._pivot = pivot;\r\n }\r\n\r\n return child;\r\n};\r\n\r\nconst buildPivot = (row: Record<string, any>, rel: HydrationRelationPlan): Record<string, any> | undefined => {\r\n if (!rel.pivot) return undefined;\r\n\r\n const pivot: Record<string, any> = {};\r\n for (const col of rel.pivot.columns) {\r\n const key = makeRelationAlias(rel.pivot.aliasPrefix, col);\r\n pivot[col] = row[key];\r\n }\r\n\r\n const hasValue = Object.values(pivot).some(v => v !== null && v !== undefined);\r\n return hasValue ? pivot : undefined;\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { EntityContext } from './entity-context.js';\r\nimport { RelationMap } from '../schema/types.js';\r\n\r\n/**\r\n * Symbol used to store entity metadata on entity instances\r\n */\r\nexport const ENTITY_META = Symbol('EntityMeta');\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\n/**\r\n * Metadata stored on entity instances for ORM internal use\r\n * @typeParam TTable - Table definition type\r\n */\r\nexport interface EntityMeta<TTable extends TableDef> {\r\n /** Entity context */\r\n ctx: EntityContext;\r\n /** Table definition */\r\n table: TTable;\r\n /** Relations that should be loaded lazily */\r\n lazyRelations: (keyof RelationMap<TTable>)[];\r\n /** Cache for relation promises */\r\n relationCache: Map<string, Promise<any>>;\r\n /** Hydration data for relations */\r\n relationHydration: Map<string, Map<string, any>>;\r\n /** Relation wrapper instances */\r\n relationWrappers: Map<string, unknown>;\r\n}\r\n\r\n/**\r\n * Gets hydration rows for a specific relation and key\r\n * @param meta - Entity metadata\r\n * @param relationName - Name of the relation\r\n * @param key - Key to look up in the hydration map\r\n * @returns Array of hydration rows or undefined if not found\r\n * @typeParam TTable - Table definition type\r\n */\r\nexport const getHydrationRows = <TTable extends TableDef>(\r\n meta: EntityMeta<TTable>,\r\n relationName: string,\r\n key: unknown\r\n): Record<string, any>[] | undefined => {\r\n const map = meta.relationHydration.get(relationName);\r\n if (!map) return undefined;\r\n const rows = map.get(toKey(key));\r\n if (!rows) return undefined;\r\n return Array.isArray(rows) ? rows : undefined;\r\n};\r\n\r\n/**\r\n * Gets a single hydration record for a specific relation and key\r\n * @param meta - Entity metadata\r\n * @param relationName - Name of the relation\r\n * @param key - Key to look up in the hydration map\r\n * @returns Single hydration record or undefined if not found\r\n * @typeParam TTable - Table definition type\r\n */\r\nexport const getHydrationRecord = <TTable extends TableDef>(\r\n meta: EntityMeta<TTable>,\r\n relationName: string,\r\n key: unknown\r\n): Record<string, any> | undefined => {\r\n const map = meta.relationHydration.get(relationName);\r\n if (!map) return undefined;\r\n const value = map.get(toKey(key));\r\n if (!value) return undefined;\r\n if (Array.isArray(value)) {\r\n return value[0];\r\n }\r\n return value;\r\n};\r\n\r\n/**\r\n * Gets entity metadata from an entity instance\r\n * @param entity - Entity instance to get metadata from\r\n * @returns Entity metadata or undefined if not found\r\n * @typeParam TTable - Table definition type\r\n */\r\nexport const getEntityMeta = <TTable extends TableDef>(entity: any): EntityMeta<TTable> | undefined => {\r\n if (!entity || typeof entity !== 'object') return undefined;\r\n return (entity as any)[ENTITY_META];\r\n};\r\n\r\n/**\r\n * Checks if an entity has metadata attached\r\n * @param entity - Entity instance to check\r\n * @returns True if the entity has metadata, false otherwise\r\n */\r\nexport const hasEntityMeta = (entity: any): entity is { [ENTITY_META]: EntityMeta<TableDef> } => {\r\n return Boolean(getEntityMeta(entity));\r\n};\r\n","import { HasManyCollection } from '../../schema/types.js';\r\nimport { EntityContext } from '../entity-context.js';\r\nimport { RelationKey } from '../runtime-types.js';\r\nimport { HasManyRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { EntityMeta, getHydrationRows } from '../entity-meta.js';\r\n\r\ntype Rows = Record<string, any>[];\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nconst hideInternal = (obj: any, keys: string[]): void => {\r\n for (const key of keys) {\r\n Object.defineProperty(obj, key, {\r\n value: obj[key],\r\n writable: false,\r\n configurable: false,\r\n enumerable: false\r\n });\r\n }\r\n};\r\n\r\nexport class DefaultHasManyCollection<TChild> implements HasManyCollection<TChild> {\r\n private loaded = false;\r\n private items: TChild[] = [];\r\n private readonly added = new Set<TChild>();\r\n private readonly removed = new Set<TChild>();\r\n\r\n constructor(\r\n private readonly ctx: EntityContext,\r\n private readonly meta: EntityMeta<any>,\r\n private readonly root: any,\r\n private readonly relationName: string,\r\n private readonly relation: HasManyRelation,\r\n private readonly rootTable: TableDef,\r\n private readonly loader: () => Promise<Map<string, Rows>>,\r\n private readonly createEntity: (row: Record<string, any>) => TChild,\r\n private readonly localKey: string\r\n ) {\r\n hideInternal(this, ['ctx', 'meta', 'root', 'relationName', 'relation', 'rootTable', 'loader', 'createEntity', 'localKey']);\r\n this.hydrateFromCache();\r\n }\r\n\r\n async load(): Promise<TChild[]> {\r\n if (this.loaded) return this.items;\r\n const map = await this.loader();\r\n const key = toKey(this.root[this.localKey]);\r\n const rows = map.get(key) ?? [];\r\n this.items = rows.map(row => this.createEntity(row));\r\n this.loaded = true;\r\n return this.items;\r\n }\r\n\r\n getItems(): TChild[] {\r\n return this.items;\r\n }\r\n\r\n add(data: Partial<TChild>): TChild {\r\n const keyValue = this.root[this.localKey];\r\n const childRow: Record<string, any> = {\r\n ...data,\r\n [this.relation.foreignKey]: keyValue\r\n };\r\n const entity = this.createEntity(childRow);\r\n this.added.add(entity);\r\n this.items.push(entity);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'add', entity }\r\n );\r\n return entity;\r\n }\r\n\r\n attach(entity: TChild): void {\r\n const keyValue = this.root[this.localKey];\r\n (entity as Record<string, any>)[this.relation.foreignKey] = keyValue;\r\n this.ctx.markDirty(entity);\r\n this.items.push(entity);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'attach', entity }\r\n );\r\n }\r\n\r\n remove(entity: TChild): void {\r\n this.items = this.items.filter(item => item !== entity);\r\n this.removed.add(entity);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'remove', entity }\r\n );\r\n }\r\n\r\n clear(): void {\r\n for (const entity of [...this.items]) {\r\n this.remove(entity);\r\n }\r\n }\r\n\r\n private get relationKey(): RelationKey {\r\n return `${this.rootTable.name}.${this.relationName}`;\r\n }\r\n\r\n private hydrateFromCache(): void {\r\n const keyValue = this.root[this.localKey];\r\n if (keyValue === undefined || keyValue === null) return;\r\n const rows = getHydrationRows(this.meta, this.relationName, keyValue);\r\n if (!rows?.length) return;\r\n this.items = rows.map(row => this.createEntity(row));\r\n this.loaded = true;\r\n }\r\n\r\n toJSON(): TChild[] {\r\n return this.items;\r\n }\r\n}\r\n","import { HasOneReference } from '../../schema/types.js';\r\nimport { EntityContext } from '../entity-context.js';\r\nimport { RelationKey } from '../runtime-types.js';\r\nimport { HasOneRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { EntityMeta, getHydrationRecord, hasEntityMeta } from '../entity-meta.js';\r\n\r\ntype Row = Record<string, any>;\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nconst hideInternal = (obj: any, keys: string[]): void => {\r\n for (const key of keys) {\r\n Object.defineProperty(obj, key, {\r\n value: obj[key],\r\n writable: false,\r\n configurable: false,\r\n enumerable: false\r\n });\r\n }\r\n};\r\n\r\nexport class DefaultHasOneReference<TChild> implements HasOneReference<TChild> {\r\n private loaded = false;\r\n private current: TChild | null = null;\r\n\r\n constructor(\r\n private readonly ctx: EntityContext,\r\n private readonly meta: EntityMeta<any>,\r\n private readonly root: any,\r\n private readonly relationName: string,\r\n private readonly relation: HasOneRelation,\r\n private readonly rootTable: TableDef,\r\n private readonly loader: () => Promise<Map<string, Row>>,\r\n private readonly createEntity: (row: Row) => TChild,\r\n private readonly localKey: string\r\n ) {\r\n hideInternal(this, [\r\n 'ctx',\r\n 'meta',\r\n 'root',\r\n 'relationName',\r\n 'relation',\r\n 'rootTable',\r\n 'loader',\r\n 'createEntity',\r\n 'localKey'\r\n ]);\r\n this.populateFromHydrationCache();\r\n }\r\n\r\n async load(): Promise<TChild | null> {\r\n if (this.loaded) return this.current;\r\n const map = await this.loader();\r\n const keyValue = this.root[this.localKey];\r\n if (keyValue === undefined || keyValue === null) {\r\n this.loaded = true;\r\n return this.current;\r\n }\r\n const row = map.get(toKey(keyValue));\r\n this.current = row ? this.createEntity(row) : null;\r\n this.loaded = true;\r\n return this.current;\r\n }\r\n\r\n get(): TChild | null {\r\n return this.current;\r\n }\r\n\r\n set(data: Partial<TChild> | TChild | null): TChild | null {\r\n if (data === null) {\r\n return this.detachCurrent();\r\n }\r\n\r\n const entity = hasEntityMeta(data) ? (data as TChild) : this.createEntity(data as Row);\r\n if (this.current && this.current !== entity) {\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'remove', entity: this.current }\r\n );\r\n }\r\n\r\n this.assignForeignKey(entity);\r\n this.current = entity;\r\n this.loaded = true;\r\n\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'attach', entity }\r\n );\r\n\r\n return entity;\r\n }\r\n\r\n toJSON(): TChild | null {\r\n return this.current;\r\n }\r\n\r\n private detachCurrent(): TChild | null {\r\n const previous = this.current;\r\n if (!previous) return null;\r\n this.current = null;\r\n this.loaded = true;\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'remove', entity: previous }\r\n );\r\n return null;\r\n }\r\n\r\n private assignForeignKey(entity: TChild): void {\r\n const keyValue = this.root[this.localKey];\r\n (entity as Row)[this.relation.foreignKey] = keyValue;\r\n }\r\n\r\n private get relationKey(): RelationKey {\r\n return `${this.rootTable.name}.${this.relationName}`;\r\n }\r\n\r\n private populateFromHydrationCache(): void {\r\n const keyValue = this.root[this.localKey];\r\n if (keyValue === undefined || keyValue === null) return;\r\n const row = getHydrationRecord(this.meta, this.relationName, keyValue);\r\n if (!row) return;\r\n this.current = this.createEntity(row);\r\n this.loaded = true;\r\n }\r\n}\r\n","import { BelongsToReference } from '../../schema/types.js';\r\nimport { EntityContext } from '../entity-context.js';\r\nimport { RelationKey } from '../runtime-types.js';\r\nimport { BelongsToRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { EntityMeta, getHydrationRecord, hasEntityMeta } from '../entity-meta.js';\r\n\r\ntype Rows = Record<string, any>;\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nconst hideInternal = (obj: any, keys: string[]): void => {\r\n for (const key of keys) {\r\n Object.defineProperty(obj, key, {\r\n value: obj[key],\r\n writable: false,\r\n configurable: false,\r\n enumerable: false\r\n });\r\n }\r\n};\r\n\r\nexport class DefaultBelongsToReference<TParent> implements BelongsToReference<TParent> {\r\n private loaded = false;\r\n private current: TParent | null = null;\r\n\r\n constructor(\r\n private readonly ctx: EntityContext,\r\n private readonly meta: EntityMeta<any>,\r\n private readonly root: any,\r\n private readonly relationName: string,\r\n private readonly relation: BelongsToRelation,\r\n private readonly rootTable: TableDef,\r\n private readonly loader: () => Promise<Map<string, Rows>>,\r\n private readonly createEntity: (row: Record<string, any>) => TParent,\r\n private readonly targetKey: string\r\n ) {\r\n hideInternal(this, ['ctx', 'meta', 'root', 'relationName', 'relation', 'rootTable', 'loader', 'createEntity', 'targetKey']);\r\n this.populateFromHydrationCache();\r\n }\r\n\r\n async load(): Promise<TParent | null> {\r\n if (this.loaded) return this.current;\r\n const map = await this.loader();\r\n const fkValue = this.root[this.relation.foreignKey];\r\n if (fkValue === null || fkValue === undefined) {\r\n this.current = null;\r\n } else {\r\n const row = map.get(toKey(fkValue));\r\n this.current = row ? this.createEntity(row) : null;\r\n }\r\n this.loaded = true;\r\n return this.current;\r\n }\r\n\r\n get(): TParent | null {\r\n return this.current;\r\n }\r\n\r\n set(data: Partial<TParent> | TParent | null): TParent | null {\r\n if (data === null) {\r\n const previous = this.current;\r\n this.root[this.relation.foreignKey] = null;\r\n this.current = null;\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'remove', entity: previous }\r\n );\r\n return null;\r\n }\r\n\r\n const entity = hasEntityMeta(data) ? (data as TParent) : this.createEntity(data as Record<string, any>);\r\n const pkValue = (entity as any)[this.targetKey];\r\n if (pkValue !== undefined) {\r\n this.root[this.relation.foreignKey] = pkValue;\r\n }\r\n this.current = entity;\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'attach', entity }\r\n );\r\n return entity;\r\n }\r\n\r\n private get relationKey(): RelationKey {\r\n return `${this.rootTable.name}.${this.relationName}`;\r\n }\r\n\r\n private populateFromHydrationCache(): void {\r\n const fkValue = this.root[this.relation.foreignKey];\r\n if (fkValue === undefined || fkValue === null) return;\r\n const row = getHydrationRecord(this.meta, this.relationName, fkValue);\r\n if (!row) return;\r\n this.current = this.createEntity(row);\r\n this.loaded = true;\r\n }\r\n\r\n toJSON(): TParent | null {\r\n return this.current;\r\n }\r\n}\r\n","import { ManyToManyCollection } from '../../schema/types.js';\r\nimport { EntityContext } from '../entity-context.js';\r\nimport { RelationKey } from '../runtime-types.js';\r\nimport { BelongsToManyRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { findPrimaryKey } from '../../query-builder/hydration-planner.js';\r\nimport { EntityMeta, getHydrationRows } from '../entity-meta.js';\r\n\r\ntype Rows = Record<string, any>[];\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nconst hideInternal = (obj: any, keys: string[]): void => {\r\n for (const key of keys) {\r\n Object.defineProperty(obj, key, {\r\n value: obj[key],\r\n writable: false,\r\n configurable: false,\r\n enumerable: false\r\n });\r\n }\r\n};\r\n\r\nexport class DefaultManyToManyCollection<TTarget> implements ManyToManyCollection<TTarget> {\r\n private loaded = false;\r\n private items: TTarget[] = [];\r\n\r\n constructor(\r\n private readonly ctx: EntityContext,\r\n private readonly meta: EntityMeta<any>,\r\n private readonly root: any,\r\n private readonly relationName: string,\r\n private readonly relation: BelongsToManyRelation,\r\n private readonly rootTable: TableDef,\r\n private readonly loader: () => Promise<Map<string, Rows>>,\r\n private readonly createEntity: (row: Record<string, any>) => TTarget,\r\n private readonly localKey: string\r\n ) {\r\n hideInternal(this, ['ctx', 'meta', 'root', 'relationName', 'relation', 'rootTable', 'loader', 'createEntity', 'localKey']);\r\n this.hydrateFromCache();\r\n }\r\n\r\n async load(): Promise<TTarget[]> {\r\n if (this.loaded) return this.items;\r\n const map = await this.loader();\r\n const key = toKey(this.root[this.localKey]);\r\n const rows = map.get(key) ?? [];\r\n this.items = rows.map(row => {\r\n const entity = this.createEntity(row);\r\n if ((row as any)._pivot) {\r\n (entity as any)._pivot = row._pivot;\r\n }\r\n return entity;\r\n });\r\n this.loaded = true;\r\n return this.items;\r\n }\r\n\r\n getItems(): TTarget[] {\r\n return this.items;\r\n }\r\n\r\n attach(target: TTarget | number | string): void {\r\n const entity = this.ensureEntity(target);\r\n const id = this.extractId(entity);\r\n if (id == null) return;\r\n if (this.items.some(item => this.extractId(item) === id)) {\r\n return;\r\n }\r\n this.items.push(entity);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'attach', entity }\r\n );\r\n }\r\n\r\n detach(target: TTarget | number | string): void {\r\n const id = typeof target === 'number' || typeof target === 'string'\r\n ? target\r\n : this.extractId(target);\r\n\r\n if (id == null) return;\r\n\r\n const existing = this.items.find(item => this.extractId(item) === id);\r\n if (!existing) return;\r\n\r\n this.items = this.items.filter(item => this.extractId(item) !== id);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'detach', entity: existing }\r\n );\r\n }\r\n\r\n async syncByIds(ids: (number | string)[]): Promise<void> {\r\n await this.load();\r\n const targetKey = this.relation.targetKey || findPrimaryKey(this.relation.target);\r\n const normalized = new Set(ids.map(id => toKey(id)));\r\n const currentIds = new Set(this.items.map(item => toKey(this.extractId(item))));\r\n\r\n for (const id of normalized) {\r\n if (!currentIds.has(id)) {\r\n this.attach(id);\r\n }\r\n }\r\n\r\n for (const item of [...this.items]) {\r\n const itemId = toKey(this.extractId(item));\r\n if (!normalized.has(itemId)) {\r\n this.detach(item);\r\n }\r\n }\r\n }\r\n\r\n private ensureEntity(target: TTarget | number | string): TTarget {\r\n if (typeof target === 'number' || typeof target === 'string') {\r\n const stub: Record<string, any> = {\r\n [this.targetKey]: target\r\n };\r\n return this.createEntity(stub);\r\n }\r\n return target;\r\n }\r\n\r\n private extractId(entity: TTarget | number | string | null | undefined): number | string | null {\r\n if (entity === null || entity === undefined) return null;\r\n if (typeof entity === 'number' || typeof entity === 'string') {\r\n return entity;\r\n }\r\n return (entity as any)[this.targetKey] ?? null;\r\n }\r\n\r\n private get relationKey(): RelationKey {\r\n return `${this.rootTable.name}.${this.relationName}`;\r\n }\r\n\r\n private get targetKey(): string {\r\n return this.relation.targetKey || findPrimaryKey(this.relation.target);\r\n }\r\n\r\n private hydrateFromCache(): void {\r\n const keyValue = this.root[this.localKey];\r\n if (keyValue === undefined || keyValue === null) return;\r\n const rows = getHydrationRows(this.meta, this.relationName, keyValue);\r\n if (!rows?.length) return;\r\n this.items = rows.map(row => {\r\n const entity = this.createEntity(row);\r\n if ((row as any)._pivot) {\r\n (entity as any)._pivot = (row as any)._pivot;\r\n }\r\n return entity;\r\n });\r\n this.loaded = true;\r\n }\r\n\r\n toJSON(): TTarget[] {\r\n return this.items;\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { BelongsToManyRelation, HasManyRelation, HasOneRelation, BelongsToRelation } from '../schema/relation.js';\r\nimport { SelectQueryBuilder } from '../query-builder/select.js';\r\nimport { inList, LiteralNode } from '../core/ast/expression.js';\r\nimport { EntityContext } from './entity-context.js';\r\nimport type { QueryResult } from '../core/execution/db-executor.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\n\r\ntype Rows = Record<string, any>[];\r\n\r\nconst selectAllColumns = (table: TableDef): Record<string, ColumnDef> =>\r\n Object.entries(table.columns).reduce((acc, [name, def]) => {\r\n acc[name] = def;\r\n return acc;\r\n }, {} as Record<string, ColumnDef>);\r\n\r\nconst rowsFromResults = (results: QueryResult[]): Rows => {\r\n const rows: Rows = [];\r\n for (const result of results) {\r\n const { columns, values } = result;\r\n for (const valueRow of values) {\r\n const row: Record<string, any> = {};\r\n columns.forEach((column, idx) => {\r\n row[column] = valueRow[idx];\r\n });\r\n rows.push(row);\r\n }\r\n }\r\n return rows;\r\n};\r\n\r\nconst executeQuery = async (ctx: EntityContext, qb: SelectQueryBuilder<any, TableDef<any>>): Promise<Rows> => {\r\n const compiled = ctx.dialect.compileSelect(qb.getAST());\r\n const results = await ctx.executor.executeSql(compiled.sql, compiled.params);\r\n return rowsFromResults(results);\r\n};\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nexport const loadHasManyRelation = async (\r\n ctx: EntityContext,\r\n rootTable: TableDef,\r\n _relationName: string,\r\n relation: HasManyRelation\r\n): Promise<Map<string, Rows>> => {\r\n const localKey = relation.localKey || findPrimaryKey(rootTable);\r\n const roots = ctx.getEntitiesForTable(rootTable);\r\n const keys = new Set<unknown>();\r\n\r\n for (const tracked of roots) {\r\n const value = tracked.entity[localKey];\r\n if (value !== null && value !== undefined) {\r\n keys.add(value);\r\n }\r\n }\r\n\r\n if (!keys.size) {\r\n return new Map();\r\n }\r\n\r\n const selectMap = selectAllColumns(relation.target);\r\n const fb = new SelectQueryBuilder(relation.target).select(selectMap);\r\n const fkColumn = relation.target.columns[relation.foreignKey];\r\n if (!fkColumn) return new Map();\r\n\r\n fb.where(inList(fkColumn, Array.from(keys) as (string | number | LiteralNode)[]));\r\n\r\n const rows = await executeQuery(ctx, fb);\r\n const grouped = new Map<string, Rows>();\r\n\r\n for (const row of rows) {\r\n const fkValue = row[relation.foreignKey];\r\n if (fkValue === null || fkValue === undefined) continue;\r\n const key = toKey(fkValue);\r\n const bucket = grouped.get(key) ?? [];\r\n bucket.push(row);\r\n grouped.set(key, bucket);\r\n }\r\n\r\n return grouped;\r\n};\r\n\r\nexport const loadHasOneRelation = async (\r\n ctx: EntityContext,\r\n rootTable: TableDef,\r\n _relationName: string,\r\n relation: HasOneRelation\r\n): Promise<Map<string, Record<string, any>>> => {\r\n const localKey = relation.localKey || findPrimaryKey(rootTable);\r\n const roots = ctx.getEntitiesForTable(rootTable);\r\n const keys = new Set<unknown>();\r\n\r\n for (const tracked of roots) {\r\n const value = tracked.entity[localKey];\r\n if (value !== null && value !== undefined) {\r\n keys.add(value);\r\n }\r\n }\r\n\r\n if (!keys.size) {\r\n return new Map();\r\n }\r\n\r\n const selectMap = selectAllColumns(relation.target);\r\n const qb = new SelectQueryBuilder(relation.target).select(selectMap);\r\n const fkColumn = relation.target.columns[relation.foreignKey];\r\n if (!fkColumn) return new Map();\r\n\r\n qb.where(inList(fkColumn, Array.from(keys) as (string | number | LiteralNode)[]));\r\n\r\n const rows = await executeQuery(ctx, qb);\r\n const lookup = new Map<string, Record<string, any>>();\r\n\r\n for (const row of rows) {\r\n const fkValue = row[relation.foreignKey];\r\n if (fkValue === null || fkValue === undefined) continue;\r\n const key = toKey(fkValue);\r\n if (!lookup.has(key)) {\r\n lookup.set(key, row);\r\n }\r\n }\r\n\r\n return lookup;\r\n};\r\n\r\nexport const loadBelongsToRelation = async (\r\n ctx: EntityContext,\r\n rootTable: TableDef,\r\n _relationName: string,\r\n relation: BelongsToRelation\r\n): Promise<Map<string, Record<string, any>>> => {\r\n const roots = ctx.getEntitiesForTable(rootTable);\r\n const foreignKeys = new Set<unknown>();\r\n\r\n for (const tracked of roots) {\r\n const value = tracked.entity[relation.foreignKey];\r\n if (value !== null && value !== undefined) {\r\n foreignKeys.add(value);\r\n }\r\n }\r\n\r\n if (!foreignKeys.size) {\r\n return new Map();\r\n }\r\n\r\n const selectMap = selectAllColumns(relation.target);\r\n const qb = new SelectQueryBuilder(relation.target).select(selectMap);\r\n const targetKey = relation.localKey || findPrimaryKey(relation.target);\r\n const pkColumn = relation.target.columns[targetKey];\r\n if (!pkColumn) return new Map();\r\n\r\n qb.where(inList(pkColumn, Array.from(foreignKeys) as (string | number | LiteralNode)[]));\r\n const rows = await executeQuery(ctx, qb);\r\n const map = new Map<string, Record<string, any>>();\r\n\r\n for (const row of rows) {\r\n const keyValue = row[targetKey];\r\n if (keyValue === null || keyValue === undefined) continue;\r\n map.set(toKey(keyValue), row);\r\n }\r\n\r\n return map;\r\n};\r\n\r\nexport const loadBelongsToManyRelation = async (\r\n ctx: EntityContext,\r\n rootTable: TableDef,\r\n _relationName: string,\r\n relation: BelongsToManyRelation\r\n): Promise<Map<string, Rows>> => {\r\n const rootKey = relation.localKey || findPrimaryKey(rootTable);\r\n const roots = ctx.getEntitiesForTable(rootTable);\r\n const rootIds = new Set<unknown>();\r\n\r\n for (const tracked of roots) {\r\n const value = tracked.entity[rootKey];\r\n if (value !== null && value !== undefined) {\r\n rootIds.add(value);\r\n }\r\n }\r\n\r\n if (!rootIds.size) {\r\n return new Map();\r\n }\r\n\r\n const pivotSelect = selectAllColumns(relation.pivotTable);\r\n const pivotQb = new SelectQueryBuilder(relation.pivotTable).select(pivotSelect);\r\n const pivotFkCol = relation.pivotTable.columns[relation.pivotForeignKeyToRoot];\r\n if (!pivotFkCol) return new Map();\r\n\r\n pivotQb.where(inList(pivotFkCol, Array.from(rootIds) as (string | number | LiteralNode)[]));\r\n const pivotRows = await executeQuery(ctx, pivotQb);\r\n\r\n const rootLookup = new Map<string, { targetId: unknown; pivot: Record<string, any> }[]>();\r\n const targetIds = new Set<unknown>();\r\n\r\n for (const pivot of pivotRows) {\r\n const rootValue = pivot[relation.pivotForeignKeyToRoot];\r\n const targetValue = pivot[relation.pivotForeignKeyToTarget];\r\n if (rootValue === null || rootValue === undefined || targetValue === null || targetValue === undefined) {\r\n continue;\r\n }\r\n const bucket = rootLookup.get(toKey(rootValue)) ?? [];\r\n bucket.push({\r\n targetId: targetValue,\r\n pivot: { ...pivot }\r\n });\r\n rootLookup.set(toKey(rootValue), bucket);\r\n targetIds.add(targetValue);\r\n }\r\n\r\n if (!targetIds.size) {\r\n return new Map();\r\n }\r\n\r\n const targetSelect = selectAllColumns(relation.target);\r\n const targetKey = relation.targetKey || findPrimaryKey(relation.target);\r\n const targetPkColumn = relation.target.columns[targetKey];\r\n if (!targetPkColumn) return new Map();\r\n\r\n const targetQb = new SelectQueryBuilder(relation.target).select(targetSelect);\r\n targetQb.where(inList(targetPkColumn, Array.from(targetIds) as (string | number | LiteralNode)[]));\r\n const targetRows = await executeQuery(ctx, targetQb);\r\n const targetMap = new Map<string, Record<string, any>>();\r\n\r\n for (const row of targetRows) {\r\n const pkValue = row[targetKey];\r\n if (pkValue === null || pkValue === undefined) continue;\r\n targetMap.set(toKey(pkValue), row);\r\n }\r\n\r\n const result = new Map<string, Rows>();\r\n\r\n for (const [rootId, entries] of rootLookup.entries()) {\r\n const bucket: Rows = [];\r\n for (const entry of entries) {\r\n const targetRow = targetMap.get(toKey(entry.targetId));\r\n if (!targetRow) continue;\r\n bucket.push({\r\n ...targetRow,\r\n _pivot: entry.pivot\r\n });\r\n }\r\n result.set(rootId, bucket);\r\n }\r\n\r\n return result;\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { EntityInstance, RelationMap, HasManyCollection, HasOneReference, BelongsToReference, ManyToManyCollection } from '../schema/types.js';\r\nimport { EntityContext } from './entity-context.js';\r\nimport { ENTITY_META, EntityMeta, getEntityMeta } from './entity-meta.js';\r\nimport { DefaultHasManyCollection } from './relations/has-many.js';\r\nimport { DefaultHasOneReference } from './relations/has-one.js';\r\nimport { DefaultBelongsToReference } from './relations/belongs-to.js';\r\nimport { DefaultManyToManyCollection } from './relations/many-to-many.js';\r\nimport { HasManyRelation, HasOneRelation, BelongsToRelation, BelongsToManyRelation, RelationKinds } from '../schema/relation.js';\r\nimport { loadHasManyRelation, loadHasOneRelation, loadBelongsToRelation, loadBelongsToManyRelation } from './lazy-batch.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\n\r\ntype Rows = Record<string, any>[];\r\n\r\nconst relationLoaderCache = <T extends Map<string, any>>(\r\n meta: EntityMeta<any>,\r\n relationName: string,\r\n factory: () => Promise<T>\r\n): Promise<T> => {\r\n if (meta.relationCache.has(relationName)) {\r\n return meta.relationCache.get(relationName)! as Promise<T>;\r\n }\r\n\r\n const promise = factory().then(value => {\r\n for (const tracked of meta.ctx.getEntitiesForTable(meta.table)) {\r\n const otherMeta = getEntityMeta(tracked.entity);\r\n if (!otherMeta) continue;\r\n otherMeta.relationHydration.set(relationName, value);\r\n }\r\n return value;\r\n });\r\n\r\n meta.relationCache.set(relationName, promise);\r\n\r\n for (const tracked of meta.ctx.getEntitiesForTable(meta.table)) {\r\n const otherMeta = getEntityMeta(tracked.entity);\r\n if (!otherMeta) continue;\r\n otherMeta.relationCache.set(relationName, promise);\r\n }\r\n\r\n return promise;\r\n};\r\n\r\nexport const createEntityProxy = <\r\n TTable extends TableDef,\r\n TLazy extends keyof RelationMap<TTable> = keyof RelationMap<TTable>\r\n>(\r\n ctx: EntityContext,\r\n table: TTable,\r\n row: Record<string, any>,\r\n lazyRelations: TLazy[] = [] as TLazy[]\r\n): EntityInstance<TTable> => {\r\n const target: Record<string, any> = { ...row };\r\n const meta: EntityMeta<TTable> = {\r\n ctx,\r\n table,\r\n lazyRelations: [...lazyRelations],\r\n relationCache: new Map(),\r\n relationHydration: new Map(),\r\n relationWrappers: new Map()\r\n };\r\n\r\n Object.defineProperty(target, ENTITY_META, {\r\n value: meta,\r\n enumerable: false,\r\n writable: false\r\n });\r\n\r\n let proxy: EntityInstance<TTable>;\r\n const handler: ProxyHandler<any> = {\r\n get(targetObj, prop, receiver) {\r\n if (prop === ENTITY_META) {\r\n return meta;\r\n }\r\n\r\n if (prop === '$load') {\r\n return async (relationName: keyof RelationMap<TTable>) => {\r\n const wrapper = getRelationWrapper(meta, relationName as string, proxy);\r\n if (wrapper && typeof wrapper.load === 'function') {\r\n return wrapper.load();\r\n }\r\n return undefined;\r\n };\r\n }\r\n\r\n if (typeof prop === 'string' && table.relations[prop]) {\r\n return getRelationWrapper(meta, prop, proxy);\r\n }\r\n\r\n return Reflect.get(targetObj, prop, receiver);\r\n },\r\n\r\n set(targetObj, prop, value, receiver) {\r\n const result = Reflect.set(targetObj, prop, value, receiver);\r\n if (typeof prop === 'string' && table.columns[prop]) {\r\n ctx.markDirty(proxy);\r\n }\r\n return result;\r\n }\r\n };\r\n\r\n proxy = new Proxy(target, handler) as EntityInstance<TTable>;\r\n populateHydrationCache(proxy, row, meta);\r\n return proxy;\r\n};\r\n\r\nexport const createEntityFromRow = <\r\n TTable extends TableDef,\r\n TResult extends EntityInstance<TTable> = EntityInstance<TTable>\r\n>(\r\n ctx: EntityContext,\r\n table: TTable,\r\n row: Record<string, any>,\r\n lazyRelations: (keyof RelationMap<TTable>)[] = []\r\n): TResult => {\r\n const pkName = findPrimaryKey(table);\r\n const pkValue = row[pkName];\r\n if (pkValue !== undefined && pkValue !== null) {\r\n const tracked = ctx.getEntity(table, pkValue);\r\n if (tracked) return tracked as TResult;\r\n }\r\n\r\n const entity = createEntityProxy(ctx, table, row, lazyRelations);\r\n if (pkValue !== undefined && pkValue !== null) {\r\n ctx.trackManaged(table, pkValue, entity);\r\n } else {\r\n ctx.trackNew(table, entity);\r\n }\r\n\r\n return entity as TResult;\r\n};\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nconst populateHydrationCache = <TTable extends TableDef>(\r\n entity: any,\r\n row: Record<string, any>,\r\n meta: EntityMeta<TTable>\r\n): void => {\r\n for (const relationName of Object.keys(meta.table.relations)) {\r\n const relation = meta.table.relations[relationName];\r\n const data = row[relationName];\r\n if (relation.type === RelationKinds.HasOne) {\r\n const localKey = relation.localKey || findPrimaryKey(meta.table);\r\n const rootValue = entity[localKey];\r\n if (rootValue === undefined || rootValue === null) continue;\r\n if (!data || typeof data !== 'object') continue;\r\n const cache = new Map<string, Record<string, any>>();\r\n cache.set(toKey(rootValue), data as Record<string, any>);\r\n meta.relationHydration.set(relationName, cache);\r\n meta.relationCache.set(relationName, Promise.resolve(cache));\r\n continue;\r\n }\r\n\r\n if (!Array.isArray(data)) continue;\r\n\r\n if (relation.type === RelationKinds.HasMany || relation.type === RelationKinds.BelongsToMany) {\r\n const localKey = relation.localKey || findPrimaryKey(meta.table);\r\n const rootValue = entity[localKey];\r\n if (rootValue === undefined || rootValue === null) continue;\r\n const cache = new Map<string, Rows>();\r\n cache.set(toKey(rootValue), data as Rows);\r\n meta.relationHydration.set(relationName, cache);\r\n meta.relationCache.set(relationName, Promise.resolve(cache));\r\n continue;\r\n }\r\n\r\n if (relation.type === RelationKinds.BelongsTo) {\r\n const targetKey = relation.localKey || findPrimaryKey(relation.target);\r\n const cache = new Map<string, Record<string, any>>();\r\n for (const item of data) {\r\n const pkValue = item[targetKey];\r\n if (pkValue === undefined || pkValue === null) continue;\r\n cache.set(toKey(pkValue), item);\r\n }\r\n if (cache.size) {\r\n meta.relationHydration.set(relationName, cache);\r\n meta.relationCache.set(relationName, Promise.resolve(cache));\r\n }\r\n }\r\n }\r\n};\r\n\r\nconst getRelationWrapper = (\r\n meta: EntityMeta<any>,\r\n relationName: string,\r\n owner: any\r\n): HasManyCollection<any> | HasOneReference<any> | BelongsToReference<any> | ManyToManyCollection<any> | undefined => {\r\n if (meta.relationWrappers.has(relationName)) {\r\n return meta.relationWrappers.get(relationName) as HasManyCollection<any>;\r\n }\r\n\r\n const relation = meta.table.relations[relationName];\r\n if (!relation) return undefined;\r\n\r\n const wrapper = instantiateWrapper(meta, relationName, relation as any, owner);\r\n if (wrapper) {\r\n meta.relationWrappers.set(relationName, wrapper);\r\n }\r\n\r\n return wrapper;\r\n};\r\n\r\nconst instantiateWrapper = (\r\n meta: EntityMeta<any>,\r\n relationName: string,\r\n relation: HasManyRelation | HasOneRelation | BelongsToRelation | BelongsToManyRelation,\r\n owner: any\r\n): HasManyCollection<any> | HasOneReference<any> | BelongsToReference<any> | ManyToManyCollection<any> | undefined => {\r\n switch (relation.type) {\r\n case RelationKinds.HasOne: {\r\n const hasOne = relation as HasOneRelation;\r\n const localKey = hasOne.localKey || findPrimaryKey(meta.table);\r\n const loader = () => relationLoaderCache(meta, relationName, () =>\r\n loadHasOneRelation(meta.ctx, meta.table, relationName, hasOne)\r\n );\r\n return new DefaultHasOneReference(\r\n meta.ctx,\r\n meta,\r\n owner,\r\n relationName,\r\n hasOne,\r\n meta.table,\r\n loader,\r\n (row: Record<string, any>) => createEntityFromRow(meta.ctx, hasOne.target, row),\r\n localKey\r\n );\r\n }\r\n case RelationKinds.HasMany: {\r\n const hasMany = relation as HasManyRelation;\r\n const localKey = hasMany.localKey || findPrimaryKey(meta.table);\r\n const loader = () => relationLoaderCache(meta, relationName, () =>\r\n loadHasManyRelation(meta.ctx, meta.table, relationName, hasMany)\r\n );\r\n return new DefaultHasManyCollection(\r\n meta.ctx,\r\n meta,\r\n owner,\r\n relationName,\r\n hasMany,\r\n meta.table,\r\n loader,\r\n (row: Record<string, any>) => createEntityFromRow(meta.ctx, relation.target, row),\r\n localKey\r\n );\r\n }\r\n case RelationKinds.BelongsTo: {\r\n const belongsTo = relation as BelongsToRelation;\r\n const targetKey = belongsTo.localKey || findPrimaryKey(belongsTo.target);\r\n const loader = () => relationLoaderCache(meta, relationName, () =>\r\n loadBelongsToRelation(meta.ctx, meta.table, relationName, belongsTo)\r\n );\r\n return new DefaultBelongsToReference(\r\n meta.ctx,\r\n meta,\r\n owner,\r\n relationName,\r\n belongsTo,\r\n meta.table,\r\n loader,\r\n (row: Record<string, any>) => createEntityFromRow(meta.ctx, relation.target, row),\r\n targetKey\r\n );\r\n }\r\n case RelationKinds.BelongsToMany: {\r\n const many = relation as BelongsToManyRelation;\r\n const localKey = many.localKey || findPrimaryKey(meta.table);\r\n const loader = () => relationLoaderCache(meta, relationName, () =>\r\n loadBelongsToManyRelation(meta.ctx, meta.table, relationName, many)\r\n );\r\n return new DefaultManyToManyCollection(\r\n meta.ctx,\r\n meta,\r\n owner,\r\n relationName,\r\n many,\r\n meta.table,\r\n loader,\r\n (row: Record<string, any>) => createEntityFromRow(meta.ctx, relation.target, row),\r\n localKey\r\n );\r\n }\r\n default:\r\n return undefined;\r\n }\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { EntityInstance } from '../schema/types.js';\r\nimport { hydrateRows } from './hydration.js';\r\nimport { OrmSession } from './orm-session.ts';\r\nimport { SelectQueryBuilder } from '../query-builder/select.js';\r\nimport { createEntityProxy, createEntityFromRow } from './entity.js';\r\nimport { EntityContext } from './entity-context.js';\r\nimport { ExecutionContext } from './execution-context.js';\r\nimport { HydrationContext } from './hydration-context.js';\r\n\r\ntype Row = Record<string, any>;\r\n\r\nconst flattenResults = (results: { columns: string[]; values: unknown[][] }[]): Row[] => {\r\n const rows: Row[] = [];\r\n for (const result of results) {\r\n const { columns, values } = result;\r\n for (const valueRow of values) {\r\n const row: Row = {};\r\n columns.forEach((column, idx) => {\r\n row[column] = valueRow[idx];\r\n });\r\n rows.push(row);\r\n }\r\n }\r\n return rows;\r\n};\r\n\r\nconst executeWithEntityContext = async <TTable extends TableDef>(\r\n entityCtx: EntityContext,\r\n qb: SelectQueryBuilder<any, TTable>\r\n): Promise<EntityInstance<TTable>[]> => {\r\n const ast = qb.getAST();\r\n const compiled = entityCtx.dialect.compileSelect(ast);\r\n const executed = await entityCtx.executor.executeSql(compiled.sql, compiled.params);\r\n const rows = flattenResults(executed);\r\n\r\n if (ast.setOps && ast.setOps.length > 0) {\r\n return rows.map(row => createEntityProxy(entityCtx, qb.getTable(), row, qb.getLazyRelations()));\r\n }\r\n\r\n const hydrated = hydrateRows(rows, qb.getHydrationPlan());\r\n return hydrated.map(row => createEntityFromRow(entityCtx, qb.getTable(), row, qb.getLazyRelations()));\r\n};\r\n\r\nexport async function executeHydrated<TTable extends TableDef>(\r\n session: OrmSession,\r\n qb: SelectQueryBuilder<any, TTable>\r\n): Promise<EntityInstance<TTable>[]> {\r\n return executeWithEntityContext(session, qb);\r\n}\r\n\r\nexport async function executeHydratedWithContexts<TTable extends TableDef>(\r\n _execCtx: ExecutionContext,\r\n hydCtx: HydrationContext,\r\n qb: SelectQueryBuilder<any, TTable>\r\n): Promise<EntityInstance<TTable>[]> {\r\n const entityCtx = hydCtx.entityContext;\r\n if (!entityCtx) {\r\n throw new Error('Hydration context is missing an EntityContext');\r\n }\r\n return executeWithEntityContext(entityCtx, qb);\r\n}\r\n","import { TableDef } from '../schema/table.js';\n\nimport { ColumnDef } from '../schema/column.js';\n\nimport { SelectQueryNode, SetOperationKind } from '../core/ast/query.js';\n\nimport { HydrationPlan } from '../core/hydration/types.js';\n\nimport {\n\n ColumnNode,\n\n ExpressionNode,\n\n FunctionNode,\n\n LiteralNode,\n\n BinaryExpressionNode,\n\n CaseExpressionNode,\n\n WindowFunctionNode,\n\n and,\n\n exists,\n\n notExists\n\n} from '../core/ast/expression.js';\nimport { derivedTable } from '../core/ast/builders.js';\n\nimport { CompiledQuery, Dialect } from '../core/dialect/abstract.js';\n\nimport { DialectKey, resolveDialectInput } from '../core/dialect/dialect-factory.js';\n\n\n\ntype SelectDialectInput = Dialect | DialectKey;\n\nimport { SelectQueryState } from './select-query-state.js';\n\nimport { HydrationManager } from './hydration-manager.js';\n\nimport {\n\n resolveSelectQueryBuilderDependencies,\n\n SelectQueryBuilderContext,\n\n SelectQueryBuilderDependencies,\n\n SelectQueryBuilderEnvironment\n\n} from './select-query-builder-deps.js';\n\nimport { QueryAstService } from './query-ast-service.js';\n\nimport { ColumnSelector } from './column-selector.js';\n\nimport { RelationManager } from './relation-manager.js';\n\nimport { RelationIncludeOptions } from './relation-types.js';\n\nimport type { RelationDef } from '../schema/relation.js';\n\nimport { JOIN_KINDS, JoinKind, ORDER_DIRECTIONS, OrderDirection } from '../core/sql/sql.js';\n\nimport { EntityInstance, RelationMap, RelationTargetTable } from '../schema/types.js';\n\nimport { OrmSession } from '../orm/orm-session.ts';\n\nimport { ExecutionContext } from '../orm/execution-context.js';\n\nimport { HydrationContext } from '../orm/hydration-context.js';\n\nimport { executeHydrated, executeHydratedWithContexts } from '../orm/execute.js';\n\nimport { createJoinNode } from '../core/ast/join-node.js';\n\n\ntype ColumnSelectionValue = ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode;\n\ntype DeepSelectConfig<TTable extends TableDef> = {\n root?: (keyof TTable['columns'] & string)[];\n} & {\n [K in keyof TTable['relations'] & string]?: (\n keyof RelationTargetTable<TTable['relations'][K]>['columns'] & string\n )[];\n};\n\ntype WhereHasOptions = {\n correlate?: ExpressionNode;\n};\n\ntype RelationCallback = <TChildTable extends TableDef>(\n qb: SelectQueryBuilder<any, TChildTable>\n) => SelectQueryBuilder<any, TChildTable>;\n\n\n/**\n\n * Main query builder class for constructing SQL SELECT queries\n\n * @typeParam T - Result type for projections (unused)\n\n * @typeParam TTable - Table definition being queried\n\n */\n\nexport class SelectQueryBuilder<T = any, TTable extends TableDef = TableDef> {\n\n private readonly env: SelectQueryBuilderEnvironment;\n\n private readonly context: SelectQueryBuilderContext;\n\n private readonly columnSelector: ColumnSelector;\n\n private readonly relationManager: RelationManager;\n\n private readonly lazyRelations: Set<string>;\n\n\n\n /**\n\n * Creates a new SelectQueryBuilder instance\n\n * @param table - Table definition to query\n\n * @param state - Optional initial query state\n\n * @param hydration - Optional hydration manager\n\n * @param dependencies - Optional query builder dependencies\n\n */\n\n constructor(\n\n table: TTable,\n\n state?: SelectQueryState,\n\n hydration?: HydrationManager,\n\n dependencies?: Partial<SelectQueryBuilderDependencies>,\n\n lazyRelations?: Set<string>\n\n ) {\n\n const deps = resolveSelectQueryBuilderDependencies(dependencies);\n\n this.env = { table, deps };\n\n const initialState = state ?? deps.createState(table);\n\n const initialHydration = hydration ?? deps.createHydration(table);\n\n this.context = {\n\n state: initialState,\n\n hydration: initialHydration\n\n };\n\n this.lazyRelations = new Set(lazyRelations ?? []);\n\n this.columnSelector = new ColumnSelector(this.env);\n\n this.relationManager = new RelationManager(this.env);\n\n }\n\n\n\n private clone(\n\n context: SelectQueryBuilderContext = this.context,\n\n lazyRelations = new Set(this.lazyRelations)\n\n ): SelectQueryBuilder<T, TTable> {\n\n return new SelectQueryBuilder(this.env.table as TTable, context.state, context.hydration, this.env.deps, lazyRelations);\n\n }\n\n /**\n * Applies an alias to the root FROM table.\n * @param alias - Alias to apply\n */\n as(alias: string): SelectQueryBuilder<T, TTable> {\n const from = this.context.state.ast.from;\n if (from.type !== 'Table') {\n throw new Error('Cannot alias non-table FROM sources');\n }\n const nextFrom = { ...from, alias };\n const nextContext = this.applyAst(this.context, service => service.withFrom(nextFrom));\n return this.clone(nextContext);\n }\n\n\n\n private resolveQueryNode(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryNode {\n\n return typeof (query as any).getAST === 'function'\n\n ? (query as SelectQueryBuilder<any, TableDef<any>>).getAST()\n\n : (query as SelectQueryNode);\n\n }\n\n private applyCorrelation(ast: SelectQueryNode, correlation?: ExpressionNode): SelectQueryNode {\n if (!correlation) return ast;\n const combinedWhere = ast.where ? and(correlation, ast.where) : correlation;\n return {\n ...ast,\n where: combinedWhere\n };\n }\n\n\n\n private createChildBuilder<R, TChild extends TableDef>(table: TChild): SelectQueryBuilder<R, TChild> {\n\n return new SelectQueryBuilder(table, undefined, undefined, this.env.deps);\n\n }\n\n\n\n private applyAst(\n\n context: SelectQueryBuilderContext,\n\n mutator: (service: QueryAstService) => SelectQueryState\n\n ): SelectQueryBuilderContext {\n\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\n\n const nextState = mutator(astService);\n\n return { state: nextState, hydration: context.hydration };\n\n }\n\n\n\n private applyJoin(\n\n context: SelectQueryBuilderContext,\n\n table: TableDef,\n\n condition: BinaryExpressionNode,\n\n kind: JoinKind\n\n ): SelectQueryBuilderContext {\n\n const joinNode = createJoinNode(kind, table.name, condition);\n\n return this.applyAst(context, service => service.withJoin(joinNode));\n\n }\n\n\n\n private applySetOperation(\n\n operator: SetOperationKind,\n\n query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode\n\n ): SelectQueryBuilderContext {\n\n const subAst = this.resolveQueryNode(query);\n\n return this.applyAst(this.context, service => service.withSetOperation(operator, subAst));\n\n }\n\n\n\n /**\n\n * Selects specific columns for the query\n\n * @param columns - Record of column definitions, function nodes, case expressions, or window functions\n\n * @returns New query builder instance with selected columns\n\n */\n\n select(columns: Record<string, ColumnSelectionValue>): SelectQueryBuilder<T, TTable> {\n\n return this.clone(this.columnSelector.select(this.context, columns));\n\n }\n\n\n /**\n * Selects columns from the root table by name (typed).\n * @param cols - Column names on the root table\n */\n selectColumns<K extends keyof TTable['columns'] & string>(...cols: K[]): SelectQueryBuilder<T, TTable> {\n const selection: Record<string, ColumnDef> = {};\n\n for (const key of cols) {\n const col = this.env.table.columns[key];\n if (!col) {\n throw new Error(`Column '${key}' not found on table '${this.env.table.name}'`);\n }\n selection[key] = col;\n }\n\n return this.select(selection);\n }\n\n\n\n /**\n\n * Selects raw column expressions\n\n * @param cols - Column expressions as strings\n\n * @returns New query builder instance with raw column selections\n\n */\n\n selectRaw(...cols: string[]): SelectQueryBuilder<T, TTable> {\n\n return this.clone(this.columnSelector.selectRaw(this.context, cols));\n\n }\n\n\n\n /**\n\n * Adds a Common Table Expression (CTE) to the query\n\n * @param name - Name of the CTE\n\n * @param query - Query builder or query node for the CTE\n\n * @param columns - Optional column names for the CTE\n\n * @returns New query builder instance with the CTE\n\n */\n\n with(name: string, query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode, columns?: string[]): SelectQueryBuilder<T, TTable> {\n\n const subAst = this.resolveQueryNode(query);\n\n const nextContext = this.applyAst(this.context, service => service.withCte(name, subAst, columns, false));\n\n return this.clone(nextContext);\n\n }\n\n\n\n /**\n\n * Adds a recursive Common Table Expression (CTE) to the query\n\n * @param name - Name of the CTE\n\n * @param query - Query builder or query node for the CTE\n\n * @param columns - Optional column names for the CTE\n\n * @returns New query builder instance with the recursive CTE\n\n */\n\n withRecursive(name: string, query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode, columns?: string[]): SelectQueryBuilder<T, TTable> {\n\n const subAst = this.resolveQueryNode(query);\n\n const nextContext = this.applyAst(this.context, service => service.withCte(name, subAst, columns, true));\n\n return this.clone(nextContext);\n\n }\n\n\n /**\n * Replaces the FROM clause with a derived table (subquery with alias)\n * @param subquery - Subquery to use as the FROM source\n * @param alias - Alias for the derived table\n * @param columnAliases - Optional column alias list\n * @returns New query builder instance with updated FROM\n */\n fromSubquery(\n subquery: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode,\n alias: string,\n columnAliases?: string[]\n ): SelectQueryBuilder<T, TTable> {\n const subAst = this.resolveQueryNode(subquery);\n const fromNode = derivedTable(subAst, alias, columnAliases);\n const nextContext = this.applyAst(this.context, service => service.withFrom(fromNode));\n return this.clone(nextContext);\n }\n\n\n\n /**\n\n * Selects a subquery as a column\n\n * @param alias - Alias for the subquery column\n\n * @param sub - Query builder or query node for the subquery\n\n * @returns New query builder instance with the subquery selection\n\n */\n\n selectSubquery(alias: string, sub: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\n\n const query = this.resolveQueryNode(sub);\n\n return this.clone(this.columnSelector.selectSubquery(this.context, alias, query));\n\n }\n\n\n /**\n * Adds a JOIN against a derived table (subquery with alias)\n * @param subquery - Subquery to join\n * @param alias - Alias for the derived table\n * @param condition - Join condition expression\n * @param joinKind - Join kind (defaults to INNER)\n * @param columnAliases - Optional column alias list for the derived table\n * @returns New query builder instance with the derived-table join\n */\n joinSubquery(\n subquery: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode,\n alias: string,\n condition: BinaryExpressionNode,\n joinKind: JoinKind = JOIN_KINDS.INNER,\n columnAliases?: string[]\n ): SelectQueryBuilder<T, TTable> {\n const subAst = this.resolveQueryNode(subquery);\n const joinNode = createJoinNode(joinKind, derivedTable(subAst, alias, columnAliases), condition);\n const nextContext = this.applyAst(this.context, service => service.withJoin(joinNode));\n return this.clone(nextContext);\n }\n\n\n\n /**\n\n * Adds an INNER JOIN to the query\n\n * @param table - Table to join\n\n * @param condition - Join condition expression\n\n * @returns New query builder instance with the INNER JOIN\n\n */\n\n innerJoin(table: TableDef, condition: BinaryExpressionNode): SelectQueryBuilder<T, TTable> {\n\n const nextContext = this.applyJoin(this.context, table, condition, JOIN_KINDS.INNER);\n\n return this.clone(nextContext);\n\n }\n\n\n\n /**\n\n * Adds a LEFT JOIN to the query\n\n * @param table - Table to join\n\n * @param condition - Join condition expression\n\n * @returns New query builder instance with the LEFT JOIN\n\n */\n\n leftJoin(table: TableDef, condition: BinaryExpressionNode): SelectQueryBuilder<T, TTable> {\n\n const nextContext = this.applyJoin(this.context, table, condition, JOIN_KINDS.LEFT);\n\n return this.clone(nextContext);\n\n }\n\n\n\n /**\n\n * Adds a RIGHT JOIN to the query\n\n * @param table - Table to join\n\n * @param condition - Join condition expression\n\n * @returns New query builder instance with the RIGHT JOIN\n\n */\n\n rightJoin(table: TableDef, condition: BinaryExpressionNode): SelectQueryBuilder<T, TTable> {\n\n const nextContext = this.applyJoin(this.context, table, condition, JOIN_KINDS.RIGHT);\n\n return this.clone(nextContext);\n\n }\n\n\n\n /**\n\n * Matches records based on a relationship\n\n * @param relationName - Name of the relationship to match\n\n * @param predicate - Optional predicate expression\n\n * @returns New query builder instance with the relationship match\n\n */\n\n match(relationName: string, predicate?: ExpressionNode): SelectQueryBuilder<T, TTable> {\n\n const nextContext = this.relationManager.match(this.context, relationName, predicate);\n\n return this.clone(nextContext);\n\n }\n\n\n\n /**\n\n * Joins a related table\n\n * @param relationName - Name of the relationship to join\n\n * @param joinKind - Type of join (defaults to INNER)\n\n * @param extraCondition - Optional additional join condition\n\n * @returns New query builder instance with the relationship join\n\n */\n\n joinRelation(\n\n relationName: string,\n\n joinKind: JoinKind = JOIN_KINDS.INNER,\n\n extraCondition?: ExpressionNode\n\n ): SelectQueryBuilder<T, TTable> {\n\n const nextContext = this.relationManager.joinRelation(this.context, relationName, joinKind, extraCondition);\n\n return this.clone(nextContext);\n\n }\n\n\n\n /**\n\n * Includes related data in the query results\n\n * @param relationName - Name of the relationship to include\n\n * @param options - Optional include options\n\n * @returns New query builder instance with the relationship inclusion\n\n */\n\n include(relationName: string, options?: RelationIncludeOptions): SelectQueryBuilder<T, TTable> {\n\n const nextContext = this.relationManager.include(this.context, relationName, options);\n\n return this.clone(nextContext);\n\n }\n\n\n\n includeLazy<K extends keyof RelationMap<TTable>>(relationName: K): SelectQueryBuilder<T, TTable> {\n\n const nextLazy = new Set(this.lazyRelations);\n\n nextLazy.add(relationName as string);\n\n return this.clone(this.context, nextLazy);\n\n }\n\n /**\n * Selects columns for a related table in a single hop.\n */\n selectRelationColumns<\n K extends keyof TTable['relations'] & string,\n TRel extends RelationDef = TTable['relations'][K],\n TTarget extends TableDef = RelationTargetTable<TRel>,\n C extends keyof TTarget['columns'] & string = keyof TTarget['columns'] & string\n >(relationName: K, ...cols: C[]): SelectQueryBuilder<T, TTable> {\n const relation = this.env.table.relations[relationName] as RelationDef | undefined;\n if (!relation) {\n throw new Error(`Relation '${relationName}' not found on table '${this.env.table.name}'`);\n }\n const target = relation.target;\n\n for (const col of cols) {\n if (!target.columns[col]) {\n throw new Error(\n `Column '${col}' not found on related table '${target.name}' for relation '${relationName}'`\n );\n }\n }\n\n return this.include(relationName as string, { columns: cols as string[] });\n }\n\n\n /**\n * Convenience alias for selecting specific columns from a relation.\n */\n includePick<\n K extends keyof TTable['relations'] & string,\n TRel extends RelationDef = TTable['relations'][K],\n TTarget extends TableDef = RelationTargetTable<TRel>,\n C extends keyof TTarget['columns'] & string = keyof TTarget['columns'] & string\n >(relationName: K, cols: C[]): SelectQueryBuilder<T, TTable> {\n return this.selectRelationColumns(relationName, ...cols);\n }\n\n\n /**\n * Selects columns for the root table and relations from a single config object.\n */\n selectColumnsDeep(config: DeepSelectConfig<TTable>): SelectQueryBuilder<T, TTable> {\n let qb: SelectQueryBuilder<T, TTable> = this;\n\n if (config.root?.length) {\n qb = qb.selectColumns(...config.root);\n }\n\n for (const key of Object.keys(config) as (keyof typeof config)[]) {\n if (key === 'root') continue;\n const relName = key as keyof TTable['relations'] & string;\n const cols = config[relName as keyof DeepSelectConfig<TTable>] as string[] | undefined;\n if (!cols || !cols.length) continue;\n qb = qb.selectRelationColumns(relName, ...(cols as string[]));\n }\n\n return qb;\n }\n\n\n\n getLazyRelations(): (keyof RelationMap<TTable>)[] {\n\n return Array.from(this.lazyRelations) as (keyof RelationMap<TTable>)[];\n\n }\n\n\n\n getTable(): TTable {\n\n return this.env.table as TTable;\n\n }\n\n\n\n async execute(ctx: OrmSession): Promise<EntityInstance<TTable>[]> {\n\n return executeHydrated(ctx, this);\n\n }\n\n\n\n async executeWithContexts(execCtx: ExecutionContext, hydCtx: HydrationContext): Promise<EntityInstance<TTable>[]> {\n\n return executeHydratedWithContexts(execCtx, hydCtx, this);\n\n }\n\n\n\n /**\n\n * Adds a WHERE condition to the query\n\n * @param expr - Expression for the WHERE clause\n\n * @returns New query builder instance with the WHERE condition\n\n */\n\n where(expr: ExpressionNode): SelectQueryBuilder<T, TTable> {\n\n const nextContext = this.applyAst(this.context, service => service.withWhere(expr));\n\n return this.clone(nextContext);\n\n }\n\n\n\n /**\n\n * Adds a GROUP BY clause to the query\n\n * @param col - Column definition or column node to group by\n\n * @returns New query builder instance with the GROUP BY clause\n\n */\n\n groupBy(col: ColumnDef | ColumnNode): SelectQueryBuilder<T, TTable> {\n\n const nextContext = this.applyAst(this.context, service => service.withGroupBy(col));\n\n return this.clone(nextContext);\n\n }\n\n\n\n /**\n\n * Adds a HAVING condition to the query\n\n * @param expr - Expression for the HAVING clause\n\n * @returns New query builder instance with the HAVING condition\n\n */\n\n having(expr: ExpressionNode): SelectQueryBuilder<T, TTable> {\n\n const nextContext = this.applyAst(this.context, service => service.withHaving(expr));\n\n return this.clone(nextContext);\n\n }\n\n\n\n /**\n\n * Adds an ORDER BY clause to the query\n\n * @param col - Column definition or column node to order by\n\n * @param direction - Order direction (defaults to ASC)\n\n * @returns New query builder instance with the ORDER BY clause\n\n */\n\n orderBy(col: ColumnDef | ColumnNode, direction: OrderDirection = ORDER_DIRECTIONS.ASC): SelectQueryBuilder<T, TTable> {\n\n const nextContext = this.applyAst(this.context, service => service.withOrderBy(col, direction));\n\n return this.clone(nextContext);\n\n }\n\n\n\n /**\n\n * Adds a DISTINCT clause to the query\n\n * @param cols - Columns to make distinct\n\n * @returns New query builder instance with the DISTINCT clause\n\n */\n\n distinct(...cols: (ColumnDef | ColumnNode)[]): SelectQueryBuilder<T, TTable> {\n\n return this.clone(this.columnSelector.distinct(this.context, cols));\n\n }\n\n\n\n /**\n\n * Adds a LIMIT clause to the query\n\n * @param n - Maximum number of rows to return\n\n * @returns New query builder instance with the LIMIT clause\n\n */\n\n limit(n: number): SelectQueryBuilder<T, TTable> {\n\n const nextContext = this.applyAst(this.context, service => service.withLimit(n));\n\n return this.clone(nextContext);\n\n }\n\n\n\n /**\n\n * Adds an OFFSET clause to the query\n\n * @param n - Number of rows to skip\n\n * @returns New query builder instance with the OFFSET clause\n\n */\n\n offset(n: number): SelectQueryBuilder<T, TTable> {\n\n const nextContext = this.applyAst(this.context, service => service.withOffset(n));\n\n return this.clone(nextContext);\n\n }\n\n\n\n /**\n\n * Combines this query with another using UNION\n\n * @param query - Query to union with\n\n * @returns New query builder instance with the set operation\n\n */\n\n union(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\n\n return this.clone(this.applySetOperation('UNION', query));\n\n }\n\n\n\n /**\n\n * Combines this query with another using UNION ALL\n\n * @param query - Query to union with\n\n * @returns New query builder instance with the set operation\n\n */\n\n unionAll(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\n\n return this.clone(this.applySetOperation('UNION ALL', query));\n\n }\n\n\n\n /**\n\n * Combines this query with another using INTERSECT\n\n * @param query - Query to intersect with\n\n * @returns New query builder instance with the set operation\n\n */\n\n intersect(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\n\n return this.clone(this.applySetOperation('INTERSECT', query));\n\n }\n\n\n\n /**\n\n * Combines this query with another using EXCEPT\n\n * @param query - Query to subtract\n\n * @returns New query builder instance with the set operation\n\n */\n\n except(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\n\n return this.clone(this.applySetOperation('EXCEPT', query));\n\n }\n\n\n\n /**\n\n * Adds a WHERE EXISTS condition to the query\n\n * @param subquery - Subquery to check for existence\n\n * @returns New query builder instance with the WHERE EXISTS condition\n\n */\n\n whereExists(\n subquery: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode,\n correlate?: ExpressionNode\n ): SelectQueryBuilder<T, TTable> {\n const subAst = this.resolveQueryNode(subquery);\n const correlated = this.applyCorrelation(subAst, correlate);\n return this.where(exists(correlated));\n }\n\n\n\n /**\n\n * Adds a WHERE NOT EXISTS condition to the query\n\n * @param subquery - Subquery to check for non-existence\n\n * @returns New query builder instance with the WHERE NOT EXISTS condition\n\n */\n\n whereNotExists(\n subquery: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode,\n correlate?: ExpressionNode\n ): SelectQueryBuilder<T, TTable> {\n const subAst = this.resolveQueryNode(subquery);\n const correlated = this.applyCorrelation(subAst, correlate);\n return this.where(notExists(correlated));\n }\n\n\n\n /**\n\n * Adds a WHERE EXISTS condition based on a relationship\n\n * @param relationName - Name of the relationship to check\n\n * @param callback - Optional callback to modify the relationship query\n\n * @returns New query builder instance with the relationship existence check\n\n */\n\n whereHas(\n\n relationName: string,\n\n callbackOrOptions?: RelationCallback | WhereHasOptions,\n\n maybeOptions?: WhereHasOptions\n\n ): SelectQueryBuilder<T, TTable> {\n\n const relation = this.env.table.relations[relationName];\n\n if (!relation) {\n\n throw new Error(`Relation '${relationName}' not found on table '${this.env.table.name}'`);\n\n }\n\n\n\n const callback = typeof callbackOrOptions === 'function' ? callbackOrOptions as RelationCallback : undefined;\n const options = (typeof callbackOrOptions === 'function' ? maybeOptions : callbackOrOptions) as WhereHasOptions | undefined;\n\n let subQb = this.createChildBuilder<any, typeof relation.target>(relation.target);\n\n if (callback) {\n\n subQb = callback(subQb);\n\n }\n\n\n\n const subAst = subQb.getAST();\n\n const finalSubAst = this.relationManager.applyRelationCorrelation(this.context, relationName, subAst, options?.correlate);\n\n return this.where(exists(finalSubAst));\n\n }\n\n\n\n /**\n\n * Adds a WHERE NOT EXISTS condition based on a relationship\n\n * @param relationName - Name of the relationship to check\n\n * @param callback - Optional callback to modify the relationship query\n\n * @returns New query builder instance with the relationship non-existence check\n\n */\n\n whereHasNot(\n\n relationName: string,\n\n callbackOrOptions?: RelationCallback | WhereHasOptions,\n\n maybeOptions?: WhereHasOptions\n\n ): SelectQueryBuilder<T, TTable> {\n\n const relation = this.env.table.relations[relationName];\n\n if (!relation) {\n\n throw new Error(`Relation '${relationName}' not found on table '${this.env.table.name}'`);\n\n }\n\n\n\n const callback = typeof callbackOrOptions === 'function' ? callbackOrOptions as RelationCallback : undefined;\n const options = (typeof callbackOrOptions === 'function' ? maybeOptions : callbackOrOptions) as WhereHasOptions | undefined;\n\n let subQb = this.createChildBuilder<any, typeof relation.target>(relation.target);\n\n if (callback) {\n\n subQb = callback(subQb);\n\n }\n\n\n\n const subAst = subQb.getAST();\n\n const finalSubAst = this.relationManager.applyRelationCorrelation(this.context, relationName, subAst, options?.correlate);\n\n return this.where(notExists(finalSubAst));\n\n }\n\n\n\n /**\n\n * Compiles the query to SQL for a specific dialect\n\n * @param dialect - Database dialect to compile for\n\n * @returns Compiled query with SQL and parameters\n\n */\n\n compile(dialect: SelectDialectInput): CompiledQuery {\n\n const resolved = resolveDialectInput(dialect);\n\n return resolved.compileSelect(this.context.state.ast);\n\n }\n\n\n\n /**\n\n * Converts the query to SQL string for a specific dialect\n\n * @param dialect - Database dialect to generate SQL for\n\n * @returns SQL string representation of the query\n\n */\n\n toSql(dialect: SelectDialectInput): string {\n\n return this.compile(dialect).sql;\n\n }\n\n\n\n /**\n\n * Gets the hydration plan for the query\n\n * @returns Hydration plan or undefined if none exists\n\n */\n\n getHydrationPlan(): HydrationPlan | undefined {\n\n return this.context.hydration.getPlan();\n\n }\n\n\n\n /**\n\n * Gets the Abstract Syntax Tree (AST) representation of the query\n\n * @returns Query AST with hydration applied\n\n */\n\n getAST(): SelectQueryNode {\n\n return this.context.hydration.applyToAst(this.context.state.ast);\n\n }\n\n}\n\n\n\n/**\n\n * Creates a column node for use in expressions\n\n * @param table - Table name\n\n * @param name - Column name\n\n * @returns ColumnNode with the specified table and name\n\n */\n\nexport const createColumn = (table: string, name: string): ColumnNode => ({ type: 'Column', table, name });\n\n\n\n/**\n\n * Creates a literal value node for use in expressions\n\n * @param val - Literal value (string or number)\n\n * @returns LiteralNode with the specified value\n\n */\n\nexport const createLiteral = (val: string | number): LiteralNode => ({ type: 'Literal', value: val });\n","import { ColumnType, ColumnDef } from '../schema/column.js';\nimport { defineTable, TableDef, TableHooks } from '../schema/table.js';\nimport { CascadeMode, RelationKinds } from '../schema/relation.js';\n\nexport type EntityConstructor = new (...args: any[]) => any;\nexport type EntityOrTableTarget = EntityConstructor | TableDef;\nexport type EntityOrTableTargetResolver = EntityOrTableTarget | (() => EntityOrTableTarget);\n\nexport type ColumnDefLike<T extends ColumnDef = ColumnDef> = Omit<T, 'name' | 'table'>;\n\ntype MaterializeColumns<TColumns extends Record<string, ColumnDefLike>> = {\n [K in keyof TColumns]: ColumnDef<TColumns[K]['type'], TColumns[K]['tsType']> & Omit<\n TColumns[K],\n 'name' | 'table' | 'type' | 'tsType'\n > & { name: string; table: string };\n};\n\ninterface BaseRelationMetadata {\n propertyKey: string;\n target: EntityOrTableTargetResolver;\n cascade?: CascadeMode;\n}\n\nexport interface HasManyRelationMetadata extends BaseRelationMetadata {\n kind: typeof RelationKinds.HasMany;\n foreignKey: string;\n localKey?: string;\n}\n\nexport interface HasOneRelationMetadata extends BaseRelationMetadata {\n kind: typeof RelationKinds.HasOne;\n foreignKey: string;\n localKey?: string;\n}\n\nexport interface BelongsToRelationMetadata extends BaseRelationMetadata {\n kind: typeof RelationKinds.BelongsTo;\n foreignKey: string;\n localKey?: string;\n}\n\nexport interface BelongsToManyRelationMetadata extends BaseRelationMetadata {\n kind: typeof RelationKinds.BelongsToMany;\n pivotTable: EntityOrTableTargetResolver;\n pivotForeignKeyToRoot: string;\n pivotForeignKeyToTarget: string;\n localKey?: string;\n targetKey?: string;\n pivotPrimaryKey?: string;\n defaultPivotColumns?: string[];\n}\n\nexport type RelationMetadata =\n | HasManyRelationMetadata\n | HasOneRelationMetadata\n | BelongsToRelationMetadata\n | BelongsToManyRelationMetadata;\n\nexport interface EntityMetadata<TColumns extends Record<string, ColumnDefLike> = Record<string, ColumnDefLike>> {\n target: EntityConstructor;\n tableName: string;\n columns: TColumns;\n relations: Record<string, RelationMetadata>;\n hooks?: TableHooks;\n table?: TableDef<MaterializeColumns<TColumns>>;\n}\n\nconst metadataMap = new Map<EntityConstructor, EntityMetadata>();\n\nexport const registerEntityMetadata = (meta: EntityMetadata): void => {\n metadataMap.set(meta.target, meta);\n};\n\nexport const ensureEntityMetadata = (target: EntityConstructor): EntityMetadata => {\n let meta = metadataMap.get(target);\n if (!meta) {\n meta = {\n target,\n tableName: target.name || 'unknown',\n columns: {},\n relations: {}\n };\n metadataMap.set(target, meta);\n }\n return meta;\n};\n\nexport const getEntityMetadata = (target: EntityConstructor): EntityMetadata | undefined => {\n return metadataMap.get(target);\n};\n\nexport const getAllEntityMetadata = (): EntityMetadata[] => {\n return Array.from(metadataMap.values());\n};\n\nexport const clearEntityMetadata = (): void => {\n metadataMap.clear();\n};\n\nexport const addColumnMetadata = (\n target: EntityConstructor,\n propertyKey: string,\n column: ColumnDefLike\n): void => {\n const meta = ensureEntityMetadata(target);\n (meta.columns as Record<string, ColumnDefLike>)[propertyKey] = { ...column };\n};\n\nexport const addRelationMetadata = (\n target: EntityConstructor,\n propertyKey: string,\n relation: RelationMetadata\n): void => {\n const meta = ensureEntityMetadata(target);\n meta.relations[propertyKey] = relation;\n};\n\nexport const setEntityTableName = (\n target: EntityConstructor,\n tableName: string,\n hooks?: TableHooks\n): void => {\n const meta = ensureEntityMetadata(target);\n if (tableName && tableName.length > 0) {\n meta.tableName = tableName;\n }\n if (hooks) {\n meta.hooks = hooks;\n }\n};\n\nexport const buildTableDef = <TColumns extends Record<string, ColumnDefLike>>(meta: EntityMetadata<TColumns>): TableDef<MaterializeColumns<TColumns>> => {\n if (meta.table) {\n return meta.table;\n }\n\n const columns = Object.entries(meta.columns).reduce<MaterializeColumns<TColumns>>((acc, [key, def]) => {\n (acc as any)[key] = {\n ...def,\n name: key,\n table: meta.tableName\n };\n return acc;\n }, {} as MaterializeColumns<TColumns>);\n\n const table = defineTable(meta.tableName, columns, {}, meta.hooks);\n meta.table = table;\n return table;\n};\n","import { SelectQueryBuilder } from '../query-builder/select.js';\nimport {\n hasMany,\n hasOne,\n belongsTo,\n belongsToMany,\n RelationKinds,\n type RelationDef\n} from '../schema/relation.js';\nimport { TableDef } from '../schema/table.js';\nimport {\n buildTableDef,\n EntityConstructor,\n EntityOrTableTarget,\n EntityOrTableTargetResolver,\n getAllEntityMetadata,\n getEntityMetadata,\n RelationMetadata\n} from '../orm/entity-metadata.js';\n\nconst isTableDef = (value: unknown): value is TableDef => {\n return typeof value === 'object' && value !== null && 'columns' in (value as TableDef);\n};\n\nconst unwrapTarget = (target: EntityOrTableTargetResolver): EntityOrTableTarget => {\n if (typeof target === 'function' && (target as Function).prototype === undefined) {\n return (target as () => EntityOrTableTarget)();\n }\n return target as EntityOrTableTarget;\n};\n\nconst resolveTableTarget = (\n target: EntityOrTableTargetResolver,\n tableMap: Map<EntityConstructor, TableDef>\n): TableDef => {\n const resolved = unwrapTarget(target);\n if (isTableDef(resolved)) {\n return resolved;\n }\n const table = tableMap.get(resolved as EntityConstructor);\n if (!table) {\n throw new Error(`Entity '${(resolved as EntityConstructor).name}' is not registered with decorators`);\n }\n return table;\n};\n\nconst buildRelationDefinitions = (\n meta: { relations: Record<string, RelationMetadata> },\n tableMap: Map<EntityConstructor, TableDef>\n): Record<string, RelationDef> => {\n const relations: Record<string, RelationDef> = {};\n\n for (const [name, relation] of Object.entries(meta.relations)) {\n switch (relation.kind) {\n case RelationKinds.HasOne: {\n relations[name] = hasOne(\n resolveTableTarget(relation.target, tableMap),\n relation.foreignKey,\n relation.localKey,\n relation.cascade\n );\n break;\n }\n case RelationKinds.HasMany: {\n relations[name] = hasMany(\n resolveTableTarget(relation.target, tableMap),\n relation.foreignKey,\n relation.localKey,\n relation.cascade\n );\n break;\n }\n case RelationKinds.BelongsTo: {\n relations[name] = belongsTo(\n resolveTableTarget(relation.target, tableMap),\n relation.foreignKey,\n relation.localKey,\n relation.cascade\n );\n break;\n }\n case RelationKinds.BelongsToMany: {\n relations[name] = belongsToMany(\n resolveTableTarget(relation.target, tableMap),\n resolveTableTarget(relation.pivotTable, tableMap),\n {\n pivotForeignKeyToRoot: relation.pivotForeignKeyToRoot,\n pivotForeignKeyToTarget: relation.pivotForeignKeyToTarget,\n localKey: relation.localKey,\n targetKey: relation.targetKey,\n pivotPrimaryKey: relation.pivotPrimaryKey,\n defaultPivotColumns: relation.defaultPivotColumns,\n cascade: relation.cascade\n }\n );\n break;\n }\n }\n }\n\n return relations;\n};\n\nexport const bootstrapEntities = (): TableDef[] => {\n const metas = getAllEntityMetadata();\n const tableMap = new Map<EntityConstructor, TableDef>();\n\n for (const meta of metas) {\n const table = buildTableDef(meta);\n tableMap.set(meta.target, table);\n }\n\n for (const meta of metas) {\n const table = meta.table!;\n const relations = buildRelationDefinitions(meta, tableMap);\n table.relations = relations;\n }\n\n return metas.map(meta => meta.table!) as TableDef[];\n};\n\nexport const getTableDefFromEntity = <TTable extends TableDef = TableDef>(ctor: EntityConstructor): TTable | undefined => {\n const meta = getEntityMetadata(ctor);\n if (!meta) return undefined;\n if (!meta.table) {\n bootstrapEntities();\n }\n return meta.table as TTable;\n};\n\nexport const selectFromEntity = <TTable extends TableDef = TableDef>(\n ctor: EntityConstructor\n): SelectQueryBuilder<any, TTable> => {\n const table = getTableDefFromEntity(ctor);\n if (!table) {\n throw new Error(`Entity '${ctor.name}' is not registered with decorators or has not been bootstrapped`);\n }\n return new SelectQueryBuilder(table as TTable);\n};\n","import type { TableDef } from '../schema/table.js';\nimport type { ColumnDef } from '../schema/column.js';\nimport { getTableDefFromEntity } from '../decorators/bootstrap.js';\n\n/**\n * Build a typed selection map from a TableDef.\n */\nexport function sel<\n TTable extends TableDef,\n K extends keyof TTable['columns'] & string\n>(table: TTable, ...cols: K[]): Record<K, TTable['columns'][K]> {\n const selection = {} as Record<K, TTable['columns'][K]>;\n\n for (const col of cols) {\n const def = table.columns[col] as TTable['columns'][K];\n if (!def) {\n throw new Error(`Column '${col}' not found on table '${table.name}'`);\n }\n selection[col] = def;\n }\n\n return selection;\n}\n\ntype Ctor<T> = { new (...args: any[]): T };\n\n/**\n * Build a typed selection map from an entity constructor.\n */\nexport function esel<TEntity, K extends keyof TEntity & string>(\n entity: Ctor<TEntity>,\n ...props: K[]\n): Record<K, ColumnDef> {\n const table = getTableDefFromEntity(entity) as TableDef | undefined;\n if (!table) {\n throw new Error(`No table definition registered for entity '${entity.name}'`);\n }\n\n const selection = {} as Record<K, ColumnDef>;\n\n for (const prop of props) {\n const col = table.columns[prop];\n if (!col) {\n throw new Error(`No column '${prop}' found for entity '${entity.name}'`);\n }\n selection[prop] = col;\n }\n\n return selection;\n}\n","import { TableDef } from '../schema/table.js';\r\nimport { InsertQueryNode, TableNode } from '../core/ast/query.js';\r\nimport { ColumnNode, OperandNode, isValueOperandInput, valueToOperand } from '../core/ast/expression.js';\r\nimport { buildColumnNodes, createTableNode } from '../core/ast/builders.js';\r\n\r\n/**\r\n * Maintains immutable state for building INSERT queries\r\n */\r\nexport class InsertQueryState {\r\n public readonly table: TableDef;\r\n public readonly ast: InsertQueryNode;\r\n\r\n constructor(table: TableDef, ast?: InsertQueryNode) {\r\n this.table = table;\r\n this.ast = ast ?? {\r\n type: 'InsertQuery',\r\n into: createTableNode(table),\r\n columns: [],\r\n values: []\r\n };\r\n }\r\n\r\n private clone(nextAst: InsertQueryNode): InsertQueryState {\r\n return new InsertQueryState(this.table, nextAst);\r\n }\r\n\r\n withValues(rows: Record<string, unknown>[]): InsertQueryState {\r\n if (!rows.length) return this;\r\n\r\n const definedColumns = this.ast.columns.length\r\n ? this.ast.columns\r\n : buildColumnNodes(this.table, Object.keys(rows[0]));\r\n\r\n const newRows: OperandNode[][] = rows.map((row, rowIndex) =>\r\n definedColumns.map(column => {\r\n const rawValue = row[column.name];\r\n\r\n if (!isValueOperandInput(rawValue)) {\r\n throw new Error(\r\n `Invalid insert value for column \"${column.name}\" in row ${rowIndex}: only primitives, null, or OperandNodes are allowed`\r\n );\r\n }\r\n\r\n return valueToOperand(rawValue);\r\n })\r\n );\r\n\r\n return this.clone({\r\n ...this.ast,\r\n columns: definedColumns,\r\n values: [...this.ast.values, ...newRows]\r\n });\r\n }\r\n\r\n withReturning(columns: ColumnNode[]): InsertQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n returning: [...columns]\r\n });\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { ColumnNode } from '../core/ast/expression.js';\r\nimport { CompiledQuery, InsertCompiler, Dialect } from '../core/dialect/abstract.js';\r\nimport { DialectKey, resolveDialectInput } from '../core/dialect/dialect-factory.js';\r\nimport { InsertQueryNode } from '../core/ast/query.js';\r\nimport { InsertQueryState } from './insert-query-state.js';\r\nimport { buildColumnNode } from '../core/ast/builders.js';\r\n\r\ntype InsertDialectInput = Dialect | DialectKey;\r\n\r\n/**\r\n * Builder for INSERT queries\r\n */\r\nexport class InsertQueryBuilder<T> {\r\n private readonly table: TableDef;\r\n private readonly state: InsertQueryState;\r\n\r\n constructor(table: TableDef, state?: InsertQueryState) {\r\n this.table = table;\r\n this.state = state ?? new InsertQueryState(table);\r\n }\r\n\r\n private clone(state: InsertQueryState): InsertQueryBuilder<T> {\r\n return new InsertQueryBuilder(this.table, state);\r\n }\r\n\r\n values(rowOrRows: Record<string, unknown> | Record<string, unknown>[]): InsertQueryBuilder<T> {\r\n const rows = Array.isArray(rowOrRows) ? rowOrRows : [rowOrRows];\r\n if (!rows.length) return this;\r\n return this.clone(this.state.withValues(rows));\r\n }\r\n\r\n returning(...columns: (ColumnDef | ColumnNode)[]): InsertQueryBuilder<T> {\r\n if (!columns.length) return this;\r\n const nodes = columns.map(column => buildColumnNode(this.table, column));\r\n return this.clone(this.state.withReturning(nodes));\r\n }\r\n\r\n // Existing compiler-based compile stays, but we add a new overload.\r\n\r\n // 1) Keep the old behavior (used internally / tests, if any):\r\n compile(compiler: InsertCompiler): CompiledQuery;\r\n // 2) New ergonomic overload:\r\n compile(dialect: InsertDialectInput): CompiledQuery;\r\n\r\n compile(arg: InsertCompiler | InsertDialectInput): CompiledQuery {\r\n if (typeof (arg as any).compileInsert === 'function') {\r\n // InsertCompiler path – old behavior\r\n return (arg as InsertCompiler).compileInsert(this.state.ast);\r\n }\r\n\r\n // Dialect | string path – new behavior\r\n const dialect = resolveDialectInput(arg as InsertDialectInput);\r\n return dialect.compileInsert(this.state.ast);\r\n }\r\n\r\n toSql(arg: InsertCompiler | InsertDialectInput): string {\r\n return this.compile(arg as any).sql;\r\n }\r\n\r\n getAST(): InsertQueryNode {\r\n return this.state.ast;\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnNode, ExpressionNode, OperandNode, isOperandNode, valueToOperand } from '../core/ast/expression.js';\r\nimport { TableNode, UpdateQueryNode, UpdateAssignmentNode } from '../core/ast/query.js';\r\nimport { createTableNode } from '../core/ast/builders.js';\r\ntype LiteralValue = string | number | boolean | null;\r\ntype UpdateValue = OperandNode | LiteralValue;\r\n\r\nconst isUpdateValue = (value: unknown): value is UpdateValue => {\r\n if (value === null) return true;\r\n switch (typeof value) {\r\n case 'string':\r\n case 'number':\r\n case 'boolean':\r\n return true;\r\n default:\r\n return isOperandNode(value);\r\n }\r\n};\r\n\r\n/**\r\n * Immutable state for UPDATE queries\r\n */\r\nexport class UpdateQueryState {\r\n public readonly table: TableDef;\r\n public readonly ast: UpdateQueryNode;\r\n\r\n constructor(table: TableDef, ast?: UpdateQueryNode) {\r\n this.table = table;\r\n this.ast = ast ?? {\r\n type: 'UpdateQuery',\r\n table: createTableNode(table),\r\n set: []\r\n };\r\n }\r\n\r\n private clone(nextAst: UpdateQueryNode): UpdateQueryState {\r\n return new UpdateQueryState(this.table, nextAst);\r\n }\r\n\r\n withSet(values: Record<string, unknown>): UpdateQueryState {\r\n const assignments: UpdateAssignmentNode[] = Object.entries(values).map(([column, rawValue]) => {\r\n if (!isUpdateValue(rawValue)) {\r\n throw new Error(\r\n `Invalid update value for column \"${column}\": only primitives, null, or OperandNodes are allowed`\r\n );\r\n }\r\n\r\n return {\r\n column: {\r\n type: 'Column',\r\n table: this.table.name,\r\n name: column\r\n },\r\n value: valueToOperand(rawValue)\r\n };\r\n });\r\n\r\n return this.clone({\r\n ...this.ast,\r\n set: assignments\r\n });\r\n }\r\n\r\n withWhere(expr: ExpressionNode): UpdateQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n where: expr\r\n });\r\n }\r\n\r\n withReturning(columns: ColumnNode[]): UpdateQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n returning: [...columns]\r\n });\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { ColumnNode, ExpressionNode } from '../core/ast/expression.js';\r\nimport { CompiledQuery, UpdateCompiler, Dialect } from '../core/dialect/abstract.js';\r\nimport { DialectKey, resolveDialectInput } from '../core/dialect/dialect-factory.js';\r\nimport { UpdateQueryNode } from '../core/ast/query.js';\r\nimport { UpdateQueryState } from './update-query-state.js';\r\nimport { buildColumnNode } from '../core/ast/builders.js';\r\n\r\ntype UpdateDialectInput = Dialect | DialectKey;\r\n\r\n/**\r\n * Builder for UPDATE queries\r\n */\r\nexport class UpdateQueryBuilder<T> {\r\n private readonly table: TableDef;\r\n private readonly state: UpdateQueryState;\r\n\r\n constructor(table: TableDef, state?: UpdateQueryState) {\r\n this.table = table;\r\n this.state = state ?? new UpdateQueryState(table);\r\n }\r\n\r\n private clone(state: UpdateQueryState): UpdateQueryBuilder<T> {\r\n return new UpdateQueryBuilder(this.table, state);\r\n }\r\n\r\n set(values: Record<string, unknown>): UpdateQueryBuilder<T> {\r\n return this.clone(this.state.withSet(values));\r\n }\r\n\r\n where(expr: ExpressionNode): UpdateQueryBuilder<T> {\r\n return this.clone(this.state.withWhere(expr));\r\n }\r\n\r\n returning(...columns: (ColumnDef | ColumnNode)[]): UpdateQueryBuilder<T> {\r\n if (!columns.length) return this;\r\n const nodes = columns.map(column => buildColumnNode(this.table, column));\r\n return this.clone(this.state.withReturning(nodes));\r\n }\r\n\r\n // Existing compiler-based compile stays, but we add a new overload.\r\n\r\n // 1) Keep the old behavior (used internally / tests, if any):\r\n compile(compiler: UpdateCompiler): CompiledQuery;\r\n // 2) New ergonomic overload:\r\n compile(dialect: UpdateDialectInput): CompiledQuery;\r\n\r\n compile(arg: UpdateCompiler | UpdateDialectInput): CompiledQuery {\r\n if (typeof (arg as any).compileUpdate === 'function') {\r\n // UpdateCompiler path – old behavior\r\n return (arg as UpdateCompiler).compileUpdate(this.state.ast);\r\n }\r\n\r\n // Dialect | string path – new behavior\r\n const dialect = resolveDialectInput(arg as UpdateDialectInput);\r\n return dialect.compileUpdate(this.state.ast);\r\n }\r\n\r\n toSql(arg: UpdateCompiler | UpdateDialectInput): string {\r\n return this.compile(arg as any).sql;\r\n }\r\n\r\n getAST(): UpdateQueryNode {\r\n return this.state.ast;\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnNode, ExpressionNode } from '../core/ast/expression.js';\r\nimport { TableNode, DeleteQueryNode } from '../core/ast/query.js';\r\nimport { createTableNode } from '../core/ast/builders.js';\r\n\r\n/**\r\n * Maintains immutable state for DELETE queries\r\n */\r\nexport class DeleteQueryState {\r\n public readonly table: TableDef;\r\n public readonly ast: DeleteQueryNode;\r\n\r\n constructor(table: TableDef, ast?: DeleteQueryNode) {\r\n this.table = table;\r\n this.ast = ast ?? {\r\n type: 'DeleteQuery',\r\n from: createTableNode(table)\r\n };\r\n }\r\n\r\n private clone(nextAst: DeleteQueryNode): DeleteQueryState {\r\n return new DeleteQueryState(this.table, nextAst);\r\n }\r\n\r\n withWhere(expr: ExpressionNode): DeleteQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n where: expr\r\n });\r\n }\r\n\r\n withReturning(columns: ColumnNode[]): DeleteQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n returning: [...columns]\r\n });\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { ColumnNode, ExpressionNode } from '../core/ast/expression.js';\r\nimport { CompiledQuery, DeleteCompiler, Dialect } from '../core/dialect/abstract.js';\r\nimport { DialectKey, resolveDialectInput } from '../core/dialect/dialect-factory.js';\r\nimport { DeleteQueryNode } from '../core/ast/query.js';\r\nimport { DeleteQueryState } from './delete-query-state.js';\r\nimport { buildColumnNode } from '../core/ast/builders.js';\r\n\r\ntype DeleteDialectInput = Dialect | DialectKey;\r\n\r\n/**\r\n * Builder for DELETE queries\r\n */\r\nexport class DeleteQueryBuilder<T> {\r\n private readonly table: TableDef;\r\n private readonly state: DeleteQueryState;\r\n\r\n constructor(table: TableDef, state?: DeleteQueryState) {\r\n this.table = table;\r\n this.state = state ?? new DeleteQueryState(table);\r\n }\r\n\r\n private clone(state: DeleteQueryState): DeleteQueryBuilder<T> {\r\n return new DeleteQueryBuilder(this.table, state);\r\n }\r\n\r\n where(expr: ExpressionNode): DeleteQueryBuilder<T> {\r\n return this.clone(this.state.withWhere(expr));\r\n }\r\n\r\n returning(...columns: (ColumnDef | ColumnNode)[]): DeleteQueryBuilder<T> {\r\n if (!columns.length) return this;\r\n const nodes = columns.map(column => buildColumnNode(this.table, column));\r\n return this.clone(this.state.withReturning(nodes));\r\n }\r\n\r\n // Existing compiler-based compile stays, but we add a new overload.\r\n\r\n // 1) Keep the old behavior (used internally / tests, if any):\r\n compile(compiler: DeleteCompiler): CompiledQuery;\r\n // 2) New ergonomic overload:\r\n compile(dialect: DeleteDialectInput): CompiledQuery;\r\n\r\n compile(arg: DeleteCompiler | DeleteDialectInput): CompiledQuery {\r\n if (typeof (arg as any).compileDelete === 'function') {\r\n // DeleteCompiler path – old behavior\r\n return (arg as DeleteCompiler).compileDelete(this.state.ast);\r\n }\r\n\r\n // Dialect | string path – new behavior\r\n const dialect = resolveDialectInput(arg as DeleteDialectInput);\r\n return dialect.compileDelete(this.state.ast);\r\n }\r\n\r\n toSql(arg: DeleteCompiler | DeleteDialectInput): string {\r\n return this.compile(arg as any).sql;\r\n }\r\n\r\n getAST(): DeleteQueryNode {\r\n return this.state.ast;\r\n }\r\n}\r\n","import type { TableDef, IndexColumn } from '../../schema/table.js';\r\nimport type { RawDefaultValue } from '../../schema/column.js';\r\n\r\n/**\r\n * Minimal surface for anything that can quote identifiers.\r\n * Implemented by SchemaDialect, runtime Dialect, etc.\r\n */\r\nexport interface Quoter {\r\n quoteIdentifier(id: string): string;\r\n}\r\n\r\n/**\r\n * Escape a value to be safe inside a single-quoted SQL literal.\r\n * Purely mechanical; no dialect knowledge.\r\n */\r\nexport const escapeSqlString = (value: string): string =>\r\n value.replace(/'/g, \"''\");\r\n\r\n/**\r\n * Narrow a value to the RawDefaultValue shape.\r\n * This is domain-specific but dialect-agnostic.\r\n */\r\nexport const isRawDefault = (value: unknown): value is RawDefaultValue =>\r\n typeof value === 'object' &&\r\n value !== null &&\r\n 'raw' in value &&\r\n typeof (value as RawDefaultValue).raw === 'string';\r\n\r\n/**\r\n * Abstraction for \"how do I turn values into SQL literals\".\r\n * Implemented or configured by each dialect.\r\n */\r\nexport interface LiteralFormatter {\r\n formatLiteral(value: unknown): string;\r\n}\r\n\r\n/**\r\n * Declarative options for building a LiteralFormatter.\r\n * Dialects configure behavior by data, not by being hard-coded here.\r\n */\r\nexport interface LiteralFormatOptions {\r\n nullLiteral?: string; // default: 'NULL'\r\n booleanTrue?: string; // default: 'TRUE'\r\n booleanFalse?: string; // default: 'FALSE'\r\n\r\n numberFormatter?: (value: number) => string;\r\n dateFormatter?: (value: Date) => string;\r\n stringWrapper?: (escaped: string) => string; // how to wrap an escaped string\r\n jsonWrapper?: (escaped: string) => string; // how to wrap escaped JSON\r\n}\r\n\r\n/**\r\n * Factory for a value-based LiteralFormatter that:\r\n * - Handles type dispatch (null/number/boolean/date/string/object/raw)\r\n * - Delegates representation choices to options\r\n * - Knows nothing about concrete dialects\r\n */\r\nexport const createLiteralFormatter = (\r\n options: LiteralFormatOptions = {}\r\n): LiteralFormatter => {\r\n const {\r\n nullLiteral = 'NULL',\r\n booleanTrue = 'TRUE',\r\n booleanFalse = 'FALSE',\r\n\r\n numberFormatter = (value: number): string =>\r\n Number.isFinite(value) ? String(value) : nullLiteral,\r\n\r\n dateFormatter = (value: Date): string =>\r\n `'${escapeSqlString(value.toISOString())}'`,\r\n\r\n stringWrapper = (escaped: string): string => `'${escaped}'`,\r\n jsonWrapper = (escaped: string): string => `'${escaped}'`,\r\n } = options;\r\n\r\n const wrapString = stringWrapper;\r\n const wrapJson = jsonWrapper;\r\n\r\n const format = (value: unknown): string => {\r\n // Domain rule: raw defaults bypass all formatting.\r\n if (isRawDefault(value)) return value.raw;\r\n\r\n if (value === null) return nullLiteral;\r\n\r\n if (typeof value === 'number') {\r\n return numberFormatter(value);\r\n }\r\n\r\n if (typeof value === 'boolean') {\r\n return value ? booleanTrue : booleanFalse;\r\n }\r\n\r\n if (value instanceof Date) {\r\n return dateFormatter(value);\r\n }\r\n\r\n if (typeof value === 'string') {\r\n return wrapString(escapeSqlString(value));\r\n }\r\n\r\n // Fallback: serialize to JSON then treat as string.\r\n return wrapJson(escapeSqlString(JSON.stringify(value)));\r\n };\r\n\r\n return {\r\n formatLiteral: format,\r\n };\r\n};\r\n\r\n/**\r\n * Convenience wrapper if you prefer a functional style at call-sites.\r\n */\r\nexport const formatLiteral = (\r\n formatter: LiteralFormatter,\r\n value: unknown\r\n): string => formatter.formatLiteral(value);\r\n\r\n/**\r\n * Quotes a possibly qualified identifier like \"schema.table\" or \"db.schema.table\"\r\n * using a Quoter that knows how to quote a single segment.\r\n */\r\nexport const quoteQualified = (quoter: Quoter, identifier: string): string => {\r\n const parts = identifier.split('.');\r\n return parts.map(part => quoter.quoteIdentifier(part)).join('.');\r\n};\r\n\r\n/**\r\n * Renders index column list, including optional order / nulls, using the\r\n * provided Quoter for identifier quoting.\r\n */\r\nexport const renderIndexColumns = (\r\n quoter: Quoter,\r\n columns: (string | IndexColumn)[]\r\n): string =>\r\n columns\r\n .map(col => {\r\n if (typeof col === 'string') {\r\n return quoter.quoteIdentifier(col);\r\n }\r\n\r\n const parts: string[] = [quoter.quoteIdentifier(col.column)];\r\n\r\n if (col.order) {\r\n parts.push(col.order);\r\n }\r\n\r\n if (col.nulls) {\r\n parts.push(`NULLS ${col.nulls}`);\r\n }\r\n\r\n return parts.join(' ');\r\n })\r\n .join(', ');\r\n\r\n/**\r\n * Resolves the primary key column names for a table, based purely on schema\r\n * metadata. This is domain logic, but independent from any dialect.\r\n */\r\nexport const resolvePrimaryKey = (table: TableDef): string[] => {\r\n if (Array.isArray(table.primaryKey) && table.primaryKey.length > 0) {\r\n return table.primaryKey;\r\n }\r\n\r\n const columns = Object.values(table.columns ?? {});\r\n\r\n // `primary` / `name` are domain-level properties of ColumnDef.\r\n return columns\r\n .filter((col: any) => col.primary)\r\n .map((col: any) => col.name);\r\n};\r\n","import type { TableDef, IndexDef, IndexColumn } from '../../schema/table.js';\nimport type { ColumnDef, ForeignKeyReference } from '../../schema/column.js';\nimport type { SchemaDialect } from './schema-dialect.js';\nimport { deriveIndexName } from './naming-strategy.js';\nimport {\n formatLiteral,\n renderIndexColumns,\n quoteQualified,\n resolvePrimaryKey,\n Quoter\n} from './sql-writing.js';\nimport { DatabaseTable, DatabaseColumn, ColumnDiff } from './schema-types.js';\nimport { DialectName } from './schema-dialect.js';\n\nexport interface SchemaGenerateResult {\n tableSql: string;\n indexSql: string[];\n}\n\nexport interface RenderColumnOptions {\n includePrimary?: boolean;\n}\n\nexport const renderColumnDefinition = (\n table: TableDef,\n col: ColumnDef,\n dialect: SchemaDialect,\n options: RenderColumnOptions = {}\n): { sql: string; inlinePrimary: boolean } => {\n const parts: string[] = [];\n parts.push(dialect.quoteIdentifier(col.name));\n parts.push(dialect.renderColumnType(col));\n\n const autoInc = dialect.renderAutoIncrement(col, table);\n if (autoInc) parts.push(autoInc);\n\n if (col.notNull) parts.push('NOT NULL');\n if (col.unique) parts.push('UNIQUE');\n if (col.default !== undefined) {\n parts.push(`DEFAULT ${dialect.renderDefault(col.default, col)}`);\n }\n if (options.includePrimary && col.primary) {\n parts.push('PRIMARY KEY');\n }\n if (col.check) {\n parts.push(`CHECK (${col.check})`);\n }\n if (col.references) {\n parts.push(dialect.renderReference(col.references, table));\n }\n\n return { sql: parts.join(' '), inlinePrimary: !!(options.includePrimary && col.primary) };\n};\n\nexport const generateCreateTableSql = (\n table: TableDef,\n dialect: SchemaDialect\n): SchemaGenerateResult => {\n const pk = resolvePrimaryKey(table);\n const inlinePkColumns = new Set<string>();\n\n const columnLines = Object.values(table.columns).map(col => {\n const includePk = (dialect as any).preferInlinePkAutoincrement?.(col, table, pk) && pk.includes(col.name);\n if (includePk) {\n inlinePkColumns.add(col.name);\n }\n return renderColumnDefinition(table, col, dialect, { includePrimary: includePk }).sql;\n });\n\n const constraintLines: string[] = [];\n\n if (pk.length > 0 && !(pk.length === 1 && inlinePkColumns.has(pk[0]))) {\n const cols = pk.map(c => dialect.quoteIdentifier(c)).join(', ');\n constraintLines.push(`PRIMARY KEY (${cols})`);\n }\n\n if (table.checks) {\n table.checks.forEach(check => {\n const name = check.name ? `${dialect.quoteIdentifier(check.name)} ` : '';\n constraintLines.push(`CONSTRAINT ${name}CHECK (${check.expression})`);\n });\n }\n\n const allLines = [...columnLines, ...constraintLines];\n const body = allLines.map(line => ` ${line}`).join(',\\n');\n const tableOptions = dialect.renderTableOptions(table);\n const tableSql = `CREATE TABLE ${dialect.formatTableName(table)} (\\n${body}\\n)${tableOptions ? ' ' + tableOptions : ''};`;\n\n const indexSql: string[] = [];\n if (table.indexes && table.indexes.length > 0) {\n for (const idx of table.indexes) {\n if (idx.where && !dialect.supportsPartialIndexes()) {\n throw new Error(`Dialect ${dialect.name} does not support partial/filtered indexes (${idx.name || idx.columns.join('_')}).`);\n }\n indexSql.push(dialect.renderIndex(table, idx));\n }\n }\n\n return { tableSql, indexSql };\n};\n\nexport const generateSchemaSql = (\n tables: TableDef[],\n dialect: SchemaDialect\n): string[] => {\n const ordered = orderTablesByDependencies(tables);\n const statements: string[] = [];\n ordered.forEach(table => {\n const { tableSql, indexSql } = generateCreateTableSql(table, dialect);\n statements.push(tableSql, ...indexSql);\n });\n return statements;\n};\n\nconst orderTablesByDependencies = (tables: TableDef[]): TableDef[] => {\n const map = new Map<string, TableDef>();\n tables.forEach(t => map.set(t.name, t));\n\n const deps = new Map<string, Set<string>>();\n for (const table of tables) {\n const refTables = new Set<string>();\n Object.values(table.columns).forEach(col => {\n if (col.references?.table) {\n refTables.add(col.references.table);\n }\n });\n deps.set(table.name, refTables);\n }\n\n const visited = new Set<string>();\n const ordered: TableDef[] = [];\n\n const visit = (name: string, stack: Set<string>) => {\n if (visited.has(name)) return;\n const table = map.get(name);\n if (!table) return;\n if (stack.has(name)) {\n ordered.push(table);\n visited.add(name);\n return;\n }\n stack.add(name);\n for (const dep of deps.get(name) || []) {\n visit(dep, stack);\n }\n stack.delete(name);\n visited.add(name);\n ordered.push(table);\n };\n\n tables.forEach(t => visit(t.name, new Set()));\n return ordered;\n};\n\n// Re-export DialectName for backward compatibility\nexport type { DialectName };\n","import type { TableDef, IndexDef } from '../../schema/table.js';\r\n\r\nexport const deriveIndexName = (table: TableDef, index: IndexDef): string => {\r\n const base = (index.columns ?? [])\r\n .map(col => (typeof col === 'string' ? col : col.column))\r\n .join('_');\r\n\r\n const suffix = index.unique ? 'uniq' : 'idx';\r\n return `${table.name}_${base}_${suffix}`;\r\n};\r\n","import { TableDef } from '../../schema/table.js';\r\nimport { ColumnDef } from '../../schema/column.js';\r\nimport type { DbExecutor } from '../execution/db-executor.js';\r\nimport { SchemaDialect } from './schema-dialect.js';\r\nimport { deriveIndexName } from './naming-strategy.js';\r\nimport { generateCreateTableSql, renderColumnDefinition } from './schema-generator.js';\r\nimport { ColumnDiff, DatabaseColumn, DatabaseSchema, DatabaseTable } from './schema-types.js';\r\n\r\nexport type SchemaChangeKind =\r\n | 'createTable'\r\n | 'dropTable'\r\n | 'addColumn'\r\n | 'dropColumn'\r\n | 'alterColumn'\r\n | 'addIndex'\r\n | 'dropIndex';\r\n\r\nexport interface SchemaChange {\r\n kind: SchemaChangeKind;\r\n table: string;\r\n description: string;\r\n statements: string[];\r\n safe: boolean;\r\n}\r\n\r\nexport interface SchemaPlan {\r\n changes: SchemaChange[];\r\n warnings: string[];\r\n}\r\n\r\nexport interface SchemaDiffOptions {\r\n /** Allow destructive operations (drops) */\r\n allowDestructive?: boolean;\r\n}\r\n\r\nconst tableKey = (name: string, schema?: string) => (schema ? `${schema}.${name}` : name);\r\n\r\nconst mapTables = (schema: DatabaseSchema) => {\r\n const map = new Map<string, DatabaseTable>();\r\n for (const table of schema.tables) {\r\n map.set(tableKey(table.name, table.schema), table);\r\n }\r\n return map;\r\n};\r\n\r\nconst buildAddColumnSql = (table: TableDef, colName: string, dialect: SchemaDialect): string => {\r\n const column = table.columns[colName];\r\n const rendered = renderColumnDefinition(table, column, dialect);\r\n return `ALTER TABLE ${dialect.formatTableName(table)} ADD ${rendered.sql};`;\r\n};\r\n\r\nconst normalizeType = (value: string | undefined): string => (value || '').toLowerCase().replace(/\\s+/g, ' ').trim();\r\nconst normalizeDefault = (value: unknown): string | undefined => {\r\n if (value === undefined || value === null) return undefined;\r\n return String(value).trim();\r\n};\r\n\r\nconst diffColumn = (expected: ColumnDef, actual: DatabaseColumn, dialect: SchemaDialect): ColumnDiff => {\r\n const expectedType = normalizeType(dialect.renderColumnType(expected));\r\n const actualType = normalizeType(actual.type);\r\n const expectedDefault =\r\n expected.default !== undefined ? normalizeDefault(dialect.renderDefault(expected.default, expected)) : undefined;\r\n const actualDefault = normalizeDefault(actual.default);\r\n return {\r\n typeChanged: expectedType !== actualType,\r\n nullabilityChanged: !!expected.notNull !== !!actual.notNull,\r\n defaultChanged: expectedDefault !== actualDefault,\r\n autoIncrementChanged: !!expected.autoIncrement !== !!actual.autoIncrement\r\n };\r\n};\r\n\r\nexport const diffSchema = (\r\n expectedTables: TableDef[],\r\n actualSchema: DatabaseSchema,\r\n dialect: SchemaDialect,\r\n options: SchemaDiffOptions = {}\r\n): SchemaPlan => {\r\n const allowDestructive = options.allowDestructive ?? false;\r\n const plan: SchemaPlan = { changes: [], warnings: [] };\r\n\r\n const actualMap = mapTables(actualSchema);\r\n\r\n // Create missing tables and indexes\r\n for (const table of expectedTables) {\r\n const key = tableKey(table.name, table.schema);\r\n const actual = actualMap.get(key);\r\n if (!actual) {\r\n const { tableSql, indexSql } = generateCreateTableSql(table, dialect);\r\n plan.changes.push({\r\n kind: 'createTable',\r\n table: key,\r\n description: `Create table ${key}`,\r\n statements: [tableSql, ...indexSql],\r\n safe: true\r\n });\r\n continue;\r\n }\r\n\r\n // Columns\r\n const actualCols = new Map(actual.columns.map(c => [c.name, c]));\r\n for (const colName of Object.keys(table.columns)) {\r\n if (!actualCols.has(colName)) {\r\n plan.changes.push({\r\n kind: 'addColumn',\r\n table: key,\r\n description: `Add column ${colName} to ${key}`,\r\n statements: [buildAddColumnSql(table, colName, dialect)],\r\n safe: true\r\n });\r\n } else {\r\n const expectedCol = table.columns[colName];\r\n const actualCol = actualCols.get(colName)!;\r\n const colDiff = diffColumn(expectedCol, actualCol, dialect);\r\n const shouldAlter =\r\n colDiff.typeChanged || colDiff.nullabilityChanged || colDiff.defaultChanged || colDiff.autoIncrementChanged;\r\n if (shouldAlter) {\r\n const statements = dialect.alterColumnSql?.(table, expectedCol, actualCol, colDiff) ?? [];\r\n if (statements.length > 0) {\r\n plan.changes.push({\r\n kind: 'alterColumn',\r\n table: key,\r\n description: `Alter column ${colName} on ${key}`,\r\n statements,\r\n safe: true\r\n });\r\n }\r\n const warning = dialect.warnAlterColumn?.(table, expectedCol, actualCol, colDiff);\r\n if (warning) plan.warnings.push(warning);\r\n }\r\n }\r\n }\r\n for (const colName of actualCols.keys()) {\r\n if (!table.columns[colName]) {\r\n plan.changes.push({\r\n kind: 'dropColumn',\r\n table: key,\r\n description: `Drop column ${colName} from ${key}`,\r\n statements: allowDestructive ? dialect.dropColumnSql(actual, colName) : [],\r\n safe: false\r\n });\r\n const warning = dialect.warnDropColumn?.(actual, colName);\r\n if (warning) plan.warnings.push(warning);\r\n }\r\n }\r\n\r\n // Indexes (naive: based on name or derived name)\r\n const expectedIndexes = table.indexes ?? [];\r\n const actualIndexes = actual.indexes ?? [];\r\n const actualIndexMap = new Map(actualIndexes.map(idx => [idx.name, idx]));\r\n\r\n for (const idx of expectedIndexes) {\r\n const name = idx.name || deriveIndexName(table, idx);\r\n if (!actualIndexMap.has(name)) {\r\n plan.changes.push({\r\n kind: 'addIndex',\r\n table: key,\r\n description: `Create index ${name} on ${key}`,\r\n statements: [dialect.renderIndex(table, { ...idx, name })],\r\n safe: true\r\n });\r\n }\r\n }\r\n\r\n for (const idx of actualIndexes) {\r\n if (idx.name && !expectedIndexes.find(expected => (expected.name || deriveIndexName(table, expected)) === idx.name)) {\r\n plan.changes.push({\r\n kind: 'dropIndex',\r\n table: key,\r\n description: `Drop index ${idx.name} on ${key}`,\r\n statements: allowDestructive ? dialect.dropIndexSql(actual, idx.name) : [],\r\n safe: false\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Extra tables\r\n for (const actual of actualSchema.tables) {\r\n const key = tableKey(actual.name, actual.schema);\r\n if (!expectedTables.find(t => tableKey(t.name, t.schema) === key)) {\r\n plan.changes.push({\r\n kind: 'dropTable',\r\n table: key,\r\n description: `Drop table ${key}`,\r\n statements: allowDestructive ? dialect.dropTableSql(actual) : [],\r\n safe: false\r\n });\r\n }\r\n }\r\n\r\n return plan;\r\n};\r\n\r\nexport interface SynchronizeOptions extends SchemaDiffOptions {\r\n dryRun?: boolean;\r\n}\r\n\r\nexport const synchronizeSchema = async (\r\n expectedTables: TableDef[],\r\n actualSchema: DatabaseSchema,\r\n dialect: SchemaDialect,\r\n executor: DbExecutor,\r\n options: SynchronizeOptions = {}\r\n): Promise<SchemaPlan> => {\r\n const plan = diffSchema(expectedTables, actualSchema, dialect, options);\r\n if (!options.dryRun) {\r\n const { executeSchemaPlan } = await import('./schema-plan-executor.js');\r\n await executeSchemaPlan(plan, executor, options);\r\n }\r\n return plan;\r\n};\r\n","import { DbExecutor, QueryResult } from '../../execution/db-executor.js';\nimport { IntrospectOptions } from './types.js';\n\nexport const toRows = (result: QueryResult | undefined): Record<string, any>[] => {\n if (!result) return [];\n return result.values.map(row =>\n result.columns.reduce<Record<string, any>>((acc, col, idx) => {\n acc[col] = row[idx];\n return acc;\n }, {})\n );\n};\n\nexport const queryRows = async (\n executor: DbExecutor,\n sql: string,\n params: unknown[] = []\n): Promise<Record<string, any>[]> => {\n const [first] = await executor.executeSql(sql, params);\n return toRows(first);\n};\n\nexport const shouldIncludeTable = (name: string, options: IntrospectOptions): boolean => {\n if (options.includeTables && !options.includeTables.includes(name)) return false;\n if (options.excludeTables && options.excludeTables.includes(name)) return false;\n return true;\n};\n","import { defineTable } from '../../../../schema/table.js';\r\nimport { col } from '../../../../schema/column.js';\r\n\r\nexport const PgInformationSchemaColumns = defineTable(\r\n 'columns',\r\n {\r\n table_schema: col.varchar(255),\r\n table_name: col.varchar(255),\r\n column_name: col.varchar(255),\r\n data_type: col.varchar(255),\r\n is_nullable: col.varchar(3),\r\n column_default: col.varchar(1024),\r\n ordinal_position: col.int()\r\n },\r\n {},\r\n undefined,\r\n { schema: 'information_schema' }\r\n);\r\n\r\nexport const PgClass = defineTable(\r\n 'pg_class',\r\n {\r\n oid: col.int(),\r\n relname: col.varchar(255),\r\n relnamespace: col.int(),\r\n relkind: col.varchar(1)\r\n },\r\n {},\r\n undefined,\r\n { schema: 'pg_catalog' }\r\n);\r\n\r\nexport const PgNamespace = defineTable(\r\n 'pg_namespace',\r\n {\r\n oid: col.int(),\r\n nspname: col.varchar(255)\r\n },\r\n {},\r\n undefined,\r\n { schema: 'pg_catalog' }\r\n);\r\n\r\nexport const PgIndex = defineTable(\r\n 'pg_index',\r\n {\r\n indrelid: col.int(),\r\n indexrelid: col.int(),\r\n indisprimary: col.boolean(),\r\n indkey: col.varchar(255),\r\n indpred: col.varchar(1024)\r\n },\r\n {},\r\n undefined,\r\n { schema: 'pg_catalog' }\r\n);\r\n\r\nexport const PgAttribute = defineTable(\r\n 'pg_attribute',\r\n {\r\n attrelid: col.int(),\r\n attname: col.varchar(255),\r\n attnum: col.int()\r\n },\r\n {},\r\n undefined,\r\n { schema: 'pg_catalog' }\r\n);\r\n\r\nexport const PgTableConstraints = defineTable(\r\n 'table_constraints',\r\n {\r\n constraint_catalog: col.varchar(255),\r\n constraint_schema: col.varchar(255),\r\n constraint_name: col.varchar(255),\r\n table_catalog: col.varchar(255),\r\n table_schema: col.varchar(255),\r\n table_name: col.varchar(255),\r\n constraint_type: col.varchar(255)\r\n },\r\n {},\r\n undefined,\r\n { schema: 'information_schema' }\r\n);\r\n\r\nexport const PgKeyColumnUsage = defineTable(\r\n 'key_column_usage',\r\n {\r\n constraint_catalog: col.varchar(255),\r\n constraint_schema: col.varchar(255),\r\n constraint_name: col.varchar(255),\r\n table_catalog: col.varchar(255),\r\n table_schema: col.varchar(255),\r\n table_name: col.varchar(255),\r\n column_name: col.varchar(255),\r\n ordinal_position: col.int()\r\n },\r\n {},\r\n undefined,\r\n { schema: 'information_schema' }\r\n);\r\n\r\nexport const PgConstraintColumnUsage = defineTable(\r\n 'constraint_column_usage',\r\n {\r\n constraint_catalog: col.varchar(255),\r\n constraint_schema: col.varchar(255),\r\n constraint_name: col.varchar(255),\r\n table_catalog: col.varchar(255),\r\n table_schema: col.varchar(255),\r\n table_name: col.varchar(255),\r\n column_name: col.varchar(255)\r\n },\r\n {},\r\n undefined,\r\n { schema: 'information_schema' }\r\n);\r\n\r\nexport const PgReferentialConstraints = defineTable(\r\n 'referential_constraints',\r\n {\r\n constraint_catalog: col.varchar(255),\r\n constraint_schema: col.varchar(255),\r\n constraint_name: col.varchar(255),\r\n unique_constraint_catalog: col.varchar(255),\r\n unique_constraint_schema: col.varchar(255),\r\n unique_constraint_name: col.varchar(255),\r\n match_option: col.varchar(64),\r\n update_rule: col.varchar(64),\r\n delete_rule: col.varchar(64)\r\n },\r\n {},\r\n undefined,\r\n { schema: 'information_schema' }\r\n);\r\n\r\nexport default {\r\n PgInformationSchemaColumns,\r\n PgClass,\r\n PgNamespace,\r\n PgIndex,\r\n PgAttribute\r\n};\r\n","import type { SelectQueryBuilder } from '../../../query-builder/select.js';\r\nimport type { IntrospectContext } from './context.js';\r\n\r\nimport { toRows } from './utils.js';\r\n\r\nexport async function runSelect<T = Record<string, any>>(\r\n qb: SelectQueryBuilder<any, any>,\r\n ctx: IntrospectContext\r\n): Promise<T[]> {\r\n const ast = qb.getAST();\r\n const compiled = ctx.dialect.compileSelect(ast);\r\n const results = await ctx.executor.executeSql(compiled.sql, compiled.params);\r\n // executor returns QueryResult[]; take the first result set and map to rows\r\n const [first] = results;\r\n return toRows(first) as T[];\r\n}\r\n\r\nexport default runSelect;\r\n\r\nexport async function runSelectNode<T = Record<string, any>>(ast: any, ctx: IntrospectContext): Promise<T[]> {\r\n const compiled = ctx.dialect.compileSelect(ast);\r\n const results = await ctx.executor.executeSql(compiled.sql, compiled.params);\r\n const [first] = results;\r\n return toRows(first) as T[];\r\n}\r\n","import type { SchemaIntrospector, IntrospectOptions } from './types.js';\r\nimport { queryRows, shouldIncludeTable } from './utils.js';\r\nimport { DatabaseSchema, DatabaseTable, DatabaseIndex, DatabaseColumn } from '../schema-types.js';\r\nimport type { DbExecutor } from '../../execution/db-executor.js';\r\nimport type { IntrospectContext } from './context.js';\r\nimport { PgInformationSchemaColumns } from './catalogs/postgres.js';\r\nimport { PgKeyColumnUsage, PgTableConstraints, PgConstraintColumnUsage, PgReferentialConstraints, PgIndex, PgClass, PgNamespace, PgAttribute } from './catalogs/postgres.js';\r\nimport { SelectQueryBuilder } from '../../../query-builder/select.js';\r\nimport { eq, and } from '../../ast/expression-builders.js';\r\nimport type { SelectQueryNode, TableNode } from '../../ast/query.js';\r\nimport type { JoinNode } from '../../ast/join.js';\r\nimport type { ColumnNode, ExpressionNode } from '../../ast/expression-nodes.js';\r\nimport { fnTable } from '../../ast/builders.js';\r\nimport { runSelect, runSelectNode } from './run-select.js';\r\n\r\nexport const postgresIntrospector: SchemaIntrospector = {\r\n async introspect(ctx: IntrospectContext, options: IntrospectOptions): Promise<DatabaseSchema> {\r\n const schema = options.schema || 'public';\r\n const tables: DatabaseTable[] = [];\r\n\r\n // Columns query\r\n const qbColumns = new SelectQueryBuilder(PgInformationSchemaColumns as any)\r\n .select({\r\n table_schema: PgInformationSchemaColumns.columns.table_schema,\r\n table_name: PgInformationSchemaColumns.columns.table_name,\r\n column_name: PgInformationSchemaColumns.columns.column_name,\r\n data_type: PgInformationSchemaColumns.columns.data_type,\r\n is_nullable: PgInformationSchemaColumns.columns.is_nullable,\r\n column_default: PgInformationSchemaColumns.columns.column_default,\r\n ordinal_position: PgInformationSchemaColumns.columns.ordinal_position\r\n })\r\n .where(eq(PgInformationSchemaColumns.columns.table_schema, schema))\r\n .orderBy(PgInformationSchemaColumns.columns.table_name)\r\n .orderBy(PgInformationSchemaColumns.columns.ordinal_position);\r\n\r\n const columnRows = await runSelect(qbColumns, ctx);\r\n\r\n // Primary key columns query\r\n const qbPk = new SelectQueryBuilder(PgKeyColumnUsage as any)\r\n .select({\r\n table_schema: PgKeyColumnUsage.columns.table_schema,\r\n table_name: PgKeyColumnUsage.columns.table_name,\r\n column_name: PgKeyColumnUsage.columns.column_name,\r\n ordinal_position: PgKeyColumnUsage.columns.ordinal_position,\r\n constraint_name: PgKeyColumnUsage.columns.constraint_name\r\n })\r\n .innerJoin(PgTableConstraints as any, eq(PgTableConstraints.columns.constraint_name, PgKeyColumnUsage.columns.constraint_name))\r\n .where(eq(PgTableConstraints.columns.constraint_type, 'PRIMARY KEY'))\r\n .where(eq(PgKeyColumnUsage.columns.table_schema, schema))\r\n .orderBy(PgKeyColumnUsage.columns.table_name)\r\n .orderBy(PgKeyColumnUsage.columns.ordinal_position);\r\n\r\n const pkRows = await runSelect(qbPk, ctx);\r\n\r\n // Build primary key map (grouped by table, ordered by ordinal_position)\r\n const pkMap = new Map<string, string[]>();\r\n const pkGrouped = new Map<string, { pos: number; col: string }[]>();\r\n for (const r of pkRows) {\r\n const key = `${r.table_schema}.${r.table_name}`;\r\n const arr = pkGrouped.get(key) ?? [];\r\n arr.push({ pos: r.ordinal_position ?? 0, col: r.column_name });\r\n pkGrouped.set(key, arr);\r\n }\r\n for (const [k, vals] of pkGrouped.entries()) {\r\n vals.sort((a, b) => (a.pos || 0) - (b.pos || 0));\r\n pkMap.set(k, vals.map(v => v.col));\r\n }\r\n\r\n // Foreign key columns query\r\n const qbFk = new SelectQueryBuilder(PgKeyColumnUsage as any)\r\n .select({\r\n table_schema: PgKeyColumnUsage.columns.table_schema,\r\n table_name: PgKeyColumnUsage.columns.table_name,\r\n column_name: PgKeyColumnUsage.columns.column_name,\r\n constraint_name: PgKeyColumnUsage.columns.constraint_name,\r\n foreign_table_schema: PgConstraintColumnUsage.columns.table_schema,\r\n foreign_table_name: PgConstraintColumnUsage.columns.table_name,\r\n foreign_column_name: PgConstraintColumnUsage.columns.column_name\r\n })\r\n .innerJoin(PgTableConstraints as any, eq(PgTableConstraints.columns.constraint_name, PgKeyColumnUsage.columns.constraint_name))\r\n .innerJoin(PgConstraintColumnUsage as any, eq(PgConstraintColumnUsage.columns.constraint_name, PgTableConstraints.columns.constraint_name))\r\n .innerJoin(PgReferentialConstraints as any, eq(PgReferentialConstraints.columns.constraint_name, PgTableConstraints.columns.constraint_name))\r\n .where(eq(PgTableConstraints.columns.constraint_type, 'FOREIGN KEY'))\r\n .where(eq(PgKeyColumnUsage.columns.table_schema, schema));\r\n\r\n const fkRows = await runSelect(qbFk, ctx);\r\n\r\n // Build foreign key map\r\n const fkMap = new Map<string, any[]>();\r\n for (const r of fkRows) {\r\n const key = `${r.table_schema}.${r.table_name}.${r.column_name}`;\r\n const existing = fkMap.get(key) ?? [];\r\n existing.push({\r\n table: `${r.foreign_table_schema}.${r.foreign_table_name}`,\r\n column: r.foreign_column_name,\r\n onDelete: undefined,\r\n onUpdate: undefined\r\n });\r\n fkMap.set(key, existing);\r\n }\r\n\r\n // Index columns query using AST with FunctionTable for unnest\r\n const indexQuery: SelectQueryNode = {\r\n type: 'SelectQuery',\r\n from: { type: 'Table', name: 'pg_index', schema: 'pg_catalog', alias: 'i' } as TableNode,\r\n columns: [\r\n { type: 'Column', table: 'ns', name: 'nspname', alias: 'table_schema' } as ColumnNode,\r\n { type: 'Column', table: 'tbl', name: 'relname', alias: 'table_name' } as ColumnNode,\r\n { type: 'Column', table: 'idx', name: 'relname', alias: 'index_name' } as ColumnNode,\r\n { type: 'Column', table: 'i', name: 'indisunique', alias: 'is_unique' } as ColumnNode,\r\n { type: 'Column', table: 'i', name: 'indpred', alias: 'predicate' } as ColumnNode,\r\n { type: 'Column', table: 'att', name: 'attname', alias: 'attname' } as ColumnNode,\r\n { type: 'Column', table: 'arr', name: 'idx', alias: 'ord' } as ColumnNode\r\n ],\r\n joins: [\r\n // JOIN pg_class AS tbl ON tbl.oid = i.indrelid\r\n {\r\n type: 'Join',\r\n kind: 'INNER',\r\n table: { type: 'Table', name: 'pg_class', schema: 'pg_catalog', alias: 'tbl' } as TableNode,\r\n condition: eq({ table: 'tbl', name: 'oid' }, { table: 'i', name: 'indrelid' }) as ExpressionNode\r\n } as JoinNode,\r\n // JOIN pg_namespace AS ns ON ns.oid = tbl.relnamespace\r\n {\r\n type: 'Join',\r\n kind: 'INNER',\r\n table: { type: 'Table', name: 'pg_namespace', schema: 'pg_catalog', alias: 'ns' } as TableNode,\r\n condition: eq({ table: 'ns', name: 'oid' }, { table: 'tbl', name: 'relnamespace' }) as ExpressionNode\r\n } as JoinNode,\r\n // JOIN pg_class AS idx ON idx.oid = i.indexrelid\r\n {\r\n type: 'Join',\r\n kind: 'INNER',\r\n table: { type: 'Table', name: 'pg_class', schema: 'pg_catalog', alias: 'idx' } as TableNode,\r\n condition: eq({ table: 'idx', name: 'oid' }, { table: 'i', name: 'indexrelid' }) as ExpressionNode\r\n } as JoinNode,\r\n // LATERAL JOIN UNNEST(i.indkey) WITH ORDINALITY AS arr(attnum, idx)\r\n {\r\n type: 'Join',\r\n kind: 'INNER',\r\n table: fnTable('unnest', [{ type: 'Column', table: 'i', name: 'indkey' } as ColumnNode], 'arr', { \r\n lateral: true, \r\n withOrdinality: true, \r\n columnAliases: ['attnum', 'idx'] \r\n }),\r\n condition: { type: 'BinaryExpression', left: { type: 'Literal', value: 1 }, operator: '=', right: { type: 'Literal', value: 1 } } as unknown as ExpressionNode\r\n } as JoinNode,\r\n // LEFT JOIN pg_attribute AS att ON att.attrelid = tbl.oid AND att.attnum = arr.attnum\r\n {\r\n type: 'Join',\r\n kind: 'LEFT',\r\n table: { type: 'Table', name: 'pg_attribute', schema: 'pg_catalog', alias: 'att' } as TableNode,\r\n condition: and(\r\n eq({ table: 'att', name: 'attrelid' }, { table: 'tbl', name: 'oid' }),\r\n eq({ table: 'att', name: 'attnum' }, { table: 'arr', name: 'attnum' })\r\n ) as ExpressionNode\r\n } as JoinNode\r\n ],\r\n where: and(\r\n eq({ table: 'ns', name: 'nspname' }, schema) as ExpressionNode,\r\n eq({ table: 'i', name: 'indisprimary' }, { type: 'Literal', value: false } as any) as ExpressionNode\r\n ) as ExpressionNode\r\n };\r\n\r\n const indexQueryRows = await runSelectNode(indexQuery, ctx);\r\n \r\n // Aggregate index rows by table/index to build final index list\r\n const indexGrouped = new Map<string, { table_schema: string; table_name: string; index_name: string; is_unique: any; predicate: any; cols: { ord: number; att: string | null }[] }>();\r\n for (const r of indexQueryRows) {\r\n const key = `${r.table_schema}.${r.table_name}.${r.index_name}`;\r\n const entry = indexGrouped.get(key) ?? { \r\n table_schema: r.table_schema, \r\n table_name: r.table_name, \r\n index_name: r.index_name, \r\n is_unique: r.is_unique, \r\n predicate: r.predicate, \r\n cols: [] \r\n };\r\n entry.cols.push({ ord: r.ord ?? 0, att: r.attname ?? null });\r\n indexGrouped.set(key, entry);\r\n }\r\n\r\n const indexRows = Array.from(indexGrouped.values()).map(v => ({\r\n table_schema: v.table_schema,\r\n table_name: v.table_name,\r\n index_name: v.index_name,\r\n is_unique: v.is_unique,\r\n predicate: v.predicate,\r\n column_names: v.cols.sort((a, b) => (a.ord || 0) - (b.ord || 0)).map(c => c.att).filter(Boolean)\r\n }));\r\n\r\n // Build final schema\r\n const tablesByKey = new Map<string, DatabaseTable>();\r\n\r\n columnRows.forEach(r => {\r\n const key = `${r.table_schema}.${r.table_name}`;\r\n if (!shouldIncludeTable(r.table_name, options)) {\r\n return;\r\n }\r\n if (!tablesByKey.has(key)) {\r\n tablesByKey.set(key, {\r\n name: r.table_name,\r\n schema: r.table_schema,\r\n columns: [],\r\n primaryKey: pkMap.get(key) || [],\r\n indexes: []\r\n });\r\n }\r\n const cols = tablesByKey.get(key)!;\r\n const fk = fkMap.get(`${r.table_schema}.${r.table_name}.${r.column_name}`)?.[0];\r\n const column: DatabaseColumn = {\r\n name: r.column_name,\r\n type: r.data_type,\r\n notNull: r.is_nullable === 'NO',\r\n default: r.column_default ?? undefined,\r\n references: fk\r\n ? {\r\n table: fk.table,\r\n column: fk.column,\r\n onDelete: fk.onDelete,\r\n onUpdate: fk.onUpdate\r\n }\r\n : undefined\r\n };\r\n cols.columns.push(column);\r\n });\r\n\r\n indexRows.forEach(r => {\r\n const key = `${r.table_schema}.${r.table_name}`;\r\n const table = tablesByKey.get(key);\r\n if (!table) return;\r\n const idx: DatabaseIndex = {\r\n name: r.index_name,\r\n columns: (r.column_names || []).map((c: string) => ({ column: c })),\r\n unique: !!r.is_unique,\r\n where: r.predicate || undefined\r\n };\r\n table.indexes = table.indexes || [];\r\n table.indexes.push(idx);\r\n });\r\n\r\n tables.push(...tablesByKey.values());\r\n return { tables };\r\n }\r\n};\r\n","import { SchemaIntrospector, IntrospectOptions } from './types.js';\r\nimport { queryRows, shouldIncludeTable } from './utils.js';\r\nimport { DatabaseSchema, DatabaseTable, DatabaseIndex, DatabaseColumn } from '../schema-types.js';\r\nimport { DbExecutor } from '../../execution/db-executor.js';\r\n\r\nexport const mysqlIntrospector: SchemaIntrospector = {\r\n async introspect(ctx: { executor: DbExecutor }, options: IntrospectOptions): Promise<DatabaseSchema> {\r\n const schema = options.schema;\r\n const filterClause = schema ? 'table_schema = ?' : 'table_schema = database()';\r\n const params = schema ? [schema] : [];\r\n\r\n const columnRows = await queryRows(\r\n ctx.executor,\r\n `\r\n SELECT table_schema, table_name, column_name, data_type, is_nullable, column_default, extra\r\n FROM information_schema.columns\r\n WHERE ${filterClause}\r\n ORDER BY table_name, ordinal_position\r\n `,\r\n params\r\n );\r\n\r\n const pkRows = await queryRows(\r\n ctx.executor,\r\n `\r\n SELECT table_schema, table_name, column_name\r\n FROM information_schema.key_column_usage\r\n WHERE constraint_name = 'PRIMARY' AND ${filterClause}\r\n ORDER BY ordinal_position\r\n `,\r\n params\r\n );\r\n\r\n const pkMap = new Map<string, string[]>();\r\n pkRows.forEach(r => {\r\n const key = `${r.table_schema}.${r.table_name}`;\r\n const list = pkMap.get(key) || [];\r\n list.push(r.column_name);\r\n pkMap.set(key, list);\r\n });\r\n\r\n const indexRows = await queryRows(\r\n ctx.executor,\r\n `\r\n SELECT\r\n table_schema,\r\n table_name,\r\n index_name,\r\n non_unique,\r\n GROUP_CONCAT(column_name ORDER BY seq_in_index) AS cols\r\n FROM information_schema.statistics\r\n WHERE ${filterClause} AND index_name <> 'PRIMARY'\r\n GROUP BY table_schema, table_name, index_name, non_unique\r\n `,\r\n params\r\n );\r\n\r\n const tablesByKey = new Map<string, DatabaseTable>();\r\n\r\n columnRows.forEach(r => {\r\n const key = `${r.table_schema}.${r.table_name}`;\r\n if (!shouldIncludeTable(r.table_name, options)) return;\r\n if (!tablesByKey.has(key)) {\r\n tablesByKey.set(key, {\r\n name: r.table_name,\r\n schema: r.table_schema,\r\n columns: [],\r\n primaryKey: pkMap.get(key) || [],\r\n indexes: []\r\n });\r\n }\r\n const cols = tablesByKey.get(key)!;\r\n const column: DatabaseColumn = {\r\n name: r.column_name,\r\n type: r.data_type,\r\n notNull: r.is_nullable === 'NO',\r\n default: r.column_default ?? undefined,\r\n autoIncrement: typeof r.extra === 'string' && r.extra.includes('auto_increment')\r\n };\r\n cols.columns.push(column);\r\n });\r\n\r\n indexRows.forEach(r => {\r\n const key = `${r.table_schema}.${r.table_name}`;\r\n const table = tablesByKey.get(key);\r\n if (!table) return;\r\n const cols = (typeof r.cols === 'string' ? r.cols.split(',') : []).map((c: string) => ({ column: c.trim() }));\r\n const idx: DatabaseIndex = {\r\n name: r.index_name,\r\n columns: cols,\r\n unique: r.non_unique === 0\r\n };\r\n table.indexes = table.indexes || [];\r\n table.indexes.push(idx);\r\n });\r\n\r\n return { tables: Array.from(tablesByKey.values()) };\r\n }\r\n};\r\n","import { SchemaIntrospector, IntrospectOptions } from './types.js';\nimport { queryRows, shouldIncludeTable } from './utils.js';\nimport { DatabaseSchema, DatabaseTable, DatabaseIndex } from '../schema-types.js';\nimport { DbExecutor } from '../../execution/db-executor.js';\n\nconst escapeSingleQuotes = (name: string) => name.replace(/'/g, \"''\");\n\nexport const sqliteIntrospector: SchemaIntrospector = {\n async introspect(ctx: { executor: DbExecutor }, options: IntrospectOptions): Promise<DatabaseSchema> {\n const tables: DatabaseTable[] = [];\n const tableRows = await queryRows(\n ctx.executor,\n `SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%';`\n );\n\n for (const row of tableRows) {\n const name = row.name as string;\n if (!shouldIncludeTable(name, options)) continue;\n const table: DatabaseTable = { name, columns: [], primaryKey: [], indexes: [] };\n\n const cols = await queryRows(ctx.executor, `PRAGMA table_info('${escapeSingleQuotes(name)}');`);\n cols.forEach(c => {\n table.columns.push({\n name: c.name,\n type: c.type,\n notNull: c.notnull === 1,\n default: c.dflt_value ?? undefined,\n autoIncrement: false\n });\n if (c.pk && c.pk > 0) {\n table.primaryKey = table.primaryKey || [];\n table.primaryKey.push(c.name);\n }\n });\n\n const fkRows = await queryRows(ctx.executor, `PRAGMA foreign_key_list('${escapeSingleQuotes(name)}');`);\n fkRows.forEach(fk => {\n const col = table.columns.find(c => c.name === fk.from);\n if (col) {\n col.references = {\n table: fk.table,\n column: fk.to,\n onDelete: fk.on_delete?.toUpperCase(),\n onUpdate: fk.on_update?.toUpperCase()\n };\n }\n });\n\n const idxList = await queryRows(ctx.executor, `PRAGMA index_list('${escapeSingleQuotes(name)}');`);\n for (const idx of idxList) {\n const idxName = idx.name as string;\n const columnsInfo = await queryRows(ctx.executor, `PRAGMA index_info('${escapeSingleQuotes(idxName)}');`);\n const idxEntry: DatabaseIndex = {\n name: idxName,\n columns: columnsInfo.map(ci => ({ column: ci.name as string })),\n unique: idx.unique === 1\n };\n table.indexes!.push(idxEntry);\n }\n\n tables.push(table);\n }\n\n return { tables };\n }\n};\n","import { SchemaIntrospector, IntrospectOptions } from './types.js';\r\nimport { queryRows, shouldIncludeTable } from './utils.js';\r\nimport { DatabaseSchema, DatabaseTable, DatabaseIndex, DatabaseColumn } from '../schema-types.js';\r\nimport { DbExecutor } from '../../execution/db-executor.js';\r\n\r\nexport const mssqlIntrospector: SchemaIntrospector = {\r\n async introspect(ctx: { executor: DbExecutor }, options: IntrospectOptions): Promise<DatabaseSchema> {\r\n const schema = options.schema;\r\n const filterSchema = schema ? 'sch.name = @p1' : '1=1';\r\n const params = schema ? [schema] : [];\r\n\r\n const columnRows = await queryRows(\r\n ctx.executor,\r\n `\r\n SELECT\r\n sch.name AS table_schema,\r\n t.name AS table_name,\r\n c.name AS column_name,\r\n ty.name AS data_type,\r\n c.is_nullable,\r\n c.is_identity,\r\n object_definition(c.default_object_id) AS column_default\r\n FROM sys.columns c\r\n JOIN sys.tables t ON t.object_id = c.object_id\r\n JOIN sys.schemas sch ON sch.schema_id = t.schema_id\r\n JOIN sys.types ty ON ty.user_type_id = c.user_type_id\r\n WHERE t.is_ms_shipped = 0 AND ${filterSchema}\r\n `,\r\n params\r\n );\r\n\r\n const pkRows = await queryRows(\r\n ctx.executor,\r\n `\r\n SELECT\r\n sch.name AS table_schema,\r\n t.name AS table_name,\r\n c.name AS column_name,\r\n ic.key_ordinal\r\n FROM sys.indexes i\r\n JOIN sys.index_columns ic ON ic.object_id = i.object_id AND ic.index_id = i.index_id\r\n JOIN sys.columns c ON c.object_id = ic.object_id AND c.column_id = ic.column_id\r\n JOIN sys.tables t ON t.object_id = i.object_id\r\n JOIN sys.schemas sch ON sch.schema_id = t.schema_id\r\n WHERE i.is_primary_key = 1 AND ${filterSchema}\r\n ORDER BY ic.key_ordinal\r\n `,\r\n params\r\n );\r\n\r\n const pkMap = new Map<string, string[]>();\r\n pkRows.forEach(r => {\r\n const key = `${r.table_schema}.${r.table_name}`;\r\n const list = pkMap.get(key) || [];\r\n list.push(r.column_name);\r\n pkMap.set(key, list);\r\n });\r\n\r\n const indexRows = await queryRows(\r\n ctx.executor,\r\n `\r\n SELECT\r\n sch.name AS table_schema,\r\n t.name AS table_name,\r\n i.name AS index_name,\r\n i.is_unique,\r\n i.has_filter,\r\n i.filter_definition\r\n FROM sys.indexes i\r\n JOIN sys.tables t ON t.object_id = i.object_id\r\n JOIN sys.schemas sch ON sch.schema_id = t.schema_id\r\n WHERE i.is_primary_key = 0 AND i.is_hypothetical = 0 AND ${filterSchema}\r\n `,\r\n params\r\n );\r\n\r\n const indexColsRows = await queryRows(\r\n ctx.executor,\r\n `\r\n SELECT\r\n sch.name AS table_schema,\r\n t.name AS table_name,\r\n i.name AS index_name,\r\n c.name AS column_name,\r\n ic.key_ordinal\r\n FROM sys.index_columns ic\r\n JOIN sys.indexes i ON i.object_id = ic.object_id AND i.index_id = ic.index_id\r\n JOIN sys.columns c ON c.object_id = ic.object_id AND c.column_id = ic.column_id\r\n JOIN sys.tables t ON t.object_id = i.object_id\r\n JOIN sys.schemas sch ON sch.schema_id = t.schema_id\r\n WHERE i.is_primary_key = 0 AND ${filterSchema}\r\n ORDER BY ic.key_ordinal\r\n `,\r\n params\r\n );\r\n\r\n const indexColumnsMap = new Map<string, { column: string; order: number }[]>();\r\n indexColsRows.forEach(r => {\r\n const key = `${r.table_schema}.${r.table_name}.${r.index_name}`;\r\n const list = indexColumnsMap.get(key) || [];\r\n list.push({ column: r.column_name, order: r.key_ordinal });\r\n indexColumnsMap.set(key, list);\r\n });\r\n\r\n const tablesByKey = new Map<string, DatabaseTable>();\r\n\r\n columnRows.forEach(r => {\r\n if (!shouldIncludeTable(r.table_name, options)) return;\r\n const key = `${r.table_schema}.${r.table_name}`;\r\n if (!tablesByKey.has(key)) {\r\n tablesByKey.set(key, {\r\n name: r.table_name,\r\n schema: r.table_schema,\r\n columns: [],\r\n primaryKey: pkMap.get(key) || [],\r\n indexes: []\r\n });\r\n }\r\n const t = tablesByKey.get(key)!;\r\n const column: DatabaseColumn = {\r\n name: r.column_name,\r\n type: r.data_type,\r\n notNull: r.is_nullable === false || r.is_nullable === 0,\r\n default: r.column_default ?? undefined,\r\n autoIncrement: !!r.is_identity\r\n };\r\n t.columns.push(column);\r\n });\r\n\r\n indexRows.forEach(r => {\r\n const key = `${r.table_schema}.${r.table_name}`;\r\n const table = tablesByKey.get(key);\r\n if (!table) return;\r\n const cols = (indexColumnsMap.get(`${r.table_schema}.${r.table_name}.${r.index_name}`) || [])\r\n .sort((a, b) => a.order - b.order)\r\n .map(c => ({ column: c.column }));\r\n const idx: DatabaseIndex = {\r\n name: r.index_name,\r\n columns: cols,\r\n unique: !!r.is_unique,\r\n where: r.has_filter ? r.filter_definition : undefined\r\n };\r\n table.indexes = table.indexes || [];\r\n table.indexes.push(idx);\r\n });\r\n\r\n return { tables: Array.from(tablesByKey.values()) };\r\n }\r\n};\r\n","import type { DialectName } from '../schema-generator.js';\r\nimport type { SchemaIntrospector } from './types.js';\r\nimport { postgresIntrospector } from './postgres.js';\r\nimport { mysqlIntrospector } from './mysql.js';\r\nimport { sqliteIntrospector } from './sqlite.js';\r\nimport { mssqlIntrospector } from './mssql.js';\r\n\r\nconst registry = new Map<DialectName, SchemaIntrospector>();\r\n\r\nconst registerBuiltInIntrospectors = () => {\r\n registry.set('postgres', postgresIntrospector);\r\n registry.set('mysql', mysqlIntrospector);\r\n registry.set('sqlite', sqliteIntrospector);\r\n registry.set('mssql', mssqlIntrospector);\r\n};\r\n\r\nregisterBuiltInIntrospectors();\r\n\r\nexport const registerSchemaIntrospector = (dialect: DialectName, introspector: SchemaIntrospector): void => {\r\n registry.set(dialect, introspector);\r\n};\r\n\r\nexport const getSchemaIntrospector = (dialect: DialectName): SchemaIntrospector | undefined => {\r\n return registry.get(dialect);\r\n};\r\n\r\n","import type { DialectName } from './schema-generator.js';\r\nimport { DatabaseSchema } from './schema-types.js';\r\nimport { DbExecutor } from '../execution/db-executor.js';\r\nimport type { IntrospectOptions, SchemaIntrospector, IntrospectContext } from './introspect/types.js';\r\nimport { getSchemaIntrospector } from './introspect/registry.js';\r\nimport { DialectFactory } from '../dialect/dialect-factory.js';\r\n\r\n/**\r\n * Introspects an existing database schema using the dialect-specific strategy.\r\n */\r\nexport const introspectSchema = async (\r\n executor: DbExecutor,\r\n dialect: DialectName,\r\n options: IntrospectOptions = {}\r\n): Promise<DatabaseSchema> => {\r\n const handler = getSchemaIntrospector(dialect);\r\n if (!handler) {\r\n throw new Error(`Unsupported dialect for introspection: ${dialect}`);\r\n }\r\n const dialectInstance = DialectFactory.create(dialect);\r\n const ctx: IntrospectContext = { executor, dialect: dialectInstance };\r\n return handler.introspect(ctx, options);\r\n};\r\n\r\nexport type { IntrospectOptions, SchemaIntrospector };\r\n","// Pure AST Builders - No Dialect Logic Here!\r\n\r\nimport { ColumnDef } from '../../schema/column.js';\r\nimport { columnOperand, valueToOperand } from '../ast/expression-builders.js';\r\nimport { FunctionNode, OperandNode, isOperandNode } from '../ast/expression.js';\r\n\r\ntype OperandInput = OperandNode | ColumnDef | string | number | boolean | null;\r\n\r\nconst isColumnDef = (val: any): val is ColumnDef => !!val && typeof val === 'object' && 'type' in val && 'name' in val;\r\n\r\nconst toOperand = (input: OperandInput): OperandNode => {\r\n if (isOperandNode(input)) return input;\r\n if (isColumnDef(input)) return columnOperand(input);\r\n\r\n return valueToOperand(input);\r\n};\r\n\r\nconst fn = (key: string, args: OperandInput[]): FunctionNode => ({\r\n type: 'Function',\r\n name: key,\r\n fn: key,\r\n args: args.map(toOperand)\r\n});\r\n\r\n/**\r\n * Helper: LOWER(str)\r\n */\r\nexport const lower = (value: OperandInput): FunctionNode => fn('LOWER', [value]);\r\n\r\n/**\r\n * Helper: UPPER(str)\r\n */\r\nexport const upper = (value: OperandInput): FunctionNode => fn('UPPER', [value]);\r\n\r\n/**\r\n * Helper: ASCII(str)\r\n */\r\nexport const ascii = (value: OperandInput): FunctionNode => fn('ASCII', [value]);\r\n\r\n/**\r\n * Helper: CHAR(code[, code...])\r\n */\r\nexport const char = (...codes: OperandInput[]): FunctionNode => {\r\n if (codes.length === 0) throw new Error('char() expects at least 1 argument');\r\n return fn('CHAR', codes);\r\n};\r\n\r\n/**\r\n * Helper: CHAR_LENGTH(str)\r\n */\r\nexport const charLength = (value: OperandInput): FunctionNode => fn('CHAR_LENGTH', [value]);\r\n\r\n/**\r\n * Helper: LENGTH(str)\r\n */\r\nexport const length = (value: OperandInput): FunctionNode => fn('LENGTH', [value]);\r\n\r\n/**\r\n * Helper: TRIM([chars FROM] str)\r\n */\r\nexport const trim = (value: OperandInput, chars?: OperandInput): FunctionNode =>\r\n chars === undefined ? fn('TRIM', [value]) : fn('TRIM', [value, chars]);\r\n\r\n/**\r\n * Helper: LTRIM(str)\r\n */\r\nexport const ltrim = (value: OperandInput): FunctionNode => fn('LTRIM', [value]);\r\n\r\n/**\r\n * Helper: RTRIM(str)\r\n */\r\nexport const rtrim = (value: OperandInput): FunctionNode => fn('RTRIM', [value]);\r\n\r\n/**\r\n * Helper: CONCAT(arg1, arg2, ...)\r\n */\r\nexport const concat = (...args: OperandInput[]): FunctionNode => {\r\n if (args.length < 2) throw new Error('concat() expects at least 2 arguments');\r\n return fn('CONCAT', args);\r\n};\r\n\r\n/**\r\n * Helper: CONCAT_WS(separator, arg1, arg2, ...)\r\n */\r\nexport const concatWs = (separator: OperandInput, ...args: OperandInput[]): FunctionNode => {\r\n if (args.length < 1) throw new Error('concatWs() expects at least 2 arguments including the separator');\r\n return fn('CONCAT_WS', [separator, ...args]);\r\n};\r\n\r\n/**\r\n * Helper: SUBSTR(str, start[, length])\r\n */\r\nexport const substr = (value: OperandInput, start: OperandInput, length?: OperandInput): FunctionNode =>\r\n length === undefined ? fn('SUBSTR', [value, start]) : fn('SUBSTR', [value, start, length]);\r\n\r\n/**\r\n * Helper: LEFT(str, length)\r\n */\r\nexport const left = (value: OperandInput, len: OperandInput): FunctionNode => fn('LEFT', [value, len]);\r\n\r\n/**\r\n * Helper: RIGHT(str, length)\r\n */\r\nexport const right = (value: OperandInput, len: OperandInput): FunctionNode => fn('RIGHT', [value, len]);\r\n\r\n/**\r\n * Helper: POSITION(substring IN string)\r\n */\r\nexport const position = (substring: OperandInput, value: OperandInput): FunctionNode => fn('POSITION', [substring, value]);\r\n\r\n/**\r\n * Helper: INSTR(string, substring)\r\n */\r\nexport const instr = (value: OperandInput, substring: OperandInput): FunctionNode => fn('INSTR', [value, substring]);\r\n\r\n/**\r\n * Helper: LOCATE(substring, string[, start])\r\n */\r\nexport const locate = (substring: OperandInput, value: OperandInput, start?: OperandInput): FunctionNode =>\r\n start === undefined ? fn('LOCATE', [substring, value]) : fn('LOCATE', [substring, value, start]);\r\n\r\n/**\r\n * Helper: REPLACE(string, search, replace)\r\n */\r\nexport const replace = (value: OperandInput, search: OperandInput, replacement: OperandInput): FunctionNode =>\r\n fn('REPLACE', [value, search, replacement]);\r\n\r\n/**\r\n * Helper: REPEAT(string, count)\r\n */\r\nexport const repeat = (value: OperandInput, count: OperandInput): FunctionNode => fn('REPEAT', [value, count]);\r\n\r\n/**\r\n * Helper: LPAD(string, length, padstr)\r\n */\r\nexport const lpad = (value: OperandInput, len: OperandInput, pad: OperandInput): FunctionNode =>\r\n fn('LPAD', [value, len, pad]);\r\n\r\n/**\r\n * Helper: RPAD(string, length, padstr)\r\n */\r\nexport const rpad = (value: OperandInput, len: OperandInput, pad: OperandInput): FunctionNode =>\r\n fn('RPAD', [value, len, pad]);\r\n\r\n/**\r\n * Helper: SPACE(count)\r\n */\r\nexport const space = (count: OperandInput): FunctionNode => fn('SPACE', [count]);\r\n","// Pure AST Builders - No Dialect Logic Here!\r\n\r\nimport { ColumnDef } from '../../schema/column.js';\r\nimport { columnOperand, valueToOperand } from '../ast/expression-builders.js';\r\nimport { FunctionNode, OperandNode, isOperandNode } from '../ast/expression.js';\r\n\r\ntype OperandInput = OperandNode | ColumnDef | string | number | boolean | null;\r\n\r\nconst isColumnDef = (val: any): val is ColumnDef => !!val && typeof val === 'object' && 'type' in val && 'name' in val;\r\n\r\nconst toOperand = (input: OperandInput): OperandNode => {\r\n if (isOperandNode(input)) return input;\r\n if (isColumnDef(input)) return columnOperand(input);\r\n\r\n return valueToOperand(input);\r\n};\r\n\r\nconst fn = (key: string, args: OperandInput[]): FunctionNode => ({\r\n type: 'Function',\r\n name: key,\r\n fn: key,\r\n args: args.map(toOperand)\r\n});\r\n\r\n// ----------------------\r\n// Helper Functions\r\n// ----------------------\r\n\r\n/**\r\n * Helper: ABS(x) - Returns the absolute value of a number\r\n */\r\nexport const abs = (value: OperandInput): FunctionNode => fn('ABS', [value]);\r\n\r\n/**\r\n * Helper: ACOS(x) - Returns the arccosine (inverse cosine)\r\n */\r\nexport const acos = (value: OperandInput): FunctionNode => fn('ACOS', [value]);\r\n\r\n/**\r\n * Helper: ASIN(x) - Returns the arcsine (inverse sine)\r\n */\r\nexport const asin = (value: OperandInput): FunctionNode => fn('ASIN', [value]);\r\n\r\n/**\r\n * Helper: ATAN(x) - Returns the arctangent (inverse tangent)\r\n */\r\nexport const atan = (value: OperandInput): FunctionNode => fn('ATAN', [value]);\r\n\r\n/**\r\n * Helper: ATAN2(y, x) - Returns the arctangent of the two arguments\r\n */\r\nexport const atan2 = (y: OperandInput, x: OperandInput): FunctionNode => fn('ATAN2', [y, x]);\r\n\r\n/**\r\n * Helper: CEIL(x) / CEILING(x) - Returns the smallest integer >= x\r\n */\r\nexport const ceil = (value: OperandInput): FunctionNode => fn('CEIL', [value]);\r\n\r\n/**\r\n * Helper: CEILING(x) - Alias for CEIL\r\n */\r\nexport const ceiling = (value: OperandInput): FunctionNode => fn('CEILING', [value]);\r\n\r\n/**\r\n * Helper: COS(x) - Returns the cosine of a number (in radians)\r\n */\r\nexport const cos = (value: OperandInput): FunctionNode => fn('COS', [value]);\r\n\r\n/**\r\n * Helper: COT(x) - Returns the cotangent of a number\r\n */\r\nexport const cot = (value: OperandInput): FunctionNode => fn('COT', [value]);\r\n\r\n/**\r\n * Helper: DEGREES(x) - Converts radians to degrees\r\n */\r\nexport const degrees = (value: OperandInput): FunctionNode => fn('DEGREES', [value]);\r\n\r\n/**\r\n * Helper: EXP(x) - Returns e raised to the power of the argument\r\n */\r\nexport const exp = (value: OperandInput): FunctionNode => fn('EXP', [value]);\r\n\r\n/**\r\n * Helper: FLOOR(x) - Returns the largest integer <= x\r\n */\r\nexport const floor = (value: OperandInput): FunctionNode => fn('FLOOR', [value]);\r\n\r\n/**\r\n * Helper: LN(x) - Returns the natural logarithm (base e)\r\n */\r\nexport const ln = (value: OperandInput): FunctionNode => fn('LN', [value]);\r\n\r\n/**\r\n * Helper: LOG(x) - Returns the base-10 logarithm\r\n */\r\nexport const log = (value: OperandInput): FunctionNode => fn('LOG', [value]);\r\n\r\n/**\r\n * Helper: LOG10(x) - Returns the base-10 logarithm\r\n */\r\nexport const log10 = (value: OperandInput): FunctionNode => fn('LOG10', [value]);\r\n\r\n/**\r\n * Helper: LOG(base, x) - Returns the logarithm of x for a specific base\r\n */\r\nexport const logBase = (base: OperandInput, value: OperandInput): FunctionNode => fn('LOG_BASE', [base, value]);\r\n\r\n/**\r\n * Helper: MOD(x, y) - Returns the remainder of x/y\r\n */\r\nexport const mod = (x: OperandInput, y: OperandInput): FunctionNode => fn('MOD', [x, y]);\r\n\r\n/**\r\n * Helper: PI() - Returns the value of PI (approx. 3.14159...)\r\n */\r\nexport const pi = (): FunctionNode => fn('PI', []);\r\n\r\n/**\r\n * Helper: POWER(x, y) - Returns x raised to the power of y\r\n */\r\nexport const power = (x: OperandInput, y: OperandInput): FunctionNode => fn('POWER', [x, y]);\r\n\r\n/**\r\n * Helper: POW(x, y) - Alias for POWER\r\n */\r\nexport const pow = (x: OperandInput, y: OperandInput): FunctionNode => fn('POW', [x, y]);\r\n\r\n/**\r\n * Helper: RADIANS(x) - Converts degrees to radians\r\n */\r\nexport const radians = (value: OperandInput): FunctionNode => fn('RADIANS', [value]);\r\n\r\n/**\r\n * Helper: RAND() / RANDOM() - Returns a random number\r\n */\r\nexport const random = (): FunctionNode => fn('RANDOM', []);\r\n\r\n/**\r\n * Helper: RAND() - Alias for RANDOM (returns float 0-1)\r\n */\r\nexport const rand = (): FunctionNode => fn('RAND', []);\r\n\r\n/**\r\n * Helper: ROUND(x[, decimals]) - Rounds a number to specified decimal places\r\n */\r\nexport const round = (value: OperandInput, decimals?: OperandInput): FunctionNode =>\r\n decimals === undefined ? fn('ROUND', [value]) : fn('ROUND', [value, decimals]);\r\n\r\n/**\r\n * Helper: SIGN(x) - Returns the sign of a number (-1, 0, 1)\r\n */\r\nexport const sign = (value: OperandInput): FunctionNode => fn('SIGN', [value]);\r\n\r\n/**\r\n * Helper: SIN(x) - Returns the sine of a number (in radians)\r\n */\r\nexport const sin = (value: OperandInput): FunctionNode => fn('SIN', [value]);\r\n\r\n/**\r\n * Helper: SQRT(x) - Returns the square root of a number\r\n */\r\nexport const sqrt = (value: OperandInput): FunctionNode => fn('SQRT', [value]);\r\n\r\n/**\r\n * Helper: TAN(x) - Returns the tangent of a number (in radians)\r\n */\r\nexport const tan = (value: OperandInput): FunctionNode => fn('TAN', [value]);\r\n\r\n/**\r\n * Helper: TRUNC(x[, decimals]) / TRUNCATE(x, decimals) - Truncates a number without rounding\r\n */\r\nexport const trunc = (value: OperandInput, decimals?: OperandInput): FunctionNode =>\r\n decimals === undefined ? fn('TRUNC', [value]) : fn('TRUNC', [value, decimals]);\r\n\r\n/**\r\n * Helper: TRUNCATE(x, decimals) - Alias for TRUNC\r\n */\r\nexport const truncate = (value: OperandInput, decimals: OperandInput): FunctionNode =>\r\n fn('TRUNCATE', [value, decimals]);\r\n","// Pure AST Builders - No Dialect Logic Here!\r\n\r\nimport { ColumnDef } from '../../schema/column.js';\r\nimport { columnOperand, valueToOperand } from '../ast/expression-builders.js';\r\nimport { FunctionNode, OperandNode, isOperandNode } from '../ast/expression.js';\r\n\r\ntype OperandInput = OperandNode | ColumnDef | string | number | boolean | null;\r\n\r\nconst isColumnDef = (val: any): val is ColumnDef => !!val && typeof val === 'object' && 'type' in val && 'name' in val;\r\n\r\nconst toOperand = (input: OperandInput): OperandNode => {\r\n if (isOperandNode(input)) return input;\r\n if (isColumnDef(input)) return columnOperand(input);\r\n\r\n return valueToOperand(input);\r\n};\r\n\r\nconst fn = (key: string, args: OperandInput[]): FunctionNode => ({\r\n type: 'Function',\r\n name: key,\r\n args: args.map(toOperand)\r\n});\r\n\r\n// ----------------------\r\n// Helper Functions\r\n// ----------------------\r\n\r\n/**\r\n * Helper: NOW() - Returns the current local date and time\r\n */\r\nexport const now = (): FunctionNode => fn('NOW', []);\r\n\r\n/**\r\n * Helper: CURRENT_DATE - Returns only the current date (no time)\r\n */\r\nexport const currentDate = (): FunctionNode => fn('CURRENT_DATE', []);\r\n\r\n/**\r\n * Helper: CURRENT_TIME - Returns only the current time\r\n */\r\nexport const currentTime = (): FunctionNode => fn('CURRENT_TIME', []);\r\n\r\n/**\r\n * Helper: UTC_NOW() - Returns current UTC/GMT date and time\r\n */\r\nexport const utcNow = (): FunctionNode => fn('UTC_NOW', []);\r\n\r\n/**\r\n * Helper: EXTRACT(part FROM date) - Extracts a part (year, month, day, hour, etc.) from a date\r\n * @param part - The date part to extract (e.g., 'YEAR', 'MONTH', 'DAY', 'HOUR', 'MINUTE', 'SECOND')\r\n * @param date - The date/datetime value\r\n */\r\nexport const extract = (part: OperandInput, date: OperandInput): FunctionNode => fn('EXTRACT', [part, date]);\r\n\r\n/**\r\n * Helper: YEAR(date) - Extracts the year from a date\r\n */\r\nexport const year = (date: OperandInput): FunctionNode => fn('YEAR', [date]);\r\n\r\n/**\r\n * Helper: MONTH(date) - Extracts the month from a date\r\n */\r\nexport const month = (date: OperandInput): FunctionNode => fn('MONTH', [date]);\r\n\r\n/**\r\n * Helper: DAY(date) - Extracts the day from a date\r\n */\r\nexport const day = (date: OperandInput): FunctionNode => fn('DAY', [date]);\r\n\r\n/**\r\n * Helper: DATE_ADD(date, interval, unit) - Adds a specific time interval to a date\r\n * @param date - The date/datetime value\r\n * @param interval - The number of units to add\r\n * @param unit - The unit type (e.g., 'DAY', 'MONTH', 'YEAR', 'HOUR', 'MINUTE', 'SECOND')\r\n */\r\nexport const dateAdd = (date: OperandInput, interval: OperandInput, unit: OperandInput): FunctionNode =>\r\n fn('DATE_ADD', [date, interval, unit]);\r\n\r\n/**\r\n * Helper: DATE_SUB(date, interval, unit) - Subtracts a specific time interval from a date\r\n * @param date - The date/datetime value\r\n * @param interval - The number of units to subtract\r\n * @param unit - The unit type (e.g., 'DAY', 'MONTH', 'YEAR', 'HOUR', 'MINUTE', 'SECOND')\r\n */\r\nexport const dateSub = (date: OperandInput, interval: OperandInput, unit: OperandInput): FunctionNode =>\r\n fn('DATE_SUB', [date, interval, unit]);\r\n\r\n/**\r\n * Helper: DATE_DIFF(date1, date2) - Returns the difference between two dates in days\r\n * @param date1 - The end date\r\n * @param date2 - The start date\r\n */\r\nexport const dateDiff = (date1: OperandInput, date2: OperandInput): FunctionNode => fn('DATE_DIFF', [date1, date2]);\r\n\r\n/**\r\n * Helper: DATE_FORMAT(date, format) - Converts a date to a formatted string\r\n * @param date - The date/datetime value\r\n * @param format - The format string (dialect-specific)\r\n */\r\nexport const dateFormat = (date: OperandInput, format: OperandInput): FunctionNode => fn('DATE_FORMAT', [date, format]);\r\n\r\n/**\r\n * Helper: UNIX_TIMESTAMP() - Returns the current Unix epoch (seconds since 1970)\r\n */\r\nexport const unixTimestamp = (): FunctionNode => fn('UNIX_TIMESTAMP', []);\r\n\r\n/**\r\n * Helper: FROM_UNIXTIME(timestamp) - Converts Unix epoch seconds to a date\r\n * @param timestamp - Unix timestamp in seconds\r\n */\r\nexport const fromUnixTime = (timestamp: OperandInput): FunctionNode => fn('FROM_UNIXTIME', [timestamp]);\r\n\r\n/**\r\n * Helper: END_OF_MONTH(date) - Returns the last day of the month for a given date\r\n */\r\nexport const endOfMonth = (date: OperandInput): FunctionNode => fn('END_OF_MONTH', [date]);\r\n\r\n/**\r\n * Helper: DAY_OF_WEEK(date) - Returns the index of the weekday\r\n */\r\nexport const dayOfWeek = (date: OperandInput): FunctionNode => fn('DAY_OF_WEEK', [date]);\r\n\r\n/**\r\n * Helper: WEEK_OF_YEAR(date) - Returns the week number of the year\r\n */\r\nexport const weekOfYear = (date: OperandInput): FunctionNode => fn('WEEK_OF_YEAR', [date]);\r\n\r\n/**\r\n * Helper: DATE_TRUNC(part, date) - Resets date precision (e.g., first day of the month/year)\r\n * @param part - The truncation precision (e.g., 'YEAR', 'MONTH', 'DAY')\r\n * @param date - The date/datetime value\r\n */\r\nexport const dateTrunc = (part: OperandInput, date: OperandInput): FunctionNode => fn('DATE_TRUNC', [part, date]);\r\n","// In a real Node environment: import { AsyncLocalStorage } from 'node:async_hooks';\r\n\r\n/**\r\n * Browser-compatible implementation of AsyncLocalStorage\r\n * Provides a simple in-memory store for browser environments\r\n * @typeParam T - Type of the stored data\r\n */\r\nexport class AsyncLocalStorage<T> {\r\n private store: T | undefined;\r\n\r\n /**\r\n * Executes a callback with the specified store value\r\n * @param store - Value to store during callback execution\r\n * @param callback - Function to execute with the store value\r\n * @returns Result of the callback function\r\n */\r\n run<R>(store: T, callback: () => R): R {\r\n this.store = store;\r\n try {\r\n return callback();\r\n } finally {\r\n this.store = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the currently stored value\r\n * @returns Current store value or undefined if none exists\r\n */\r\n getStore(): T | undefined {\r\n return this.store;\r\n }\r\n}\r\n","import { SQL_OPERATORS, SqlOperator } from './sql.js';\r\n\r\n/**\r\n * Configuration for how SQL operators map to TypeScript builder helpers\r\n */\r\nexport interface SqlOperatorConfig {\r\n /**\r\n * SQL operator literal\r\n */\r\n sql: SqlOperator;\r\n /**\r\n * Corresponding TypeScript helper name\r\n */\r\n tsName: string;\r\n}\r\n\r\n/**\r\n * Registry of supported SQL operators and their companion helper names\r\n */\r\nexport const SQL_OPERATOR_REGISTRY: Record<SqlOperator, SqlOperatorConfig> = {\r\n [SQL_OPERATORS.EQUALS]: { sql: SQL_OPERATORS.EQUALS, tsName: 'eq' },\r\n [SQL_OPERATORS.NOT_EQUALS]: { sql: SQL_OPERATORS.NOT_EQUALS, tsName: 'neq' },\r\n [SQL_OPERATORS.GREATER_THAN]: { sql: SQL_OPERATORS.GREATER_THAN, tsName: 'gt' },\r\n [SQL_OPERATORS.GREATER_OR_EQUAL]: { sql: SQL_OPERATORS.GREATER_OR_EQUAL, tsName: 'gte' },\r\n [SQL_OPERATORS.LESS_THAN]: { sql: SQL_OPERATORS.LESS_THAN, tsName: 'lt' },\r\n [SQL_OPERATORS.LESS_OR_EQUAL]: { sql: SQL_OPERATORS.LESS_OR_EQUAL, tsName: 'lte' },\r\n [SQL_OPERATORS.LIKE]: { sql: SQL_OPERATORS.LIKE, tsName: 'like' },\r\n [SQL_OPERATORS.NOT_LIKE]: { sql: SQL_OPERATORS.NOT_LIKE, tsName: 'notLike' },\r\n [SQL_OPERATORS.IN]: { sql: SQL_OPERATORS.IN, tsName: 'inList' },\r\n [SQL_OPERATORS.NOT_IN]: { sql: SQL_OPERATORS.NOT_IN, tsName: 'notInList' },\r\n [SQL_OPERATORS.IS_NULL]: { sql: SQL_OPERATORS.IS_NULL, tsName: 'isNull' },\r\n [SQL_OPERATORS.IS_NOT_NULL]: { sql: SQL_OPERATORS.IS_NOT_NULL, tsName: 'isNotNull' },\r\n [SQL_OPERATORS.AND]: { sql: SQL_OPERATORS.AND, tsName: 'and' },\r\n [SQL_OPERATORS.OR]: { sql: SQL_OPERATORS.OR, tsName: 'or' },\r\n [SQL_OPERATORS.BETWEEN]: { sql: SQL_OPERATORS.BETWEEN, tsName: 'between' },\r\n [SQL_OPERATORS.NOT_BETWEEN]: { sql: SQL_OPERATORS.NOT_BETWEEN, tsName: 'notBetween' },\r\n [SQL_OPERATORS.EXISTS]: { sql: SQL_OPERATORS.EXISTS, tsName: 'exists' },\r\n [SQL_OPERATORS.NOT_EXISTS]: { sql: SQL_OPERATORS.NOT_EXISTS, tsName: 'notExists' }\r\n};\r\n","import type { TableNode, FunctionTableNode, DerivedTableNode, TableSourceNode } from '../core/ast/query.js';\nimport type { ColumnNode } from '../core/ast/expression.js';\r\n\r\n/**\r\n * Strategy interface for converting database names to TypeScript identifiers\r\n */\r\nexport interface NamingStrategy {\r\n /**\r\n * Converts a table name to a TypeScript symbol name\r\n * @param table - Table node, function table node, or name\n * @returns Valid TypeScript identifier\n */\n tableToSymbol(table: TableSourceNode | string): string;\n\r\n /**\r\n * Converts a column reference to a property name\r\n * @param column - Column node\r\n * @returns Valid TypeScript property name\r\n */\r\n columnToProperty(column: ColumnNode): string;\r\n}\r\n\r\n/**\r\n * Default naming strategy that maintains backward compatibility\r\n * with the original capitalize() behavior\r\n */\r\nexport class DefaultNamingStrategy implements NamingStrategy {\r\n /**\r\n * Converts table names to TypeScript symbols\r\n * @param table - Table node, function table node, or string name\n * @returns Capitalized table name (handles schema-qualified names)\n */\n tableToSymbol(table: TableNode | FunctionTableNode | DerivedTableNode | string): string {\n const tableName =\n typeof table === 'string'\n ? table\n : table.type === 'DerivedTable'\n ? table.alias\n : table.name;\n\r\n // Handle schema-qualified names (e.g., \"auth.user\" → \"AuthUser\")\r\n if (tableName.includes('.')) {\r\n return tableName.split('.')\r\n .map(part => this.capitalize(part))\r\n .join('');\r\n }\r\n\r\n return this.capitalize(tableName);\r\n }\r\n\r\n /**\r\n * Converts column references to property names\r\n * @param column - Column node\r\n * @returns Column name as-is (for backward compatibility)\r\n */\r\n columnToProperty(column: ColumnNode): string {\r\n return column.name;\r\n }\r\n\r\n /**\r\n * Capitalizes the first letter of a string\r\n * @param s - String to capitalize\r\n * @returns Capitalized string\r\n */\r\n private capitalize(s: string): string {\r\n if (!s) return s;\r\n return s.charAt(0).toUpperCase() + s.slice(1);\r\n }\r\n}\r\n","import { SelectQueryNode } from '../core/ast/query.js';\r\nimport {\r\n ExpressionNode,\r\n OperandNode,\r\n BinaryExpressionNode,\r\n LogicalExpressionNode,\r\n InExpressionNode,\r\n NullExpressionNode,\r\n JsonPathNode,\r\n ExistsExpressionNode,\r\n BetweenExpressionNode,\r\n ScalarSubqueryNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode,\r\n ColumnNode,\r\n LiteralNode,\r\n FunctionNode,\r\n ExpressionVisitor,\r\n OperandVisitor,\r\n visitExpression,\r\n visitOperand\r\n} from '../core/ast/expression.js';\r\nimport { SQL_OPERATOR_REGISTRY } from '../core/sql/sql-operator-config.js';\r\nimport { SqlOperator } from '../core/sql/sql.js';\r\nimport { isRelationAlias } from '../query-builder/relation-alias.js';\r\nimport { HydrationMetadata } from '../core/hydration/types.js';\r\nimport { getJoinRelationName } from '../core/ast/join-metadata.js';\r\nimport { NamingStrategy, DefaultNamingStrategy } from './naming-strategy.js';\r\n\r\nconst assertNever = (value: never): never => {\r\n throw new Error(`Unhandled SQL operator: ${value}`);\r\n};\r\n\r\n/**\r\n * Generates TypeScript code from query AST nodes\r\n */\r\nexport class TypeScriptGenerator implements ExpressionVisitor<string>, OperandVisitor<string> {\r\n constructor(private namingStrategy: NamingStrategy = new DefaultNamingStrategy()) {}\r\n\r\n /**\r\n * Generates TypeScript code from a query AST\r\n * @param ast - Query AST to generate code from\r\n * @returns Generated TypeScript code\r\n */\r\n generate(ast: SelectQueryNode): string {\r\n const chainLines = this.buildSelectLines(ast);\r\n const lines = chainLines.map((line, index) => (index === 0 ? `const query = ${line}` : line));\r\n lines.push(';', '', 'await query.execute();');\r\n return lines.join('\\n');\r\n }\r\n\r\n /**\r\n * Builds TypeScript method chain lines from query AST\r\n * @param ast - Query AST\r\n * @returns Array of TypeScript method chain lines\r\n */\r\n private buildSelectLines(ast: SelectQueryNode): string[] {\r\n const lines: string[] = [];\r\n const hydration = (ast.meta as HydrationMetadata | undefined)?.hydration;\r\n const hydratedRelations = new Set(hydration?.relations?.map(r => r.name) ?? []);\r\n\r\n const selections = ast.columns\r\n .filter(col => !(hydration && isRelationAlias((col as any).alias)))\r\n .map(col => {\r\n const key = (col as any).alias || (col as any).name;\r\n const operand = col as OperandNode;\r\n return `${key}: ${this.printOperand(operand)}`;\r\n });\r\n\r\n lines.push(`db.select({`);\r\n selections.forEach((sel, index) => {\r\n lines.push(` ${sel}${index < selections.length - 1 ? ',' : ''}`);\r\n });\r\n lines.push(`})`);\r\n lines.push(`.from(${this.namingStrategy.tableToSymbol(ast.from)})`);\r\n\r\n if (ast.distinct && ast.distinct.length) {\r\n const cols = ast.distinct.map(c => `${this.namingStrategy.tableToSymbol(c.table)}.${c.name}`).join(', ');\r\n lines.push(`.distinct(${cols})`);\r\n }\r\n\r\n ast.joins.forEach(join => {\r\n const relationName = getJoinRelationName(join);\r\n if (relationName && hydratedRelations.has(relationName)) {\r\n return;\r\n }\r\n\r\n if (relationName) {\r\n if (join.kind === 'INNER') {\r\n lines.push(`.joinRelation('${relationName}')`);\r\n } else {\r\n lines.push(`.joinRelation('${relationName}', '${join.kind}')`);\r\n }\r\n } else {\r\n const table = this.namingStrategy.tableToSymbol(join.table);\r\n const cond = this.printExpression(join.condition);\r\n let method = 'innerJoin';\r\n if (join.kind === 'LEFT') method = 'leftJoin';\r\n if (join.kind === 'RIGHT') method = 'rightJoin';\r\n lines.push(`.${method}(${table}, ${cond})`);\r\n }\r\n });\r\n\r\n if (hydration?.relations?.length) {\r\n hydration.relations.forEach(rel => {\r\n const options: string[] = [];\r\n if (rel.columns.length) options.push(`columns: [${rel.columns.map(c => `'${c}'`).join(', ')}]`);\r\n if (rel.aliasPrefix !== rel.name) options.push(`aliasPrefix: '${rel.aliasPrefix}'`);\r\n const opts = options.length ? `, { ${options.join(', ')} }` : '';\r\n lines.push(`.include('${rel.name}'${opts})`);\r\n });\r\n }\r\n\r\n if (ast.where) {\r\n lines.push(`.where(${this.printExpression(ast.where)})`);\r\n }\r\n\r\n if (ast.groupBy && ast.groupBy.length) {\r\n const cols = ast.groupBy.map(c => `${this.namingStrategy.tableToSymbol(c.table)}.${c.name}`).join(', ');\r\n lines.push(`.groupBy(${cols})`);\r\n }\r\n\r\n if (ast.having) {\r\n lines.push(`.having(${this.printExpression(ast.having)})`);\r\n }\r\n\r\n if (ast.orderBy && ast.orderBy.length) {\r\n ast.orderBy.forEach(o => {\r\n lines.push(`.orderBy(${this.namingStrategy.tableToSymbol(o.column.table)}.${o.column.name}, '${o.direction}')`);\r\n });\r\n }\r\n\r\n if (ast.limit) lines.push(`.limit(${ast.limit})`);\r\n if (ast.offset) lines.push(`.offset(${ast.offset})`);\r\n\r\n return lines;\r\n }\r\n\r\n /**\r\n * Prints an expression node to TypeScript code\r\n * @param expr - Expression node to print\r\n * @returns TypeScript code representation\r\n */\r\n private printExpression(expr: ExpressionNode): string {\r\n return visitExpression(expr, this);\r\n }\r\n\r\n /**\r\n * Prints an operand node to TypeScript code\r\n * @param node - Operand node to print\r\n * @returns TypeScript code representation\r\n */\r\n private printOperand(node: OperandNode): string {\r\n return visitOperand(node, this);\r\n }\r\n\r\n public visitBinaryExpression(binary: BinaryExpressionNode): string {\r\n return this.printBinaryExpression(binary);\r\n }\r\n\r\n public visitLogicalExpression(logical: LogicalExpressionNode): string {\r\n return this.printLogicalExpression(logical);\r\n }\r\n\r\n public visitNullExpression(nullExpr: NullExpressionNode): string {\r\n return this.printNullExpression(nullExpr);\r\n }\r\n\r\n public visitInExpression(inExpr: InExpressionNode): string {\r\n return this.printInExpression(inExpr);\r\n }\r\n\r\n public visitExistsExpression(existsExpr: ExistsExpressionNode): string {\r\n return this.printExistsExpression(existsExpr);\r\n }\r\n\r\n public visitBetweenExpression(betweenExpr: BetweenExpressionNode): string {\r\n return this.printBetweenExpression(betweenExpr);\r\n }\r\n\r\n public visitColumn(node: ColumnNode): string {\r\n return this.printColumnOperand(node);\r\n }\r\n\r\n public visitLiteral(node: LiteralNode): string {\r\n return this.printLiteralOperand(node);\r\n }\r\n\r\n public visitFunction(node: FunctionNode): string {\r\n return this.printFunctionOperand(node);\r\n }\r\n\r\n public visitJsonPath(node: JsonPathNode): string {\r\n return this.printJsonPathOperand(node);\r\n }\r\n\r\n public visitScalarSubquery(node: ScalarSubqueryNode): string {\r\n return this.printScalarSubqueryOperand(node);\r\n }\r\n\r\n public visitCaseExpression(node: CaseExpressionNode): string {\r\n return this.printCaseExpressionOperand(node);\r\n }\r\n\r\n public visitWindowFunction(node: WindowFunctionNode): string {\r\n return this.printWindowFunctionOperand(node);\r\n }\r\n\r\n /**\r\n * Prints a binary expression to TypeScript code\r\n * @param binary - Binary expression node\r\n * @returns TypeScript code representation\r\n */\r\n private printBinaryExpression(binary: BinaryExpressionNode): string {\r\n const left = this.printOperand(binary.left);\r\n const right = this.printOperand(binary.right);\r\n const fn = this.mapOp(binary.operator);\r\n const args = [left, right];\r\n if (binary.escape) {\r\n args.push(this.printOperand(binary.escape));\r\n }\r\n return `${fn}(${args.join(', ')})`;\r\n }\r\n\r\n /**\r\n * Prints a logical expression to TypeScript code\r\n * @param logical - Logical expression node\r\n * @returns TypeScript code representation\r\n */\r\n private printLogicalExpression(logical: LogicalExpressionNode): string {\r\n if (logical.operands.length === 0) return '';\r\n const parts = logical.operands.map(op => {\r\n const compiled = this.printExpression(op);\r\n return op.type === 'LogicalExpression' ? `(${compiled})` : compiled;\r\n });\r\n return `${this.mapOp(logical.operator)}(\\n ${parts.join(',\\n ')}\\n )`;\r\n }\r\n\r\n /**\r\n * Prints an IN expression to TypeScript code\r\n * @param inExpr - IN expression node\r\n * @returns TypeScript code representation\r\n */\r\n private printInExpression(inExpr: InExpressionNode): string {\r\n const left = this.printOperand(inExpr.left);\r\n const values = inExpr.right.map(v => this.printOperand(v)).join(', ');\r\n const fn = this.mapOp(inExpr.operator);\r\n return `${fn}(${left}, [${values}])`;\r\n }\r\n\r\n /**\r\n * Prints a null expression to TypeScript code\r\n * @param nullExpr - Null expression node\r\n * @returns TypeScript code representation\r\n */\r\n private printNullExpression(nullExpr: NullExpressionNode): string {\r\n const left = this.printOperand(nullExpr.left);\r\n const fn = this.mapOp(nullExpr.operator);\r\n return `${fn}(${left})`;\r\n }\r\n\r\n /**\r\n * Prints a BETWEEN expression to TypeScript code\r\n * @param betweenExpr - BETWEEN expression node\r\n * @returns TypeScript code representation\r\n */\r\n private printBetweenExpression(betweenExpr: BetweenExpressionNode): string {\r\n const left = this.printOperand(betweenExpr.left);\r\n const lower = this.printOperand(betweenExpr.lower);\r\n const upper = this.printOperand(betweenExpr.upper);\r\n return `${this.mapOp(betweenExpr.operator)}(${left}, ${lower}, ${upper})`;\r\n }\r\n\r\n /**\r\n * Prints an EXISTS expression to TypeScript code\r\n * @param existsExpr - EXISTS expression node\r\n * @returns TypeScript code representation\r\n */\r\n private printExistsExpression(existsExpr: ExistsExpressionNode): string {\r\n const subquery = this.inlineChain(this.buildSelectLines(existsExpr.subquery));\r\n return `${this.mapOp(existsExpr.operator)}(${subquery})`;\r\n }\r\n\r\n /**\r\n * Prints a column operand to TypeScript code\r\n * @param column - Column node\r\n * @returns TypeScript code representation\r\n */\r\n private printColumnOperand(column: ColumnNode): string {\r\n return `${this.namingStrategy.tableToSymbol(column.table)}.${column.name}`;\r\n }\r\n\r\n /**\r\n * Prints a literal operand to TypeScript code\r\n * @param literal - Literal node\r\n * @returns TypeScript code representation\r\n */\r\n private printLiteralOperand(literal: LiteralNode): string {\r\n if (literal.value === null) return 'null';\r\n return typeof literal.value === 'string' ? `'${literal.value}'` : String(literal.value);\r\n }\r\n\r\n /**\r\n * Prints a function operand to TypeScript code\r\n * @param fn - Function node\r\n * @returns TypeScript code representation\r\n */\r\n private printFunctionOperand(fn: FunctionNode): string {\r\n const args = fn.args.map(a => this.printOperand(a)).join(', ');\r\n return `${fn.name.toLowerCase()}(${args})`;\r\n }\r\n\r\n /**\r\n * Prints a JSON path operand to TypeScript code\r\n * @param json - JSON path node\r\n * @returns TypeScript code representation\r\n */\r\n private printJsonPathOperand(json: JsonPathNode): string {\r\n return `jsonPath(${this.namingStrategy.tableToSymbol(json.column.table)}.${json.column.name}, '${json.path}')`;\r\n }\r\n\r\n /**\r\n * Prints a scalar subquery operand to TypeScript code\r\n * @param node - Scalar subquery node\r\n * @returns TypeScript code representation\r\n */\r\n private printScalarSubqueryOperand(node: ScalarSubqueryNode): string {\r\n const subquery = this.inlineChain(this.buildSelectLines(node.query));\r\n return `(${subquery})`;\r\n }\r\n\r\n /**\r\n * Prints a CASE expression operand to TypeScript code\r\n * @param node - CASE expression node\r\n * @returns TypeScript code representation\r\n */\r\n private printCaseExpressionOperand(node: CaseExpressionNode): string {\r\n const clauses = node.conditions.map(\r\n condition =>\r\n `{ when: ${this.printExpression(condition.when)}, then: ${this.printOperand(condition.then)} }`\r\n );\r\n const elseValue = node.else ? `, ${this.printOperand(node.else)}` : '';\r\n return `caseWhen([${clauses.join(', ')}]${elseValue})`;\r\n }\r\n\r\n /**\r\n * Prints a window function operand to TypeScript code\r\n * @param node - Window function node\r\n * @returns TypeScript code representation\r\n */\r\n private printWindowFunctionOperand(node: WindowFunctionNode): string {\r\n let result = `${node.name}(`;\r\n if (node.args.length > 0) {\r\n result += node.args.map(arg => this.printOperand(arg)).join(', ');\r\n }\r\n result += ') OVER (';\r\n\r\n const parts: string[] = [];\r\n\r\n if (node.partitionBy && node.partitionBy.length > 0) {\r\n const partitionClause =\r\n 'PARTITION BY ' + node.partitionBy.map(col => `${this.namingStrategy.tableToSymbol(col.table)}.${col.name}`).join(', ');\r\n parts.push(partitionClause);\r\n }\r\n\r\n if (node.orderBy && node.orderBy.length > 0) {\r\n const orderClause =\r\n 'ORDER BY ' +\r\n node.orderBy.map(o => `${this.namingStrategy.tableToSymbol(o.column.table)}.${o.column.name} ${o.direction}`).join(', ');\r\n parts.push(orderClause);\r\n }\r\n\r\n result += parts.join(' ');\r\n result += ')';\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Converts method chain lines to inline format\r\n * @param lines - Method chain lines\r\n * @returns Inline method chain string\r\n */\r\n private inlineChain(lines: string[]): string {\r\n return lines\r\n .map(line => line.trim())\r\n .filter(line => line.length > 0)\r\n .join(' ');\r\n }\r\n\r\n /**\r\n * Maps SQL operators to TypeScript function names\r\n * @param op - SQL operator\r\n * @returns TypeScript function name\r\n */\r\n private mapOp(op: SqlOperator): string {\r\n const config = SQL_OPERATOR_REGISTRY[op];\r\n if (!config) {\r\n return assertNever(op as never);\r\n }\r\n return config.tsName;\r\n }\r\n}\r\n","import type { TableDef } from '../schema/table.js';\r\nimport type { TrackedEntity } from './runtime-types.js';\r\n\r\nexport class IdentityMap {\r\n private readonly buckets = new Map<string, Map<string, TrackedEntity>>();\r\n\r\n get bucketsMap(): Map<string, Map<string, TrackedEntity>> {\r\n return this.buckets;\r\n }\r\n\r\n getEntity(table: TableDef, pk: string | number): any | undefined {\r\n const bucket = this.buckets.get(table.name);\r\n return bucket?.get(this.toIdentityKey(pk))?.entity;\r\n }\r\n\r\n register(tracked: TrackedEntity): void {\r\n if (tracked.pk == null) return;\r\n const bucket = this.buckets.get(tracked.table.name) ?? new Map<string, TrackedEntity>();\r\n bucket.set(this.toIdentityKey(tracked.pk), tracked);\r\n this.buckets.set(tracked.table.name, bucket);\r\n }\r\n\r\n remove(tracked: TrackedEntity): void {\r\n if (tracked.pk == null) return;\r\n const bucket = this.buckets.get(tracked.table.name);\r\n bucket?.delete(this.toIdentityKey(tracked.pk));\r\n }\r\n\r\n getEntitiesForTable(table: TableDef): TrackedEntity[] {\r\n const bucket = this.buckets.get(table.name);\r\n return bucket ? Array.from(bucket.values()) : [];\r\n }\r\n\r\n clear(): void {\r\n this.buckets.clear();\r\n }\r\n\r\n private toIdentityKey(pk: string | number): string {\r\n return String(pk);\r\n }\r\n}\r\n","import { RelationDef } from '../schema/relation.js';\r\nimport { TableDef } from '../schema/table.js';\r\n\r\n/**\r\n * Entity status enum representing the lifecycle state of an entity\r\n */\r\nexport enum EntityStatus {\r\n /** Entity is newly created and not yet persisted */\r\n New = 'new',\r\n /** Entity is managed by the ORM and synchronized with the database */\r\n Managed = 'managed',\r\n /** Entity has been modified but not yet persisted */\r\n Dirty = 'dirty',\r\n /** Entity has been marked for removal */\r\n Removed = 'removed',\r\n /** Entity is detached from the ORM context */\r\n Detached = 'detached'\r\n}\r\n\r\n/**\r\n * Represents an entity being tracked by the ORM\r\n */\r\nexport interface TrackedEntity {\r\n /** The table definition this entity belongs to */\r\n table: TableDef;\r\n /** The actual entity instance */\r\n entity: any;\r\n /** Primary key value of the entity */\r\n pk: string | number | null;\r\n /** Current status of the entity */\r\n status: EntityStatus;\r\n /** Original values of the entity when it was loaded */\r\n original: Record<string, any> | null;\r\n}\r\n\r\n/**\r\n * Type representing a key for relation navigation\r\n */\r\nexport type RelationKey = string;\r\n\r\n/**\r\n * Represents a change operation on a relation\r\n * @typeParam T - Type of the related entity\r\n */\r\nexport type RelationChange<T> =\r\n | { kind: 'add'; entity: T }\r\n | { kind: 'attach'; entity: T }\r\n | { kind: 'remove'; entity: T }\r\n | { kind: 'detach'; entity: T };\r\n\r\n/**\r\n * Represents a relation change entry in the unit of work\r\n */\r\nexport interface RelationChangeEntry {\r\n /** Root entity that owns the relation */\r\n root: any;\r\n /** Key of the relation being changed */\r\n relationKey: RelationKey;\r\n /** Table definition of the root entity */\r\n rootTable: TableDef;\r\n /** Name of the relation */\r\n relationName: string;\r\n /** Relation definition */\r\n relation: RelationDef;\r\n /** The change being applied */\r\n change: RelationChange<any>;\r\n}\r\n\r\n/**\r\n * Represents a domain event that can be emitted by entities\r\n * @typeParam TType - Type of the event (string literal)\r\n */\r\nexport interface DomainEvent<TType extends string = string> {\r\n /** Type identifier for the event */\r\n readonly type: TType;\r\n /** Timestamp when the event occurred */\r\n readonly occurredAt?: Date;\r\n}\r\n\r\n/**\r\n * Type representing any domain event\r\n */\r\nexport type AnyDomainEvent = DomainEvent<string>;\r\n\r\n/**\r\n * Type representing ORM-specific domain events\r\n */\r\nexport type OrmDomainEvent = AnyDomainEvent;\r\n\r\n/**\r\n * Interface for entities that can emit domain events\r\n * @typeParam E - Type of domain events this entity can emit\r\n */\r\nexport interface HasDomainEvents<E extends DomainEvent = AnyDomainEvent> {\r\n /** Array of domain events emitted by this entity */\r\n domainEvents?: E[];\r\n}\r\n","import { ColumnNode, eq } from '../core/ast/expression.js';\r\nimport type { Dialect, CompiledQuery } from '../core/dialect/abstract.js';\r\nimport { InsertQueryBuilder } from '../query-builder/insert.js';\r\nimport { UpdateQueryBuilder } from '../query-builder/update.js';\r\nimport { DeleteQueryBuilder } from '../query-builder/delete.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\nimport type { TableDef, TableHooks } from '../schema/table.js';\r\nimport type { DbExecutor, QueryResult } from '../core/execution/db-executor.js';\r\nimport { IdentityMap } from './identity-map.js';\r\nimport { EntityStatus } from './runtime-types.js';\r\nimport type { TrackedEntity } from './runtime-types.js';\r\n\r\nexport class UnitOfWork {\r\n private readonly trackedEntities = new Map<any, TrackedEntity>();\r\n\r\n constructor(\r\n private readonly dialect: Dialect,\r\n private readonly executor: DbExecutor,\r\n private readonly identityMap: IdentityMap,\r\n private readonly hookContext: () => unknown\r\n ) { }\r\n\r\n get identityBuckets(): Map<string, Map<string, TrackedEntity>> {\r\n return this.identityMap.bucketsMap;\r\n }\r\n\r\n getTracked(): TrackedEntity[] {\r\n return Array.from(this.trackedEntities.values());\r\n }\r\n\r\n getEntity(table: TableDef, pk: string | number): any | undefined {\r\n return this.identityMap.getEntity(table, pk);\r\n }\r\n\r\n getEntitiesForTable(table: TableDef): TrackedEntity[] {\r\n return this.identityMap.getEntitiesForTable(table);\r\n }\r\n\r\n findTracked(entity: any): TrackedEntity | undefined {\r\n return this.trackedEntities.get(entity);\r\n }\r\n\r\n setEntity(table: TableDef, pk: string | number, entity: any): void {\r\n if (pk === null || pk === undefined) return;\r\n let tracked = this.trackedEntities.get(entity);\r\n if (!tracked) {\r\n tracked = {\r\n table,\r\n entity,\r\n pk,\r\n status: EntityStatus.Managed,\r\n original: this.createSnapshot(table, entity)\r\n };\r\n this.trackedEntities.set(entity, tracked);\r\n } else {\r\n tracked.pk = pk;\r\n }\r\n\r\n this.registerIdentity(tracked);\r\n }\r\n\r\n trackNew(table: TableDef, entity: any, pk?: string | number): void {\r\n const tracked: TrackedEntity = {\r\n table,\r\n entity,\r\n pk: pk ?? null,\r\n status: EntityStatus.New,\r\n original: null\r\n };\r\n this.trackedEntities.set(entity, tracked);\r\n if (pk != null) {\r\n this.registerIdentity(tracked);\r\n }\r\n }\r\n\r\n trackManaged(table: TableDef, pk: string | number, entity: any): void {\r\n const tracked: TrackedEntity = {\r\n table,\r\n entity,\r\n pk,\r\n status: EntityStatus.Managed,\r\n original: this.createSnapshot(table, entity)\r\n };\r\n this.trackedEntities.set(entity, tracked);\r\n this.registerIdentity(tracked);\r\n }\r\n\r\n markDirty(entity: any): void {\r\n const tracked = this.trackedEntities.get(entity);\r\n if (!tracked) return;\r\n if (tracked.status === EntityStatus.New || tracked.status === EntityStatus.Removed) return;\r\n tracked.status = EntityStatus.Dirty;\r\n }\r\n\r\n markRemoved(entity: any): void {\r\n const tracked = this.trackedEntities.get(entity);\r\n if (!tracked) return;\r\n tracked.status = EntityStatus.Removed;\r\n }\r\n\r\n async flush(): Promise<void> {\r\n const toFlush = Array.from(this.trackedEntities.values());\r\n for (const tracked of toFlush) {\r\n switch (tracked.status) {\r\n case EntityStatus.New:\r\n await this.flushInsert(tracked);\r\n break;\r\n case EntityStatus.Dirty:\r\n await this.flushUpdate(tracked);\r\n break;\r\n case EntityStatus.Removed:\r\n await this.flushDelete(tracked);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n }\r\n\r\n reset(): void {\r\n this.trackedEntities.clear();\r\n this.identityMap.clear();\r\n }\r\n\r\n private async flushInsert(tracked: TrackedEntity): Promise<void> {\r\n await this.runHook(tracked.table.hooks?.beforeInsert, tracked);\r\n\r\n const payload = this.extractColumns(tracked.table, tracked.entity);\r\n let builder = new InsertQueryBuilder(tracked.table).values(payload);\r\n if (this.dialect.supportsReturning()) {\r\n builder = builder.returning(...this.getReturningColumns(tracked.table));\r\n }\r\n const compiled = builder.compile(this.dialect);\r\n const results = await this.executeCompiled(compiled);\r\n this.applyReturningResults(tracked, results);\r\n\r\n tracked.status = EntityStatus.Managed;\r\n tracked.original = this.createSnapshot(tracked.table, tracked.entity);\r\n tracked.pk = this.getPrimaryKeyValue(tracked);\r\n this.registerIdentity(tracked);\r\n\r\n await this.runHook(tracked.table.hooks?.afterInsert, tracked);\r\n }\r\n\r\n private async flushUpdate(tracked: TrackedEntity): Promise<void> {\r\n if (tracked.pk == null) return;\r\n const changes = this.computeChanges(tracked);\r\n if (!Object.keys(changes).length) {\r\n tracked.status = EntityStatus.Managed;\r\n return;\r\n }\r\n\r\n await this.runHook(tracked.table.hooks?.beforeUpdate, tracked);\r\n\r\n const pkColumn = tracked.table.columns[findPrimaryKey(tracked.table)];\r\n if (!pkColumn) return;\r\n\r\n let builder = new UpdateQueryBuilder(tracked.table)\r\n .set(changes)\r\n .where(eq(pkColumn, tracked.pk));\r\n\r\n if (this.dialect.supportsReturning()) {\r\n builder = builder.returning(...this.getReturningColumns(tracked.table));\r\n }\r\n\r\n const compiled = builder.compile(this.dialect);\r\n const results = await this.executeCompiled(compiled);\r\n this.applyReturningResults(tracked, results);\r\n\r\n tracked.status = EntityStatus.Managed;\r\n tracked.original = this.createSnapshot(tracked.table, tracked.entity);\r\n this.registerIdentity(tracked);\r\n\r\n await this.runHook(tracked.table.hooks?.afterUpdate, tracked);\r\n }\r\n\r\n private async flushDelete(tracked: TrackedEntity): Promise<void> {\r\n if (tracked.pk == null) return;\r\n await this.runHook(tracked.table.hooks?.beforeDelete, tracked);\r\n\r\n const pkColumn = tracked.table.columns[findPrimaryKey(tracked.table)];\r\n if (!pkColumn) return;\r\n\r\n const builder = new DeleteQueryBuilder(tracked.table).where(eq(pkColumn, tracked.pk));\r\n const compiled = builder.compile(this.dialect);\r\n await this.executeCompiled(compiled);\r\n\r\n tracked.status = EntityStatus.Detached;\r\n this.trackedEntities.delete(tracked.entity);\r\n this.identityMap.remove(tracked);\r\n\r\n await this.runHook(tracked.table.hooks?.afterDelete, tracked);\r\n }\r\n\r\n private async runHook(\r\n hook: TableHooks[keyof TableHooks] | undefined,\r\n tracked: TrackedEntity\r\n ): Promise<void> {\r\n if (!hook) return;\r\n await hook(this.hookContext() as any, tracked.entity);\r\n }\r\n\r\n private computeChanges(tracked: TrackedEntity): Record<string, unknown> {\r\n const snapshot = tracked.original ?? {};\r\n const changes: Record<string, unknown> = {};\r\n for (const column of Object.keys(tracked.table.columns)) {\r\n const current = tracked.entity[column];\r\n if (snapshot[column] !== current) {\r\n changes[column] = current;\r\n }\r\n }\r\n return changes;\r\n }\r\n\r\n private extractColumns(table: TableDef, entity: any): Record<string, unknown> {\r\n const payload: Record<string, unknown> = {};\r\n for (const column of Object.keys(table.columns)) {\r\n if (entity[column] === undefined) continue;\r\n payload[column] = entity[column];\r\n }\r\n return payload;\r\n }\r\n\r\n private async executeCompiled(compiled: CompiledQuery): Promise<QueryResult[]> {\r\n return this.executor.executeSql(compiled.sql, compiled.params);\r\n }\r\n\r\n private getReturningColumns(table: TableDef): ColumnNode[] {\r\n return Object.values(table.columns).map(column => ({\r\n type: 'Column',\r\n table: table.name,\r\n name: column.name,\r\n alias: column.name\r\n }));\r\n }\r\n\r\n private applyReturningResults(tracked: TrackedEntity, results: QueryResult[]): void {\r\n if (!this.dialect.supportsReturning()) return;\r\n const first = results[0];\r\n if (!first || first.values.length === 0) return;\r\n\r\n const row = first.values[0];\r\n for (let i = 0; i < first.columns.length; i++) {\r\n const columnName = this.normalizeColumnName(first.columns[i]);\r\n if (!(columnName in tracked.table.columns)) continue;\r\n tracked.entity[columnName] = row[i];\r\n }\r\n }\r\n\r\n private normalizeColumnName(column: string): string {\r\n const parts = column.split('.');\r\n const candidate = parts[parts.length - 1];\r\n return candidate.replace(/^[\"`[\\]]+|[\"`[\\]]+$/g, '');\r\n }\r\n\r\n private registerIdentity(tracked: TrackedEntity): void {\r\n if (tracked.pk == null) return;\r\n this.identityMap.register(tracked);\r\n }\r\n\r\n private createSnapshot(table: TableDef, entity: any): Record<string, any> {\r\n const snapshot: Record<string, any> = {};\r\n for (const column of Object.keys(table.columns)) {\r\n snapshot[column] = entity[column];\r\n }\r\n return snapshot;\r\n }\r\n\r\n private getPrimaryKeyValue(tracked: TrackedEntity): string | number | null {\r\n const key = findPrimaryKey(tracked.table);\r\n const val = tracked.entity[key];\r\n if (val === undefined || val === null) return null;\r\n return val;\r\n }\r\n}\r\n","import type { DomainEvent, HasDomainEvents, TrackedEntity } from './runtime-types.js';\r\n\r\ntype EventOfType<E extends DomainEvent, TType extends E['type']> =\r\n Extract<E, { type: TType }>;\r\n\r\nexport type DomainEventHandler<E extends DomainEvent, Context> =\r\n (event: E, ctx: Context) => Promise<void> | void;\r\n\r\nexport type InitialHandlers<E extends DomainEvent, Context> = {\r\n [K in E['type']]?: DomainEventHandler<EventOfType<E, K>, Context>[];\r\n};\r\n\r\nexport class DomainEventBus<E extends DomainEvent, Context> {\r\n private readonly handlers = new Map<E['type'], DomainEventHandler<E, Context>[]>();\r\n\r\n constructor(initialHandlers?: InitialHandlers<E, Context>) {\r\n if (initialHandlers) {\r\n for (const key in initialHandlers) {\r\n const type = key as E['type'];\r\n const list = initialHandlers[type] ?? [];\r\n this.handlers.set(type, [...(list as DomainEventHandler<E, Context>[])]);\r\n }\r\n }\r\n }\r\n\r\n on<TType extends E['type']>(\r\n type: TType,\r\n handler: DomainEventHandler<EventOfType<E, TType>, Context>\r\n ): void {\r\n const key = type as E['type'];\r\n const existing = this.handlers.get(key) ?? [];\r\n existing.push(handler as unknown as DomainEventHandler<E, Context>);\r\n this.handlers.set(key, existing);\r\n }\r\n\r\n register<TType extends E['type']>(\r\n type: TType,\r\n handler: DomainEventHandler<EventOfType<E, TType>, Context>\r\n ): void {\r\n this.on(type, handler);\r\n }\r\n\r\n async dispatch(trackedEntities: Iterable<TrackedEntity>, ctx: Context): Promise<void> {\r\n for (const tracked of trackedEntities) {\r\n const entity = tracked.entity as HasDomainEvents<E>;\r\n if (!entity.domainEvents?.length) continue;\r\n\r\n for (const event of entity.domainEvents) {\r\n const handlers = this.handlers.get(event.type as E['type']);\r\n if (!handlers?.length) continue;\r\n\r\n for (const handler of handlers) {\r\n await handler(event, ctx);\r\n }\r\n }\r\n\r\n entity.domainEvents = [];\r\n }\r\n }\r\n}\r\n\r\nexport const addDomainEvent = <E extends DomainEvent>(\r\n entity: HasDomainEvents<E>,\r\n event: E\r\n): void => {\r\n if (!entity.domainEvents) {\r\n entity.domainEvents = [];\r\n }\r\n entity.domainEvents.push(event);\r\n};\r\n","import { and, eq } from '../core/ast/expression.js';\r\nimport type { Dialect } from '../core/dialect/abstract.js';\r\nimport { DeleteQueryBuilder } from '../query-builder/delete.js';\r\nimport { InsertQueryBuilder } from '../query-builder/insert.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\nimport type { BelongsToManyRelation, HasManyRelation, HasOneRelation } from '../schema/relation.js';\r\nimport { RelationKinds } from '../schema/relation.js';\r\nimport type { TableDef } from '../schema/table.js';\r\nimport type { DbExecutor } from '../core/execution/db-executor.js';\r\nimport type { RelationChangeEntry } from './runtime-types.js';\r\nimport { UnitOfWork } from './unit-of-work.js';\r\n\r\nexport class RelationChangeProcessor {\r\n private readonly relationChanges: RelationChangeEntry[] = [];\r\n\r\n constructor(\r\n private readonly unitOfWork: UnitOfWork,\r\n private readonly dialect: Dialect,\r\n private readonly executor: DbExecutor\r\n ) { }\r\n\r\n registerChange(entry: RelationChangeEntry): void {\r\n this.relationChanges.push(entry);\r\n }\r\n\r\n reset(): void {\r\n this.relationChanges.length = 0;\r\n }\r\n\r\n async process(): Promise<void> {\r\n if (!this.relationChanges.length) return;\r\n const entries = [...this.relationChanges];\r\n this.relationChanges.length = 0;\r\n\r\n for (const entry of entries) {\r\n switch (entry.relation.type) {\r\n case RelationKinds.HasMany:\r\n await this.handleHasManyChange(entry);\r\n break;\r\n case RelationKinds.HasOne:\r\n await this.handleHasOneChange(entry);\r\n break;\r\n case RelationKinds.BelongsToMany:\r\n await this.handleBelongsToManyChange(entry);\r\n break;\r\n case RelationKinds.BelongsTo:\r\n await this.handleBelongsToChange(entry);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n private async handleHasManyChange(entry: RelationChangeEntry): Promise<void> {\r\n const relation = entry.relation as HasManyRelation;\r\n const target = entry.change.entity;\r\n if (!target) return;\r\n\r\n const tracked = this.unitOfWork.findTracked(target);\r\n if (!tracked) return;\r\n\r\n const localKey = relation.localKey || findPrimaryKey(entry.rootTable);\r\n const rootValue = entry.root[localKey];\r\n if (rootValue === undefined || rootValue === null) return;\r\n\r\n if (entry.change.kind === 'add' || entry.change.kind === 'attach') {\r\n this.assignHasManyForeignKey(tracked.entity, relation, rootValue);\r\n this.unitOfWork.markDirty(tracked.entity);\r\n return;\r\n }\r\n\r\n if (entry.change.kind === 'remove') {\r\n this.detachHasManyChild(tracked.entity, relation);\r\n }\r\n }\r\n\r\n private async handleHasOneChange(entry: RelationChangeEntry): Promise<void> {\r\n const relation = entry.relation as HasOneRelation;\r\n const target = entry.change.entity;\r\n if (!target) return;\r\n\r\n const tracked = this.unitOfWork.findTracked(target);\r\n if (!tracked) return;\r\n\r\n const localKey = relation.localKey || findPrimaryKey(entry.rootTable);\r\n const rootValue = entry.root[localKey];\r\n if (rootValue === undefined || rootValue === null) return;\r\n\r\n if (entry.change.kind === 'attach' || entry.change.kind === 'add') {\r\n this.assignHasOneForeignKey(tracked.entity, relation, rootValue);\r\n this.unitOfWork.markDirty(tracked.entity);\r\n return;\r\n }\r\n\r\n if (entry.change.kind === 'remove') {\r\n this.detachHasOneChild(tracked.entity, relation);\r\n }\r\n }\r\n\r\n private async handleBelongsToChange(_entry: RelationChangeEntry): Promise<void> {\r\n // Reserved for future cascade/persist behaviors for belongs-to relations.\r\n }\r\n\r\n private async handleBelongsToManyChange(entry: RelationChangeEntry): Promise<void> {\r\n const relation = entry.relation as BelongsToManyRelation;\r\n const rootKey = relation.localKey || findPrimaryKey(entry.rootTable);\r\n const rootId = entry.root[rootKey];\r\n if (rootId === undefined || rootId === null) return;\r\n\r\n const targetId = this.resolvePrimaryKeyValue(entry.change.entity, relation.target);\r\n if (targetId === null) return;\r\n\r\n if (entry.change.kind === 'attach' || entry.change.kind === 'add') {\r\n await this.insertPivotRow(relation, rootId, targetId);\r\n return;\r\n }\r\n\r\n if (entry.change.kind === 'detach' || entry.change.kind === 'remove') {\r\n await this.deletePivotRow(relation, rootId, targetId);\r\n\r\n if (relation.cascade === 'all' || relation.cascade === 'remove') {\r\n this.unitOfWork.markRemoved(entry.change.entity);\r\n }\r\n }\r\n }\r\n\r\n private assignHasManyForeignKey(child: any, relation: HasManyRelation, rootValue: unknown): void {\r\n const current = child[relation.foreignKey];\r\n if (current === rootValue) return;\r\n child[relation.foreignKey] = rootValue;\r\n }\r\n\r\n private detachHasManyChild(child: any, relation: HasManyRelation): void {\r\n if (relation.cascade === 'all' || relation.cascade === 'remove') {\r\n this.unitOfWork.markRemoved(child);\r\n return;\r\n }\r\n child[relation.foreignKey] = null;\r\n this.unitOfWork.markDirty(child);\r\n }\r\n\r\n private assignHasOneForeignKey(child: any, relation: HasOneRelation, rootValue: unknown): void {\r\n const current = child[relation.foreignKey];\r\n if (current === rootValue) return;\r\n child[relation.foreignKey] = rootValue;\r\n }\r\n\r\n private detachHasOneChild(child: any, relation: HasOneRelation): void {\r\n if (relation.cascade === 'all' || relation.cascade === 'remove') {\r\n this.unitOfWork.markRemoved(child);\r\n return;\r\n }\r\n child[relation.foreignKey] = null;\r\n this.unitOfWork.markDirty(child);\r\n }\r\n\r\n private async insertPivotRow(relation: BelongsToManyRelation, rootId: string | number, targetId: string | number): Promise<void> {\r\n const payload = {\r\n [relation.pivotForeignKeyToRoot]: rootId,\r\n [relation.pivotForeignKeyToTarget]: targetId\r\n };\r\n const builder = new InsertQueryBuilder(relation.pivotTable).values(payload);\r\n const compiled = builder.compile(this.dialect);\r\n await this.executor.executeSql(compiled.sql, compiled.params);\r\n }\r\n\r\n private async deletePivotRow(relation: BelongsToManyRelation, rootId: string | number, targetId: string | number): Promise<void> {\r\n const rootCol = relation.pivotTable.columns[relation.pivotForeignKeyToRoot];\r\n const targetCol = relation.pivotTable.columns[relation.pivotForeignKeyToTarget];\r\n if (!rootCol || !targetCol) return;\r\n\r\n const builder = new DeleteQueryBuilder(relation.pivotTable).where(\r\n and(eq(rootCol, rootId), eq(targetCol, targetId))\r\n );\r\n const compiled = builder.compile(this.dialect);\r\n await this.executor.executeSql(compiled.sql, compiled.params);\r\n }\r\n\r\n private resolvePrimaryKeyValue(entity: any, table: TableDef): string | number | null {\r\n if (!entity) return null;\r\n const key = findPrimaryKey(table);\r\n const value = entity[key];\r\n if (value === undefined || value === null) return null;\r\n return value;\r\n }\r\n}\r\n","import type { DbExecutor } from '../core/execution/db-executor.js';\n\n/**\n * Represents a single SQL query log entry\n */\nexport interface QueryLogEntry {\n /** The SQL query that was executed */\n sql: string;\n /** Parameters used in the query */\n params?: unknown[];\n}\n\n/**\n * Function type for query logging callbacks\n * @param entry - The query log entry to process\n */\nexport type QueryLogger = (entry: QueryLogEntry) => void;\n\n/**\n * Creates a wrapped database executor that logs all SQL queries\n * @param executor - Original database executor to wrap\n * @param logger - Optional logger function to receive query log entries\n * @returns Wrapped executor that logs queries before execution\n */\nexport const createQueryLoggingExecutor = (\n executor: DbExecutor,\n logger?: QueryLogger\n): DbExecutor => {\n if (!logger) {\n return executor;\n }\n\n const wrapped: DbExecutor = {\n async executeSql(sql, params) {\n logger({ sql, params });\n return executor.executeSql(sql, params);\n }\n };\n\n if (executor.beginTransaction) {\n wrapped.beginTransaction = executor.beginTransaction.bind(executor);\n }\n\n if (executor.commitTransaction) {\n wrapped.commitTransaction = executor.commitTransaction.bind(executor);\n }\n\n if (executor.rollbackTransaction) {\n wrapped.rollbackTransaction = executor.rollbackTransaction.bind(executor);\n }\n\n return wrapped;\n};\n","import type { DbExecutor } from '../core/execution/db-executor.js';\r\n\r\n/**\r\n * Executes a function within a database transaction\r\n * @param executor - Database executor to use for transaction operations\r\n * @param action - Function to execute within the transaction\r\n * @returns Promise that resolves when the transaction is complete\r\n * @throws Re-throws any errors that occur during the transaction (after rolling back)\r\n */\r\nexport const runInTransaction = async (executor: DbExecutor, action: () => Promise<void>): Promise<void> => {\r\n if (!executor.beginTransaction) {\r\n await action();\r\n return;\r\n }\r\n\r\n await executor.beginTransaction();\r\n try {\r\n await action();\r\n await executor.commitTransaction?.();\r\n } catch (error) {\r\n await executor.rollbackTransaction?.();\r\n throw error;\r\n }\r\n};\r\n","import { Dialect } from '../core/dialect/abstract.js';\nimport { eq } from '../core/ast/expression.js';\nimport type { DbExecutor } from '../core/execution/db-executor.js';\nimport { SelectQueryBuilder } from '../query-builder/select.js';\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\nimport type { ColumnDef } from '../schema/column.js';\nimport type { TableDef } from '../schema/table.js';\nimport { EntityInstance } from '../schema/types.js';\nimport { RelationDef } from '../schema/relation.js';\n\nimport { selectFromEntity, getTableDefFromEntity } from '../decorators/bootstrap.js';\nimport type { EntityConstructor } from './entity-metadata.js';\nimport { Orm } from './orm.js';\nimport { IdentityMap } from './identity-map.js';\nimport { UnitOfWork } from './unit-of-work.js';\nimport { DomainEventBus, DomainEventHandler, InitialHandlers } from './domain-event-bus.js';\nimport { RelationChangeProcessor } from './relation-change-processor.js';\nimport { createQueryLoggingExecutor, QueryLogger } from './query-logger.js';\nimport { ExecutionContext } from './execution-context.js';\nimport type { HydrationContext } from './hydration-context.js';\nimport type { EntityContext } from './entity-context.js';\nimport {\n DomainEvent,\n OrmDomainEvent,\n RelationChange,\n RelationChangeEntry,\n RelationKey,\n TrackedEntity\n} from './runtime-types.js';\nimport { executeHydrated } from './execute.js';\nimport { runInTransaction } from './transaction-runner.js';\n\nexport interface OrmInterceptor {\n beforeFlush?(ctx: EntityContext): Promise<void> | void;\n afterFlush?(ctx: EntityContext): Promise<void> | void;\n}\n\nexport interface OrmSessionOptions<E extends DomainEvent = OrmDomainEvent> {\n orm: Orm<E>;\n executor: DbExecutor;\n queryLogger?: QueryLogger;\n interceptors?: OrmInterceptor[];\n domainEventHandlers?: InitialHandlers<E, OrmSession<E>>;\n}\n\nexport class OrmSession<E extends DomainEvent = OrmDomainEvent> implements EntityContext {\n readonly orm: Orm<E>;\n readonly executor: DbExecutor;\n readonly identityMap: IdentityMap;\n readonly unitOfWork: UnitOfWork;\n readonly domainEvents: DomainEventBus<E, OrmSession<E>>;\n readonly relationChanges: RelationChangeProcessor;\n\n private readonly interceptors: OrmInterceptor[];\n\n constructor(opts: OrmSessionOptions<E>) {\n this.orm = opts.orm;\n this.executor = createQueryLoggingExecutor(opts.executor, opts.queryLogger);\n this.interceptors = [...(opts.interceptors ?? [])];\n\n this.identityMap = new IdentityMap();\n this.unitOfWork = new UnitOfWork(this.orm.dialect, this.executor, this.identityMap, () => this);\n this.relationChanges = new RelationChangeProcessor(this.unitOfWork, this.orm.dialect, this.executor);\n this.domainEvents = new DomainEventBus<E, OrmSession<E>>(opts.domainEventHandlers);\n }\n\n get dialect(): Dialect {\n return this.orm.dialect;\n }\n\n get identityBuckets(): Map<string, Map<string, TrackedEntity>> {\n return this.unitOfWork.identityBuckets;\n }\n\n get tracked(): TrackedEntity[] {\n return this.unitOfWork.getTracked();\n }\n\n getEntity(table: TableDef, pk: any): any | undefined {\n return this.unitOfWork.getEntity(table, pk);\n }\n\n setEntity(table: TableDef, pk: any, entity: any): void {\n this.unitOfWork.setEntity(table, pk, entity);\n }\n\n trackNew(table: TableDef, entity: any, pk?: any): void {\n this.unitOfWork.trackNew(table, entity, pk);\n }\n\n trackManaged(table: TableDef, pk: any, entity: any): void {\n this.unitOfWork.trackManaged(table, pk, entity);\n }\n\n markDirty(entity: any): void {\n this.unitOfWork.markDirty(entity);\n }\n\n markRemoved(entity: any): void {\n this.unitOfWork.markRemoved(entity);\n }\n\n registerRelationChange = (\n root: any,\n relationKey: RelationKey,\n rootTable: TableDef,\n relationName: string,\n relation: RelationDef,\n change: RelationChange<any>\n ): void => {\n this.relationChanges.registerChange(\n buildRelationChangeEntry(root, relationKey, rootTable, relationName, relation, change)\n );\n };\n\n getEntitiesForTable(table: TableDef): TrackedEntity[] {\n return this.unitOfWork.getEntitiesForTable(table);\n }\n\n registerInterceptor(interceptor: OrmInterceptor): void {\n this.interceptors.push(interceptor);\n }\n\n registerDomainEventHandler<TType extends E['type']>(\n type: TType,\n handler: DomainEventHandler<Extract<E, { type: TType }>, OrmSession<E>>\n ): void {\n this.domainEvents.on(type, handler);\n }\n\n async find<TTable extends TableDef>(entityClass: EntityConstructor, id: any): Promise<EntityInstance<TTable> | null> {\n const table = getTableDefFromEntity(entityClass);\n if (!table) {\n throw new Error('Entity metadata has not been bootstrapped');\n }\n const primaryKey = findPrimaryKey(table);\n const column = table.columns[primaryKey];\n if (!column) {\n throw new Error('Entity table does not expose a primary key');\n }\n const columnSelections = Object.values(table.columns).reduce<Record<string, ColumnDef>>((acc, col) => {\n acc[col.name] = col;\n return acc;\n }, {});\n const qb = selectFromEntity<TTable>(entityClass)\n .select(columnSelections)\n .where(eq(column, id))\n .limit(1);\n const rows = await executeHydrated(this, qb);\n return rows[0] ?? null;\n }\n\n async findOne<TTable extends TableDef>(qb: SelectQueryBuilder<any, TTable>): Promise<EntityInstance<TTable> | null> {\n const limited = qb.limit(1);\n const rows = await executeHydrated(this, limited);\n return rows[0] ?? null;\n }\n\n async findMany<TTable extends TableDef>(qb: SelectQueryBuilder<any, TTable>): Promise<EntityInstance<TTable>[]> {\n return executeHydrated(this, qb);\n }\n\n async persist(entity: object): Promise<void> {\n if (this.unitOfWork.findTracked(entity)) {\n return;\n }\n const table = getTableDefFromEntity((entity as any).constructor as EntityConstructor);\n if (!table) {\n throw new Error('Entity metadata has not been bootstrapped');\n }\n const primaryKey = findPrimaryKey(table);\n const pkValue = (entity as Record<string, any>)[primaryKey];\n if (pkValue !== undefined && pkValue !== null) {\n this.trackManaged(table, pkValue, entity);\n } else {\n this.trackNew(table, entity);\n }\n }\n\n async remove(entity: object): Promise<void> {\n this.markRemoved(entity);\n }\n\n async flush(): Promise<void> {\n await this.unitOfWork.flush();\n }\n\n private async flushWithHooks(): Promise<void> {\n for (const interceptor of this.interceptors) {\n await interceptor.beforeFlush?.(this);\n }\n\n await this.unitOfWork.flush();\n await this.relationChanges.process();\n await this.unitOfWork.flush();\n\n for (const interceptor of this.interceptors) {\n await interceptor.afterFlush?.(this);\n }\n }\n\n async commit(): Promise<void> {\n await runInTransaction(this.executor, async () => {\n await this.flushWithHooks();\n });\n\n await this.domainEvents.dispatch(this.unitOfWork.getTracked(), this);\n }\n\n async transaction<T>(fn: (session: OrmSession<E>) => Promise<T>): Promise<T> {\n // If the executor can't do transactions, just run and commit once.\n if (!this.executor.beginTransaction) {\n const result = await fn(this);\n await this.commit();\n return result;\n }\n\n await this.executor.beginTransaction();\n try {\n const result = await fn(this);\n await this.flushWithHooks();\n await this.executor.commitTransaction?.();\n await this.domainEvents.dispatch(this.unitOfWork.getTracked(), this);\n return result;\n } catch (err) {\n await this.rollback();\n throw err;\n }\n }\n\n async rollback(): Promise<void> {\n await this.executor.rollbackTransaction?.();\n this.unitOfWork.reset();\n this.relationChanges.reset();\n }\n\n getExecutionContext(): ExecutionContext {\n return {\n dialect: this.orm.dialect,\n executor: this.executor,\n interceptors: this.orm.interceptors\n };\n }\n\n getHydrationContext(): HydrationContext<E> {\n return {\n identityMap: this.identityMap,\n unitOfWork: this.unitOfWork,\n domainEvents: this.domainEvents,\n relationChanges: this.relationChanges,\n entityContext: this\n };\n }\n}\n\nconst buildRelationChangeEntry = (\n root: any,\n relationKey: RelationKey,\n rootTable: TableDef,\n relationName: string,\n relation: RelationDef,\n change: RelationChange<any>\n): RelationChangeEntry => ({\n root,\n relationKey,\n rootTable,\n relationName,\n relation,\n change\n});\n","import type { DbExecutor, QueryResult } from '../core/execution/db-executor.js';\r\n\r\nexport interface QueryContext {\r\n sql: string;\r\n params: unknown[];\r\n // maybe metadata like entity type, operation type, etc.\r\n}\r\n\r\nexport type QueryInterceptor = (ctx: QueryContext, next: () => Promise<QueryResult[]>) => Promise<QueryResult[]>;\r\n\r\nexport class InterceptorPipeline {\r\n private interceptors: QueryInterceptor[] = [];\r\n\r\n use(interceptor: QueryInterceptor) {\r\n this.interceptors.push(interceptor);\r\n }\r\n\r\n async run(ctx: QueryContext, executor: DbExecutor): Promise<QueryResult[]> {\r\n let i = 0;\r\n const dispatch = async (): Promise<QueryResult[]> => {\r\n const interceptor = this.interceptors[i++];\r\n if (!interceptor) {\r\n return executor.executeSql(ctx.sql, ctx.params);\r\n }\r\n return interceptor(ctx, dispatch);\r\n };\r\n return dispatch();\r\n }\r\n}\r\n","import type { DomainEvent, OrmDomainEvent } from './runtime-types.js';\r\nimport type { Dialect } from '../core/dialect/abstract.js';\r\nimport type { DbExecutor } from '../core/execution/db-executor.js';\r\nimport type { NamingStrategy } from '../codegen/naming-strategy.js';\r\nimport { InterceptorPipeline } from './interceptor-pipeline.js';\r\nimport { DefaultNamingStrategy } from '../codegen/naming-strategy.js';\r\nimport { OrmSession } from './orm-session.js';\r\n\r\nexport interface OrmOptions<E extends DomainEvent = OrmDomainEvent> {\r\n dialect: Dialect;\r\n executorFactory: DbExecutorFactory;\r\n interceptors?: InterceptorPipeline;\r\n namingStrategy?: NamingStrategy;\r\n // model registrations etc.\r\n}\r\n\r\nexport interface DbExecutorFactory {\r\n createExecutor(options?: { tx?: ExternalTransaction }): DbExecutor;\r\n createTransactionalExecutor(): DbExecutor;\r\n}\r\n\r\nexport interface ExternalTransaction {\r\n // Transaction-specific properties\r\n}\r\n\r\nexport class Orm<E extends DomainEvent = OrmDomainEvent> {\r\n readonly dialect: Dialect;\r\n readonly interceptors: InterceptorPipeline;\r\n readonly namingStrategy: NamingStrategy;\r\n private readonly executorFactory: DbExecutorFactory;\r\n\r\n constructor(opts: OrmOptions<E>) {\r\n this.dialect = opts.dialect;\r\n this.interceptors = opts.interceptors ?? new InterceptorPipeline();\r\n this.namingStrategy = opts.namingStrategy ?? new DefaultNamingStrategy();\r\n this.executorFactory = opts.executorFactory;\r\n }\r\n\r\n createSession(options?: { tx?: ExternalTransaction }): OrmSession<E> {\r\n const executor = this.executorFactory.createExecutor(options?.tx);\r\n return new OrmSession<E>({ orm: this, executor });\r\n }\r\n\r\n async transaction<T>(fn: (session: OrmSession<E>) => Promise<T>): Promise<T> {\r\n const executor = this.executorFactory.createTransactionalExecutor();\r\n const session = new OrmSession<E>({ orm: this, executor });\r\n try {\r\n const result = await fn(session);\r\n await session.commit();\r\n return result;\r\n } catch (err) {\r\n await session.rollback();\r\n throw err;\r\n } finally {\r\n // executor cleanup if needed\r\n }\r\n }\r\n}\r\n","import { ColumnDefLike, RelationMetadata } from '../orm/entity-metadata.js';\n\nexport interface StandardDecoratorContext {\n kind: string;\n name?: string | symbol;\n metadata?: Record<PropertyKey, unknown>;\n addInitializer?(initializer: (this: unknown) => void): void;\n static?: boolean;\n private?: boolean;\n}\n\nexport interface DualModePropertyDecorator {\n (target: object, propertyKey: string | symbol): void;\n (value: unknown, context: StandardDecoratorContext): void;\n}\n\nexport interface DualModeClassDecorator {\n <TFunction extends Function>(value: TFunction): void | TFunction;\n <TFunction extends Function>(value: TFunction, context: StandardDecoratorContext): void | TFunction;\n}\n\nexport interface DecoratorMetadataBag {\n columns: Array<{ propertyName: string; column: ColumnDefLike }>;\n relations: Array<{ propertyName: string; relation: RelationMetadata }>;\n}\n\nconst METADATA_KEY = 'metal-orm:decorators';\n\nexport const isStandardDecoratorContext = (value: unknown): value is StandardDecoratorContext => {\n return typeof value === 'object' && value !== null && 'kind' in (value as any);\n};\n\nexport const getOrCreateMetadataBag = (context: StandardDecoratorContext): DecoratorMetadataBag => {\n const metadata = context.metadata || (context.metadata = {} as Record<PropertyKey, unknown>);\n const existing = metadata[METADATA_KEY] as DecoratorMetadataBag | undefined;\n if (existing) {\n return existing;\n }\n const bag: DecoratorMetadataBag = { columns: [], relations: [] };\n metadata[METADATA_KEY] = bag;\n return bag;\n};\n\nexport const readMetadataBag = (context: StandardDecoratorContext): DecoratorMetadataBag | undefined => {\n return context.metadata?.[METADATA_KEY] as DecoratorMetadataBag | undefined;\n};\n\nexport const registerInitializer = (\n context: StandardDecoratorContext,\n initializer: (this: unknown) => void\n): void => {\n context.addInitializer?.(initializer);\n};\n","import { TableHooks } from '../schema/table.js';\nimport {\n addColumnMetadata,\n addRelationMetadata,\n EntityConstructor,\n ensureEntityMetadata,\n setEntityTableName\n} from '../orm/entity-metadata.js';\nimport { DualModeClassDecorator, isStandardDecoratorContext, readMetadataBag } from './decorator-metadata.js';\n\nexport interface EntityOptions {\n tableName?: string;\n hooks?: TableHooks;\n}\n\nconst toSnakeCase = (value: string): string => {\n return value\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/[^a-z0-9_]+/gi, '_')\n .replace(/__+/g, '_')\n .replace(/^_|_$/g, '')\n .toLowerCase();\n};\n\nconst deriveTableNameFromConstructor = (ctor: Function): string => {\n const fallback = 'unknown';\n const rawName = ctor.name || fallback;\n const strippedName = rawName.replace(/Entity$/i, '');\n const normalized = toSnakeCase(strippedName || rawName);\n if (!normalized) {\n return fallback;\n }\n return normalized.endsWith('s') ? normalized : `${normalized}s`;\n};\n\nexport function Entity(options: EntityOptions = {}) {\n const decorator: DualModeClassDecorator = value => {\n const tableName = options.tableName ?? deriveTableNameFromConstructor(value);\n setEntityTableName(value as EntityConstructor, tableName, options.hooks);\n\n return value;\n };\n\n const decoratorWithContext: DualModeClassDecorator = (value, context?) => {\n const ctor = value as EntityConstructor;\n decorator(ctor);\n\n if (context && isStandardDecoratorContext(context)) {\n const bag = readMetadataBag(context);\n if (bag) {\n const meta = ensureEntityMetadata(ctor);\n for (const entry of bag.columns) {\n if (!meta.columns[entry.propertyName]) {\n addColumnMetadata(ctor, entry.propertyName, { ...entry.column });\n }\n }\n for (const entry of bag.relations) {\n if (!meta.relations[entry.propertyName]) {\n addRelationMetadata(ctor, entry.propertyName, entry.relation);\n }\n }\n }\n }\n\n return ctor;\n };\n\n return decoratorWithContext;\n}\n","import { ColumnDef, ColumnType } from '../schema/column.js';\nimport {\n addColumnMetadata,\n EntityConstructor,\n ColumnDefLike,\n ensureEntityMetadata\n} from '../orm/entity-metadata.js';\nimport {\n DualModePropertyDecorator,\n getOrCreateMetadataBag,\n isStandardDecoratorContext,\n registerInitializer,\n StandardDecoratorContext\n} from './decorator-metadata.js';\n\nexport interface ColumnOptions {\n type: ColumnType;\n args?: ColumnDef['args'];\n notNull?: boolean;\n primary?: boolean;\n tsType?: ColumnDef['tsType'];\n}\n\nexport type ColumnInput = ColumnOptions | ColumnDef<any, any>;\n\nconst normalizeColumnInput = (input: ColumnInput): ColumnDefLike => {\n const asOptions = input as ColumnOptions;\n const asDefinition = input as ColumnDef;\n const column: ColumnDefLike = {\n type: asOptions.type ?? asDefinition.type,\n args: asOptions.args ?? asDefinition.args,\n notNull: asOptions.notNull ?? asDefinition.notNull,\n primary: asOptions.primary ?? asDefinition.primary,\n tsType: asDefinition.tsType ?? asOptions.tsType,\n unique: asDefinition.unique,\n default: asDefinition.default,\n autoIncrement: asDefinition.autoIncrement,\n generated: asDefinition.generated,\n check: asDefinition.check,\n references: asDefinition.references,\n comment: asDefinition.comment\n };\n\n if (!column.type) {\n throw new Error('Column decorator requires a column type');\n }\n\n return column;\n};\n\nconst normalizePropertyName = (name: string | symbol): string => {\n if (typeof name === 'symbol') {\n return name.description ?? name.toString();\n }\n return name;\n};\n\nconst resolveConstructor = (target: unknown): EntityConstructor | undefined => {\n if (typeof target === 'function') {\n return target as EntityConstructor;\n }\n\n if (target && typeof (target as any).constructor === 'function') {\n return (target as any).constructor as EntityConstructor;\n }\n\n return undefined;\n};\n\nconst registerColumn = (ctor: EntityConstructor, propertyName: string, column: ColumnDefLike): void => {\n const meta = ensureEntityMetadata(ctor);\n if (meta.columns[propertyName]) {\n return;\n }\n addColumnMetadata(ctor, propertyName, column);\n};\n\nconst registerColumnFromContext = (\n context: StandardDecoratorContext,\n column: ColumnDefLike\n): void => {\n if (!context.name) {\n throw new Error('Column decorator requires a property name');\n }\n const propertyName = normalizePropertyName(context.name);\n const bag = getOrCreateMetadataBag(context);\n if (!bag.columns.some(entry => entry.propertyName === propertyName)) {\n bag.columns.push({ propertyName, column: { ...column } });\n }\n\n registerInitializer(context, function () {\n const ctor = resolveConstructor(this);\n if (!ctor) {\n return;\n }\n registerColumn(ctor, propertyName, column);\n });\n};\n\nexport function Column(definition: ColumnInput) {\n const normalized = normalizeColumnInput(definition);\n const decorator: DualModePropertyDecorator = (targetOrValue, propertyKeyOrContext) => {\n if (isStandardDecoratorContext(propertyKeyOrContext)) {\n registerColumnFromContext(propertyKeyOrContext, normalized);\n return;\n }\n\n const propertyName = normalizePropertyName(propertyKeyOrContext);\n const ctor = resolveConstructor(targetOrValue);\n if (!ctor) {\n throw new Error('Unable to resolve constructor when registering column metadata');\n }\n registerColumn(ctor, propertyName, { ...normalized });\n };\n\n return decorator;\n}\n\nexport function PrimaryKey(definition: ColumnInput) {\n const normalized = normalizeColumnInput(definition);\n normalized.primary = true;\n return Column(normalized);\n}\n","import { CascadeMode, RelationKinds } from '../schema/relation.js';\nimport {\n addRelationMetadata,\n EntityConstructor,\n EntityOrTableTargetResolver,\n RelationMetadata\n} from '../orm/entity-metadata.js';\nimport {\n DualModePropertyDecorator,\n getOrCreateMetadataBag,\n isStandardDecoratorContext,\n registerInitializer,\n StandardDecoratorContext\n} from './decorator-metadata.js';\n\ninterface BaseRelationOptions {\n target: EntityOrTableTargetResolver;\n cascade?: CascadeMode;\n localKey?: string;\n}\n\nexport interface HasManyOptions extends BaseRelationOptions {\n foreignKey: string;\n}\n\nexport interface HasOneOptions extends BaseRelationOptions {\n foreignKey: string;\n}\n\nexport interface BelongsToOptions extends BaseRelationOptions {\n foreignKey: string;\n}\n\nexport interface BelongsToManyOptions {\n target: EntityOrTableTargetResolver;\n pivotTable: EntityOrTableTargetResolver;\n pivotForeignKeyToRoot: string;\n pivotForeignKeyToTarget: string;\n localKey?: string;\n targetKey?: string;\n pivotPrimaryKey?: string;\n defaultPivotColumns?: string[];\n cascade?: CascadeMode;\n}\n\nconst normalizePropertyName = (name: string | symbol): string => {\n if (typeof name === 'symbol') {\n return name.description ?? name.toString();\n }\n return name;\n};\n\nconst resolveConstructor = (instanceOrCtor: unknown): EntityConstructor | undefined => {\n if (typeof instanceOrCtor === 'function') {\n return instanceOrCtor as EntityConstructor;\n }\n if (instanceOrCtor && typeof (instanceOrCtor as any).constructor === 'function') {\n return (instanceOrCtor as any).constructor as EntityConstructor;\n }\n return undefined;\n};\n\nconst registerRelation = (ctor: EntityConstructor, propertyName: string, metadata: RelationMetadata): void => {\n addRelationMetadata(ctor, propertyName, metadata);\n};\n\nconst createFieldDecorator = (\n metadataFactory: (propertyName: string) => RelationMetadata\n) => {\n const decorator: DualModePropertyDecorator = (targetOrValue, propertyKeyOrContext) => {\n if (isStandardDecoratorContext(propertyKeyOrContext)) {\n const ctx = propertyKeyOrContext as StandardDecoratorContext;\n if (!ctx.name) {\n throw new Error('Relation decorator requires a property name');\n }\n const propertyName = normalizePropertyName(ctx.name);\n const bag = getOrCreateMetadataBag(ctx);\n const relationMetadata = metadataFactory(propertyName);\n\n if (!bag.relations.some(entry => entry.propertyName === propertyName)) {\n bag.relations.push({ propertyName, relation: relationMetadata });\n }\n\n registerInitializer(ctx, function () {\n const ctor = resolveConstructor(this);\n if (!ctor) {\n return;\n }\n registerRelation(ctor, propertyName, relationMetadata);\n });\n return;\n }\n\n const propertyName = normalizePropertyName(propertyKeyOrContext);\n const ctor = resolveConstructor(targetOrValue);\n if (!ctor) {\n throw new Error('Unable to resolve constructor when registering relation metadata');\n }\n registerRelation(ctor, propertyName, metadataFactory(propertyName));\n };\n\n return decorator;\n};\n\nexport function HasMany(options: HasManyOptions) {\n return createFieldDecorator(propertyName => ({\n kind: RelationKinds.HasMany,\n propertyKey: propertyName,\n target: options.target,\n foreignKey: options.foreignKey,\n localKey: options.localKey,\n cascade: options.cascade\n }));\n}\n\nexport function HasOne(options: HasOneOptions) {\n return createFieldDecorator(propertyName => ({\n kind: RelationKinds.HasOne,\n propertyKey: propertyName,\n target: options.target,\n foreignKey: options.foreignKey,\n localKey: options.localKey,\n cascade: options.cascade\n }));\n}\n\nexport function BelongsTo(options: BelongsToOptions) {\n return createFieldDecorator(propertyName => ({\n kind: RelationKinds.BelongsTo,\n propertyKey: propertyName,\n target: options.target,\n foreignKey: options.foreignKey,\n localKey: options.localKey,\n cascade: options.cascade\n }));\n}\n\nexport function BelongsToMany(options: BelongsToManyOptions) {\n return createFieldDecorator(propertyName => ({\n kind: RelationKinds.BelongsToMany,\n propertyKey: propertyName,\n target: options.target,\n pivotTable: options.pivotTable,\n pivotForeignKeyToRoot: options.pivotForeignKeyToRoot,\n pivotForeignKeyToTarget: options.pivotForeignKeyToTarget,\n localKey: options.localKey,\n targetKey: options.targetKey,\n pivotPrimaryKey: options.pivotPrimaryKey,\n defaultPivotColumns: options.defaultPivotColumns,\n cascade: options.cascade\n }));\n}\n","// src/core/execution/db-executor.ts\r\n\r\n// low-level canonical shape\r\nexport type QueryResult = {\r\n columns: string[];\r\n values: unknown[][];\r\n};\r\n\r\nexport interface DbExecutor {\r\n executeSql(sql: string, params?: unknown[]): Promise<QueryResult[]>;\r\n\r\n beginTransaction?(): Promise<void>;\r\n commitTransaction?(): Promise<void>;\r\n rollbackTransaction?(): Promise<void>;\r\n}\r\n\r\n// --- helpers ---\r\n\r\n/**\r\n * Convert an array of row objects into a QueryResult.\r\n */\r\nexport function rowsToQueryResult(\r\n rows: Array<Record<string, unknown>>\r\n): QueryResult {\r\n if (rows.length === 0) {\r\n return { columns: [], values: [] };\r\n }\r\n\r\n const columns = Object.keys(rows[0]);\r\n const values = rows.map(row => columns.map(c => (row as any)[c]));\r\n return { columns, values };\r\n}\r\n\r\n/**\r\n * Minimal contract that most SQL clients can implement.\r\n */\r\nexport interface SimpleQueryRunner {\r\n query(\r\n sql: string,\r\n params?: unknown[]\r\n ): Promise<Array<Record<string, unknown>>>;\r\n beginTransaction?(): Promise<void>;\r\n commitTransaction?(): Promise<void>;\r\n rollbackTransaction?(): Promise<void>;\r\n}\r\n\r\n/**\r\n * Generic factory: turn any SimpleQueryRunner into a DbExecutor.\r\n */\r\nexport function createExecutorFromQueryRunner(\r\n runner: SimpleQueryRunner\r\n): DbExecutor {\r\n return {\r\n async executeSql(sql, params) {\r\n const rows = await runner.query(sql, params);\r\n const result = rowsToQueryResult(rows);\r\n return [result];\r\n },\r\n beginTransaction: runner.beginTransaction?.bind(runner),\r\n commitTransaction: runner.commitTransaction?.bind(runner),\r\n rollbackTransaction: runner.rollbackTransaction?.bind(runner),\r\n };\r\n}\r\n","// src/core/execution/executors/postgres-executor.ts\r\nimport {\r\n DbExecutor,\r\n createExecutorFromQueryRunner\r\n} from '../db-executor.js';\r\n\r\nexport interface PostgresClientLike {\r\n query(\r\n text: string,\r\n params?: unknown[]\r\n ): Promise<{ rows: Array<Record<string, unknown>> }>;\r\n}\r\n\r\nexport function createPostgresExecutor(\r\n client: PostgresClientLike\r\n): DbExecutor {\r\n return createExecutorFromQueryRunner({\r\n async query(sql, params) {\r\n const { rows } = await client.query(sql, params as any[]);\r\n return rows;\r\n },\r\n async beginTransaction() {\r\n await client.query('BEGIN');\r\n },\r\n async commitTransaction() {\r\n await client.query('COMMIT');\r\n },\r\n async rollbackTransaction() {\r\n await client.query('ROLLBACK');\r\n },\r\n });\r\n}\r\n","// src/core/execution/executors/mysql-executor.ts\r\nimport {\r\n DbExecutor,\r\n rowsToQueryResult\r\n} from '../db-executor.js';\r\n\r\nexport interface MysqlClientLike {\r\n query(\r\n sql: string,\r\n params?: unknown[]\r\n ): Promise<[any, any?]>; // rows, metadata\r\n beginTransaction?(): Promise<void>;\r\n commit?(): Promise<void>;\r\n rollback?(): Promise<void>;\r\n}\r\n\r\nexport function createMysqlExecutor(\r\n client: MysqlClientLike\r\n): DbExecutor {\r\n return {\r\n async executeSql(sql, params) {\r\n const [rows] = await client.query(sql, params as any[]);\r\n\r\n if (!Array.isArray(rows)) {\r\n // e.g. insert/update returning only headers, treat as no rows\r\n return [{ columns: [], values: [] }];\r\n }\r\n\r\n const result = rowsToQueryResult(\r\n rows as Array<Record<string, unknown>>\r\n );\r\n return [result];\r\n },\r\n async beginTransaction() {\r\n if (!client.beginTransaction) return;\r\n await client.beginTransaction();\r\n },\r\n async commitTransaction() {\r\n if (!client.commit) return;\r\n await client.commit();\r\n },\r\n async rollbackTransaction() {\r\n if (!client.rollback) return;\r\n await client.rollback();\r\n },\r\n };\r\n}\r\n","// src/core/execution/executors/sqlite-executor.ts\r\nimport {\r\n DbExecutor,\r\n rowsToQueryResult\r\n} from '../db-executor.js';\r\n\r\nexport interface SqliteClientLike {\r\n all(\r\n sql: string,\r\n params?: unknown[]\r\n ): Promise<Array<Record<string, unknown>>>;\r\n run?(sql: string, params?: unknown[]): Promise<unknown>;\r\n beginTransaction?(): Promise<void>;\r\n commitTransaction?(): Promise<void>;\r\n rollbackTransaction?(): Promise<void>;\r\n}\r\n\r\nexport function createSqliteExecutor(\r\n client: SqliteClientLike\r\n): DbExecutor {\r\n return {\r\n async executeSql(sql, params) {\r\n const rows = await client.all(sql, params);\r\n const result = rowsToQueryResult(rows);\r\n return [result];\r\n },\r\n beginTransaction: client.beginTransaction?.bind(client),\r\n commitTransaction: client.commitTransaction?.bind(client),\r\n rollbackTransaction: client.rollbackTransaction?.bind(client),\r\n };\r\n}\r\n","// src/core/execution/executors/mssql-executor.ts\r\nimport {\r\n DbExecutor,\r\n rowsToQueryResult\r\n} from '../db-executor.js';\r\n\r\nexport interface MssqlClientLike {\r\n query(\r\n sql: string,\r\n params?: unknown[]\r\n ): Promise<{ recordset: Array<Record<string, unknown>> }>;\r\n beginTransaction?(): Promise<void>;\r\n commit?(): Promise<void>;\r\n rollback?(): Promise<void>;\r\n}\r\n\r\nexport function createMssqlExecutor(\r\n client: MssqlClientLike\r\n): DbExecutor {\r\n return {\r\n async executeSql(sql, params) {\r\n const { recordset } = await client.query(sql, params);\r\n const result = rowsToQueryResult(recordset ?? []);\r\n return [result];\r\n },\r\n async beginTransaction() {\r\n if (!client.beginTransaction) return;\r\n await client.beginTransaction();\r\n },\r\n async commitTransaction() {\r\n if (!client.commit) return;\r\n await client.commit();\r\n },\r\n async rollbackTransaction() {\r\n if (!client.rollback) return;\r\n await client.rollback();\r\n },\r\n };\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Tedious integration helper (driver adapter)\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface TediousColumn {\r\n metadata: { colName: string };\r\n value: unknown;\r\n}\r\n\r\nexport interface TediousRequest {\r\n addParameter(name: string, type: unknown, value: unknown): void;\r\n on(event: 'row', listener: (columns: TediousColumn[]) => void): void;\r\n}\r\n\r\nexport interface TediousRequestCtor {\r\n new (sql: string, callback: (err?: Error | null) => void): TediousRequest;\r\n}\r\n\r\nexport interface TediousTypes {\r\n NVarChar: unknown;\r\n Int: unknown;\r\n Float: unknown;\r\n BigInt: unknown;\r\n Bit: unknown;\r\n DateTime: unknown;\r\n VarBinary: unknown;\r\n}\r\n\r\nexport interface TediousModule {\r\n Request: TediousRequestCtor;\r\n TYPES: TediousTypes;\r\n}\r\n\r\nexport interface TediousConnectionLike {\r\n execSql(request: TediousRequest): void;\r\n beginTransaction?(cb: (err?: Error | null) => void): void;\r\n commitTransaction?(cb: (err?: Error | null) => void): void;\r\n rollbackTransaction?(cb: (err?: Error | null) => void): void;\r\n}\r\n\r\nexport interface CreateTediousClientOptions {\r\n inferType?(value: unknown, TYPES: TediousTypes): unknown;\r\n}\r\n\r\nconst defaultInferType = (value: unknown, TYPES: TediousTypes): unknown => {\r\n if (value === null || value === undefined) return TYPES.NVarChar;\r\n if (typeof value === 'number') {\r\n return Number.isInteger(value) ? TYPES.Int : TYPES.Float;\r\n }\r\n if (typeof value === 'bigint') return TYPES.BigInt;\r\n if (typeof value === 'boolean') return TYPES.Bit;\r\n if (value instanceof Date) return TYPES.DateTime;\r\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) {\r\n return TYPES.VarBinary;\r\n }\r\n return TYPES.NVarChar;\r\n};\r\n\r\nexport function createTediousMssqlClient(\r\n connection: TediousConnectionLike,\r\n { Request, TYPES }: TediousModule,\r\n options?: CreateTediousClientOptions\r\n): MssqlClientLike {\r\n const inferType = options?.inferType ?? defaultInferType;\r\n\r\n return {\r\n async query(sql: string, params: unknown[] = []) {\r\n const rows = await new Promise<Array<Record<string, unknown>>>(\r\n (resolve, reject) => {\r\n const collected: Record<string, unknown>[] = [];\r\n\r\n const request = new Request(sql, err => {\r\n if (err) return reject(err);\r\n resolve(collected);\r\n });\r\n\r\n params.forEach((value, idx) => {\r\n const sqlType = inferType(value, TYPES);\r\n request.addParameter(\r\n `p${idx + 1}`,\r\n sqlType,\r\n value as unknown\r\n );\r\n });\r\n\r\n request.on('row', cols => {\r\n const row: Record<string, unknown> = {};\r\n for (const col of cols) {\r\n row[col.metadata.colName] = col.value;\r\n }\r\n collected.push(row);\r\n });\r\n\r\n connection.execSql(request);\r\n }\r\n );\r\n\r\n return { recordset: rows };\r\n },\r\n\r\n beginTransaction: connection.beginTransaction\r\n ? () =>\r\n new Promise<void>((resolve, reject) => {\r\n connection.beginTransaction!(err =>\r\n err ? reject(err) : resolve()\r\n );\r\n })\r\n : undefined,\r\n\r\n commit: connection.commitTransaction\r\n ? () =>\r\n new Promise<void>((resolve, reject) => {\r\n connection.commitTransaction!(err =>\r\n err ? reject(err) : resolve()\r\n );\r\n })\r\n : undefined,\r\n\r\n rollback: connection.rollbackTransaction\r\n ? () =>\r\n new Promise<void>((resolve, reject) => {\r\n connection.rollbackTransaction!(err =>\r\n err ? reject(err) : resolve()\r\n );\r\n })\r\n : undefined,\r\n };\r\n}\r\n\r\nexport function createTediousExecutor(\r\n connection: TediousConnectionLike,\r\n module: TediousModule,\r\n options?: CreateTediousClientOptions\r\n): DbExecutor {\r\n const client = createTediousMssqlClient(connection, module, options);\r\n return createMssqlExecutor(client);\r\n}\r\n"],"mappings":"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","names":["length","col","left","right","lower","upper","col","col","col","upper","left","right","lower","col","fn","col","col","fn","col","col","col","col","col","col","col","fn","col","col","state","hydration","relationSelectionResult","col","col","toKey","toKey","hideInternal","toKey","hideInternal","toKey","hideInternal","toKey","toKey","hasOne","hasMany","belongsTo","col","col","col","col","col","executeSchemaPlan","col","col","toOperand","length","count","isColumnDef","toOperand","fn","isColumnDef","toOperand","fn","assertNever","col","sel","left","right","fn","lower","upper","EntityStatus","col","fn","fn","normalizePropertyName","resolveConstructor","propertyName","ctor","col","module"]}
|