@warlock.js/cascade 5.31.0 → 5.32.0

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.
Files changed (230) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/cjs/index.cjs +104 -85
  3. package/cjs/index.cjs.map +1 -1
  4. package/esm/context/database-data-source-context.d.mts +2 -3
  5. package/esm/context/database-data-source-context.d.mts.map +1 -1
  6. package/esm/context/database-transaction-context.d.mts +2 -3
  7. package/esm/context/database-transaction-context.d.mts.map +1 -1
  8. package/esm/contracts/database-driver.contract.d.mts +56 -36
  9. package/esm/contracts/database-driver.contract.d.mts.map +1 -1
  10. package/esm/contracts/database-id-generator.contract.d.mts +7 -5
  11. package/esm/contracts/database-id-generator.contract.d.mts.map +1 -1
  12. package/esm/contracts/database-remover.contract.d.mts +3 -5
  13. package/esm/contracts/database-remover.contract.d.mts.map +1 -1
  14. package/esm/contracts/database-restorer.contract.d.mts +6 -6
  15. package/esm/contracts/database-restorer.contract.d.mts.map +1 -1
  16. package/esm/contracts/database-writer.contract.d.mts +4 -6
  17. package/esm/contracts/database-writer.contract.d.mts.map +1 -1
  18. package/esm/contracts/driver-blueprint.contract.d.mts +2 -3
  19. package/esm/contracts/driver-blueprint.contract.d.mts.map +1 -1
  20. package/esm/contracts/index.d.mts +2 -1
  21. package/esm/contracts/migration-driver.contract.d.mts +101 -53
  22. package/esm/contracts/migration-driver.contract.d.mts.map +1 -1
  23. package/esm/contracts/query-builder.contract.d.mts +51 -33
  24. package/esm/contracts/query-builder.contract.d.mts.map +1 -1
  25. package/esm/contracts/sync-adapter.contract.d.mts +25 -14
  26. package/esm/contracts/sync-adapter.contract.d.mts.map +1 -1
  27. package/esm/data-source/data-source-registry.d.mts +4 -5
  28. package/esm/data-source/data-source-registry.d.mts.map +1 -1
  29. package/esm/data-source/data-source.d.mts +8 -5
  30. package/esm/data-source/data-source.d.mts.map +1 -1
  31. package/esm/database-dirty-tracker.d.mts +2 -2
  32. package/esm/database-dirty-tracker.d.mts.map +1 -1
  33. package/esm/database-dirty-tracker.mjs +3 -2
  34. package/esm/database-dirty-tracker.mjs.map +1 -1
  35. package/esm/drivers/mongodb/mongodb-driver.d.mts +3 -4
  36. package/esm/drivers/mongodb/mongodb-driver.d.mts.map +1 -1
  37. package/esm/drivers/mongodb/mongodb-id-generator.d.mts +2 -3
  38. package/esm/drivers/mongodb/mongodb-id-generator.d.mts.map +1 -1
  39. package/esm/drivers/mongodb/mongodb-migration-driver.d.mts +1 -3
  40. package/esm/drivers/mongodb/mongodb-migration-driver.d.mts.map +1 -1
  41. package/esm/drivers/mongodb/mongodb-query-builder.d.mts +2 -3
  42. package/esm/drivers/mongodb/mongodb-query-builder.d.mts.map +1 -1
  43. package/esm/drivers/mongodb/mongodb-query-builder.mjs +8 -5
  44. package/esm/drivers/mongodb/mongodb-query-builder.mjs.map +1 -1
  45. package/esm/drivers/mongodb/mongodb-query-operations.d.mts +1 -3
  46. package/esm/drivers/mongodb/mongodb-query-operations.d.mts.map +1 -1
  47. package/esm/drivers/mongodb/mongodb-query-parser.d.mts +7 -6
  48. package/esm/drivers/mongodb/mongodb-query-parser.d.mts.map +1 -1
  49. package/esm/drivers/mongodb/mongodb-query-parser.mjs +2 -6
  50. package/esm/drivers/mongodb/mongodb-query-parser.mjs.map +1 -1
  51. package/esm/drivers/mongodb/mongodb-sync-adapter.d.mts +1 -3
  52. package/esm/drivers/mongodb/mongodb-sync-adapter.d.mts.map +1 -1
  53. package/esm/drivers/mongodb/types.d.mts +11 -9
  54. package/esm/drivers/mongodb/types.d.mts.map +1 -1
  55. package/esm/drivers/postgres/index.d.mts +2 -1
  56. package/esm/drivers/postgres/index.mjs +1 -1
  57. package/esm/drivers/postgres/naming.mjs +1 -1
  58. package/esm/drivers/postgres/postgres-blueprint.d.mts +1 -3
  59. package/esm/drivers/postgres/postgres-blueprint.d.mts.map +1 -1
  60. package/esm/drivers/postgres/postgres-dialect.d.mts +4 -6
  61. package/esm/drivers/postgres/postgres-dialect.d.mts.map +1 -1
  62. package/esm/drivers/postgres/postgres-driver.d.mts +4 -5
  63. package/esm/drivers/postgres/postgres-driver.d.mts.map +1 -1
  64. package/esm/drivers/postgres/postgres-migration-driver.d.mts +1 -3
  65. package/esm/drivers/postgres/postgres-migration-driver.d.mts.map +1 -1
  66. package/esm/drivers/postgres/postgres-migration-driver.mjs +13 -10
  67. package/esm/drivers/postgres/postgres-migration-driver.mjs.map +1 -1
  68. package/esm/drivers/postgres/postgres-query-builder.d.mts +4 -4
  69. package/esm/drivers/postgres/postgres-query-builder.d.mts.map +1 -1
  70. package/esm/drivers/postgres/postgres-query-builder.mjs +14 -10
  71. package/esm/drivers/postgres/postgres-query-builder.mjs.map +1 -1
  72. package/esm/drivers/postgres/postgres-query-parser.d.mts +16 -11
  73. package/esm/drivers/postgres/postgres-query-parser.d.mts.map +1 -1
  74. package/esm/drivers/postgres/postgres-query-parser.mjs +1 -1
  75. package/esm/drivers/postgres/postgres-query-parser.mjs.map +1 -1
  76. package/esm/drivers/postgres/postgres-sql-serializer.mjs +13 -10
  77. package/esm/drivers/postgres/postgres-sql-serializer.mjs.map +1 -1
  78. package/esm/drivers/postgres/postgres-ttl-purge.mjs +1 -1
  79. package/esm/drivers/postgres/postgres-type-converters.mjs +2 -2
  80. package/esm/drivers/postgres/postgres-type-converters.mjs.map +1 -1
  81. package/esm/drivers/postgres/postgres-update-validator.mjs +1 -1
  82. package/esm/drivers/postgres/postgres-update-validator.mjs.map +1 -1
  83. package/esm/drivers/postgres/types.d.mts +87 -45
  84. package/esm/drivers/postgres/types.d.mts.map +1 -1
  85. package/esm/drivers/sql/sql-dialect.contract.d.mts +1 -3
  86. package/esm/drivers/sql/sql-dialect.contract.d.mts.map +1 -1
  87. package/esm/drivers/sql/sql-types.d.mts +113 -59
  88. package/esm/drivers/sql/sql-types.d.mts.map +1 -1
  89. package/esm/errors/missing-data-source.error.d.mts +1 -2
  90. package/esm/errors/missing-data-source.error.d.mts.map +1 -1
  91. package/esm/errors/transaction-rollback.error.d.mts +1 -2
  92. package/esm/errors/transaction-rollback.error.d.mts.map +1 -1
  93. package/esm/errors/undefined-where-value.error.d.mts +1 -2
  94. package/esm/errors/undefined-where-value.error.d.mts.map +1 -1
  95. package/esm/errors/unsafe-filter.error.d.mts +1 -2
  96. package/esm/errors/unsafe-filter.error.d.mts.map +1 -1
  97. package/esm/errors/unsafe-raw-expression.error.d.mts +1 -2
  98. package/esm/errors/unsafe-raw-expression.error.d.mts.map +1 -1
  99. package/esm/errors/unsupported-lean-operation.error.d.mts +1 -2
  100. package/esm/errors/unsupported-lean-operation.error.d.mts.map +1 -1
  101. package/esm/errors/unsupported-lock-for-update.error.d.mts +1 -2
  102. package/esm/errors/unsupported-lock-for-update.error.d.mts.map +1 -1
  103. package/esm/errors/unsupported-query-operation.error.d.mts +1 -2
  104. package/esm/errors/unsupported-query-operation.error.d.mts.map +1 -1
  105. package/esm/errors/unsupported-update-operation.error.d.mts +1 -2
  106. package/esm/errors/unsupported-update-operation.error.d.mts.map +1 -1
  107. package/esm/events/model-events.d.mts +8 -6
  108. package/esm/events/model-events.d.mts.map +1 -1
  109. package/esm/expressions/aggregate-expressions.d.mts +7 -7
  110. package/esm/expressions/aggregate-expressions.d.mts.map +1 -1
  111. package/esm/expressions/column-expressions.d.mts +11 -11
  112. package/esm/expressions/column-expressions.d.mts.map +1 -1
  113. package/esm/index.d.mts +7 -2
  114. package/esm/index.mjs +1 -1
  115. package/esm/migration/column-builder.d.mts +2 -3
  116. package/esm/migration/column-builder.d.mts.map +1 -1
  117. package/esm/migration/column-helpers.d.mts +49 -50
  118. package/esm/migration/column-helpers.d.mts.map +1 -1
  119. package/esm/migration/column-helpers.mjs +1 -1
  120. package/esm/migration/foreign-key-builder.d.mts +2 -3
  121. package/esm/migration/foreign-key-builder.d.mts.map +1 -1
  122. package/esm/migration/index.d.mts +3 -2
  123. package/esm/migration/index.mjs +2 -2
  124. package/esm/migration/migration-runner.d.mts +7 -6
  125. package/esm/migration/migration-runner.d.mts.map +1 -1
  126. package/esm/migration/migration-runner.mjs +15 -11
  127. package/esm/migration/migration-runner.mjs.map +1 -1
  128. package/esm/migration/migration.d.mts +50 -32
  129. package/esm/migration/migration.d.mts.map +1 -1
  130. package/esm/migration/migration.mjs +1 -3
  131. package/esm/migration/migration.mjs.map +1 -1
  132. package/esm/migration/sql-serializer.d.mts +1 -3
  133. package/esm/migration/sql-serializer.d.mts.map +1 -1
  134. package/esm/migration/types.d.mts +7 -7
  135. package/esm/migration/types.d.mts.map +1 -1
  136. package/esm/model/methods/accessor-methods.mjs +1 -1
  137. package/esm/model/methods/accessor-methods.mjs.map +1 -1
  138. package/esm/model/methods/meta-methods.mjs +4 -2
  139. package/esm/model/methods/meta-methods.mjs.map +1 -1
  140. package/esm/model/methods/query-methods.mjs +1 -1
  141. package/esm/model/methods/write-methods.d.mts +3 -2
  142. package/esm/model/methods/write-methods.d.mts.map +1 -1
  143. package/esm/model/methods/write-methods.mjs +5 -2
  144. package/esm/model/methods/write-methods.mjs.map +1 -1
  145. package/esm/model/model.d.mts +9 -9
  146. package/esm/model/model.d.mts.map +1 -1
  147. package/esm/model/model.types.d.mts +7 -7
  148. package/esm/model/model.types.d.mts.map +1 -1
  149. package/esm/model/register-model.d.mts +13 -15
  150. package/esm/model/register-model.d.mts.map +1 -1
  151. package/esm/model/relation-decorators.d.mts +6 -8
  152. package/esm/model/relation-decorators.d.mts.map +1 -1
  153. package/esm/operations/database.d.mts +13 -8
  154. package/esm/operations/database.d.mts.map +1 -1
  155. package/esm/operations/index.d.mts +2 -1
  156. package/esm/operations/index.mjs +1 -1
  157. package/esm/operations/migrations.d.mts +18 -14
  158. package/esm/operations/migrations.d.mts.map +1 -1
  159. package/esm/query-builder/query-builder.d.mts +2 -4
  160. package/esm/query-builder/query-builder.d.mts.map +1 -1
  161. package/esm/query-builder/query-builder.mjs +12 -11
  162. package/esm/query-builder/query-builder.mjs.map +1 -1
  163. package/esm/relations/index.d.mts +2 -1
  164. package/esm/relations/index.mjs +1 -1
  165. package/esm/relations/key-conventions.mjs +2 -1
  166. package/esm/relations/key-conventions.mjs.map +1 -1
  167. package/esm/relations/pivot-operations.d.mts +3 -5
  168. package/esm/relations/pivot-operations.d.mts.map +1 -1
  169. package/esm/relations/relation-hydrator.d.mts +3 -5
  170. package/esm/relations/relation-hydrator.d.mts.map +1 -1
  171. package/esm/relations/relation-loader.d.mts +2 -4
  172. package/esm/relations/relation-loader.d.mts.map +1 -1
  173. package/esm/relations/relation-loader.mjs +4 -5
  174. package/esm/relations/relation-loader.mjs.map +1 -1
  175. package/esm/relations/types.d.mts +14 -15
  176. package/esm/relations/types.d.mts.map +1 -1
  177. package/esm/remover/database-remover.d.mts +1 -3
  178. package/esm/remover/database-remover.d.mts.map +1 -1
  179. package/esm/restorer/database-restorer.d.mts +1 -3
  180. package/esm/restorer/database-restorer.d.mts.map +1 -1
  181. package/esm/restorer/database-restorer.mjs +2 -1
  182. package/esm/restorer/database-restorer.mjs.map +1 -1
  183. package/esm/sql-database-dirty-tracker.d.mts +1 -3
  184. package/esm/sql-database-dirty-tracker.d.mts.map +1 -1
  185. package/esm/sync/model-events.mjs +1 -1
  186. package/esm/sync/model-sync-operation.d.mts +2 -4
  187. package/esm/sync/model-sync-operation.d.mts.map +1 -1
  188. package/esm/sync/model-sync.d.mts +3 -4
  189. package/esm/sync/model-sync.d.mts.map +1 -1
  190. package/esm/sync/sync-context.d.mts +2 -4
  191. package/esm/sync/sync-context.d.mts.map +1 -1
  192. package/esm/sync/sync-fanout.mjs +1 -1
  193. package/esm/sync/sync-manager.d.mts +2 -4
  194. package/esm/sync/sync-manager.d.mts.map +1 -1
  195. package/esm/sync/types.d.mts +121 -64
  196. package/esm/sync/types.d.mts.map +1 -1
  197. package/esm/transactions/after-commit.d.mts +2 -2
  198. package/esm/transactions/after-commit.d.mts.map +1 -1
  199. package/esm/types.d.mts +7 -8
  200. package/esm/types.d.mts.map +1 -1
  201. package/esm/utils/connect-to-database.d.mts +7 -8
  202. package/esm/utils/connect-to-database.d.mts.map +1 -1
  203. package/esm/utils/database-writer.utils.d.mts +3 -4
  204. package/esm/utils/database-writer.utils.d.mts.map +1 -1
  205. package/esm/utils/define-model.d.mts +3 -5
  206. package/esm/utils/define-model.d.mts.map +1 -1
  207. package/esm/utils/escape-regex.d.mts +3 -4
  208. package/esm/utils/escape-regex.d.mts.map +1 -1
  209. package/esm/utils/once-connected.d.mts +2 -4
  210. package/esm/utils/once-connected.d.mts.map +1 -1
  211. package/esm/utils/sanitize-filter.d.mts +3 -4
  212. package/esm/utils/sanitize-filter.d.mts.map +1 -1
  213. package/esm/validation/database-seal-plugins.d.mts +2 -1
  214. package/esm/validation/database-writer-validation-error.d.mts +1 -3
  215. package/esm/validation/database-writer-validation-error.d.mts.map +1 -1
  216. package/esm/validation/index.d.mts +3 -1
  217. package/esm/validation/index.mjs +1 -1
  218. package/esm/validation/plugins/database-rules-plugin.d.mts +2 -3
  219. package/esm/validation/plugins/database-rules-plugin.d.mts.map +1 -1
  220. package/esm/validation/plugins/embed-validator-plugin.d.mts +4 -3
  221. package/esm/validation/plugins/embed-validator-plugin.d.mts.map +1 -1
  222. package/esm/validation/types.d.mts +14 -10
  223. package/esm/validation/types.d.mts.map +1 -1
  224. package/esm/validation/validators/embed-validator.d.mts +2 -3
  225. package/esm/validation/validators/embed-validator.d.mts.map +1 -1
  226. package/esm/writer/database-writer.d.mts +1 -3
  227. package/esm/writer/database-writer.d.mts.map +1 -1
  228. package/esm/writer/database-writer.mjs +1 -1
  229. package/esm/writer/database-writer.mjs.map +1 -1
  230. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"postgres-sql-serializer.mjs","names":[],"sources":["../../../../../../../../../packages/cascade/src/drivers/postgres/postgres-sql-serializer.ts"],"sourcesContent":["import type { SqlDialectContract } from \"../sql/sql-dialect.contract\";\nimport type { PendingOperation } from \"../../migration/migration\";\nimport { SQLSerializer } from \"../../migration/sql-serializer\";\nimport type {\n ColumnDefinition,\n ForeignKeyDefinition,\n FullTextIndexOptions,\n GeoIndexOptions,\n IndexDefinition,\n VectorIndexOptions,\n} from \"../../contracts/migration-driver.contract\";\n\n/**\n * PostgreSQL-specific SQL serializer.\n *\n * Converts pending migration operations into valid PostgreSQL DDL statements.\n */\nexport class PostgresSQLSerializer extends SQLSerializer {\n public constructor(private readonly dialect: SqlDialectContract) {\n super();\n }\n\n public serialize(operation: PendingOperation, table: string): string | string[] | null {\n switch (operation.type) {\n case \"createTable\":\n return this.createTable(table);\n case \"createTableIfNotExists\":\n return this.createTableIfNotExists(table);\n case \"dropTable\":\n return this.dropTable(table);\n case \"dropTableIfExists\":\n return this.dropTableIfExists(table);\n case \"renameTable\":\n return this.renameTable(table, operation.payload as string);\n case \"truncateTable\":\n return this.truncateTable(table);\n case \"addColumn\":\n return this.addColumn(table, operation.payload as ColumnDefinition);\n case \"dropColumn\":\n return this.dropColumn(table, operation.payload as string);\n case \"dropColumns\":\n // This is handled via map in serializeAll or loop, but Postgres supports multiple DROP COLUMN\n // For simplicity, we can serialize multiple statements if we want, or handle it here\n // Actually, dropColumns payload is string[]. We can join them.\n return this.dropColumns(table, operation.payload as string[]);\n case \"renameColumn\": {\n const payload = operation.payload as { from: string; to: string };\n return this.renameColumn(table, payload.from, payload.to);\n }\n case \"modifyColumn\":\n // Modify column might require multiple statements in Postgres (type, nullability, default).\n // SQLSerializer's serialize return is just a string, so we'll separate them by semicolon\n // Or wait, Postgres allows multiple ALTER COLUMN in one ALTER TABLE statement.\n return this.modifyColumn(table, operation.payload as ColumnDefinition);\n case \"createIndex\":\n return this.createIndex(table, operation.payload as IndexDefinition);\n case \"dropIndex\":\n return this.dropIndex(table, operation.payload as string | string[]);\n case \"createUniqueIndex\": {\n const payload = operation.payload as { columns: string[]; name?: string };\n return this.createIndex(table, {\n columns: payload.columns,\n name: payload.name,\n unique: true,\n });\n }\n case \"dropUniqueIndex\":\n return this.dropIndex(table, operation.payload as string[]);\n case \"createFullTextIndex\": {\n const payload = operation.payload as { columns: string[]; options?: FullTextIndexOptions };\n return this.createFullTextIndex(table, payload.columns, payload.options);\n }\n case \"dropFullTextIndex\":\n return this.dropIndex(table, operation.payload as string);\n case \"createGeoIndex\": {\n const payload = operation.payload as { column: string; options?: GeoIndexOptions };\n return this.createGeoIndex(table, payload.column, payload.options);\n }\n case \"dropGeoIndex\":\n return this.dropIndex(table, `idx_${table}_geo_${operation.payload}`);\n case \"createVectorIndex\": {\n const payload = operation.payload as { column: string; options: VectorIndexOptions };\n return this.createVectorIndex(table, payload.column, payload.options);\n }\n case \"dropVectorIndex\":\n return this.dropIndex(table, `idx_${table}_vector_${operation.payload}`);\n case \"createTTLIndex\": {\n const payload = operation.payload as { column: string; expireAfterSeconds: number };\n return this.createTTLIndex(table, payload.column, payload.expireAfterSeconds);\n }\n case \"dropTTLIndex\":\n return this.dropIndex(table, `idx_${table}_ttl_${operation.payload}`);\n case \"addForeignKey\":\n return this.addForeignKey(table, operation.payload as ForeignKeyDefinition);\n case \"dropForeignKey\":\n return this.dropForeignKey(table, operation.payload as string);\n case \"addPrimaryKey\":\n return this.addPrimaryKey(table, operation.payload as string[]);\n case \"dropPrimaryKey\":\n return this.dropPrimaryKey(table);\n case \"addCheck\": {\n const payload = operation.payload as { name: string; expression: string };\n return this.addCheck(table, payload.name, payload.expression);\n }\n case \"dropCheck\":\n return this.dropCheck(table, operation.payload as string);\n case \"createTimestamps\":\n // createTimestamps needs to inject two columns. We return two statements.\n return this.createTimestamps(table);\n case \"rawStatement\": {\n const payload = operation.payload as string;\n // ensure string doesn't end with a semicolon if it's already one statement\n return payload;\n }\n case \"setSchemaValidation\":\n case \"removeSchemaValidation\":\n // Not implemented in PostgreSQL\n return null;\n default:\n return null;\n }\n }\n\n // ============================================================================\n // TABLE OPERATIONS\n // ============================================================================\n\n private createTable(table: string): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n return `CREATE TABLE ${quotedTable} ()`;\n }\n\n private createTableIfNotExists(table: string): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n return `CREATE TABLE IF NOT EXISTS ${quotedTable} ()`;\n }\n\n private dropTable(table: string): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n return `DROP TABLE ${quotedTable} CASCADE`;\n }\n\n private dropTableIfExists(table: string): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n return `DROP TABLE IF EXISTS ${quotedTable} CASCADE`;\n }\n\n private renameTable(from: string, to: string): string {\n const quotedFrom = this.dialect.quoteIdentifier(from);\n const quotedTo = this.dialect.quoteIdentifier(to);\n return `ALTER TABLE ${quotedFrom} RENAME TO ${quotedTo}`;\n }\n\n private truncateTable(table: string): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n return `TRUNCATE TABLE ${quotedTable}`;\n }\n\n // ============================================================================\n // COLUMN OPERATIONS\n // ============================================================================\n\n private addColumn(table: string, column: ColumnDefinition): string | string[] {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const quotedColumn = this.dialect.quoteIdentifier(column.name);\n\n let sqlType: string;\n if (column.autoIncrement) {\n if (column.type === \"bigInteger\") {\n sqlType = \"BIGSERIAL\";\n } else {\n sqlType = \"SERIAL\";\n }\n } else {\n sqlType = this.dialect.getSqlType(column.type, {\n length: column.length,\n precision: column.precision,\n scale: column.scale,\n dimensions: column.dimensions,\n });\n }\n\n let sql = `ALTER TABLE ${quotedTable} ADD COLUMN ${quotedColumn} ${sqlType}`;\n\n if (column.generated) {\n sql += ` GENERATED ALWAYS AS (${column.generated.expression})`;\n if (column.generated.stored) {\n sql += \" STORED\";\n }\n } else {\n if (!column.autoIncrement && column.nullable === false) {\n sql += \" NOT NULL\";\n }\n\n if (column.defaultValue !== undefined) {\n if (\n typeof column.defaultValue === \"object\" &&\n column.defaultValue !== null &&\n (column.defaultValue as any).__type === \"CURRENT_TIMESTAMP\"\n ) {\n sql += \" DEFAULT NOW()\";\n } else if (column.isRawDefault === false) {\n const escaped = String(column.defaultValue).replace(/'/g, \"''\");\n sql += ` DEFAULT '${escaped}'`;\n } else if (typeof column.defaultValue === \"boolean\") {\n sql += ` DEFAULT ${column.defaultValue ? \"TRUE\" : \"FALSE\"}`;\n } else if (typeof column.defaultValue === \"number\") {\n sql += ` DEFAULT ${column.defaultValue}`;\n } else {\n sql += ` DEFAULT ${column.defaultValue}`; // raw default\n }\n }\n\n if (column.primary) {\n sql += \" PRIMARY KEY\";\n }\n\n if (column.unique) {\n sql += \" UNIQUE\";\n }\n }\n\n const statements: string[] = [sql];\n\n // Column-level `.check(...)` becomes a table CHECK constraint emitted as a\n // follow-up ALTER — mirrors the direct driver path (Migration.execute →\n // driver.addColumn + driver.addCheck).\n if (column.checkConstraint) {\n statements.push(\n this.addCheck(table, column.checkConstraint.name, column.checkConstraint.expression),\n );\n }\n\n // pgvector: ensure the extension is active before the vector column is created.\n // SQLGrammar classifies CREATE EXTENSION as Phase 1, so this will always\n // run before any CREATE TABLE / ADD COLUMN statement regardless of batch order.\n if (column.type === \"vector\") {\n return [\"CREATE EXTENSION IF NOT EXISTS vector\", ...statements];\n }\n\n // The length test does not narrow the index read. `?? statements` keeps\n // the same two outcomes: the single statement, or the list.\n return statements.length === 1 ? (statements[0] ?? statements) : statements;\n }\n\n private dropColumn(table: string, column: string): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const quotedColumn = this.dialect.quoteIdentifier(column);\n return `ALTER TABLE ${quotedTable} DROP COLUMN ${quotedColumn}`;\n }\n\n private dropColumns(table: string, columns: string[]): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const drops = columns\n .map((col) => `DROP COLUMN ${this.dialect.quoteIdentifier(col)}`)\n .join(\", \");\n return `ALTER TABLE ${quotedTable} ${drops}`;\n }\n\n private renameColumn(table: string, from: string, to: string): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const quotedFrom = this.dialect.quoteIdentifier(from);\n const quotedTo = this.dialect.quoteIdentifier(to);\n return `ALTER TABLE ${quotedTable} RENAME COLUMN ${quotedFrom} TO ${quotedTo}`;\n }\n\n private modifyColumn(table: string, column: ColumnDefinition): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const quotedColumn = this.dialect.quoteIdentifier(column.name);\n const sqlType = this.dialect.getSqlType(column.type, {\n length: column.length,\n precision: column.precision,\n scale: column.scale,\n dimensions: column.dimensions,\n });\n\n const alters: string[] = [];\n alters.push(`ALTER COLUMN ${quotedColumn} TYPE ${sqlType}`);\n\n if (column.nullable === false) {\n alters.push(`ALTER COLUMN ${quotedColumn} SET NOT NULL`);\n } else if (column.nullable === true) {\n alters.push(`ALTER COLUMN ${quotedColumn} DROP NOT NULL`);\n }\n\n if (column.defaultValue !== undefined) {\n let defaultVal: string;\n if (\n typeof column.defaultValue === \"object\" &&\n column.defaultValue !== null &&\n (column.defaultValue as any).__type === \"CURRENT_TIMESTAMP\"\n ) {\n defaultVal = \"NOW()\";\n } else if (column.isRawDefault === false) {\n defaultVal = `'${String(column.defaultValue).replace(/'/g, \"''\")}'`;\n } else if (typeof column.defaultValue === \"boolean\") {\n defaultVal = column.defaultValue ? \"TRUE\" : \"FALSE\";\n } else {\n defaultVal = String(column.defaultValue);\n }\n alters.push(`ALTER COLUMN ${quotedColumn} SET DEFAULT ${defaultVal}`);\n }\n\n return `ALTER TABLE ${quotedTable} ${alters.join(\", \")}`;\n }\n\n private createTimestamps(table: string): string[] {\n const quotedTable = this.dialect.quoteIdentifier(table);\n return [\n `ALTER TABLE ${quotedTable} ADD COLUMN \"created_at\" TIMESTAMPTZ NOT NULL DEFAULT NOW()`,\n `ALTER TABLE ${quotedTable} ADD COLUMN \"updated_at\" TIMESTAMPTZ NOT NULL DEFAULT NOW()`,\n ];\n }\n\n // ============================================================================\n // INDEX OPERATIONS\n // ============================================================================\n\n private createIndex(table: string, index: IndexDefinition): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n let indexName: string;\n if (index.name) {\n indexName = index.name;\n } else {\n const colStr = Array.isArray(index.columns) ? index.columns.join(\"_\") : index.columns;\n indexName = `idx_${table}_${colStr}`;\n }\n const quotedIndexName = this.dialect.quoteIdentifier(indexName);\n const uniqueKeyword = index.unique ? \"UNIQUE \" : \"\";\n const concurrentlyKeyword = index.concurrently ? \"CONCURRENTLY \" : \"\";\n\n let columnsPart: string;\n\n if (index.expressions && index.expressions.length > 0) {\n columnsPart = index.expressions.map((expr) => `(${expr})`).join(\", \");\n } else {\n const columns = index.columns.map((col, i) => {\n const quotedCol = this.dialect.quoteIdentifier(col);\n const direction = index.directions?.[i]?.toUpperCase() ?? \"\";\n return direction ? `${quotedCol} ${direction}` : quotedCol;\n });\n columnsPart = columns.join(\", \");\n }\n\n let sql = `CREATE ${uniqueKeyword}INDEX ${concurrentlyKeyword}${quotedIndexName} ON ${quotedTable} (${columnsPart})`;\n\n if (index.include && index.include.length > 0) {\n const includeCols = index.include.map((col) => this.dialect.quoteIdentifier(col)).join(\", \");\n sql += ` INCLUDE (${includeCols})`;\n }\n\n if (index.where && Object.keys(index.where).length > 0) {\n const conditions = Object.entries(index.where)\n .map(([key, value]) => {\n const quotedKey = this.dialect.quoteIdentifier(key);\n return typeof value === \"string\"\n ? `${quotedKey} = '${value}'`\n : `${quotedKey} = ${value}`;\n })\n .join(\" AND \");\n sql += ` WHERE ${conditions}`;\n }\n\n return sql;\n }\n\n private dropIndex(table: string, indexNameOrColumns: string | string[]): string {\n let indexName: string;\n if (typeof indexNameOrColumns === \"string\") {\n indexName = indexNameOrColumns;\n } else {\n indexName = `idx_${table}_${indexNameOrColumns.join(\"_\")}`;\n }\n const quotedIndexName = this.dialect.quoteIdentifier(indexName);\n return `DROP INDEX IF EXISTS ${quotedIndexName}`;\n }\n\n private createFullTextIndex(\n table: string,\n columns: string[],\n options?: FullTextIndexOptions,\n ): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const indexName = options?.name ?? `idx_${table}_fulltext_${columns.join(\"_\")}`;\n const quotedIndexName = this.dialect.quoteIdentifier(indexName);\n const language = options?.language ?? \"english\";\n\n const tsvectors = columns.map((col) => {\n const weight = options?.weights?.[col] ?? \"A\";\n return `setweight(to_tsvector('${language}', COALESCE(${this.dialect.quoteIdentifier(col)}, '')), '${weight}')`;\n });\n\n return `CREATE INDEX ${quotedIndexName} ON ${quotedTable} USING GIN ((${tsvectors.join(\" || \")}))`;\n }\n\n private createGeoIndex(table: string, column: string, options?: GeoIndexOptions): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const quotedColumn = this.dialect.quoteIdentifier(column);\n const indexName = options?.name ?? `idx_${table}_geo_${column}`;\n const quotedIndexName = this.dialect.quoteIdentifier(indexName);\n\n return `CREATE INDEX ${quotedIndexName} ON ${quotedTable} USING GIST (${quotedColumn})`;\n }\n\n private createVectorIndex(table: string, column: string, options: VectorIndexOptions): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const quotedColumn = this.dialect.quoteIdentifier(column);\n const indexName = options.name ?? `idx_${table}_vector_${column}`;\n const quotedIndexName = this.dialect.quoteIdentifier(indexName);\n\n const opClass =\n options.similarity === \"euclidean\"\n ? \"vector_l2_ops\"\n : options.similarity === \"dotProduct\"\n ? \"vector_ip_ops\"\n : \"vector_cosine_ops\";\n\n const lists = options.lists ?? 100;\n\n return `CREATE INDEX ${quotedIndexName} ON ${quotedTable} USING ivfflat (${quotedColumn} ${opClass}) WITH (lists = ${lists})`;\n }\n\n private createTTLIndex(table: string, column: string, expireAfterSeconds: number): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const quotedColumn = this.dialect.quoteIdentifier(column);\n const indexName = `idx_${table}_ttl_${column}`;\n const quotedIndexName = this.dialect.quoteIdentifier(indexName);\n\n return `CREATE INDEX ${quotedIndexName} ON ${quotedTable} (${quotedColumn})`;\n }\n\n // ============================================================================\n // CONSTRAINTS\n // ============================================================================\n\n private addForeignKey(table: string, foreignKey: ForeignKeyDefinition): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const quotedColumn = this.dialect.quoteIdentifier(foreignKey.column);\n const quotedRefTable = this.dialect.quoteIdentifier(foreignKey.referencesTable);\n const quotedRefColumn = this.dialect.quoteIdentifier(foreignKey.referencesColumn);\n\n const constraintName =\n foreignKey.name ?? `fk_${table}_${foreignKey.column}_${foreignKey.referencesTable}`;\n const quotedConstraint = this.dialect.quoteIdentifier(constraintName);\n\n let sql = `ALTER TABLE ${quotedTable} ADD CONSTRAINT ${quotedConstraint} FOREIGN KEY (${quotedColumn}) REFERENCES ${quotedRefTable} (${quotedRefColumn})`;\n\n if (foreignKey.onDelete) {\n sql += ` ON DELETE ${this.mapForeignKeyAction(foreignKey.onDelete)}`;\n }\n\n if (foreignKey.onUpdate) {\n sql += ` ON UPDATE ${this.mapForeignKeyAction(foreignKey.onUpdate)}`;\n }\n\n return sql;\n }\n\n private dropForeignKey(table: string, name: string): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const quotedConstraint = this.dialect.quoteIdentifier(name);\n return `ALTER TABLE ${quotedTable} DROP CONSTRAINT ${quotedConstraint}`;\n }\n\n private addPrimaryKey(table: string, columns: string[]): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const quotedColumns = columns.map((c) => this.dialect.quoteIdentifier(c)).join(\", \");\n const constraintName = `pk_${table}`;\n const quotedConstraint = this.dialect.quoteIdentifier(constraintName);\n\n return `ALTER TABLE ${quotedTable} ADD CONSTRAINT ${quotedConstraint} PRIMARY KEY (${quotedColumns})`;\n }\n\n private dropPrimaryKey(table: string): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const constraintName = `pk_${table}`;\n const quotedConstraint = this.dialect.quoteIdentifier(constraintName);\n\n return `ALTER TABLE ${quotedTable} DROP CONSTRAINT ${quotedConstraint}`;\n }\n\n private addCheck(table: string, name: string, expression: string): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const quotedName = this.dialect.quoteIdentifier(name);\n return `ALTER TABLE ${quotedTable} ADD CONSTRAINT ${quotedName} CHECK (${expression})`;\n }\n\n private dropCheck(table: string, name: string): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const quotedName = this.dialect.quoteIdentifier(name);\n return `ALTER TABLE ${quotedTable} DROP CONSTRAINT ${quotedName}`;\n }\n\n private mapForeignKeyAction(action: \"cascade\" | \"restrict\" | \"setNull\" | \"noAction\"): string {\n switch (action) {\n case \"cascade\":\n return \"CASCADE\";\n case \"restrict\":\n return \"RESTRICT\";\n case \"setNull\":\n return \"SET NULL\";\n case \"noAction\":\n return \"NO ACTION\";\n default:\n return \"NO ACTION\";\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"postgres-sql-serializer.mjs","names":[],"sources":["../../../../../../../../../packages/cascade/src/drivers/postgres/postgres-sql-serializer.ts"],"sourcesContent":["import type { SqlDialectContract } from \"../sql/sql-dialect.contract\";\nimport type { PendingOperation } from \"../../migration/migration\";\nimport { SQLSerializer } from \"../../migration/sql-serializer\";\nimport type {\n ColumnDefinition,\n ForeignKeyDefinition,\n FullTextIndexOptions,\n GeoIndexOptions,\n IndexDefinition,\n VectorIndexOptions,\n} from \"../../contracts/migration-driver.contract\";\n\n/**\n * PostgreSQL-specific SQL serializer.\n *\n * Converts pending migration operations into valid PostgreSQL DDL statements.\n */\nexport class PostgresSQLSerializer extends SQLSerializer {\n public constructor(private readonly dialect: SqlDialectContract) {\n super();\n }\n\n public serialize(operation: PendingOperation, table: string): string | string[] | null {\n switch (operation.type) {\n case \"createTable\":\n return this.createTable(table);\n case \"createTableIfNotExists\":\n return this.createTableIfNotExists(table);\n case \"dropTable\":\n return this.dropTable(table);\n case \"dropTableIfExists\":\n return this.dropTableIfExists(table);\n case \"renameTable\":\n return this.renameTable(table, operation.payload as string);\n case \"truncateTable\":\n return this.truncateTable(table);\n case \"addColumn\":\n return this.addColumn(table, operation.payload as ColumnDefinition);\n case \"dropColumn\":\n return this.dropColumn(table, operation.payload as string);\n case \"dropColumns\":\n // This is handled via map in serializeAll or loop, but Postgres supports multiple DROP COLUMN\n // For simplicity, we can serialize multiple statements if we want, or handle it here\n // Actually, dropColumns payload is string[]. We can join them.\n return this.dropColumns(table, operation.payload as string[]);\n case \"renameColumn\": {\n const payload = operation.payload as { from: string; to: string };\n return this.renameColumn(table, payload.from, payload.to);\n }\n case \"modifyColumn\":\n // Modify column might require multiple statements in Postgres (type, nullability, default).\n // SQLSerializer's serialize return is just a string, so we'll separate them by semicolon\n // Or wait, Postgres allows multiple ALTER COLUMN in one ALTER TABLE statement.\n return this.modifyColumn(table, operation.payload as ColumnDefinition);\n case \"createIndex\":\n return this.createIndex(table, operation.payload as IndexDefinition);\n case \"dropIndex\":\n return this.dropIndex(table, operation.payload as string | string[]);\n case \"createUniqueIndex\": {\n const payload = operation.payload as { columns: string[]; name?: string };\n return this.createIndex(table, {\n columns: payload.columns,\n name: payload.name,\n unique: true,\n });\n }\n case \"dropUniqueIndex\":\n return this.dropIndex(table, operation.payload as string[]);\n case \"createFullTextIndex\": {\n const payload = operation.payload as { columns: string[]; options?: FullTextIndexOptions };\n return this.createFullTextIndex(table, payload.columns, payload.options);\n }\n case \"dropFullTextIndex\":\n return this.dropIndex(table, operation.payload as string);\n case \"createGeoIndex\": {\n const payload = operation.payload as { column: string; options?: GeoIndexOptions };\n return this.createGeoIndex(table, payload.column, payload.options);\n }\n case \"dropGeoIndex\":\n return this.dropIndex(table, `idx_${table}_geo_${operation.payload}`);\n case \"createVectorIndex\": {\n const payload = operation.payload as { column: string; options: VectorIndexOptions };\n return this.createVectorIndex(table, payload.column, payload.options);\n }\n case \"dropVectorIndex\":\n return this.dropIndex(table, `idx_${table}_vector_${operation.payload}`);\n case \"createTTLIndex\": {\n const payload = operation.payload as { column: string; expireAfterSeconds: number };\n return this.createTTLIndex(table, payload.column, payload.expireAfterSeconds);\n }\n case \"dropTTLIndex\":\n return this.dropIndex(table, `idx_${table}_ttl_${operation.payload}`);\n case \"addForeignKey\":\n return this.addForeignKey(table, operation.payload as ForeignKeyDefinition);\n case \"dropForeignKey\":\n return this.dropForeignKey(table, operation.payload as string);\n case \"addPrimaryKey\":\n return this.addPrimaryKey(table, operation.payload as string[]);\n case \"dropPrimaryKey\":\n return this.dropPrimaryKey(table);\n case \"addCheck\": {\n const payload = operation.payload as { name: string; expression: string };\n return this.addCheck(table, payload.name, payload.expression);\n }\n case \"dropCheck\":\n return this.dropCheck(table, operation.payload as string);\n case \"createTimestamps\":\n // createTimestamps needs to inject two columns. We return two statements.\n return this.createTimestamps(table);\n case \"rawStatement\": {\n const payload = operation.payload as string;\n // ensure string doesn't end with a semicolon if it's already one statement\n return payload;\n }\n case \"setSchemaValidation\":\n case \"removeSchemaValidation\":\n // Not implemented in PostgreSQL\n return null;\n default:\n return null;\n }\n }\n\n // ============================================================================\n // TABLE OPERATIONS\n // ============================================================================\n\n private createTable(table: string): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n return `CREATE TABLE ${quotedTable} ()`;\n }\n\n private createTableIfNotExists(table: string): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n return `CREATE TABLE IF NOT EXISTS ${quotedTable} ()`;\n }\n\n private dropTable(table: string): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n return `DROP TABLE ${quotedTable} CASCADE`;\n }\n\n private dropTableIfExists(table: string): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n return `DROP TABLE IF EXISTS ${quotedTable} CASCADE`;\n }\n\n private renameTable(from: string, to: string): string {\n const quotedFrom = this.dialect.quoteIdentifier(from);\n const quotedTo = this.dialect.quoteIdentifier(to);\n return `ALTER TABLE ${quotedFrom} RENAME TO ${quotedTo}`;\n }\n\n private truncateTable(table: string): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n return `TRUNCATE TABLE ${quotedTable}`;\n }\n\n // ============================================================================\n // COLUMN OPERATIONS\n // ============================================================================\n\n private addColumn(table: string, column: ColumnDefinition): string | string[] {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const quotedColumn = this.dialect.quoteIdentifier(column.name);\n\n let sqlType: string;\n if (column.autoIncrement) {\n if (column.type === \"bigInteger\") {\n sqlType = \"BIGSERIAL\";\n } else {\n sqlType = \"SERIAL\";\n }\n } else {\n sqlType = this.dialect.getSqlType(column.type, {\n length: column.length,\n precision: column.precision,\n scale: column.scale,\n dimensions: column.dimensions,\n });\n }\n\n let sql = `ALTER TABLE ${quotedTable} ADD COLUMN ${quotedColumn} ${sqlType}`;\n\n if (column.generated) {\n sql += ` GENERATED ALWAYS AS (${column.generated.expression})`;\n if (column.generated.stored) {\n sql += \" STORED\";\n }\n } else {\n if (!column.autoIncrement && column.nullable === false) {\n sql += \" NOT NULL\";\n }\n\n if (column.defaultValue !== undefined) {\n if (\n typeof column.defaultValue === \"object\" &&\n column.defaultValue !== null &&\n (column.defaultValue as any).__type === \"CURRENT_TIMESTAMP\"\n ) {\n sql += \" DEFAULT NOW()\";\n } else if (column.isRawDefault === false) {\n const escaped = String(column.defaultValue).replace(/'/g, \"''\");\n sql += ` DEFAULT '${escaped}'`;\n } else if (typeof column.defaultValue === \"boolean\") {\n sql += ` DEFAULT ${column.defaultValue ? \"TRUE\" : \"FALSE\"}`;\n } else if (typeof column.defaultValue === \"number\") {\n sql += ` DEFAULT ${column.defaultValue}`;\n } else {\n sql += ` DEFAULT ${column.defaultValue}`; // raw default\n }\n }\n\n if (column.primary) {\n sql += \" PRIMARY KEY\";\n }\n\n if (column.unique) {\n sql += \" UNIQUE\";\n }\n }\n\n const statements: string[] = [sql];\n\n // Column-level `.check(...)` becomes a table CHECK constraint emitted as a\n // follow-up ALTER — mirrors the direct driver path (Migration.execute →\n // driver.addColumn + driver.addCheck).\n if (column.checkConstraint) {\n statements.push(\n this.addCheck(table, column.checkConstraint.name, column.checkConstraint.expression),\n );\n }\n\n // pgvector: ensure the extension is active before the vector column is created.\n // SQLGrammar classifies CREATE EXTENSION as Phase 1, so this will always\n // run before any CREATE TABLE / ADD COLUMN statement regardless of batch order.\n if (column.type === \"vector\") {\n return [\"CREATE EXTENSION IF NOT EXISTS vector\", ...statements];\n }\n\n // The length test does not narrow the index read. `?? statements` keeps\n // the same two outcomes: the single statement, or the list.\n return statements.length === 1 ? (statements[0] ?? statements) : statements;\n }\n\n private dropColumn(table: string, column: string): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const quotedColumn = this.dialect.quoteIdentifier(column);\n return `ALTER TABLE ${quotedTable} DROP COLUMN ${quotedColumn}`;\n }\n\n private dropColumns(table: string, columns: string[]): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const drops = columns\n .map((col) => `DROP COLUMN ${this.dialect.quoteIdentifier(col)}`)\n .join(\", \");\n return `ALTER TABLE ${quotedTable} ${drops}`;\n }\n\n private renameColumn(table: string, from: string, to: string): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const quotedFrom = this.dialect.quoteIdentifier(from);\n const quotedTo = this.dialect.quoteIdentifier(to);\n return `ALTER TABLE ${quotedTable} RENAME COLUMN ${quotedFrom} TO ${quotedTo}`;\n }\n\n private modifyColumn(table: string, column: ColumnDefinition): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const quotedColumn = this.dialect.quoteIdentifier(column.name);\n const sqlType = this.dialect.getSqlType(column.type, {\n length: column.length,\n precision: column.precision,\n scale: column.scale,\n dimensions: column.dimensions,\n });\n\n const alters: string[] = [];\n alters.push(`ALTER COLUMN ${quotedColumn} TYPE ${sqlType}`);\n\n if (column.nullable === false) {\n alters.push(`ALTER COLUMN ${quotedColumn} SET NOT NULL`);\n } else if (column.nullable === true) {\n alters.push(`ALTER COLUMN ${quotedColumn} DROP NOT NULL`);\n }\n\n if (column.defaultValue !== undefined) {\n let defaultVal: string;\n if (\n typeof column.defaultValue === \"object\" &&\n column.defaultValue !== null &&\n (column.defaultValue as any).__type === \"CURRENT_TIMESTAMP\"\n ) {\n defaultVal = \"NOW()\";\n } else if (column.isRawDefault === false) {\n defaultVal = `'${String(column.defaultValue).replace(/'/g, \"''\")}'`;\n } else if (typeof column.defaultValue === \"boolean\") {\n defaultVal = column.defaultValue ? \"TRUE\" : \"FALSE\";\n } else {\n defaultVal = String(column.defaultValue);\n }\n alters.push(`ALTER COLUMN ${quotedColumn} SET DEFAULT ${defaultVal}`);\n }\n\n return `ALTER TABLE ${quotedTable} ${alters.join(\", \")}`;\n }\n\n private createTimestamps(table: string): string[] {\n const quotedTable = this.dialect.quoteIdentifier(table);\n return [\n `ALTER TABLE ${quotedTable} ADD COLUMN \"created_at\" TIMESTAMPTZ NOT NULL DEFAULT NOW()`,\n `ALTER TABLE ${quotedTable} ADD COLUMN \"updated_at\" TIMESTAMPTZ NOT NULL DEFAULT NOW()`,\n ];\n }\n\n // ============================================================================\n // INDEX OPERATIONS\n // ============================================================================\n\n private createIndex(table: string, index: IndexDefinition): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n let indexName: string;\n if (index.name) {\n indexName = index.name;\n } else {\n const colStr = Array.isArray(index.columns) ? index.columns.join(\"_\") : index.columns;\n indexName = `idx_${table}_${colStr}`;\n }\n const quotedIndexName = this.dialect.quoteIdentifier(indexName);\n const uniqueKeyword = index.unique ? \"UNIQUE \" : \"\";\n const concurrentlyKeyword = index.concurrently ? \"CONCURRENTLY \" : \"\";\n\n let columnsPart: string;\n\n if (index.expressions && index.expressions.length > 0) {\n columnsPart = index.expressions.map((expr) => `(${expr})`).join(\", \");\n } else {\n const columns = index.columns.map((col, i) => {\n const quotedCol = this.dialect.quoteIdentifier(col);\n const direction = index.directions?.[i]?.toUpperCase() ?? \"\";\n return direction ? `${quotedCol} ${direction}` : quotedCol;\n });\n columnsPart = columns.join(\", \");\n }\n\n let sql = `CREATE ${uniqueKeyword}INDEX ${concurrentlyKeyword}${quotedIndexName} ON ${quotedTable} (${columnsPart})`;\n\n if (index.include && index.include.length > 0) {\n const includeCols = index.include.map((col) => this.dialect.quoteIdentifier(col)).join(\", \");\n sql += ` INCLUDE (${includeCols})`;\n }\n\n if (index.where && Object.keys(index.where).length > 0) {\n const conditions = Object.entries(index.where)\n .map(([key, value]) => {\n const quotedKey = this.dialect.quoteIdentifier(key);\n return typeof value === \"string\"\n ? `${quotedKey} = '${value}'`\n : `${quotedKey} = ${value}`;\n })\n .join(\" AND \");\n sql += ` WHERE ${conditions}`;\n }\n\n return sql;\n }\n\n private dropIndex(table: string, indexNameOrColumns: string | string[]): string {\n let indexName: string;\n if (typeof indexNameOrColumns === \"string\") {\n indexName = indexNameOrColumns;\n } else {\n indexName = `idx_${table}_${indexNameOrColumns.join(\"_\")}`;\n }\n const quotedIndexName = this.dialect.quoteIdentifier(indexName);\n return `DROP INDEX IF EXISTS ${quotedIndexName}`;\n }\n\n private createFullTextIndex(\n table: string,\n columns: string[],\n options?: FullTextIndexOptions,\n ): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const indexName = options?.name ?? `idx_${table}_fulltext_${columns.join(\"_\")}`;\n const quotedIndexName = this.dialect.quoteIdentifier(indexName);\n const language = options?.language ?? \"english\";\n\n const tsvectors = columns.map((col) => {\n const weight = options?.weights?.[col] ?? \"A\";\n return `setweight(to_tsvector('${language}', COALESCE(${this.dialect.quoteIdentifier(col)}, '')), '${weight}')`;\n });\n\n return `CREATE INDEX ${quotedIndexName} ON ${quotedTable} USING GIN ((${tsvectors.join(\" || \")}))`;\n }\n\n private createGeoIndex(table: string, column: string, options?: GeoIndexOptions): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const quotedColumn = this.dialect.quoteIdentifier(column);\n const indexName = options?.name ?? `idx_${table}_geo_${column}`;\n const quotedIndexName = this.dialect.quoteIdentifier(indexName);\n\n return `CREATE INDEX ${quotedIndexName} ON ${quotedTable} USING GIST (${quotedColumn})`;\n }\n\n private createVectorIndex(table: string, column: string, options: VectorIndexOptions): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const quotedColumn = this.dialect.quoteIdentifier(column);\n const indexName = options.name ?? `idx_${table}_vector_${column}`;\n const quotedIndexName = this.dialect.quoteIdentifier(indexName);\n\n const opClass =\n options.similarity === \"euclidean\"\n ? \"vector_l2_ops\"\n : options.similarity === \"dotProduct\"\n ? \"vector_ip_ops\"\n : \"vector_cosine_ops\";\n\n const lists = options.lists ?? 100;\n\n return `CREATE INDEX ${quotedIndexName} ON ${quotedTable} USING ivfflat (${quotedColumn} ${opClass}) WITH (lists = ${lists})`;\n }\n\n private createTTLIndex(table: string, column: string, expireAfterSeconds: number): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const quotedColumn = this.dialect.quoteIdentifier(column);\n const indexName = `idx_${table}_ttl_${column}`;\n const quotedIndexName = this.dialect.quoteIdentifier(indexName);\n\n return `CREATE INDEX ${quotedIndexName} ON ${quotedTable} (${quotedColumn})`;\n }\n\n // ============================================================================\n // CONSTRAINTS\n // ============================================================================\n\n private addForeignKey(table: string, foreignKey: ForeignKeyDefinition): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const quotedColumn = this.dialect.quoteIdentifier(foreignKey.column);\n const quotedRefTable = this.dialect.quoteIdentifier(foreignKey.referencesTable);\n const quotedRefColumn = this.dialect.quoteIdentifier(foreignKey.referencesColumn);\n\n const constraintName =\n foreignKey.name ?? `fk_${table}_${foreignKey.column}_${foreignKey.referencesTable}`;\n const quotedConstraint = this.dialect.quoteIdentifier(constraintName);\n\n let sql = `ALTER TABLE ${quotedTable} ADD CONSTRAINT ${quotedConstraint} FOREIGN KEY (${quotedColumn}) REFERENCES ${quotedRefTable} (${quotedRefColumn})`;\n\n if (foreignKey.onDelete) {\n sql += ` ON DELETE ${this.mapForeignKeyAction(foreignKey.onDelete)}`;\n }\n\n if (foreignKey.onUpdate) {\n sql += ` ON UPDATE ${this.mapForeignKeyAction(foreignKey.onUpdate)}`;\n }\n\n return sql;\n }\n\n private dropForeignKey(table: string, name: string): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const quotedConstraint = this.dialect.quoteIdentifier(name);\n return `ALTER TABLE ${quotedTable} DROP CONSTRAINT ${quotedConstraint}`;\n }\n\n private addPrimaryKey(table: string, columns: string[]): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const quotedColumns = columns.map((c) => this.dialect.quoteIdentifier(c)).join(\", \");\n const constraintName = `pk_${table}`;\n const quotedConstraint = this.dialect.quoteIdentifier(constraintName);\n\n return `ALTER TABLE ${quotedTable} ADD CONSTRAINT ${quotedConstraint} PRIMARY KEY (${quotedColumns})`;\n }\n\n private dropPrimaryKey(table: string): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const constraintName = `pk_${table}`;\n const quotedConstraint = this.dialect.quoteIdentifier(constraintName);\n\n return `ALTER TABLE ${quotedTable} DROP CONSTRAINT ${quotedConstraint}`;\n }\n\n private addCheck(table: string, name: string, expression: string): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const quotedName = this.dialect.quoteIdentifier(name);\n return `ALTER TABLE ${quotedTable} ADD CONSTRAINT ${quotedName} CHECK (${expression})`;\n }\n\n private dropCheck(table: string, name: string): string {\n const quotedTable = this.dialect.quoteIdentifier(table);\n const quotedName = this.dialect.quoteIdentifier(name);\n return `ALTER TABLE ${quotedTable} DROP CONSTRAINT ${quotedName}`;\n }\n\n private mapForeignKeyAction(action: \"cascade\" | \"restrict\" | \"setNull\" | \"noAction\"): string {\n switch (action) {\n case \"cascade\":\n return \"CASCADE\";\n case \"restrict\":\n return \"RESTRICT\";\n case \"setNull\":\n return \"SET NULL\";\n case \"noAction\":\n return \"NO ACTION\";\n default:\n return \"NO ACTION\";\n }\n }\n}\n"],"mappings":"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"}
