@rhost/testkit 0.1.1 → 1.3.1

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 (110) hide show
  1. package/README.md +393 -5
  2. package/ROADMAP.md +241 -0
  3. package/dist/benchmark.d.ts +44 -0
  4. package/dist/benchmark.d.ts.map +1 -0
  5. package/dist/benchmark.js +118 -0
  6. package/dist/benchmark.js.map +1 -0
  7. package/dist/cli/deploy.d.ts +2 -0
  8. package/dist/cli/deploy.d.ts.map +1 -0
  9. package/dist/cli/deploy.js +120 -0
  10. package/dist/cli/deploy.js.map +1 -0
  11. package/dist/cli/fmt.d.ts +2 -0
  12. package/dist/cli/fmt.d.ts.map +1 -0
  13. package/dist/cli/fmt.js +119 -0
  14. package/dist/cli/fmt.js.map +1 -0
  15. package/dist/cli/index.d.ts +3 -0
  16. package/dist/cli/index.d.ts.map +1 -0
  17. package/dist/cli/index.js +81 -0
  18. package/dist/cli/index.js.map +1 -0
  19. package/dist/cli/init.d.ts +2 -0
  20. package/dist/cli/init.d.ts.map +1 -0
  21. package/dist/cli/init.js +210 -0
  22. package/dist/cli/init.js.map +1 -0
  23. package/dist/cli/validate.d.ts +2 -0
  24. package/dist/cli/validate.d.ts.map +1 -0
  25. package/dist/cli/validate.js +126 -0
  26. package/dist/cli/validate.js.map +1 -0
  27. package/dist/cli/watch.d.ts +2 -0
  28. package/dist/cli/watch.d.ts.map +1 -0
  29. package/dist/cli/watch.js +136 -0
  30. package/dist/cli/watch.js.map +1 -0
  31. package/dist/client.d.ts +48 -0
  32. package/dist/client.d.ts.map +1 -1
  33. package/dist/client.js +113 -30
  34. package/dist/client.js.map +1 -1
  35. package/dist/container.d.ts.map +1 -1
  36. package/dist/container.js +1 -1
  37. package/dist/container.js.map +1 -1
  38. package/dist/deployer.d.ts +86 -0
  39. package/dist/deployer.d.ts.map +1 -0
  40. package/dist/deployer.js +154 -0
  41. package/dist/deployer.js.map +1 -0
  42. package/dist/expect.d.ts +27 -1
  43. package/dist/expect.d.ts.map +1 -1
  44. package/dist/expect.js +47 -2
  45. package/dist/expect.js.map +1 -1
  46. package/dist/index.d.ts +10 -3
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +39 -1
  49. package/dist/index.js.map +1 -1
  50. package/dist/preflight.d.ts +70 -0
  51. package/dist/preflight.d.ts.map +1 -0
  52. package/dist/preflight.js +121 -0
  53. package/dist/preflight.js.map +1 -0
  54. package/dist/reporter.d.ts +2 -0
  55. package/dist/reporter.d.ts.map +1 -1
  56. package/dist/reporter.js +24 -1
  57. package/dist/reporter.js.map +1 -1
  58. package/dist/runner.d.ts +83 -2
  59. package/dist/runner.d.ts.map +1 -1
  60. package/dist/runner.js +137 -8
  61. package/dist/runner.js.map +1 -1
  62. package/dist/snapshots.d.ts +84 -0
  63. package/dist/snapshots.d.ts.map +1 -0
  64. package/dist/snapshots.js +230 -0
  65. package/dist/snapshots.js.map +1 -0
  66. package/dist/validator/builtins.d.ts +18 -0
  67. package/dist/validator/builtins.d.ts.map +1 -0
  68. package/dist/validator/builtins.js +265 -0
  69. package/dist/validator/builtins.js.map +1 -0
  70. package/dist/validator/checker.d.ts +13 -0
  71. package/dist/validator/checker.d.ts.map +1 -0
  72. package/dist/validator/checker.js +111 -0
  73. package/dist/validator/checker.js.map +1 -0
  74. package/dist/validator/clobber.d.ts +7 -0
  75. package/dist/validator/clobber.d.ts.map +1 -0
  76. package/dist/validator/clobber.js +102 -0
  77. package/dist/validator/clobber.js.map +1 -0
  78. package/dist/validator/compat.d.ts +19 -0
  79. package/dist/validator/compat.d.ts.map +1 -0
  80. package/dist/validator/compat.js +58 -0
  81. package/dist/validator/compat.js.map +1 -0
  82. package/dist/validator/formatter.d.ts +21 -0
  83. package/dist/validator/formatter.d.ts.map +1 -0
  84. package/dist/validator/formatter.js +120 -0
  85. package/dist/validator/formatter.js.map +1 -0
  86. package/dist/validator/index.d.ts +57 -0
  87. package/dist/validator/index.d.ts.map +1 -0
  88. package/dist/validator/index.js +133 -0
  89. package/dist/validator/index.js.map +1 -0
  90. package/dist/validator/parser.d.ts +16 -0
  91. package/dist/validator/parser.d.ts.map +1 -0
  92. package/dist/validator/parser.js +260 -0
  93. package/dist/validator/parser.js.map +1 -0
  94. package/dist/validator/tokenizer.d.ts +28 -0
  95. package/dist/validator/tokenizer.d.ts.map +1 -0
  96. package/dist/validator/tokenizer.js +174 -0
  97. package/dist/validator/tokenizer.js.map +1 -0
  98. package/dist/validator/types.d.ts +55 -0
  99. package/dist/validator/types.d.ts.map +1 -0
  100. package/dist/validator/types.js +6 -0
  101. package/dist/validator/types.js.map +1 -0
  102. package/dist/watcher.d.ts +44 -0
  103. package/dist/watcher.d.ts.map +1 -0
  104. package/dist/watcher.js +297 -0
  105. package/dist/watcher.js.map +1 -0
  106. package/dist/world.d.ts +79 -0
  107. package/dist/world.d.ts.map +1 -1
  108. package/dist/world.js +167 -1
  109. package/dist/world.js.map +1 -1
  110. package/package.json +19 -3
