callman-core 1.19.0 → 1.20.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 (75) hide show
  1. package/dist/host/db/connectionMapping.d.ts +4 -0
  2. package/dist/host/db/connectionMapping.d.ts.map +1 -1
  3. package/dist/host/db/connectionMapping.js +4 -0
  4. package/dist/host/db/connectionMapping.js.map +1 -1
  5. package/dist/host/db/pgClientConfig.d.ts +11 -0
  6. package/dist/host/db/pgClientConfig.d.ts.map +1 -0
  7. package/dist/host/db/pgClientConfig.js +83 -0
  8. package/dist/host/db/pgClientConfig.js.map +1 -0
  9. package/dist/host/db/pgSessionManager.d.ts +18 -0
  10. package/dist/host/db/pgSessionManager.d.ts.map +1 -0
  11. package/dist/host/db/pgSessionManager.js +162 -0
  12. package/dist/host/db/pgSessionManager.js.map +1 -0
  13. package/dist/host/db/postgresAdapter.d.ts.map +1 -1
  14. package/dist/host/db/postgresAdapter.js +7 -36
  15. package/dist/host/db/postgresAdapter.js.map +1 -1
  16. package/dist/host/db/queryExecutor.d.ts +4 -0
  17. package/dist/host/db/queryExecutor.d.ts.map +1 -1
  18. package/dist/host/db/queryExecutor.js +40 -2
  19. package/dist/host/db/queryExecutor.js.map +1 -1
  20. package/dist/host/db/sqlState.d.ts +2 -0
  21. package/dist/host/db/sqlState.d.ts.map +1 -0
  22. package/dist/host/db/sqlState.js +14 -0
  23. package/dist/host/db/sqlState.js.map +1 -0
  24. package/dist/host/db/types.d.ts +13 -0
  25. package/dist/host/db/types.d.ts.map +1 -1
  26. package/dist/host/index.d.ts +3 -0
  27. package/dist/host/index.d.ts.map +1 -1
  28. package/dist/host/index.js +7 -0
  29. package/dist/host/index.js.map +1 -1
  30. package/dist/scenario-runner/adapters/connection-config.d.ts +4 -0
  31. package/dist/scenario-runner/adapters/connection-config.d.ts.map +1 -1
  32. package/dist/scenario-runner/adapters/db-executor.d.ts +7 -1
  33. package/dist/scenario-runner/adapters/db-executor.d.ts.map +1 -1
  34. package/dist/scenario-runner/adapters/db-executor.js +106 -1
  35. package/dist/scenario-runner/adapters/db-executor.js.map +1 -1
  36. package/dist/scenario-runner/adapters/index.d.ts +1 -1
  37. package/dist/scenario-runner/adapters/index.d.ts.map +1 -1
  38. package/dist/scenario-runner/adapters/index.js +8 -1
  39. package/dist/scenario-runner/adapters/index.js.map +1 -1
  40. package/dist/scenario-runner/adapters/types.d.ts +8 -0
  41. package/dist/scenario-runner/adapters/types.d.ts.map +1 -1
  42. package/dist/scenario-runner/condition.d.ts +1 -0
  43. package/dist/scenario-runner/condition.d.ts.map +1 -1
  44. package/dist/scenario-runner/condition.js +127 -2
  45. package/dist/scenario-runner/condition.js.map +1 -1
  46. package/dist/scenario-runner/conditionTypes.d.ts +1 -1
  47. package/dist/scenario-runner/conditionTypes.d.ts.map +1 -1
  48. package/dist/scenario-runner/runScenario.d.ts.map +1 -1
  49. package/dist/scenario-runner/runScenario.js +42 -1
  50. package/dist/scenario-runner/runScenario.js.map +1 -1
  51. package/dist/scenario-runner/types.d.ts +27 -0
  52. package/dist/scenario-runner/types.d.ts.map +1 -1
  53. package/dist-cjs/host/db/connectionMapping.js +4 -0
  54. package/dist-cjs/host/db/connectionMapping.js.map +1 -1
  55. package/dist-cjs/host/db/pgClientConfig.js +90 -0
  56. package/dist-cjs/host/db/pgClientConfig.js.map +1 -0
  57. package/dist-cjs/host/db/pgSessionManager.js +170 -0
  58. package/dist-cjs/host/db/pgSessionManager.js.map +1 -0
  59. package/dist-cjs/host/db/postgresAdapter.js +7 -36
  60. package/dist-cjs/host/db/postgresAdapter.js.map +1 -1
  61. package/dist-cjs/host/db/queryExecutor.js +40 -2
  62. package/dist-cjs/host/db/queryExecutor.js.map +1 -1
  63. package/dist-cjs/host/db/sqlState.js +18 -0
  64. package/dist-cjs/host/db/sqlState.js.map +1 -0
  65. package/dist-cjs/host/index.js +16 -1
  66. package/dist-cjs/host/index.js.map +1 -1
  67. package/dist-cjs/scenario-runner/adapters/db-executor.js +108 -2
  68. package/dist-cjs/scenario-runner/adapters/db-executor.js.map +1 -1
  69. package/dist-cjs/scenario-runner/adapters/index.js +10 -1
  70. package/dist-cjs/scenario-runner/adapters/index.js.map +1 -1
  71. package/dist-cjs/scenario-runner/condition.js +129 -3
  72. package/dist-cjs/scenario-runner/condition.js.map +1 -1
  73. package/dist-cjs/scenario-runner/runScenario.js +42 -1
  74. package/dist-cjs/scenario-runner/runScenario.js.map +1 -1
  75. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"queryExecutor.js","sourceRoot":"","sources":["../../../src/host/db/queryExecutor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"queryExecutor.js","sourceRoot":"","sources":["../../../src/host/db/queryExecutor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractSqlState = void 0;
4
+ // SQLSTATE extraction shared by the scenario db-executor, the host query
5
+ // executor, and desktop adapters. Postgres SQLSTATE is 5 alphanumeric chars;
6
+ // `pg` errors expose it as `.code`. `.sqlState` is checked first so hosts
7
+ // can attach it explicitly without colliding with Node's `error.code`
8
+ // values (e.g. ECONNREFUSED).
9
+ const extractSqlState = (error) => {
10
+ if (!error || typeof error !== "object")
11
+ return undefined;
12
+ const candidate = error.sqlState ?? error.code;
13
+ return typeof candidate === "string" && /^[0-9A-Z]{5}$/.test(candidate)
14
+ ? candidate
15
+ : undefined;
16
+ };
17
+ exports.extractSqlState = extractSqlState;
18
+ //# sourceMappingURL=sqlState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlState.js","sourceRoot":"","sources":["../../../src/host/db/sqlState.ts"],"names":[],"mappings":";;;AAAA,yEAAyE;AACzE,6EAA6E;AAC7E,0EAA0E;AAC1E,sEAAsE;AACtE,8BAA8B;AACvB,MAAM,eAAe,GAAG,CAAC,KAAc,EAAsB,EAAE;IACpE,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC1D,MAAM,SAAS,GACZ,KAAgC,CAAC,QAAQ,IAAK,KAA4B,CAAC,IAAI,CAAC;IACnF,OAAO,OAAO,SAAS,KAAK,QAAQ,IAAI,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC;QACrE,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC,CAAC;AAPW,QAAA,eAAe,mBAO1B"}
@@ -3,7 +3,7 @@
3
3
  // resolved connection runtimes into script capabilities. Lets the collection
4
4
  // runner execute `pm.db.*` and `pm.redis` without an external host process.
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.__setRedisDriverForTests = exports.REDIS_COMMAND_SPECS = exports.parseRedisCommand = exports.executeRedisCommands = exports.databaseConfigToDbConnection = exports.OracleConnectStringError = exports.normalizeOracleConnectString = exports.renderDbQueryReference = exports.stripTrailingSqlTerminator = exports.__setMssqlDriverForTests = exports.testMssqlConnection = exports.executeMssqlQuery = exports.__setOracleDriverForTests = exports.testOracleConnection = exports.executeOracleQuery = exports.__setMysqlDriverForTests = exports.testMysqlConnection = exports.executeMysqlQuery = exports.__setPostgresDriverForTests = exports.testPostgresConnection = exports.executePostgresQuery = exports.__setMongoDriverForTests = exports.testMongoConnection = exports.executeMongoQuery = exports.testDbConnection = exports.executeResolvedDbQuery = exports.executeQuery = exports.buildRedisCapability = exports.buildRedisValueCache = exports.runRedisCommandsForPhase = exports.runConfiguredDbQuery = exports.buildDbExecuteCapability = void 0;
6
+ exports.__setRedisDriverForTests = exports.REDIS_COMMAND_SPECS = exports.parseRedisCommand = exports.executeRedisCommands = exports.databaseConfigToDbConnection = exports.OracleConnectStringError = exports.normalizeOracleConnectString = exports.renderDbQueryReference = exports.extractSqlState = exports.buildPgClientConfig = exports.buildPgSslConfig = exports.stripTrailingSqlTerminator = exports.__setMssqlDriverForTests = exports.testMssqlConnection = exports.executeMssqlQuery = exports.__setOracleDriverForTests = exports.testOracleConnection = exports.executeOracleQuery = exports.__setMysqlDriverForTests = exports.testMysqlConnection = exports.executeMysqlQuery = exports.__setPostgresDriverForTests = exports.testPostgresConnection = exports.executePostgresQuery = exports.__setMongoDriverForTests = exports.testMongoConnection = exports.executeMongoQuery = exports.__getPgSessionCountForTests = exports.__setPgSessionDriverForTests = exports.closeAllPostgresSessions = exports.releasePostgresSessionsForRun = exports.executePostgresQueryInSession = exports.testDbConnection = exports.executeResolvedDbQuery = exports.executeQuery = exports.buildRedisCapability = exports.buildRedisValueCache = exports.runRedisCommandsForPhase = exports.runConfiguredDbQuery = exports.buildDbExecuteCapability = void 0;
7
7
  var connections_js_1 = require("./connections.js");
8
8
  Object.defineProperty(exports, "buildDbExecuteCapability", { enumerable: true, get: function () { return connections_js_1.buildDbExecuteCapability; } });
9
9
  Object.defineProperty(exports, "runConfiguredDbQuery", { enumerable: true, get: function () { return connections_js_1.runConfiguredDbQuery; } });
@@ -14,6 +14,16 @@ var queryExecutor_js_1 = require("./db/queryExecutor.js");
14
14
  Object.defineProperty(exports, "executeQuery", { enumerable: true, get: function () { return queryExecutor_js_1.executeQuery; } });
15
15
  Object.defineProperty(exports, "executeResolvedDbQuery", { enumerable: true, get: function () { return queryExecutor_js_1.executeResolvedDbQuery; } });
16
16
  Object.defineProperty(exports, "testDbConnection", { enumerable: true, get: function () { return queryExecutor_js_1.testDbConnection; } });
17
+ // Run-scoped Postgres sessions for `useSession` db nodes (BEGIN…ROLLBACK
18
+ // spanning multiple nodes). Hosts wire `releasePostgresSessionsForRun` into
19
+ // the `databaseSessionRelease` driver and `closeAllPostgresSessions` into
20
+ // process shutdown.
21
+ var pgSessionManager_js_1 = require("./db/pgSessionManager.js");
22
+ Object.defineProperty(exports, "executePostgresQueryInSession", { enumerable: true, get: function () { return pgSessionManager_js_1.executePostgresQueryInSession; } });
23
+ Object.defineProperty(exports, "releasePostgresSessionsForRun", { enumerable: true, get: function () { return pgSessionManager_js_1.releasePostgresSessionsForRun; } });
24
+ Object.defineProperty(exports, "closeAllPostgresSessions", { enumerable: true, get: function () { return pgSessionManager_js_1.closeAllPostgresSessions; } });
25
+ Object.defineProperty(exports, "__setPgSessionDriverForTests", { enumerable: true, get: function () { return pgSessionManager_js_1.__setPgSessionDriverForTests; } });
26
+ Object.defineProperty(exports, "__getPgSessionCountForTests", { enumerable: true, get: function () { return pgSessionManager_js_1.__getPgSessionCountForTests; } });
17
27
  // Individual adapters + connectivity checks, so hosts (Electron, backend) call
18
28
  // the single shared implementation instead of duplicating driver logic.
19
29
  var mongoAdapter_js_1 = require("./db/mongoAdapter.js");
@@ -38,6 +48,11 @@ Object.defineProperty(exports, "testMssqlConnection", { enumerable: true, get: f
38
48
  Object.defineProperty(exports, "__setMssqlDriverForTests", { enumerable: true, get: function () { return mssqlAdapter_js_1.__setMssqlDriverForTests; } });
39
49
  var sqlNormalize_js_1 = require("./db/sqlNormalize.js");
40
50
  Object.defineProperty(exports, "stripTrailingSqlTerminator", { enumerable: true, get: function () { return sqlNormalize_js_1.stripTrailingSqlTerminator; } });
51
+ var pgClientConfig_js_1 = require("./db/pgClientConfig.js");
52
+ Object.defineProperty(exports, "buildPgSslConfig", { enumerable: true, get: function () { return pgClientConfig_js_1.buildPgSslConfig; } });
53
+ Object.defineProperty(exports, "buildPgClientConfig", { enumerable: true, get: function () { return pgClientConfig_js_1.buildPgClientConfig; } });
54
+ var sqlState_js_1 = require("./db/sqlState.js");
55
+ Object.defineProperty(exports, "extractSqlState", { enumerable: true, get: function () { return sqlState_js_1.extractSqlState; } });
41
56
  var db_query_reference_js_1 = require("./db/db-query-reference.js");
42
57
  Object.defineProperty(exports, "renderDbQueryReference", { enumerable: true, get: function () { return db_query_reference_js_1.renderDbQueryReference; } });
43
58
  var oracleConnectString_js_1 = require("./db/oracleConnectString.js");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":";AAAA,wEAAwE;AACxE,6EAA6E;AAC7E,4EAA4E;;;AAE5E,mDAc0B;AAbxB,0HAAA,wBAAwB,OAAA;AACxB,sHAAA,oBAAoB,OAAA;AACpB,0HAAA,wBAAwB,OAAA;AACxB,sHAAA,oBAAoB,OAAA;AACpB,sHAAA,oBAAoB,OAAA;AAWtB,0DAI+B;AAH7B,gHAAA,YAAY,OAAA;AACZ,0HAAA,sBAAsB,OAAA;AACtB,oHAAA,gBAAgB,OAAA;AAElB,+EAA+E;AAC/E,wEAAwE;AACxE,wDAI8B;AAH5B,oHAAA,iBAAiB,OAAA;AACjB,sHAAA,mBAAmB,OAAA;AACnB,2HAAA,wBAAwB,OAAA;AAE1B,8DAIiC;AAH/B,0HAAA,oBAAoB,OAAA;AACpB,4HAAA,sBAAsB,OAAA;AACtB,iIAAA,2BAA2B,OAAA;AAE7B,wDAI8B;AAH5B,oHAAA,iBAAiB,OAAA;AACjB,sHAAA,mBAAmB,OAAA;AACnB,2HAAA,wBAAwB,OAAA;AAE1B,0DAI+B;AAH7B,sHAAA,kBAAkB,OAAA;AAClB,wHAAA,oBAAoB,OAAA;AACpB,6HAAA,yBAAyB,OAAA;AAE3B,wDAI8B;AAH5B,oHAAA,iBAAiB,OAAA;AACjB,sHAAA,mBAAmB,OAAA;AACnB,2HAAA,wBAAwB,OAAA;AAE1B,wDAAkE;AAAzD,6HAAA,0BAA0B,OAAA;AACnC,oEAAoE;AAA3D,+HAAA,sBAAsB,OAAA;AAC/B,sEAGqC;AAFnC,sIAAA,4BAA4B,OAAA;AAC5B,kIAAA,wBAAwB,OAAA;AAE1B,kEAImC;AAHjC,oIAAA,4BAA4B,OAAA;AAgB9B,2DAQiC;AAP/B,uHAAA,oBAAoB,OAAA;AACpB,oHAAA,iBAAiB,OAAA;AACjB,sHAAA,mBAAmB,OAAA;AACnB,2HAAA,wBAAwB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":";AAAA,wEAAwE;AACxE,6EAA6E;AAC7E,4EAA4E;;;AAE5E,mDAc0B;AAbxB,0HAAA,wBAAwB,OAAA;AACxB,sHAAA,oBAAoB,OAAA;AACpB,0HAAA,wBAAwB,OAAA;AACxB,sHAAA,oBAAoB,OAAA;AACpB,sHAAA,oBAAoB,OAAA;AAWtB,0DAI+B;AAH7B,gHAAA,YAAY,OAAA;AACZ,0HAAA,sBAAsB,OAAA;AACtB,oHAAA,gBAAgB,OAAA;AAElB,yEAAyE;AACzE,4EAA4E;AAC5E,0EAA0E;AAC1E,oBAAoB;AACpB,gEAQkC;AAPhC,oIAAA,6BAA6B,OAAA;AAC7B,oIAAA,6BAA6B,OAAA;AAC7B,+HAAA,wBAAwB,OAAA;AACxB,mIAAA,4BAA4B,OAAA;AAC5B,kIAAA,2BAA2B,OAAA;AAI7B,+EAA+E;AAC/E,wEAAwE;AACxE,wDAI8B;AAH5B,oHAAA,iBAAiB,OAAA;AACjB,sHAAA,mBAAmB,OAAA;AACnB,2HAAA,wBAAwB,OAAA;AAE1B,8DAIiC;AAH/B,0HAAA,oBAAoB,OAAA;AACpB,4HAAA,sBAAsB,OAAA;AACtB,iIAAA,2BAA2B,OAAA;AAE7B,wDAI8B;AAH5B,oHAAA,iBAAiB,OAAA;AACjB,sHAAA,mBAAmB,OAAA;AACnB,2HAAA,wBAAwB,OAAA;AAE1B,0DAI+B;AAH7B,sHAAA,kBAAkB,OAAA;AAClB,wHAAA,oBAAoB,OAAA;AACpB,6HAAA,yBAAyB,OAAA;AAE3B,wDAI8B;AAH5B,oHAAA,iBAAiB,OAAA;AACjB,sHAAA,mBAAmB,OAAA;AACnB,2HAAA,wBAAwB,OAAA;AAE1B,wDAAkE;AAAzD,6HAAA,0BAA0B,OAAA;AACnC,4DAA+E;AAAtE,qHAAA,gBAAgB,OAAA;AAAE,wHAAA,mBAAmB,OAAA;AAC9C,gDAAmD;AAA1C,8GAAA,eAAe,OAAA;AACxB,oEAAoE;AAA3D,+HAAA,sBAAsB,OAAA;AAC/B,sEAGqC;AAFnC,sIAAA,4BAA4B,OAAA;AAC5B,kIAAA,wBAAwB,OAAA;AAE1B,kEAImC;AAHjC,oIAAA,4BAA4B,OAAA;AAgB9B,2DAQiC;AAP/B,uHAAA,oBAAoB,OAAA;AACpB,oHAAA,iBAAiB,OAAA;AACjB,sHAAA,mBAAmB,OAAA;AACnB,2HAAA,wBAAwB,OAAA"}
@@ -3,17 +3,90 @@
3
3
  // Resolves the workspace connection, defers the actual query execution
4
4
  // to the host-supplied `databaseExecutor` driver (mongoose / oracledb /
5
5
  // postgres / etc.), wraps the result in the scenario adapter shape.
6
+ //
7
+ // Also owns the two stored-function-testing semantics that must behave
8
+ // identically on every host: session capability detection (a `useSession`
9
+ // node on a host without `databaseSessionRelease` fails fast instead of
10
+ // silently running autocommit) and expected-error evaluation (pgTAP
11
+ // `throws_ok` equivalent — a matching failure PASSES the node).
6
12
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.buildDbExecutor = void 0;
13
+ exports.buildDbExecutor = exports.matchDbExpectedError = exports.extractSqlState = void 0;
8
14
  const abort_js_1 = require("./helpers/abort.js");
15
+ const sqlState_js_1 = require("../../host/db/sqlState.js");
16
+ Object.defineProperty(exports, "extractSqlState", { enumerable: true, get: function () { return sqlState_js_1.extractSqlState; } });
17
+ // Shared with hosts that build their own dbExecutor (desktop's IPC-backed
18
+ // adapter) so expectError semantics never drift between runners.
19
+ const matchDbExpectedError = (expectation, message, sqlState) => {
20
+ const wantedState = expectation.sqlState?.trim();
21
+ const wantedPattern = expectation.messagePattern?.trim();
22
+ if (wantedState && wantedState.toUpperCase() !== (sqlState ?? "").toUpperCase()) {
23
+ return {
24
+ matched: false,
25
+ mismatchReason: `expected SQLSTATE ${wantedState}, got ${sqlState ?? "none"}`,
26
+ };
27
+ }
28
+ if (wantedPattern) {
29
+ let re;
30
+ try {
31
+ re = new RegExp(wantedPattern);
32
+ }
33
+ catch {
34
+ return {
35
+ matched: false,
36
+ mismatchReason: `invalid expectError.messagePattern regex: ${wantedPattern}`,
37
+ };
38
+ }
39
+ if (!re.test(message)) {
40
+ return {
41
+ matched: false,
42
+ mismatchReason: `error message did not match /${wantedPattern}/`,
43
+ };
44
+ }
45
+ }
46
+ if (!wantedState && !wantedPattern) {
47
+ // An empty expectation still means "this query must fail".
48
+ return { matched: true, mismatchReason: null };
49
+ }
50
+ return { matched: true, mismatchReason: null };
51
+ };
52
+ exports.matchDbExpectedError = matchDbExpectedError;
9
53
  const buildDbExecutor = (options) => async (input) => {
10
54
  const connection = await options.resolveConnection(input.node.data.config.connectionId);
55
+ const expectError = input.node.data.config.expectError;
56
+ const hasExpectation = Boolean(expectError && (expectError.sqlState?.trim() || expectError.messagePattern?.trim()));
57
+ if (input.session && !options.drivers.databaseSessionRelease) {
58
+ return {
59
+ rawResult: { success: false, rows: [], rowCount: 0, error: "sessions unsupported" },
60
+ dbResult: null,
61
+ outputData: null,
62
+ failureMessage: "This node uses a scenario DB session, but the current runner does not support DB sessions. Run it via a host with session support or disable 'Run in scenario transaction'.",
63
+ };
64
+ }
11
65
  try {
12
66
  const result = await (0, abort_js_1.withAbortAndTimeout)(options.drivers.databaseExecutor({
13
67
  connection,
14
68
  resolvedQuery: input.resolvedQuery,
15
69
  resolvedParams: input.resolvedParams,
70
+ session: input.session,
16
71
  }), options.nodeTimeoutMs, `Database node ${input.stepId}`, input.signal);
72
+ if (hasExpectation) {
73
+ return {
74
+ rawResult: {
75
+ success: false,
76
+ rows: result.rows,
77
+ rowCount: result.rowCount,
78
+ error: "expected an error but the query succeeded",
79
+ },
80
+ dbResult: result.rows,
81
+ outputData: { rows: result.rows, rowCount: result.rowCount },
82
+ failureMessage: `Expected the query to fail (${[
83
+ expectError?.sqlState ? `SQLSTATE ${expectError.sqlState}` : null,
84
+ expectError?.messagePattern ? `message /${expectError.messagePattern}/` : null,
85
+ ]
86
+ .filter(Boolean)
87
+ .join(", ")}), but it succeeded.`,
88
+ };
89
+ }
17
90
  return {
18
91
  rawResult: {
19
92
  success: true,
@@ -30,16 +103,49 @@ const buildDbExecutor = (options) => async (input) => {
30
103
  }
31
104
  catch (error) {
32
105
  const message = error instanceof Error ? error.message : String(error);
106
+ const sqlState = (0, sqlState_js_1.extractSqlState)(error);
107
+ if (hasExpectation && expectError) {
108
+ const { matched, mismatchReason } = (0, exports.matchDbExpectedError)(expectError, message, sqlState);
109
+ if (matched) {
110
+ const expectedError = { sqlState: sqlState ?? null, message };
111
+ return {
112
+ rawResult: {
113
+ success: true,
114
+ rows: [],
115
+ rowCount: 0,
116
+ ...(sqlState ? { sqlState } : {}),
117
+ },
118
+ dbResult: null,
119
+ outputData: { expectedError, rows: [], rowCount: 0 },
120
+ failureMessage: null,
121
+ };
122
+ }
123
+ return {
124
+ rawResult: {
125
+ success: false,
126
+ rows: [],
127
+ rowCount: 0,
128
+ error: message,
129
+ ...(sqlState ? { sqlState } : {}),
130
+ },
131
+ dbResult: null,
132
+ outputData: null,
133
+ failureMessage: `Query failed, but not as expected (${mismatchReason}). Actual error: ${message}`,
134
+ };
135
+ }
33
136
  return {
34
137
  rawResult: {
35
138
  success: false,
36
139
  rows: [],
37
140
  rowCount: 0,
38
141
  error: message,
142
+ ...(sqlState ? { sqlState } : {}),
39
143
  },
40
144
  dbResult: null,
41
145
  outputData: null,
42
- failureMessage: message || "Database query failed.",
146
+ failureMessage: sqlState
147
+ ? `${sqlState}: ${message || "Database query failed."}`
148
+ : message || "Database query failed.",
43
149
  };
44
150
  }
45
151
  };
@@ -1 +1 @@
1
- {"version":3,"file":"db-executor.js","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/db-executor.ts"],"names":[],"mappings":";AAAA,wEAAwE;AACxE,uEAAuE;AACvE,wEAAwE;AACxE,oEAAoE;;;AAOpE,iDAAyD;AAGlD,MAAM,eAAe,GAAG,CAC7B,OAA6C,EAC7C,EAAE,CACF,KAAK,EAAE,KAA+B,EAAsC,EAAE;IAC5E,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAExF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAA,8BAAmB,EACtC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC;YAC/B,UAAU;YACV,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,cAAc,EAAE,KAAK,CAAC,cAAc;SACrC,CAAC,EACF,OAAO,CAAC,aAAa,EACrB,iBAAiB,KAAK,CAAC,MAAM,EAAE,EAC/B,KAAK,CAAC,MAAM,CACb,CAAC;QACF,OAAO;YACL,SAAS,EAAE;gBACT,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B;YACD,QAAQ,EAAE,MAAM,CAAC,IAAI;YACrB,UAAU,EAAE;gBACV,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B;YACD,cAAc,EAAE,IAAI;SACrB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO;YACL,SAAS,EAAE;gBACT,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,EAAE;gBACR,QAAQ,EAAE,CAAC;gBACX,KAAK,EAAE,OAAO;aACf;YACD,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,IAAI;YAChB,cAAc,EAAE,OAAO,IAAI,wBAAwB;SACpD,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AA5CS,QAAA,eAAe,mBA4CxB"}
1
+ {"version":3,"file":"db-executor.js","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/db-executor.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,7 @@
8
8
  // (HTTP, DB, Redis, Kafka). Script + notification executors default to
9
9
  // canonical core implementations but can be overridden.
10
10
  Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.summarizeContractResults = exports.buildRequestFailureMessage = exports.evaluateScenarioExpectedStatus = exports.buildWebsocketExecutor = exports.buildScriptExecutor = exports.buildRequestExecutor = exports.buildRedisExecutor = exports.buildNotificationExecutor = exports.buildKafkaExecutor = exports.buildDbExecutor = exports.buildScenarioRuntimeAdapters = void 0;
11
+ exports.summarizeContractResults = exports.buildRequestFailureMessage = exports.evaluateScenarioExpectedStatus = exports.buildWebsocketExecutor = exports.buildScriptExecutor = exports.buildRequestExecutor = exports.buildRedisExecutor = exports.buildNotificationExecutor = exports.buildKafkaExecutor = exports.matchDbExpectedError = exports.extractSqlState = exports.buildDbExecutor = exports.buildScenarioRuntimeAdapters = void 0;
12
12
  const db_executor_js_1 = require("./db-executor.js");
13
13
  const kafka_executor_js_1 = require("./kafka-executor.js");
14
14
  const notification_executor_js_1 = require("./notification-executor.js");
@@ -24,11 +24,20 @@ const buildScenarioRuntimeAdapters = (options) => ({
24
24
  websocketExecutor: (0, websocket_executor_js_1.buildWebsocketExecutor)(options),
25
25
  scriptExecutor: options.scriptExecutor ?? (0, script_executor_js_1.buildScriptExecutor)(options),
26
26
  notificationExecutor: options.notificationExecutor ?? (0, notification_executor_js_1.buildNotificationExecutor)(options),
27
+ // Present only when the host driver supports run-scoped DB sessions —
28
+ // its absence is how the runner detects "sessions unsupported here".
29
+ ...(options.drivers.databaseSessionRelease
30
+ ? {
31
+ dbSessionRelease: (input) => options.drivers.databaseSessionRelease(input),
32
+ }
33
+ : {}),
27
34
  });
28
35
  exports.buildScenarioRuntimeAdapters = buildScenarioRuntimeAdapters;
29
36
  // Re-exports so callers don't have to import from sibling files.
30
37
  var db_executor_js_2 = require("./db-executor.js");
31
38
  Object.defineProperty(exports, "buildDbExecutor", { enumerable: true, get: function () { return db_executor_js_2.buildDbExecutor; } });
39
+ Object.defineProperty(exports, "extractSqlState", { enumerable: true, get: function () { return db_executor_js_2.extractSqlState; } });
40
+ Object.defineProperty(exports, "matchDbExpectedError", { enumerable: true, get: function () { return db_executor_js_2.matchDbExpectedError; } });
32
41
  var kafka_executor_js_2 = require("./kafka-executor.js");
33
42
  Object.defineProperty(exports, "buildKafkaExecutor", { enumerable: true, get: function () { return kafka_executor_js_2.buildKafkaExecutor; } });
34
43
  var notification_executor_js_2 = require("./notification-executor.js");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/index.ts"],"names":[],"mappings":";AAAA,6DAA6D;AAC7D,EAAE;AACF,gEAAgE;AAChE,6DAA6D;AAC7D,qEAAqE;AACrE,qEAAqE;AACrE,uEAAuE;AACvE,wDAAwD;;;AAIxD,qDAAmD;AACnD,2DAAyD;AACzD,yEAAuE;AACvE,2DAAyD;AACzD,+DAA6D;AAC7D,6DAA2D;AAC3D,mEAAiE;AAI1D,MAAM,4BAA4B,GAAG,CAC1C,OAA6C,EACpB,EAAE,CAAC,CAAC;IAC7B,eAAe,EAAE,IAAA,0CAAoB,EAAC,OAAO,CAAC;IAC9C,UAAU,EAAE,IAAA,gCAAe,EAAC,OAAO,CAAC;IACpC,aAAa,EAAE,IAAA,sCAAkB,EAAC,OAAO,CAAC;IAC1C,aAAa,EAAE,IAAA,sCAAkB,EAAC,OAAO,CAAC;IAC1C,iBAAiB,EAAE,IAAA,8CAAsB,EAAC,OAAO,CAAC;IAClD,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,IAAA,wCAAmB,EAAC,OAAO,CAAC;IACtE,oBAAoB,EAClB,OAAO,CAAC,oBAAoB,IAAI,IAAA,oDAAyB,EAAC,OAAO,CAAC;CACrE,CAAC,CAAC;AAXU,QAAA,4BAA4B,gCAWtC;AAEH,iEAAiE;AACjE,mDAAmD;AAA1C,iHAAA,eAAe,OAAA;AACxB,yDAAyD;AAAhD,uHAAA,kBAAkB,OAAA;AAC3B,uEAAuE;AAA9D,qIAAA,yBAAyB,OAAA;AAClC,yDAAyD;AAAhD,uHAAA,kBAAkB,OAAA;AAC3B,6DAA6D;AAApD,2HAAA,oBAAoB,OAAA;AAC7B,2DAA2D;AAAlD,yHAAA,mBAAmB,OAAA;AAC5B,iEAAiE;AAAxD,+HAAA,sBAAsB,OAAA;AAC/B,yEAAyE;AACzE,0EAA0E;AAC1E,sEAAsE;AACtE,mEAGsC;AAFpC,oIAAA,8BAA8B,OAAA;AAGhC,qEAIuC;AAHrC,iIAAA,0BAA0B,OAAA;AAC1B,+HAAA,wBAAwB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/index.ts"],"names":[],"mappings":";AAAA,6DAA6D;AAC7D,EAAE;AACF,gEAAgE;AAChE,6DAA6D;AAC7D,qEAAqE;AACrE,qEAAqE;AACrE,uEAAuE;AACvE,wDAAwD;;;AAIxD,qDAAmD;AACnD,2DAAyD;AACzD,yEAAuE;AACvE,2DAAyD;AACzD,+DAA6D;AAC7D,6DAA2D;AAC3D,mEAAiE;AAI1D,MAAM,4BAA4B,GAAG,CAC1C,OAA6C,EACpB,EAAE,CAAC,CAAC;IAC7B,eAAe,EAAE,IAAA,0CAAoB,EAAC,OAAO,CAAC;IAC9C,UAAU,EAAE,IAAA,gCAAe,EAAC,OAAO,CAAC;IACpC,aAAa,EAAE,IAAA,sCAAkB,EAAC,OAAO,CAAC;IAC1C,aAAa,EAAE,IAAA,sCAAkB,EAAC,OAAO,CAAC;IAC1C,iBAAiB,EAAE,IAAA,8CAAsB,EAAC,OAAO,CAAC;IAClD,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,IAAA,wCAAmB,EAAC,OAAO,CAAC;IACtE,oBAAoB,EAClB,OAAO,CAAC,oBAAoB,IAAI,IAAA,oDAAyB,EAAC,OAAO,CAAC;IACpE,sEAAsE;IACtE,qEAAqE;IACrE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB;QACxC,CAAC,CAAC;YACE,gBAAgB,EAAE,CAAC,KAAwD,EAAE,EAAE,CAC7E,OAAO,CAAC,OAAO,CAAC,sBAAuB,CAAC,KAAK,CAAC;SACjD;QACH,CAAC,CAAC,EAAE,CAAC;CACR,CAAC,CAAC;AAnBU,QAAA,4BAA4B,gCAmBtC;AAEH,iEAAiE;AACjE,mDAI0B;AAHxB,iHAAA,eAAe,OAAA;AACf,iHAAA,eAAe,OAAA;AACf,sHAAA,oBAAoB,OAAA;AAEtB,yDAAyD;AAAhD,uHAAA,kBAAkB,OAAA;AAC3B,uEAAuE;AAA9D,qIAAA,yBAAyB,OAAA;AAClC,yDAAyD;AAAhD,uHAAA,kBAAkB,OAAA;AAC3B,6DAA6D;AAApD,2HAAA,oBAAoB,OAAA;AAC7B,2DAA2D;AAAlD,yHAAA,mBAAmB,OAAA;AAC5B,iEAAiE;AAAxD,+HAAA,sBAAsB,OAAA;AAC/B,yEAAyE;AACzE,0EAA0E;AAC1E,sEAAsE;AACtE,mEAGsC;AAFpC,oIAAA,8BAA8B,OAAA;AAGhC,qEAIuC;AAHrC,iIAAA,0BAA0B,OAAA;AAC1B,+HAAA,wBAAwB,OAAA"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.convertLegacyConditionOperator = exports.createConditionConfigFromLegacyExpression = exports.filterConditionRuntimeSuggestions = exports.buildConditionRuntimeSuggestions = exports.buildConditionRuntimeRootKeysForNodes = exports.buildConditionRuntimeRootSetFromKeys = exports.isConditionOperatorUnary = exports.getConditionOperatorLabel = exports.buildConditionOutputPayload = exports.updateConditionRuleRightOperand = exports.updateConditionRuleLeftOperand = exports.updateConditionRuleOperator = exports.patchConditionGroup = exports.patchConditionRule = exports.replaceConditionGroup = exports.removeConditionChild = exports.appendGroupToConditionGroup = exports.appendRuleToConditionGroup = exports.updateConditionGroupOperator = exports.getConditionRuntimeRootKeys = exports.evaluateConditionConfig = exports.getExecutableConditionGroup = exports.getConditionValueTypeLabel = exports.getConditionHeadline = exports.getConditionQuickSummary = exports.getConditionGroupCount = exports.getConditionRuleCount = exports.validateConditionRule = exports.validateConditionConfig = exports.normalizeConditionNodeConfig = exports.parseConditionExpressionSafely = exports.parseConditionExpressionToGroup = exports.serializeConditionConfigToPreview = exports.serializeConditionGroupToPreview = exports.serializeConditionConfigToExpression = exports.serializeConditionGroupToExpression = exports.createDefaultConditionConfig = exports.createConditionGroup = exports.createConditionRule = exports.createConditionOperand = exports.CONDITION_VALUE_TYPES = exports.evaluateConditionRule = exports.resolveConditionRuntimeValue = exports.CONDITION_OPERATOR_META = void 0;
3
+ exports.convertLegacyConditionOperator = exports.createConditionConfigFromLegacyExpression = exports.filterConditionRuntimeSuggestions = exports.buildConditionRuntimeSuggestions = exports.buildConditionRuntimeRootKeysForNodes = exports.buildConditionRuntimeRootSetFromKeys = exports.isConditionOperatorUnary = exports.getConditionOperatorLabel = exports.buildConditionOutputPayload = exports.updateConditionRuleRightOperand = exports.updateConditionRuleLeftOperand = exports.updateConditionRuleOperator = exports.patchConditionGroup = exports.patchConditionRule = exports.replaceConditionGroup = exports.removeConditionChild = exports.appendGroupToConditionGroup = exports.appendRuleToConditionGroup = exports.updateConditionGroupOperator = exports.getConditionRuntimeRootKeys = exports.evaluateConditionConfig = exports.getExecutableConditionGroup = exports.getConditionValueTypeLabel = exports.getConditionHeadline = exports.getConditionQuickSummary = exports.getConditionGroupCount = exports.getConditionRuleCount = exports.validateConditionRule = exports.validateConditionConfig = exports.normalizeConditionNodeConfig = exports.parseConditionExpressionSafely = exports.parseConditionExpressionToGroup = exports.serializeConditionConfigToPreview = exports.serializeConditionGroupToPreview = exports.serializeConditionConfigToExpression = exports.serializeConditionGroupToExpression = exports.createDefaultConditionConfig = exports.createConditionGroup = exports.createConditionRule = exports.createConditionOperand = exports.CONDITION_VALUE_TYPES = exports.evaluateConditionRule = exports.resolveConditionRuntimeValue = exports.isArrayRightConditionOperator = exports.CONDITION_OPERATOR_META = void 0;
4
4
  const extraction_js_1 = require("./extraction.js");
5
5
  const createId = (prefix) => typeof crypto !== "undefined" && typeof crypto.randomUUID === "function"
6
6
  ? crypto.randomUUID()
@@ -252,6 +252,8 @@ exports.CONDITION_OPERATOR_META = [
252
252
  { category: "Existence", isUnary: true, label: "Not Null", value: "not_null" },
253
253
  { category: "Collection", label: "In", value: "in" },
254
254
  { category: "Collection", label: "Not In", value: "not_in" },
255
+ { category: "Collection", label: "Contains Row", value: "contains_row" },
256
+ { category: "Collection", label: "Set Equals (unordered)", value: "set_equals_unordered" },
255
257
  ];
256
258
  const OPERATOR_ALIAS_MAP = [
257
259
  { alias: "!==", operator: "strict_not_equals" },
@@ -264,7 +266,11 @@ const OPERATOR_ALIAS_MAP = [
264
266
  { alias: "<", operator: "less_than" },
265
267
  { alias: "not_contains", operator: "not_contains" },
266
268
  { alias: "not contains", operator: "not_contains" },
269
+ { alias: "contains_row", operator: "contains_row" },
270
+ { alias: "contains row", operator: "contains_row" },
267
271
  { alias: "contains", operator: "contains" },
272
+ { alias: "set_equals_unordered", operator: "set_equals_unordered" },
273
+ { alias: "set equals", operator: "set_equals_unordered" },
268
274
  { alias: "starts_with", operator: "starts_with" },
269
275
  { alias: "starts with", operator: "starts_with" },
270
276
  { alias: "ends_with", operator: "ends_with" },
@@ -343,6 +349,13 @@ const isNumericOperator = (operator) => operator === "greater_than" ||
343
349
  operator === "less_or_equal" ||
344
350
  operator === "between";
345
351
  const isCollectionOperator = (operator) => operator === "in" || operator === "not_in";
352
+ // Operators whose right operand is an array literal (drives the default
353
+ // operand type and the builder UIs' type lock).
354
+ const isArrayRightConditionOperator = (operator) => operator === "between" ||
355
+ operator === "in" ||
356
+ operator === "not_in" ||
357
+ operator === "set_equals_unordered";
358
+ exports.isArrayRightConditionOperator = isArrayRightConditionOperator;
346
359
  const getOperatorToken = (operator) => {
347
360
  switch (operator) {
348
361
  case "equals":
@@ -389,6 +402,10 @@ const getOperatorToken = (operator) => {
389
402
  return "in";
390
403
  case "not_in":
391
404
  return "not in";
405
+ case "contains_row":
406
+ return "contains_row";
407
+ case "set_equals_unordered":
408
+ return "set_equals_unordered";
392
409
  default:
393
410
  return "==";
394
411
  }
@@ -583,9 +600,13 @@ const getDefaultRightOperand = (operator) => {
583
600
  if (isUnaryOperator(operator)) {
584
601
  return undefined;
585
602
  }
586
- if (operator === "between" || isCollectionOperator(operator)) {
603
+ if ((0, exports.isArrayRightConditionOperator)(operator)) {
587
604
  return (0, exports.createConditionOperand)("literal", "array", operator === "between" ? [0, 1] : []);
588
605
  }
606
+ if (operator === "contains_row") {
607
+ // JSON object literal — "{ column: expected }" row matcher.
608
+ return (0, exports.createConditionOperand)("literal", "string", "{}");
609
+ }
589
610
  return (0, exports.createConditionOperand)("literal", "string", "");
590
611
  };
591
612
  const parseLegacyConditionOperator = (value) => LEGACY_OPERATOR_MAP[value] ?? "equals";
@@ -1345,6 +1366,105 @@ const buildConditionRegex = (value) => {
1345
1366
  }
1346
1367
  return new RegExp(trimmed);
1347
1368
  };
1369
+ // --- Result-set assertion helpers (DB rows) -----------------------------
1370
+ // Accept an object literal typed as string ('{"tier":"GOLD"}') or an actual
1371
+ // record from a runtime path.
1372
+ const coerceRecordOperand = (value) => {
1373
+ if (isRecord(value))
1374
+ return value;
1375
+ if (typeof value === "string") {
1376
+ try {
1377
+ const parsed = JSON.parse(value);
1378
+ return isRecord(parsed) ? parsed : null;
1379
+ }
1380
+ catch {
1381
+ return null;
1382
+ }
1383
+ }
1384
+ return null;
1385
+ };
1386
+ const coerceArrayOperand = (value) => {
1387
+ if (Array.isArray(value))
1388
+ return value;
1389
+ if (typeof value === "string") {
1390
+ try {
1391
+ const parsed = JSON.parse(value);
1392
+ return Array.isArray(parsed) ? parsed : null;
1393
+ }
1394
+ catch {
1395
+ return null;
1396
+ }
1397
+ }
1398
+ return null;
1399
+ };
1400
+ // "Some row matches every expected key" — pgTAP-ish `results_ne`-lite for
1401
+ // side-effect table checks: {{Ledger.rows}} contains_row {"tier":"GOLD",
1402
+ // "cashback": 2.5}. Values compare loosely so pg numeric strings match
1403
+ // number literals.
1404
+ const evaluateContainsRow = (leftValue, rightValue) => {
1405
+ const rows = coerceArrayOperand(leftValue);
1406
+ const expected = coerceRecordOperand(rightValue);
1407
+ if (!rows || !expected)
1408
+ return false;
1409
+ const keys = Object.keys(expected);
1410
+ if (keys.length === 0)
1411
+ return rows.length > 0;
1412
+ return rows.some((row) => isRecord(row) &&
1413
+ keys.every((key) => compareLooseEquality(row[key], expected[key])));
1414
+ };
1415
+ // Multiset equality, order-insensitive (pgTAP `bag_eq` equivalent). Values
1416
+ // are canonicalized first: numeric strings become numbers ("2.50" → 2.5) and
1417
+ // object keys sort, so row order and numeric formatting don't matter.
1418
+ const canonicalizeForSetEquality = (value) => {
1419
+ if (typeof value === "string") {
1420
+ const trimmed = value.trim();
1421
+ if (trimmed !== "" && !Number.isNaN(Number(trimmed))) {
1422
+ const asNumber = Number(trimmed);
1423
+ if (Number.isFinite(asNumber))
1424
+ return asNumber;
1425
+ }
1426
+ return value;
1427
+ }
1428
+ if (Array.isArray(value))
1429
+ return value.map(canonicalizeForSetEquality);
1430
+ if (isRecord(value)) {
1431
+ const record = value;
1432
+ return Object.fromEntries(Object.keys(record)
1433
+ .sort()
1434
+ .map((key) => [key, canonicalizeForSetEquality(record[key])]));
1435
+ }
1436
+ return value;
1437
+ };
1438
+ const evaluateSetEqualsUnordered = (leftValue, rightValue) => {
1439
+ const leftArray = coerceArrayOperand(leftValue);
1440
+ const rightArray = coerceArrayOperand(rightValue);
1441
+ if (!leftArray || !rightArray || leftArray.length !== rightArray.length)
1442
+ return false;
1443
+ const serialize = (entry) => {
1444
+ try {
1445
+ return JSON.stringify(canonicalizeForSetEquality(entry)) ?? "null";
1446
+ }
1447
+ catch {
1448
+ return String(entry);
1449
+ }
1450
+ };
1451
+ const counts = new Map();
1452
+ for (const entry of leftArray) {
1453
+ const key = serialize(entry);
1454
+ counts.set(key, (counts.get(key) ?? 0) + 1);
1455
+ }
1456
+ for (const entry of rightArray) {
1457
+ const key = serialize(entry);
1458
+ const current = counts.get(key);
1459
+ if (!current)
1460
+ return false;
1461
+ if (current === 1)
1462
+ counts.delete(key);
1463
+ else
1464
+ counts.set(key, current - 1);
1465
+ }
1466
+ return counts.size === 0;
1467
+ };
1348
1468
  const compareLooseEquality = (left, right) => {
1349
1469
  if (Array.isArray(left) || Array.isArray(right) || isRecord(left) || isRecord(right)) {
1350
1470
  try {
@@ -1555,6 +1675,12 @@ const evaluateConditionRule = (rule, runtimeScope) => {
1555
1675
  ? !right.value.some((entry) => compareLooseEquality(left.value, entry))
1556
1676
  : false;
1557
1677
  break;
1678
+ case "contains_row":
1679
+ result = evaluateContainsRow(left.value, right?.value);
1680
+ break;
1681
+ case "set_equals_unordered":
1682
+ result = evaluateSetEqualsUnordered(left.value, right?.value);
1683
+ break;
1558
1684
  default:
1559
1685
  result = false;
1560
1686
  break;
@@ -1855,7 +1981,7 @@ const updateConditionRuleOperator = (rootGroup, ruleId, operator) => updateCondi
1855
1981
  ? { right: undefined }
1856
1982
  : {
1857
1983
  right: rule.right &&
1858
- ((operator !== "between" && operator !== "in" && operator !== "not_in") ||
1984
+ (!(0, exports.isArrayRightConditionOperator)(operator) ||
1859
1985
  rule.right.valueType === "array")
1860
1986
  ? cloneConditionOperand(rule.right)
1861
1987
  : getDefaultRightOperand(operator),