@@ -94,5 +94,5 @@ async function loadPostgresTTLPurgeJobs(driver) {
94
94
  }
95
95
 
96
96
  //#endregion
97
- export { loadPostgresTTLPurgeJobs, postgresTTLPurgeComment, registerPostgresTTLPurgeJob, unregisterAllPostgresTTLPurgeJobs, unregisterPostgresTTLPurgeJob };
97
+ export { loadPostgresTTLPurgeJobs, postgresTTLPurgeComment, postgresTTLPurgeJobName, purgeExpiredPostgresRows, registerPostgresTTLPurgeJob, unregisterAllPostgresTTLPurgeJobs, unregisterPostgresTTLPurgeJob };
98
98
  //# sourceMappingURL=postgres-ttl-purge.mjs.map
@@ -9,7 +9,7 @@ const toFiniteNumber = (value) => {
9
9
  return Number.isFinite(n) ? n : value;
10
10
  };
11
11
  /** OID → converter. json/jsonb are already parsed by pg, so they are absent. */
12
- const CONVERTERS = new Map([
12
+ const CONVERTERS = /* @__PURE__ */ new Map([
13
13
  [20, toSafeInteger],
14
14
  [1700, toFiniteNumber],
15
15
  [1082, toDate],
@@ -17,7 +17,7 @@ const CONVERTERS = new Map([
17
17
  [1184, toDate]
18
18
  ]);
19
19
  /** Built-in OIDs whose text must never be reinterpreted (text, varchar, bpchar, name, json, jsonb, uuid). */
20
- const LITERAL_TEXT_OIDS = new Set([
20
+ const LITERAL_TEXT_OIDS = /* @__PURE__ */ new Set([
21
21
  18,
22
22
  19,
23
23
  25,
@@ -1 +1 @@
1
- {"version":3,"file":"postgres-type-converters.mjs","names":[],"sources":["../../../../../../../../../packages/cascade/src/drivers/postgres/postgres-type-converters.ts"],"sourcesContent":["/**\n * Column-type driven conversion of PostgreSQL result values (K1:B29).\n *\n * Conversion is keyed on the column's `dataTypeID` from the pg result\n * `fields`, never on what a string value looks like.\n */\n\nexport type PostgresColumnTypes = ReadonlyMap<string, number>;\n\ntype Converter = (value: string) => unknown;\n\nconst toDate: Converter = (value) => new Date(value);\n\nconst toSafeInteger: Converter = (value) => {\n const n = Number(value);\n // Beyond 2^53 a number would silently lose digits; keep the exact string.\n return Number.isSafeInteger(n) ? n : value;\n};\n\nconst toFiniteNumber: Converter = (value) => {\n const n = Number(value);\n return Number.isFinite(n) ? n : value;\n};\n\n/** OID → converter. json/jsonb are already parsed by pg, so they are absent. */\nconst CONVERTERS = new Map<number, Converter>([\n [20, toSafeInteger], // int8\n [1700, toFiniteNumber], // numeric\n [1082, toDate], // date\n [1114, toDate], // timestamp\n [1184, toDate], // timestamptz\n]);\n\n/** Built-in OIDs whose text must never be reinterpreted (text, varchar, bpchar, name, json, jsonb, uuid). */\nconst LITERAL_TEXT_OIDS = new Set([18, 19, 25, 114, 142, 1042, 1043, 2950, 3802]);\n\n/** pgvector columns use an extension OID (not fixed), returned as '[n1,n2,...]'. */\nfunction parseVector(value: string): number[] | undefined {\n // '[' = 91, ']' = 93\n if (value.charCodeAt(0) !== 91 || value.charCodeAt(value.length - 1) !== 93) return undefined;\n\n const parts = value.slice(1, -1).split(\",\");\n const nums = new Array<number>(parts.length);\n\n for (let i = 0; i < parts.length; i++) {\n const n = +(parts[i] ?? \"\");\n if (!Number.isFinite(n)) return undefined;\n nums[i] = n;\n }\n\n return nums;\n}\n\n/**\n * Convert one value by its column type. Values of a known text type, and\n * non-string values, are returned untouched.\n */\nexport function convertPostgresValue(value: unknown, dataTypeID: number | undefined): unknown {\n if (typeof value !== \"string\" || dataTypeID === undefined) return value;\n\n const converter = CONVERTERS.get(dataTypeID);\n if (converter) return converter(value);\n\n if (LITERAL_TEXT_OIDS.has(dataTypeID)) return value;\n\n // Unknown (extension) type: only pgvector's bracketed list is re-inflated.\n return parseVector(value) ?? value;\n}\n"],"mappings":";AAWA,MAAM,UAAqB,UAAU,IAAI,KAAK,KAAK;AAEnD,MAAM,iBAA4B,UAAU;CAC1C,MAAM,IAAI,OAAO,KAAK;CAEtB,OAAO,OAAO,cAAc,CAAC,IAAI,IAAI;AACvC;AAEA,MAAM,kBAA6B,UAAU;CAC3C,MAAM,IAAI,OAAO,KAAK;CACtB,OAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAClC;;AAGA,MAAM,aAAa,IAAI,IAAuB;CAC5C,CAAC,IAAI,aAAa;CAClB,CAAC,MAAM,cAAc;CACrB,CAAC,MAAM,MAAM;CACb,CAAC,MAAM,MAAM;CACb,CAAC,MAAM,MAAM;AACf,CAAC;;AAGD,MAAM,oBAAoB,IAAI,IAAI;CAAC;CAAI;CAAI;CAAI;CAAK;CAAK;CAAM;CAAM;CAAM;AAAI,CAAC;;AAGhF,SAAS,YAAY,OAAqC;CAExD,IAAI,MAAM,WAAW,CAAC,MAAM,MAAM,MAAM,WAAW,MAAM,SAAS,CAAC,MAAM,IAAI,OAAO;CAEpF,MAAM,QAAQ,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,MAAM,GAAG;CAC1C,MAAM,OAAO,IAAI,MAAc,MAAM,MAAM;CAE3C,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;EACrC,MAAM,IAAI,EAAE,MAAM,MAAM;EACxB,IAAI,CAAC,OAAO,SAAS,CAAC,GAAG,OAAO;EAChC,KAAK,KAAK;CACZ;CAEA,OAAO;AACT;;;;;AAMA,SAAgB,qBAAqB,OAAgB,YAAyC;CAC5F,IAAI,OAAO,UAAU,YAAY,eAAe,QAAW,OAAO;CAElE,MAAM,YAAY,WAAW,IAAI,UAAU;CAC3C,IAAI,WAAW,OAAO,UAAU,KAAK;CAErC,IAAI,kBAAkB,IAAI,UAAU,GAAG,OAAO;CAG9C,OAAO,YAAY,KAAK,KAAK;AAC/B"}
1
+ {"version":3,"file":"postgres-type-converters.mjs","names":[],"sources":["../../../../../../../../../packages/cascade/src/drivers/postgres/postgres-type-converters.ts"],"sourcesContent":["/**\n * Column-type driven conversion of PostgreSQL result values (K1:B29).\n *\n * Conversion is keyed on the column's `dataTypeID` from the pg result\n * `fields`, never on what a string value looks like.\n */\n\nexport type PostgresColumnTypes = ReadonlyMap<string, number>;\n\ntype Converter = (value: string) => unknown;\n\nconst toDate: Converter = (value) => new Date(value);\n\nconst toSafeInteger: Converter = (value) => {\n const n = Number(value);\n // Beyond 2^53 a number would silently lose digits; keep the exact string.\n return Number.isSafeInteger(n) ? n : value;\n};\n\nconst toFiniteNumber: Converter = (value) => {\n const n = Number(value);\n return Number.isFinite(n) ? n : value;\n};\n\n/** OID → converter. json/jsonb are already parsed by pg, so they are absent. */\nconst CONVERTERS = new Map<number, Converter>([\n [20, toSafeInteger], // int8\n [1700, toFiniteNumber], // numeric\n [1082, toDate], // date\n [1114, toDate], // timestamp\n [1184, toDate], // timestamptz\n]);\n\n/** Built-in OIDs whose text must never be reinterpreted (text, varchar, bpchar, name, json, jsonb, uuid). */\nconst LITERAL_TEXT_OIDS = new Set([18, 19, 25, 114, 142, 1042, 1043, 2950, 3802]);\n\n/** pgvector columns use an extension OID (not fixed), returned as '[n1,n2,...]'. */\nfunction parseVector(value: string): number[] | undefined {\n // '[' = 91, ']' = 93\n if (value.charCodeAt(0) !== 91 || value.charCodeAt(value.length - 1) !== 93) return undefined;\n\n const parts = value.slice(1, -1).split(\",\");\n const nums = new Array<number>(parts.length);\n\n for (let i = 0; i < parts.length; i++) {\n const n = +(parts[i] ?? \"\");\n if (!Number.isFinite(n)) return undefined;\n nums[i] = n;\n }\n\n return nums;\n}\n\n/**\n * Convert one value by its column type. Values of a known text type, and\n * non-string values, are returned untouched.\n */\nexport function convertPostgresValue(value: unknown, dataTypeID: number | undefined): unknown {\n if (typeof value !== \"string\" || dataTypeID === undefined) return value;\n\n const converter = CONVERTERS.get(dataTypeID);\n if (converter) return converter(value);\n\n if (LITERAL_TEXT_OIDS.has(dataTypeID)) return value;\n\n // Unknown (extension) type: only pgvector's bracketed list is re-inflated.\n return parseVector(value) ?? value;\n}\n"],"mappings":";AAWA,MAAM,UAAqB,UAAU,IAAI,KAAK,KAAK;AAEnD,MAAM,iBAA4B,UAAU;CAC1C,MAAM,IAAI,OAAO,KAAK;CAEtB,OAAO,OAAO,cAAc,CAAC,IAAI,IAAI;AACvC;AAEA,MAAM,kBAA6B,UAAU;CAC3C,MAAM,IAAI,OAAO,KAAK;CACtB,OAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAClC;;AAGA,MAAM,6BAAa,IAAI,IAAuB;CAC5C,CAAC,IAAI,aAAa;CAClB,CAAC,MAAM,cAAc;CACrB,CAAC,MAAM,MAAM;CACb,CAAC,MAAM,MAAM;CACb,CAAC,MAAM,MAAM;AACf,CAAC;;AAGD,MAAM,oCAAoB,IAAI,IAAI;CAAC;CAAI;CAAI;CAAI;CAAK;CAAK;CAAM;CAAM;CAAM;AAAI,CAAC;;AAGhF,SAAS,YAAY,OAAqC;CAExD,IAAI,MAAM,WAAW,CAAC,MAAM,MAAM,MAAM,WAAW,MAAM,SAAS,CAAC,MAAM,IAAI,OAAO;CAEpF,MAAM,QAAQ,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,MAAM,GAAG;CAC1C,MAAM,OAAO,IAAI,MAAc,MAAM,MAAM;CAE3C,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;EACrC,MAAM,IAAI,EAAE,MAAM,MAAM;EACxB,IAAI,CAAC,OAAO,SAAS,CAAC,GAAG,OAAO;EAChC,KAAK,KAAK;CACZ;CAEA,OAAO;AACT;;;;;AAMA,SAAgB,qBAAqB,OAAgB,YAAyC;CAC5F,IAAI,OAAO,UAAU,YAAY,eAAe,QAAW,OAAO;CAElE,MAAM,YAAY,WAAW,IAAI,UAAU;CAC3C,IAAI,WAAW,OAAO,UAAU,KAAK;CAErC,IAAI,kBAAkB,IAAI,UAAU,GAAG,OAAO;CAG9C,OAAO,YAAY,KAAK,KAAK;AAC/B"}
@@ -7,7 +7,7 @@ import { UnsupportedUpdateOperationError } from "../../errors/unsupported-update
7
7
  * `$setOnInsert` only contributes to the INSERT half of an upsert; on a plain
8
8
  * update it is a no-op, exactly as in MongoDB.
9
9
  */
10
- const SUPPORTED_OPERATORS = new Set([
10
+ const SUPPORTED_OPERATORS = /* @__PURE__ */ new Set([
11
11
  "$set",
12
12
  "$unset",
13
13
  "$inc",
@@ -1 +1 @@
1
- {"version":3,"file":"postgres-update-validator.mjs","names":[],"sources":["../../../../../../../../../packages/cascade/src/drivers/postgres/postgres-update-validator.ts"],"sourcesContent":["import type {\n AtomicUpdate,\n DriverAtomicUpdateOptions,\n UpdateOperations,\n} from \"../../contracts/database-driver.contract\";\nimport { UnsupportedUpdateOperationError } from \"../../errors/unsupported-update-operation.error\";\n\n/**\n * Update operators the Postgres driver can express in SQL.\n *\n * `$setOnInsert` only contributes to the INSERT half of an upsert; on a plain\n * update it is a no-op, exactly as in MongoDB.\n */\nconst SUPPORTED_OPERATORS: ReadonlySet<string> = new Set([\n \"$set\",\n \"$unset\",\n \"$inc\",\n \"$dec\",\n \"$setOnInsert\",\n]);\n\n/**\n * Reject every part of an update the Postgres driver cannot perform, so no\n * operator or option is ever silently dropped.\n *\n * @param update - The requested update\n * @param options - The requested update options\n * @returns The update, narrowed to an operator object\n * @throws UnsupportedUpdateOperationError for pipeline updates, `arrayFilters`,\n * and any operator outside {@link SUPPORTED_OPERATORS}\n */\nexport function assertPostgresUpdate(\n update: AtomicUpdate,\n options?: DriverAtomicUpdateOptions,\n): UpdateOperations {\n if (Array.isArray(update)) {\n throw new UnsupportedUpdateOperationError(\n \"pipeline update\",\n \"postgres\",\n \"Use an operator object ($set/$unset/$inc/$dec) or a raw query.\",\n );\n }\n\n if (options?.arrayFilters !== undefined) {\n throw new UnsupportedUpdateOperationError(\"arrayFilters\", \"postgres\");\n }\n\n for (const operator of Object.keys(update)) {\n if (!SUPPORTED_OPERATORS.has(operator)) {\n throw new UnsupportedUpdateOperationError(\n operator,\n \"postgres\",\n \"Supported operators: $set, $unset, $inc, $dec, $setOnInsert.\",\n );\n }\n }\n\n return update;\n}\n"],"mappings":";;;;;;;;;AAaA,MAAM,sBAA2C,IAAI,IAAI;CACvD;CACA;CACA;CACA;CACA;AACF,CAAC;;;;;;;;;;;AAYD,SAAgB,qBACd,QACA,SACkB;CAClB,IAAI,MAAM,QAAQ,MAAM,GACtB,MAAM,IAAI,gCACR,mBACA,YACA,gEACF;CAGF,IAAI,SAAS,iBAAiB,QAC5B,MAAM,IAAI,gCAAgC,gBAAgB,UAAU;CAGtE,KAAK,MAAM,YAAY,OAAO,KAAK,MAAM,GACvC,IAAI,CAAC,oBAAoB,IAAI,QAAQ,GACnC,MAAM,IAAI,gCACR,UACA,YACA,8DACF;CAIJ,OAAO;AACT"}
1
+ {"version":3,"file":"postgres-update-validator.mjs","names":[],"sources":["../../../../../../../../../packages/cascade/src/drivers/postgres/postgres-update-validator.ts"],"sourcesContent":["import type {\n AtomicUpdate,\n DriverAtomicUpdateOptions,\n UpdateOperations,\n} from \"../../contracts/database-driver.contract\";\nimport { UnsupportedUpdateOperationError } from \"../../errors/unsupported-update-operation.error\";\n\n/**\n * Update operators the Postgres driver can express in SQL.\n *\n * `$setOnInsert` only contributes to the INSERT half of an upsert; on a plain\n * update it is a no-op, exactly as in MongoDB.\n */\nconst SUPPORTED_OPERATORS: ReadonlySet<string> = new Set([\n \"$set\",\n \"$unset\",\n \"$inc\",\n \"$dec\",\n \"$setOnInsert\",\n]);\n\n/**\n * Reject every part of an update the Postgres driver cannot perform, so no\n * operator or option is ever silently dropped.\n *\n * @param update - The requested update\n * @param options - The requested update options\n * @returns The update, narrowed to an operator object\n * @throws UnsupportedUpdateOperationError for pipeline updates, `arrayFilters`,\n * and any operator outside {@link SUPPORTED_OPERATORS}\n */\nexport function assertPostgresUpdate(\n update: AtomicUpdate,\n options?: DriverAtomicUpdateOptions,\n): UpdateOperations {\n if (Array.isArray(update)) {\n throw new UnsupportedUpdateOperationError(\n \"pipeline update\",\n \"postgres\",\n \"Use an operator object ($set/$unset/$inc/$dec) or a raw query.\",\n );\n }\n\n if (options?.arrayFilters !== undefined) {\n throw new UnsupportedUpdateOperationError(\"arrayFilters\", \"postgres\");\n }\n\n for (const operator of Object.keys(update)) {\n if (!SUPPORTED_OPERATORS.has(operator)) {\n throw new UnsupportedUpdateOperationError(\n operator,\n \"postgres\",\n \"Supported operators: $set, $unset, $inc, $dec, $setOnInsert.\",\n );\n }\n }\n\n return update;\n}\n"],"mappings":";;;;;;;;;AAaA,MAAM,sCAA2C,IAAI,IAAI;CACvD;CACA;CACA;CACA;CACA;AACF,CAAC;;;;;;;;;;;AAYD,SAAgB,qBACd,QACA,SACkB;CAClB,IAAI,MAAM,QAAQ,MAAM,GACtB,MAAM,IAAI,gCACR,mBACA,YACA,gEACF;CAGF,IAAI,SAAS,iBAAiB,QAC5B,MAAM,IAAI,gCAAgC,gBAAgB,UAAU;CAGtE,KAAK,MAAM,YAAY,OAAO,KAAK,MAAM,GACvC,IAAI,CAAC,oBAAoB,IAAI,QAAQ,GACnC,MAAM,IAAI,gCACR,UACA,YACA,8DACF;CAIJ,OAAO;AACT"}
@@ -9,29 +9,42 @@
9
9
  /**
10
10
  * PostgreSQL connection configuration options.
11
11
  */
12
- type PostgresConnectionConfig = {
13
- /** Database host (default: "localhost") */readonly host?: string; /** Database port (default: 5432) */
14
- readonly port?: number; /** Database name */
15
- readonly database: string; /** Database user */
16
- readonly user?: string; /** Database password */
17
- readonly password?: string; /** Connection string (alternative to individual options) */
18
- readonly connectionString?: string; /** SSL configuration */
12
+ export type PostgresConnectionConfig = {
13
+ /** Database host (default: "localhost") */
14
+ readonly host?: string;
15
+ /** Database port (default: 5432) */
16
+ readonly port?: number;
17
+ /** Database name */
18
+ readonly database: string;
19
+ /** Database user */
20
+ readonly user?: string;
21
+ /** Database password */
22
+ readonly password?: string;
23
+ /** Connection string (alternative to individual options) */
24
+ readonly connectionString?: string;
25
+ /** SSL configuration */
19
26
  readonly ssl?: boolean | {
20
27
  readonly rejectUnauthorized?: boolean;
21
28
  readonly ca?: string;
22
29
  readonly cert?: string;
23
30
  readonly key?: string;
24
- }; /** Enable database operation logging (queries, execution time, parameters) */
31
+ };
32
+ /** Enable database operation logging (queries, execution time, parameters) */
25
33
  readonly logging?: boolean;
26
34
  };
27
35
  /**
28
36
  * PostgreSQL pool configuration options.
29
37
  */
30
- type PostgresPoolConfig = PostgresConnectionConfig & {
31
- /** Column naming policy; snake_case maps columns both directions while preserving table names. @default "preserve" */readonly naming?: "preserve" | "snake_case"; /** Maximum number of clients in the pool (default: 10) */
32
- readonly max?: number; /** Minimum number of clients in the pool (default: 0) */
33
- readonly min?: number; /** How long a client can sit idle before being closed (ms) */
34
- readonly idleTimeoutMillis?: number; /** How long to wait for a client before timing out (ms) (default: 10000) */
38
+ export type PostgresPoolConfig = PostgresConnectionConfig & {
39
+ /** Column naming policy; snake_case maps columns both directions while preserving table names. @default "preserve" */
40
+ readonly naming?: "preserve" | "snake_case";
41
+ /** Maximum number of clients in the pool (default: 10) */
42
+ readonly max?: number;
43
+ /** Minimum number of clients in the pool (default: 0) */
44
+ readonly min?: number;
45
+ /** How long a client can sit idle before being closed (ms) */
46
+ readonly idleTimeoutMillis?: number;
47
+ /** How long to wait for a client before timing out (ms) (default: 10000) */
35
48
  readonly connectionTimeoutMillis?: number;
36
49
  /**
37
50
  * Enable TCP keep-alive on socket connections (default: true).
@@ -42,8 +55,10 @@ type PostgresPoolConfig = PostgresConnectionConfig & {
42
55
  * timeout, which is exactly what surfaced on first requests after the
43
56
  * server sat idle (card ba1193b4).
44
57
  */
45
- readonly keepAlive?: boolean; /** Maximum times to use a connection before destroying it */
46
- readonly maxUses?: number; /** Application name for connection identification */
58
+ readonly keepAlive?: boolean;
59
+ /** Maximum times to use a connection before destroying it */
60
+ readonly maxUses?: number;
61
+ /** Application name for connection identification */
47
62
  readonly application_name?: string;
48
63
  /**
49
64
  * Column names whose values are native PostgreSQL arrays (e.g. `JSONB[]`,
@@ -64,25 +79,32 @@ type PostgresPoolConfig = PostgresConnectionConfig & {
64
79
  /**
65
80
  * PostgreSQL query result wrapper.
66
81
  */
67
- type PostgresQueryResult<T = Record<string, unknown>> = {
68
- /** Array of rows returned by the query */readonly rows: T[]; /** Number of rows affected by INSERT/UPDATE/DELETE */
69
- readonly rowCount: number | null; /** Column definitions from the result */
82
+ export type PostgresQueryResult<T = Record<string, unknown>> = {
83
+ /** Array of rows returned by the query */
84
+ readonly rows: T[];
85
+ /** Number of rows affected by INSERT/UPDATE/DELETE */
86
+ readonly rowCount: number | null;
87
+ /** Column definitions from the result */
70
88
  readonly fields: Array<{
71
89
  readonly name: string;
72
90
  readonly dataTypeID: number;
73
- }>; /** Command that was executed (SELECT, INSERT, etc.) */
91
+ }>;
92
+ /** Command that was executed (SELECT, INSERT, etc.) */
74
93
  readonly command: string;
75
94
  };
76
95
  /**
77
96
  * PostgreSQL transaction isolation levels.
78
97
  */
79
- type PostgresIsolationLevel = "read uncommitted" | "read committed" | "repeatable read" | "serializable";
98
+ export type PostgresIsolationLevel = "read uncommitted" | "read committed" | "repeatable read" | "serializable";
80
99
  /**
81
100
  * PostgreSQL transaction options.
82
101
  */
83
- type PostgresTransactionOptions = {
84
- /** Isolation level for the transaction */readonly isolationLevel?: PostgresIsolationLevel; /** Whether the transaction is read-only */
85
- readonly readOnly?: boolean; /** Use deferrable mode (for serializable + read-only) */
102
+ export type PostgresTransactionOptions = {
103
+ /** Isolation level for the transaction */
104
+ readonly isolationLevel?: PostgresIsolationLevel;
105
+ /** Whether the transaction is read-only */
106
+ readonly readOnly?: boolean;
107
+ /** Use deferrable mode (for serializable + read-only) */
86
108
  readonly deferrable?: boolean;
87
109
  /**
88
110
  * Transaction-local PostgreSQL settings. For example:
@@ -93,44 +115,64 @@ type PostgresTransactionOptions = {
93
115
  /**
94
116
  * PostgreSQL-specific operation types used in the query builder.
95
117
  */
96
- type PostgresOperation = {
97
- /** Operation stage (select, where, join, etc.) */readonly stage: "select" | "from" | "join" | "where" | "groupBy" | "having" | "orderBy" | "limit" | "offset"; /** Operation type/name */
98
- readonly type: string; /** Operation payload/data */
118
+ export type PostgresOperation = {
119
+ /** Operation stage (select, where, join, etc.) */
120
+ readonly stage: "select" | "from" | "join" | "where" | "groupBy" | "having" | "orderBy" | "limit" | "offset";
121
+ /** Operation type/name */
122
+ readonly type: string;
123
+ /** Operation payload/data */
99
124
  readonly data: Record<string, unknown>;
100
125
  };
101
126
  /**
102
127
  * Internal representation of a pending WHERE clause.
103
128
  */
104
- type PostgresWhereClause = {
105
- /** Boolean operator to combine with previous clause */readonly boolean: "and" | "or"; /** Type of where clause */
106
- readonly type: "basic" | "raw" | "null" | "notNull" | "in" | "notIn" | "between" | "notBetween" | "exists" | "notExists" | "nested" | "column"; /** Column/field name */
107
- readonly column?: string; /** Comparison operator */
108
- readonly operator?: string; /** Value to compare */
109
- readonly value?: unknown; /** Raw SQL expression */
110
- readonly raw?: string; /** Parameter bindings */
111
- readonly bindings?: unknown[]; /** Nested conditions */
129
+ export type PostgresWhereClause = {
130
+ /** Boolean operator to combine with previous clause */
131
+ readonly boolean: "and" | "or";
132
+ /** Type of where clause */
133
+ readonly type: "basic" | "raw" | "null" | "notNull" | "in" | "notIn" | "between" | "notBetween" | "exists" | "notExists" | "nested" | "column";
134
+ /** Column/field name */
135
+ readonly column?: string;
136
+ /** Comparison operator */
137
+ readonly operator?: string;
138
+ /** Value to compare */
139
+ readonly value?: unknown;
140
+ /** Raw SQL expression */
141
+ readonly raw?: string;
142
+ /** Parameter bindings */
143
+ readonly bindings?: unknown[];
144
+ /** Nested conditions */
112
145
  readonly nested?: PostgresWhereClause[];
113
146
  };
114
147
  /**
115
148
  * PostgreSQL NOTIFY payload structure.
116
149
  */
117
- type PostgresNotification = {
118
- /** Channel name */readonly channel: string; /** Notification payload */
119
- readonly payload?: string; /** Process ID of the notifying backend */
150
+ export type PostgresNotification = {
151
+ /** Channel name */
152
+ readonly channel: string;
153
+ /** Notification payload */
154
+ readonly payload?: string;
155
+ /** Process ID of the notifying backend */
120
156
  readonly processId: number;
121
157
  };
122
158
  /**
123
159
  * PostgreSQL COPY options for bulk operations.
124
160
  */
125
- type PostgresCopyOptions = {
126
- /** Format (text, csv, binary) */readonly format?: "text" | "csv" | "binary"; /** Field delimiter for text/csv */
127
- readonly delimiter?: string; /** Quote character for csv */
128
- readonly quote?: string; /** Escape character for csv */
129
- readonly escape?: string; /** Include header row */
130
- readonly header?: boolean; /** Null string representation */
131
- readonly null?: string; /** Column list */
161
+ export type PostgresCopyOptions = {
162
+ /** Format (text, csv, binary) */
163
+ readonly format?: "text" | "csv" | "binary";
164
+ /** Field delimiter for text/csv */
165
+ readonly delimiter?: string;
166
+ /** Quote character for csv */
167
+ readonly quote?: string;
168
+ /** Escape character for csv */
169
+ readonly escape?: string;
170
+ /** Include header row */
171
+ readonly header?: boolean;
172
+ /** Null string representation */
173
+ readonly null?: string;
174
+ /** Column list */
132
175
  readonly columns?: string[];
133
176
  };
134
177
  //#endregion
135
- export { PostgresConnectionConfig, PostgresCopyOptions, PostgresIsolationLevel, PostgresNotification, PostgresOperation, PostgresPoolConfig, PostgresQueryResult, PostgresTransactionOptions, PostgresWhereClause };
136
178
  //# sourceMappingURL=types.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../../../packages/cascade/src/drivers/postgres/types.ts"],"mappings":";;AAWA;;;;;;;;;KAAY,wBAAA;EAcD,oDAZA,IAAA,WAgBM;EAAA,SAdN,IAAA,WAgBM;EAAA,SAdN,QAAA,UAiBO;EAAA,SAfP,IAAA,WAqBC;EAAA,SAnBD,QAAA;WAEA,gBAAA,WAiBsB;EAAA,SAftB,GAAA;IAAA,SAGM,kBAAA;IAAA,SACA,EAAA;IAAA,SACA,IAAA;IAAA,SACA,GAAA;EAAA,GA+BN;EAAA,SA5BA,OAAA;AAAA;;AA6CkB;AAM7B;KA7CY,kBAAA,GAAqB,wBAAwB;EA6C1B,+HA3CpB,MAAA,8BA6CM;EAAA,SA3CN,GAAA,WA+Ca;EAAA,SA7Cb,GAAA,WAuCqB;EAAA,SArCrB,iBAAA,WAuCA;EAAA,SArCA,uBAAA;EAuCA;;;;;;;AAOO;AAMlB;EAbW,SA7BA,SAAA;WAEA,OAAA,WAwCuB;EAAA,SAtCvB,gBAAA;EA+C2B;;;;;;;;;;AAWV;AAM5B;;;EAjBsC,SAhC3B,kBAAA;AAAA;;;;KAMC,mBAAA,KAAwB,MAAA;EA0Db,mDAxDZ,IAAA,EAAM,CAAA,IA8Dc;EAAA,SA5DpB,QAAA,iBAwF4B;EAAA,SAtF5B,MAAA,EAAQ,KAAA;IAAA,SACN,IAAA;IAAA,SACA,UAAA;EAAA,IA8EF;EAAA,SA3EA,OAAA;AAAA;;;;KAMC,sBAAA;AAiFZ;;;AAAA,KAxEY,0BAAA;EA0ED,mDAxEA,cAAA,GAAiB,sBAAA,EA4EjB;EAAA,SA1EA,QAAA,YA0ES;EAAA,SAxET,UAAA;EA8EoB;;;;EAAA,SAzEpB,QAAA,GAAW,MAAM;AAAA;;;;KAMhB,iBAAA;EAiFM,2DA/EP,KAAA;WAWA,IAAA;WAEA,IAAA,EAAM,MAAM;AAAA;;;;KAMX,mBAAA;kEAED,OAAA;WAEA,IAAA;WAcA,MAAA;WAEA,QAAA;WAEA,KAAA;WAEA,GAAA;WAEA,QAAA;WAEA,MAAA,GAAS,mBAAmB;AAAA;;;;KAM3B,oBAAA;8BAED,OAAA;WAEA,OAAA;WAEA,SAAA;AAAA;;;;KAMC,mBAAA;4CAED,MAAA;WAEA,SAAA;WAEA,KAAA;WAEA,MAAA;WAEA,MAAA;WAEA,IAAA;WAEA,OAAA;AAAA"}
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../../../packages/cascade/src/drivers/postgres/types.ts"],"mappings":";;;;;;;;;;;YAWY;;WAED;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;aAGM;aACA;aACA;aACA;;;WAGN;;;;;YAMC,qBAAqB;;WAEtB;;WAEA;;WAEA;;WAEA;;WAEA;;;;;;;;;;WAUA;;WAEA;;WAEA;;;;;;;;;;;;;;;WAeA;;;;;YAMC,oBAAoB,IAAI;;WAEzB,MAAM;;WAEN;;WAEA,QAAQ;aACN;aACA;;;WAGF;;;;;YAMC;;;;YASA;;WAED,iBAAiB;;WAEjB;;WAEA;;;;;WAKA,WAAW;;;;;YAMV;;WAED;;WAWA;;WAEA,MAAM;;;;;YAML;;WAED;;WAEA;;WAcA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA,SAAS;;;;;YAMR;;WAED;;WAEA;;WAEA;;;;;YAMC;;WAED;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA"}
@@ -1,6 +1,5 @@
1
1
  import { ColumnExpression } from "../../expressions/column-expressions.mjs";
2
2
  import { AggregateExpression } from "../../expressions/aggregate-expressions.mjs";
3
-
4
3
  //#region ../../packages/cascade/src/drivers/sql/sql-dialect.contract.d.ts
5
4
  /**
6
5
  * Contract that SQL dialects must implement to handle database-specific
@@ -25,7 +24,7 @@ import { AggregateExpression } from "../../expressions/aggregate-expressions.mjs
25
24
  * }
26
25
  * ```
27
26
  */
28
- interface SqlDialectContract {
27
+ export interface SqlDialectContract {
29
28
  /**
30
29
  * The name of the dialect for identification purposes.
31
30
  *
@@ -237,5 +236,4 @@ interface SqlDialectContract {
237
236
  dateTruncSql(column: string, unit: "day" | "week" | "month" | "year"): string;
238
237
  }
239
238
  //#endregion
240
- export { SqlDialectContract };
241
239
  //# sourceMappingURL=sql-dialect.contract.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sql-dialect.contract.d.mts","names":[],"sources":["../../../../../../../../../packages/cascade/src/drivers/sql/sql-dialect.contract.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;UAmCiB,kBAAA;EA6Je;;;;;EAAA,SAvJrB,IAAA;EAwK0D;;;;;;;;;;;;AA4CC;;;;EAlMpE,WAAA,CAAY,KAAA;;;;;;;;;;;;;;;;;;;EAoBZ,eAAA,CAAgB,UAAA;;;;;;;;;;;;;;;;;EAkBhB,cAAA,CAAe,KAAA;;;;;;;WAQN,iBAAA;;;;;;;WAQA,aAAA;;;;;;;;;;;;;;;;;EAkBT,WAAA,CAAY,KAAA,WAAgB,MAAA;;;;;;;;;;;;;;;;;;;EAoB5B,WAAA,CAAY,MAAA,UAAgB,IAAA;;;;;;;;;;;;EAa5B,YAAA,CAAa,MAAA,UAAgB,KAAA,WAAgB,IAAA;;;;;;;;;;;;;;;EAgB7C,WAAA,CAAY,OAAA,UAAiB,eAAA;IAA8B,QAAA;IAAkB,OAAA;EAAA;;;;;;;;;;;EAY7E,aAAA,CAAc,MAAA,UAAgB,UAAA;;;;;;;;;;;;;;EAe9B,UAAA,CACE,IAAA,UACA,OAAA;IAAY,MAAA;IAAiB,SAAA;IAAoB,KAAA;IAAgB,UAAA;EAAA;;;;;;;;;;;;;;;;;;;;;EAuBnE,cAAA,CAAe,UAAA,EAAY,mBAAA;;;;;;;;;;;EAY3B,qBAAA,CAAsB,UAAA,EAAY,gBAAgB;;;;;;;;EASlD,YAAA,CAAa,MAAA,UAAgB,IAAA;AAAA"}
1
+ {"version":3,"file":"sql-dialect.contract.d.mts","names":[],"sources":["../../../../../../../../../packages/cascade/src/drivers/sql/sql-dialect.contract.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;iBAmCiB;;;;;;WAMN;;;;;;;;;;;;;;;;;EAkBT,YAAY;;;;;;;;;;;;;;;;;;;EAoBZ,gBAAgB;;;;;;;;;;;;;;;;;EAkBhB,eAAe;;;;;;;WAQN;;;;;;;WAQA;;;;;;;;;;;;;;;;;EAkBT,YAAY,gBAAgB;;;;;;;;;;;;;;;;;;;EAoB5B,YAAY,gBAAgB;;;;;;;;;;;;EAa5B,aAAa,gBAAgB,gBAAgB;;;;;;;;;;;;;;;EAgB7C,YAAY,iBAAiB;IAA8B;IAAkB;;;;;;;;;;;;EAY7E,cAAc,gBAAgB;;;;;;;;;;;;;;EAe9B,WACE,cACA;IAAY;IAAiB;IAAoB;IAAgB;;;;;;;;;;;;;;;;;;;;;;EAuBnE,eAAe,YAAY;;;;;;;;;;;EAY3B,sBAAsB,YAAY;;;;;;;;EASlC,aAAa,gBAAgB"}