package/dist/expect.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RhostExpect = exports.RhostExpectError = exports.isRhostError = void 0;
4
+ const snapshots_1 = require("./snapshots");
4
5
  var assertions_1 = require("./assertions");
5
6
  Object.defineProperty(exports, "isRhostError", { enumerable: true, get: function () { return assertions_1.isRhostError; } });
6
7
  const assertions_2 = require("./assertions");
@@ -33,17 +34,21 @@ exports.RhostExpectError = RhostExpectError;
33
34
  * const ex = new RhostExpect(client, 'add(2,3)');
34
35
  * await ex.toBe('5');
35
36
  * await ex.not.toBe('42');
37
+ *
38
+ * @example Snapshot testing (requires runner context)
39
+ * await expect('iter(lnum(1,10),##)').toMatchSnapshot();
36
40
  */
37
41
  class RhostExpect {
38
- constructor(client, expression, negated = false) {
42
+ constructor(client, expression, negated = false, snapshotCtx) {
39
43
  this.client = client;
40
44
  this.expression = expression;
41
45
  this.negated = negated;
46
+ this.snapshotCtx = snapshotCtx;
42
47
  this._cached = undefined;
43
48
  }
44
49
  /** Negation accessor — returns a new RhostExpect with negation flipped. */
45
50
  get not() {
46
- return new RhostExpect(this.client, this.expression, !this.negated);
51
+ return new RhostExpect(this.client, this.expression, !this.negated, this.snapshotCtx);
47
52
  }
48
53
  // -------------------------------------------------------------------------
49
54
  // Internal helpers
@@ -159,6 +164,46 @@ class RhostExpect {
159
164
  const words = actual === '' ? [] : actual.split(sep).map((w) => w.trim()).filter(Boolean);
160
165
  this.pass(words.length === n, 'toHaveWordCount', actual, `list with ${n} word(s) (got ${words.length})`);
161
166
  }
167
+ // -------------------------------------------------------------------------
168
+ // Snapshot matcher
169
+ // -------------------------------------------------------------------------
170
+ /**
171
+ * Compare the evaluated result against a stored snapshot.
172
+ *
173
+ * **First run**: the value is written to the snapshot file and the test passes.
174
+ * **Subsequent runs**: the value is compared to the stored snapshot. A mismatch
175
+ * fails the test and shows a diff.
176
+ * **Update mode**: pass `updateSnapshots: true` in `RunnerOptions`, or set the
177
+ * `RHOST_UPDATE_SNAPSHOTS=1` environment variable, to overwrite stored values.
178
+ *
179
+ * `.not.toMatchSnapshot()` is not supported and will throw.
180
+ *
181
+ * @example
182
+ * await expect('iter(lnum(1,10),##)').toMatchSnapshot();
183
+ * await expect('table(name,age,role)').toMatchSnapshot();
184
+ */
185
+ async toMatchSnapshot() {
186
+ if (this.negated) {
187
+ throw new Error('expect().not.toMatchSnapshot() is not supported. ' +
188
+ 'Snapshots are for locking in specific values, not for asserting inequality.');
189
+ }
190
+ if (!this.snapshotCtx) {
191
+ throw new Error('toMatchSnapshot() requires snapshot context. ' +
192
+ 'Use runner.run() to run tests — do not call toMatchSnapshot() on a standalone RhostExpect.');
193
+ }
194
+ const actual = await this.resolve();
195
+ const key = this.snapshotCtx.manager.nextKey(this.snapshotCtx.testName);
196
+ const result = this.snapshotCtx.manager.check(key, actual);
197
+ if (result.status === 'mismatch') {
198
+ const diff = (0, snapshots_1.formatSnapshotDiff)(result.expected, actual);
199
+ throw new Error(`Snapshot mismatch for "${key}"\n\n` +
200
+ ` - Snapshot (stored)\n` +
201
+ ` + Received (actual)\n\n` +
202
+ `${diff}\n\n` +
203
+ `Run with RHOST_UPDATE_SNAPSHOTS=1 to update the stored snapshot.`);
204
+ }
205
+ // 'written', 'matched', 'updated' — all pass silently
206
+ }
162
207
  }
163
208
  exports.RhostExpect = RhostExpect;
164
209
  //# sourceMappingURL=expect.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"expect.js","sourceRoot":"","sources":["../src/expect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"expect.js","sourceRoot":"","sources":["../src/expect.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,9 +1,16 @@
1
- export { RhostClient, RhostClientOptions, stripAnsi } from './client';
1
+ export { RhostClient, RhostClientOptions, PreviewOptions, stripAnsi } from './client';
2
2
  export { MushConnection } from './connection';
3
3
  export { RhostContainer, ContainerConnectionInfo } from './container';
4
4
  export { RhostAssert, RhostAssertionError, AssertionResult, isRhostError } from './assertions';
5
5
  export { RhostExpect, RhostExpectError } from './expect';
6
- export { RhostWorld } from './world';
6
+ export { RhostWorld, WorldSnapshot, WorldDiff, WorldObjectDiff, WorldSideEffectError } from './world';
7
+ export { preflight, preflightCheck, assertFunctionExists, assertFunctionMissing, assertConfigEquals, PreflightCheck, PreflightResult, PreflightOptions, PreflightError, } from './preflight';
7
8
  export { Reporter } from './reporter';
8
- export { RhostRunner, RunnerOptions, RunResult, TestContext, TestFn, HookFn, SuiteContext, ItFn, DescribeFn, } from './runner';
9
+ export { RhostRunner, RunnerOptions, RunResult, TestContext, TestFn, HookFn, PersonaTestFn, PersonaCredentials, SuiteContext, ItFn, DescribeFn, PersonasFn, } from './runner';
10
+ export { validate, validateFile, compatibilityReport, ValidationResult, Diagnostic, Severity, FunctionSignature, BUILTIN_FUNCTIONS, Platform, CompatibilityReport, CompatibilityEntry, } from './validator';
11
+ export { format, FormatOptions, FormatResult } from './validator/formatter';
12
+ export { RhostBenchmark, runBench, formatBenchResults, BenchOptions, BenchmarkResult } from './benchmark';
13
+ export { deploy, parseDeployFile, snapshotObjects, restoreSnapshot, DeployCommand, DeploySnapshot, DeployOptions, DeployResult, } from './deployer';
14
+ export { SnapshotManager, SnapshotStats, SnapshotStatus, SnapshotCheckResult, formatSnapshotDiff } from './snapshots';
15
+ export { RhostWatcher, WatchOptions, discoverTestFiles } from './watcher';
9
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGtE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9C,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAGtE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG/F,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAGzD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGrC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,EACH,WAAW,EACX,aAAa,EACb,SAAS,EACT,WAAW,EACX,MAAM,EACN,MAAM,EACN,YAAY,EACZ,IAAI,EACJ,UAAU,GACb,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGtF,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9C,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAGtE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG/F,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAGzD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAGtG,OAAO,EACH,SAAS,EACT,cAAc,EACd,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,cAAc,GACjB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,EACH,WAAW,EACX,aAAa,EACb,SAAS,EACT,WAAW,EACX,MAAM,EACN,MAAM,EACN,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,IAAI,EACJ,UAAU,EACV,UAAU,GACb,MAAM,UAAU,CAAC;AAGlB,OAAO,EACH,QAAQ,EACR,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,UAAU,EACV,QAAQ,EACR,iBAAiB,EACjB,iBAAiB,EACjB,QAAQ,EACR,mBAAmB,EACnB,kBAAkB,GACrB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG5E,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,kBAAkB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG1G,OAAO,EACH,MAAM,EACN,eAAe,EACf,eAAe,EACf,eAAe,EACf,aAAa,EACb,cAAc,EACd,aAAa,EACb,YAAY,GACf,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGtH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RhostRunner = exports.Reporter = exports.RhostWorld = exports.RhostExpectError = exports.RhostExpect = exports.isRhostError = exports.RhostAssertionError = exports.RhostAssert = exports.RhostContainer = exports.MushConnection = exports.stripAnsi = exports.RhostClient = void 0;
3
+ exports.discoverTestFiles = exports.RhostWatcher = exports.formatSnapshotDiff = exports.SnapshotManager = exports.restoreSnapshot = exports.snapshotObjects = exports.parseDeployFile = exports.deploy = exports.formatBenchResults = exports.runBench = exports.RhostBenchmark = exports.format = exports.BUILTIN_FUNCTIONS = exports.compatibilityReport = exports.validateFile = exports.validate = exports.RhostRunner = exports.Reporter = exports.PreflightError = exports.assertConfigEquals = exports.assertFunctionMissing = exports.assertFunctionExists = exports.preflightCheck = exports.preflight = exports.WorldSideEffectError = exports.WorldSnapshot = exports.RhostWorld = exports.RhostExpectError = exports.RhostExpect = exports.isRhostError = exports.RhostAssertionError = exports.RhostAssert = exports.RhostContainer = exports.MushConnection = exports.stripAnsi = exports.RhostClient = void 0;
4
4
  // Core client
5
5
  var client_1 = require("./client");
6
6
  Object.defineProperty(exports, "RhostClient", { enumerable: true, get: function () { return client_1.RhostClient; } });
@@ -23,10 +23,48 @@ Object.defineProperty(exports, "RhostExpectError", { enumerable: true, get: func
23
23
  // World fixture manager
24
24
  var world_1 = require("./world");
25
25
  Object.defineProperty(exports, "RhostWorld", { enumerable: true, get: function () { return world_1.RhostWorld; } });
26
+ Object.defineProperty(exports, "WorldSnapshot", { enumerable: true, get: function () { return world_1.WorldSnapshot; } });
27
+ Object.defineProperty(exports, "WorldSideEffectError", { enumerable: true, get: function () { return world_1.WorldSideEffectError; } });
28
+ // Pre-flight assertions
29
+ var preflight_1 = require("./preflight");
30
+ Object.defineProperty(exports, "preflight", { enumerable: true, get: function () { return preflight_1.preflight; } });
31
+ Object.defineProperty(exports, "preflightCheck", { enumerable: true, get: function () { return preflight_1.preflightCheck; } });
32
+ Object.defineProperty(exports, "assertFunctionExists", { enumerable: true, get: function () { return preflight_1.assertFunctionExists; } });
33
+ Object.defineProperty(exports, "assertFunctionMissing", { enumerable: true, get: function () { return preflight_1.assertFunctionMissing; } });
34
+ Object.defineProperty(exports, "assertConfigEquals", { enumerable: true, get: function () { return preflight_1.assertConfigEquals; } });
35
+ Object.defineProperty(exports, "PreflightError", { enumerable: true, get: function () { return preflight_1.PreflightError; } });
26
36
  // Reporter
27
37
  var reporter_1 = require("./reporter");
28
38
  Object.defineProperty(exports, "Reporter", { enumerable: true, get: function () { return reporter_1.Reporter; } });
29
39
  // Runner + types
30
40
  var runner_1 = require("./runner");
31
41
  Object.defineProperty(exports, "RhostRunner", { enumerable: true, get: function () { return runner_1.RhostRunner; } });
42
+ // Offline softcode validator + compat report
43
+ var validator_1 = require("./validator");
44
+ Object.defineProperty(exports, "validate", { enumerable: true, get: function () { return validator_1.validate; } });
45
+ Object.defineProperty(exports, "validateFile", { enumerable: true, get: function () { return validator_1.validateFile; } });
46
+ Object.defineProperty(exports, "compatibilityReport", { enumerable: true, get: function () { return validator_1.compatibilityReport; } });
47
+ Object.defineProperty(exports, "BUILTIN_FUNCTIONS", { enumerable: true, get: function () { return validator_1.BUILTIN_FUNCTIONS; } });
48
+ // Softcode formatter
49
+ var formatter_1 = require("./validator/formatter");
50
+ Object.defineProperty(exports, "format", { enumerable: true, get: function () { return formatter_1.format; } });
51
+ // Benchmark mode
52
+ var benchmark_1 = require("./benchmark");
53
+ Object.defineProperty(exports, "RhostBenchmark", { enumerable: true, get: function () { return benchmark_1.RhostBenchmark; } });
54
+ Object.defineProperty(exports, "runBench", { enumerable: true, get: function () { return benchmark_1.runBench; } });
55
+ Object.defineProperty(exports, "formatBenchResults", { enumerable: true, get: function () { return benchmark_1.formatBenchResults; } });
56
+ // Deploy pipeline
57
+ var deployer_1 = require("./deployer");
58
+ Object.defineProperty(exports, "deploy", { enumerable: true, get: function () { return deployer_1.deploy; } });
59
+ Object.defineProperty(exports, "parseDeployFile", { enumerable: true, get: function () { return deployer_1.parseDeployFile; } });
60
+ Object.defineProperty(exports, "snapshotObjects", { enumerable: true, get: function () { return deployer_1.snapshotObjects; } });
61
+ Object.defineProperty(exports, "restoreSnapshot", { enumerable: true, get: function () { return deployer_1.restoreSnapshot; } });
62
+ // Snapshot manager
63
+ var snapshots_1 = require("./snapshots");
64
+ Object.defineProperty(exports, "SnapshotManager", { enumerable: true, get: function () { return snapshots_1.SnapshotManager; } });
65
+ Object.defineProperty(exports, "formatSnapshotDiff", { enumerable: true, get: function () { return snapshots_1.formatSnapshotDiff; } });
66
+ // Watch mode
67
+ var watcher_1 = require("./watcher");
68
+ Object.defineProperty(exports, "RhostWatcher", { enumerable: true, get: function () { return watcher_1.RhostWatcher; } });
69
+ Object.defineProperty(exports, "discoverTestFiles", { enumerable: true, get: function () { return watcher_1.discoverTestFiles; } });
32
70
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,cAAc;AACd,mCAAsE;AAA7D,qGAAA,WAAW,OAAA;AAAsB,mGAAA,SAAS,OAAA;AAEnD,aAAa;AACb,2CAA8C;AAArC,4GAAA,cAAc,OAAA;AAEvB,YAAY;AACZ,yCAAsE;AAA7D,2GAAA,cAAc,OAAA;AAEvB,+BAA+B;AAC/B,2CAA+F;AAAtF,yGAAA,WAAW,OAAA;AAAE,iHAAA,mBAAmB,OAAA;AAAmB,0GAAA,YAAY,OAAA;AAExE,iBAAiB;AACjB,mCAAyD;AAAhD,qGAAA,WAAW,OAAA;AAAE,0GAAA,gBAAgB,OAAA;AAEtC,wBAAwB;AACxB,iCAAqC;AAA5B,mGAAA,UAAU,OAAA;AAEnB,WAAW;AACX,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AAEjB,iBAAiB;AACjB,mCAUkB;AATd,qGAAA,WAAW,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,cAAc;AACd,mCAAsF;AAA7E,qGAAA,WAAW,OAAA;AAAsC,mGAAA,SAAS,OAAA;AAEnE,aAAa;AACb,2CAA8C;AAArC,4GAAA,cAAc,OAAA;AAEvB,YAAY;AACZ,yCAAsE;AAA7D,2GAAA,cAAc,OAAA;AAEvB,+BAA+B;AAC/B,2CAA+F;AAAtF,yGAAA,WAAW,OAAA;AAAE,iHAAA,mBAAmB,OAAA;AAAmB,0GAAA,YAAY,OAAA;AAExE,iBAAiB;AACjB,mCAAyD;AAAhD,qGAAA,WAAW,OAAA;AAAE,0GAAA,gBAAgB,OAAA;AAEtC,wBAAwB;AACxB,iCAAsG;AAA7F,mGAAA,UAAU,OAAA;AAAE,sGAAA,aAAa,OAAA;AAA8B,6GAAA,oBAAoB,OAAA;AAEpF,wBAAwB;AACxB,yCAUqB;AATjB,sGAAA,SAAS,OAAA;AACT,2GAAA,cAAc,OAAA;AACd,iHAAA,oBAAoB,OAAA;AACpB,kHAAA,qBAAqB,OAAA;AACrB,+GAAA,kBAAkB,OAAA;AAIlB,2GAAA,cAAc,OAAA;AAGlB,WAAW;AACX,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AAEjB,iBAAiB;AACjB,mCAakB;AAZd,qGAAA,WAAW,OAAA;AAcf,6CAA6C;AAC7C,yCAYqB;AAXjB,qGAAA,QAAQ,OAAA;AACR,yGAAA,YAAY,OAAA;AACZ,gHAAA,mBAAmB,OAAA;AAKnB,8GAAA,iBAAiB,OAAA;AAMrB,qBAAqB;AACrB,mDAA4E;AAAnE,mGAAA,MAAM,OAAA;AAEf,iBAAiB;AACjB,yCAA0G;AAAjG,2GAAA,cAAc,OAAA;AAAE,qGAAA,QAAQ,OAAA;AAAE,+GAAA,kBAAkB,OAAA;AAErD,kBAAkB;AAClB,uCASoB;AARhB,kGAAA,MAAM,OAAA;AACN,2GAAA,eAAe,OAAA;AACf,2GAAA,eAAe,OAAA;AACf,2GAAA,eAAe,OAAA;AAOnB,mBAAmB;AACnB,yCAAsH;AAA7G,4GAAA,eAAe,OAAA;AAAsD,+GAAA,kBAAkB,OAAA;AAEhG,aAAa;AACb,qCAA0E;AAAjE,uGAAA,YAAY,OAAA;AAAgB,4GAAA,iBAAiB,OAAA"}
@@ -0,0 +1,70 @@
1
+ import { RhostClient } from './client';
2
+ export interface PreflightCheckResult {
3
+ name: string;
4
+ passed: boolean;
5
+ message?: string;
6
+ }
7
+ export interface PreflightResult {
8
+ passed: number;
9
+ failed: number;
10
+ checks: PreflightCheckResult[];
11
+ }
12
+ export interface PreflightCheck {
13
+ name: string;
14
+ run(client: RhostClient): Promise<{
15
+ passed: boolean;
16
+ message?: string;
17
+ }>;
18
+ }
19
+ export interface PreflightOptions {
20
+ /**
21
+ * Throw a PreflightError if any check fails. Default: true.
22
+ * Set false to collect all results without throwing.
23
+ */
24
+ throwOnFailure?: boolean;
25
+ }
26
+ export declare class PreflightError extends Error {
27
+ readonly result: PreflightResult;
28
+ constructor(result: PreflightResult);
29
+ }
30
+ /**
31
+ * Run a set of pre-flight checks against a live server before tests start.
32
+ *
33
+ * By default throws `PreflightError` if any check fails. Pass
34
+ * `{ throwOnFailure: false }` to collect results without throwing.
35
+ *
36
+ * @example
37
+ * await preflight(client, [
38
+ * assertFunctionExists('json'),
39
+ * assertFunctionExists('localize'),
40
+ * assertConfigEquals('attr_limit', '500'),
41
+ * ]);
42
+ */
43
+ export declare function preflight(client: RhostClient, checks: PreflightCheck[], options?: PreflightOptions): Promise<PreflightResult>;
44
+ /**
45
+ * Factory for a custom preflight check with an arbitrary async predicate.
46
+ */
47
+ export declare function preflightCheck(name: string, fn: (client: RhostClient) => Promise<{
48
+ passed: boolean;
49
+ message?: string;
50
+ }>): PreflightCheck;
51
+ /**
52
+ * Assert that a softcode function is available on the server.
53
+ *
54
+ * Evals `funcname()` and checks that the response does not include "NOT FOUND".
55
+ * A "wrong number of arguments" error means the function exists.
56
+ */
57
+ export declare function assertFunctionExists(name: string): PreflightCheck;
58
+ /**
59
+ * Assert that a softcode function is NOT available on the server.
60
+ *
61
+ * Useful to confirm a restricted or removed function is absent.
62
+ */
63
+ export declare function assertFunctionMissing(name: string): PreflightCheck;
64
+ /**
65
+ * Assert that a server config key equals an expected value.
66
+ *
67
+ * Evals `config(key)` and compares the trimmed result to `expected`.
68
+ */
69
+ export declare function assertConfigEquals(key: string, expected: string): PreflightCheck;
70
+ //# sourceMappingURL=preflight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAMvC,MAAM,WAAW,oBAAoB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,oBAAoB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5E;AAED,MAAM,WAAW,gBAAgB;IAC7B;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,qBAAa,cAAe,SAAQ,KAAK;aACT,MAAM,EAAE,eAAe;gBAAvB,MAAM,EAAE,eAAe;CAQtD;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAsB,SAAS,CAC3B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,cAAc,EAAE,EACxB,OAAO,GAAE,gBAAqB,GAC/B,OAAO,CAAC,eAAe,CAAC,CAyB1B;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAC1B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAC5E,cAAc,CAEhB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAWjE;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAWlE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CAWhF"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PreflightError = void 0;
4
+ exports.preflight = preflight;
5
+ exports.preflightCheck = preflightCheck;
6
+ exports.assertFunctionExists = assertFunctionExists;
7
+ exports.assertFunctionMissing = assertFunctionMissing;
8
+ exports.assertConfigEquals = assertConfigEquals;
9
+ class PreflightError extends Error {
10
+ constructor(result) {
11
+ const failedNames = result.checks
12
+ .filter((c) => !c.passed)
13
+ .map((c) => ` ✗ ${c.name}${c.message ? ': ' + c.message : ''}`)
14
+ .join('\n');
15
+ super(`preflight: ${result.failed} check(s) failed\n${failedNames}`);
16
+ this.result = result;
17
+ this.name = 'PreflightError';
18
+ }
19
+ }
20
+ exports.PreflightError = PreflightError;
21
+ // ---------------------------------------------------------------------------
22
+ // Runner
23
+ // ---------------------------------------------------------------------------
24
+ /**
25
+ * Run a set of pre-flight checks against a live server before tests start.
26
+ *
27
+ * By default throws `PreflightError` if any check fails. Pass
28
+ * `{ throwOnFailure: false }` to collect results without throwing.
29
+ *
30
+ * @example
31
+ * await preflight(client, [
32
+ * assertFunctionExists('json'),
33
+ * assertFunctionExists('localize'),
34
+ * assertConfigEquals('attr_limit', '500'),
35
+ * ]);
36
+ */
37
+ async function preflight(client, checks, options = {}) {
38
+ const throwOnFailure = options.throwOnFailure !== false;
39
+ const results = [];
40
+ for (const check of checks) {
41
+ let checkResult;
42
+ try {
43
+ const outcome = await check.run(client);
44
+ checkResult = { name: check.name, passed: outcome.passed, message: outcome.message };
45
+ }
46
+ catch (err) {
47
+ const message = err instanceof Error ? err.message : String(err);
48
+ checkResult = { name: check.name, passed: false, message };
49
+ }
50
+ results.push(checkResult);
51
+ }
52
+ const passed = results.filter((r) => r.passed).length;
53
+ const failed = results.filter((r) => !r.passed).length;
54
+ const result = { passed, failed, checks: results };
55
+ if (throwOnFailure && failed > 0) {
56
+ throw new PreflightError(result);
57
+ }
58
+ return result;
59
+ }
60
+ // ---------------------------------------------------------------------------
61
+ // Built-in check factories
62
+ // ---------------------------------------------------------------------------
63
+ /**
64
+ * Factory for a custom preflight check with an arbitrary async predicate.
65
+ */
66
+ function preflightCheck(name, fn) {
67
+ return { name, run: fn };
68
+ }
69
+ /**
70
+ * Assert that a softcode function is available on the server.
71
+ *
72
+ * Evals `funcname()` and checks that the response does not include "NOT FOUND".
73
+ * A "wrong number of arguments" error means the function exists.
74
+ */
75
+ function assertFunctionExists(name) {
76
+ return {
77
+ name: `function exists: ${name}`,
78
+ async run(client) {
79
+ const result = await client.eval(`${name}()`);
80
+ const passed = !result.toUpperCase().includes('NOT FOUND');
81
+ return passed
82
+ ? { passed: true }
83
+ : { passed: false, message: `function '${name}' is not available on this server` };
84
+ },
85
+ };
86
+ }
87
+ /**
88
+ * Assert that a softcode function is NOT available on the server.
89
+ *
90
+ * Useful to confirm a restricted or removed function is absent.
91
+ */
92
+ function assertFunctionMissing(name) {
93
+ return {
94
+ name: `function absent: ${name}`,
95
+ async run(client) {
96
+ const result = await client.eval(`${name}()`);
97
+ const passed = result.toUpperCase().includes('NOT FOUND');
98
+ return passed
99
+ ? { passed: true }
100
+ : { passed: false, message: `function '${name}' exists but was expected to be absent` };
101
+ },
102
+ };
103
+ }
104
+ /**
105
+ * Assert that a server config key equals an expected value.
106
+ *
107
+ * Evals `config(key)` and compares the trimmed result to `expected`.
108
+ */
109
+ function assertConfigEquals(key, expected) {
110
+ return {
111
+ name: `config: ${key} = ${expected}`,
112
+ async run(client) {
113
+ const actual = (await client.eval(`config(${key})`)).trim();
114
+ const passed = actual === expected;
115
+ return passed
116
+ ? { passed: true }
117
+ : { passed: false, message: `config(${key}): expected '${expected}', got '${actual}'` };
118
+ },
119
+ };
120
+ }
121
+ //# sourceMappingURL=preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { RunResult } from './runner';
2
+ import { SnapshotStats } from './snapshots';
2
3
  export declare class Reporter {
3
4
  private readonly verbose;
4
5
  constructor(verbose: boolean);
@@ -7,5 +8,6 @@ export declare class Reporter {
7
8
  testFail(name: string, ms: number, depth: number, error: Error): void;
8
9
  testSkip(name: string, depth: number): void;
9
10
  summary(result: RunResult): void;
11
+ snapshotSummary(stats: SnapshotStats): void;
10
12
  }
11
13
  //# sourceMappingURL=reporter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAsBrC,qBAAa,QAAQ;IACL,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,OAAO;IAE7C,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAM7C,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAMvD,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAWrE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAM3C,OAAO,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;CASnC"}
1
+ {"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAuB5C,qBAAa,QAAQ;IACL,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,OAAO;IAE7C,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAM7C,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAMvD,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAWrE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAM3C,OAAO,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAWhC,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;CAoB9C"}
package/dist/reporter.js CHANGED
@@ -11,6 +11,7 @@ function colorize(code, text) {
11
11
  const green = (s) => colorize('32', s);
12
12
  const red = (s) => colorize('31', s);
13
13
  const yellow = (s) => colorize('33', s);
14
+ const cyan = (s) => colorize('36', s);
14
15
  const gray = (s) => colorize('90', s);
15
16
  const bold = (s) => colorize('1', s);
16
17
  // ---------------------------------------------------------------------------
@@ -60,7 +61,29 @@ class Reporter {
60
61
  if (result.skipped > 0)
61
62
  parts.push(yellow(`${result.skipped} skipped`));
62
63
  parts.push(`${result.total} total`);
63
- process.stdout.write(`\nTests: ${parts.join(', ')} (${result.duration}ms)\n`);
64
+ process.stdout.write(`\nTests: ${parts.join(', ')} ${gray(`(${result.duration}ms)`)}\n`);
65
+ this.snapshotSummary(result.snapshots);
66
+ }
67
+ snapshotSummary(stats) {
68
+ if (!this.verbose)
69
+ return;
70
+ const { matched, written, updated, obsolete } = stats;
71
+ const total = matched + written + updated;
72
+ if (total === 0 && obsolete === 0)
73
+ return;
74
+ const parts = [];
75
+ if (matched > 0)
76
+ parts.push(green(`${matched} passed`));
77
+ if (written > 0)
78
+ parts.push(cyan(`${written} written`));
79
+ if (updated > 0)
80
+ parts.push(yellow(`${updated} updated`));
81
+ if (obsolete > 0)
82
+ parts.push(gray(`${obsolete} obsolete`));
83
+ process.stdout.write(`Snapshots: ${parts.join(', ')}\n`);
84
+ if (obsolete > 0) {
85
+ process.stdout.write(gray(` Run with RHOST_UPDATE_SNAPSHOTS=1 to remove obsolete snapshots.\n`));
86
+ }
64
87
  }
65
88
  }
66
89
  exports.Reporter = Reporter;
@@ -1 +1 @@
1
- {"version":3,"file":"reporter.js","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reporter.js","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"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"}
package/dist/runner.d.ts CHANGED
@@ -1,7 +1,8 @@
1
- import { RhostClient, RhostClientOptions } from './client';
1
+ import { RhostClient, RhostClientOptions, PreviewOptions } from './client';
2
2
  import { RhostAssert } from './assertions';
3
3
  import { RhostExpect } from './expect';
4
4
  import { RhostWorld } from './world';
5
+ import { SnapshotStats } from './snapshots';
5
6
  export interface RunResult {
6
7
  passed: number;
7
8
  failed: number;
@@ -13,19 +14,41 @@ export interface RunResult {
13
14
  test: string;
14
15
  error: Error;
15
16
  }>;
17
+ snapshots: SnapshotStats;
16
18
  }
17
19
  export interface TestContext {
18
20
  expect(expression: string): RhostExpect;
19
21
  client: RhostClient;
20
22
  world: RhostWorld;
23
+ /**
24
+ * Evaluate a softcode expression (default) or run a raw MUSH command and
25
+ * print the raw server output to stdout exactly as a player would see it —
26
+ * ANSI colours, formatting, all of it.
27
+ *
28
+ * Returns the raw string so you can still assert on it if needed.
29
+ *
30
+ * @example Softcode result with colour
31
+ * await preview('ansi(rh,CRITICAL HIT!)');
32
+ *
33
+ * @example Room description as a player sees it
34
+ * await preview('look here', { mode: 'command' });
35
+ *
36
+ * @example Score screen
37
+ * await preview('score', { mode: 'command' });
38
+ */
39
+ preview(input: string, options?: PreviewOptions): Promise<string>;
21
40
  }
22
41
  export type TestFn = (ctx: TestContext) => Promise<void> | void;
23
42
  export type HookFn = (ctx: {
24
43
  client: RhostClient;
25
44
  world: RhostWorld;
26
45
  }) => Promise<void> | void;
46
+ export type PersonaTestFn = (ctx: TestContext & {
47
+ persona: string;
48
+ }) => Promise<void> | void;
27
49
  export type ItFn = (name: string, fn: TestFn, timeout?: number) => void;
28
50
  export type DescribeFn = (name: string, fn: (ctx: SuiteContext) => void) => void;
51
+ export type PersonasFn = (names: string[], testName: string, fn: PersonaTestFn, timeout?: number) => void;
29
52
  export interface SuiteContext {
30
53
  it: ItFn & {
31
54
  skip: ItFn;
@@ -43,6 +66,28 @@ export interface SuiteContext {
43
66
  afterAll(fn: HookFn): void;
44
67
  beforeEach(fn: HookFn): void;
45
68
  afterEach(fn: HookFn): void;
69
+ /**
70
+ * Register one test per persona. Each test connects to the MUSH server
71
+ * using the credentials defined under `runner.run({ personas: {...} })`.
72
+ *
73
+ * @example
74
+ * personas(
75
+ * ['mortal', 'builder', 'wizard'],
76
+ * 'hidden room visibility',
77
+ * async ({ expect, persona }) => {
78
+ * if (persona === 'mortal') {
79
+ * await expect('can_see_hidden()').toBe('0');
80
+ * } else {
81
+ * await expect('can_see_hidden()').toBe('1');
82
+ * }
83
+ * },
84
+ * );
85
+ */
86
+ personas: PersonasFn;
87
+ }
88
+ export interface PersonaCredentials {
89
+ username: string;
90
+ password: string;
46
91
  }
47
92
  export interface RunnerOptions extends RhostClientOptions {
48
93
  /** Character name. Required. */
@@ -51,12 +96,39 @@ export interface RunnerOptions extends RhostClientOptions {
51
96
  password: string;
52
97
  /** Print results to stdout while running. Default: true */
53
98
  verbose?: boolean;
99
+ /**
100
+ * Credentials for named personas used by `personas()` tests.
101
+ *
102
+ * @example
103
+ * runner.run({
104
+ * username: 'Wizard',
105
+ * password: 'Nyctasia',
106
+ * personas: {
107
+ * mortal: { username: 'TestMortal', password: 'mortalpass' },
108
+ * builder: { username: 'TestBuilder', password: 'builderpass' },
109
+ * },
110
+ * });
111
+ */
112
+ personas?: Record<string, PersonaCredentials>;
113
+ /**
114
+ * Absolute or relative path to the snapshot file.
115
+ * Default: `__snapshots__/<calling-file>.snap` next to the test file,
116
+ * or `__snapshots__/testkit.snap` in cwd if the caller cannot be determined.
117
+ */
118
+ snapshotFile?: string;
119
+ /**
120
+ * Overwrite stored snapshots with current values instead of comparing.
121
+ * Also activated by the `RHOST_UPDATE_SNAPSHOTS=1` environment variable.
122
+ * Default: false
123
+ */
124
+ updateSnapshots?: boolean;
54
125
  }
55
126
  /**
56
127
  * Jest-style test runner for RhostMUSH softcode.
57
128
  *
58
129
  * Supports nested describes, it.skip/it.only, describe.skip/describe.only,
59
- * per-test timeouts, lifecycle hooks, and automatic world cleanup.
130
+ * per-test timeouts, lifecycle hooks, automatic world cleanup, and snapshot
131
+ * testing via `expect().toMatchSnapshot()`.
60
132
  *
61
133
  * @example
62
134
  * const runner = new RhostRunner();
@@ -72,6 +144,8 @@ export interface RunnerOptions extends RhostClientOptions {
72
144
  */
73
145
  export declare class RhostRunner {
74
146
  private topLevel;
147
+ /** Set at the start of run() so persona test closures can access credentials. */
148
+ private _options;
75
149
  describe(name: string, fn: (ctx: SuiteContext) => void): this;
76
150
  run(options: RunnerOptions): Promise<RunResult>;
77
151
  private _buildSuite;
@@ -85,6 +159,13 @@ export declare class RhostRunner {
85
159
  private _countFailedFromBeforeAll;
86
160
  private _countSkipped;
87
161
  private _withTimeout;
162
+ private resolveSnapshotFile;
163
+ /**
164
+ * Walk the Error.stack to find the first file that is not the runner
165
+ * itself and not inside node_modules. Used to auto-derive the snapshot
166
+ * file path from the test file's location.
167
+ */
168
+ private getCallerFile;
88
169
  }
89
170
  export { RhostAssert };
90
171
  //# sourceMappingURL=runner.d.ts.map