@warlock.js/cascade 5.23.2 → 5.25.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 (72) hide show
  1. package/CHANGELOG.md +352 -329
  2. package/README.md +101 -101
  3. package/bin/cascade.js +0 -0
  4. package/cjs/index.cjs +208 -69
  5. package/cjs/index.cjs.map +1 -1
  6. package/esm/contracts/database-driver.contract.d.mts +22 -1
  7. package/esm/contracts/database-driver.contract.d.mts.map +1 -1
  8. package/esm/contracts/index.d.mts +1 -1
  9. package/esm/data-source/data-source-registry.d.mts +8 -6
  10. package/esm/data-source/data-source-registry.d.mts.map +1 -1
  11. package/esm/data-source/data-source-registry.mjs +7 -1
  12. package/esm/data-source/data-source-registry.mjs.map +1 -1
  13. package/esm/drivers/mongodb/mongodb-driver.d.mts +13 -0
  14. package/esm/drivers/mongodb/mongodb-driver.d.mts.map +1 -1
  15. package/esm/drivers/mongodb/mongodb-driver.mjs +71 -2
  16. package/esm/drivers/mongodb/mongodb-driver.mjs.map +1 -1
  17. package/esm/drivers/mongodb/mongodb-query-builder.d.mts.map +1 -1
  18. package/esm/drivers/mongodb/mongodb-query-builder.mjs +2 -1
  19. package/esm/drivers/mongodb/mongodb-query-builder.mjs.map +1 -1
  20. package/esm/drivers/postgres/postgres-driver.d.mts +9 -0
  21. package/esm/drivers/postgres/postgres-driver.d.mts.map +1 -1
  22. package/esm/drivers/postgres/postgres-driver.mjs +61 -5
  23. package/esm/drivers/postgres/postgres-driver.mjs.map +1 -1
  24. package/esm/drivers/postgres/postgres-query-parser.d.mts +1 -4
  25. package/esm/drivers/postgres/postgres-query-parser.d.mts.map +1 -1
  26. package/esm/drivers/postgres/postgres-query-parser.mjs +4 -5
  27. package/esm/drivers/postgres/postgres-query-parser.mjs.map +1 -1
  28. package/esm/drivers/postgres/types.d.mts +5 -0
  29. package/esm/drivers/postgres/types.d.mts.map +1 -1
  30. package/esm/errors/unsafe-filter.error.mjs.map +1 -1
  31. package/esm/errors/unsafe-raw-expression.error.mjs.map +1 -1
  32. package/esm/errors/unsupported-lock-for-update.error.d.mts +11 -0
  33. package/esm/errors/unsupported-lock-for-update.error.d.mts.map +1 -0
  34. package/esm/errors/unsupported-lock-for-update.error.mjs +16 -0
  35. package/esm/errors/unsupported-lock-for-update.error.mjs.map +1 -0
  36. package/esm/events/model-events.mjs.map +1 -1
  37. package/esm/index.d.mts +3 -2
  38. package/esm/index.mjs +2 -1
  39. package/esm/migration/migration-runner.mjs.map +1 -1
  40. package/esm/migration/sql-grammar.mjs.map +1 -1
  41. package/esm/model/generate-model-id.mjs +23 -0
  42. package/esm/model/generate-model-id.mjs.map +1 -0
  43. package/esm/model/methods/delete-methods.mjs.map +1 -1
  44. package/esm/model/methods/meta-methods.mjs.map +1 -1
  45. package/esm/model/methods/query-methods.mjs +25 -2
  46. package/esm/model/methods/query-methods.mjs.map +1 -1
  47. package/esm/model/methods/write-methods.mjs.map +1 -1
  48. package/esm/query-builder/query-builder.mjs +1 -1
  49. package/esm/query-builder/query-builder.mjs.map +1 -1
  50. package/esm/utils/sanitize-filter.mjs.map +1 -1
  51. package/esm/validation/plugins/database-rules-plugin.mjs.map +1 -1
  52. package/esm/writer/database-writer.d.mts +0 -33
  53. package/esm/writer/database-writer.d.mts.map +1 -1
  54. package/esm/writer/database-writer.mjs +4 -52
  55. package/esm/writer/database-writer.mjs.map +1 -1
  56. package/llms-full.txt +2835 -2783
  57. package/package.json +5 -5
  58. package/skills/aggregate-data/SKILL.md +165 -165
  59. package/skills/alter-migration/SKILL.md +531 -531
  60. package/skills/configure-delete-strategy/SKILL.md +130 -130
  61. package/skills/define-model/SKILL.md +205 -205
  62. package/skills/define-relations/SKILL.md +171 -171
  63. package/skills/manage-data-sources/SKILL.md +177 -140
  64. package/skills/manage-transactions/SKILL.md +233 -208
  65. package/skills/paginate-results/SKILL.md +122 -122
  66. package/skills/perform-atomic-ops/SKILL.md +156 -156
  67. package/skills/query-data/SKILL.md +213 -213
  68. package/skills/run-cascade-cli/SKILL.md +125 -125
  69. package/skills/search-by-vector/SKILL.md +127 -127
  70. package/skills/subscribe-to-model-events/SKILL.md +148 -148
  71. package/skills/track-changes/SKILL.md +127 -127
  72. package/skills/write-migration/SKILL.md +206 -206
@@ -1 +1 @@
1
- {"version":3,"file":"postgres-driver.d.mts","names":[],"sources":["../../../../../../../../cascade/src/drivers/postgres/postgres-driver.ts"],"mappings":"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"}
1
+ {"version":3,"file":"postgres-driver.d.mts","names":[],"sources":["../../../../../../../../cascade/src/drivers/postgres/postgres-driver.ts"],"mappings":"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"}
@@ -309,6 +309,13 @@ var PostgresDriver = class {
309
309
  if (!this._eventListeners.has(event)) this._eventListeners.set(event, /* @__PURE__ */ new Set());
310
310
  this._eventListeners.get(event).add(listener);
311
311
  }
312
+ /** Remove a previously registered driver event listener. */
313
+ off(event, listener) {
314
+ const listeners = this._eventListeners.get(event);
315
+ if (!listeners) return;
316
+ listeners.delete(listener);
317
+ if (listeners.size === 0) this._eventListeners.delete(event);
318
+ }
312
319
  /**
313
320
  * Serialize data for storage in PostgreSQL.
314
321
  *
@@ -801,14 +808,22 @@ var PostgresDriver = class {
801
808
  * @returns Transaction contract with commit/rollback methods
802
809
  */
803
810
  async beginTransaction(options) {
811
+ const settings = Object.entries(options?.settings ?? {});
812
+ for (const [name] of settings) if (!/^[A-Za-z_][A-Za-z0-9_.]*$/.test(name)) throw new Error(`Invalid PostgreSQL transaction setting name: "${name}"`);
804
813
  const client = await this.pool.connect();
814
+ let transactionStarted = false;
805
815
  try {
806
816
  let beginSql = "BEGIN";
807
817
  if (options?.isolationLevel) beginSql += ` ISOLATION LEVEL ${options.isolationLevel.toUpperCase()}`;
808
818
  if (options?.readOnly) beginSql += " READ ONLY";
809
819
  if (options?.deferrable) beginSql += " DEFERRABLE";
810
- await client.query(beginSql);
820
+ await this.executePostgresQuery(() => client.query(beginSql), beginSql);
821
+ transactionStarted = true;
822
+ for (const [name, value] of settings) await this.executePostgresQuery(() => client.query("SELECT set_config($1, $2, true)", [name, String(value)]), "SELECT set_config($1, $2, true)", [name, String(value)]);
811
823
  } catch (error) {
824
+ if (transactionStarted) try {
825
+ await this.executePostgresQuery(() => client.query("ROLLBACK"), "ROLLBACK");
826
+ } catch {}
812
827
  client.release(error instanceof Error ? error : new Error(String(error)));
813
828
  throw error;
814
829
  }
@@ -816,7 +831,7 @@ var PostgresDriver = class {
816
831
  context: client,
817
832
  commit: async () => {
818
833
  try {
819
- await client.query("COMMIT");
834
+ await this.executePostgresQuery(() => client.query("COMMIT"), "COMMIT");
820
835
  } catch (error) {
821
836
  client.release(error instanceof Error ? error : new Error(String(error)));
822
837
  throw error;
@@ -825,7 +840,7 @@ var PostgresDriver = class {
825
840
  },
826
841
  rollback: async () => {
827
842
  try {
828
- await client.query("ROLLBACK");
843
+ await this.executePostgresQuery(() => client.query("ROLLBACK"), "ROLLBACK");
829
844
  } catch (error) {
830
845
  client.release(error instanceof Error ? error : new Error(String(error)));
831
846
  throw error;
@@ -1058,8 +1073,8 @@ var PostgresDriver = class {
1058
1073
  paramCount: params.length
1059
1074
  }
1060
1075
  });
1061
- if (txClient) result = await txClient.query(sql, params);
1062
- else result = await this.pool.query(sql, params);
1076
+ if (txClient) result = await this.executePostgresQuery(() => txClient.query(sql, params), sql, params);
1077
+ else result = await this.executePostgresQuery(() => this.pool.query(sql, params), sql, params);
1063
1078
  if (this.config.logging) {
1064
1079
  const duration = (performance.now() - startTime).toFixed(2);
1065
1080
  log.success({
@@ -1092,6 +1107,47 @@ var PostgresDriver = class {
1092
1107
  throw error;
1093
1108
  }
1094
1109
  }
1110
+ /** Execute SQL and emit its public query event when the event is observed. */
1111
+ async executePostgresQuery(execute, sql, bindings = []) {
1112
+ if (!this._eventListeners.get("query")?.size) return execute();
1113
+ const started = performance.now();
1114
+ const startedAt = performance.timeOrigin + started;
1115
+ let result;
1116
+ try {
1117
+ result = await execute();
1118
+ } catch (error) {
1119
+ this.emitQueryEvent({
1120
+ connection: this.name,
1121
+ driver: "postgres",
1122
+ sql,
1123
+ bindings,
1124
+ durationMs: performance.now() - started,
1125
+ startedAt,
1126
+ error
1127
+ });
1128
+ throw error;
1129
+ }
1130
+ const event = {
1131
+ connection: this.name,
1132
+ driver: "postgres",
1133
+ sql,
1134
+ bindings,
1135
+ durationMs: performance.now() - started,
1136
+ startedAt
1137
+ };
1138
+ if (typeof result.rowCount === "number") event.rowCount = result.rowCount;
1139
+ this.emitQueryEvent(event);
1140
+ return result;
1141
+ }
1142
+ /**
1143
+ * Emit a `query` event. An observer is never allowed to fail the query it
1144
+ * observes, so a throwing listener is swallowed here.
1145
+ */
1146
+ emitQueryEvent(event) {
1147
+ try {
1148
+ this.emit("query", event);
1149
+ } catch {}
1150
+ }
1095
1151
  /**
1096
1152
  * Emit an event to all registered listeners.
1097
1153
  *