@rhost/testkit 0.1.1 → 1.3.2

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 +56 -0
  32. package/dist/client.d.ts.map +1 -1
  33. package/dist/client.js +117 -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/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
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
package/dist/runner.js CHANGED
@@ -1,12 +1,47 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.RhostAssert = exports.RhostRunner = void 0;
37
+ const path = __importStar(require("path"));
4
38
  const client_1 = require("./client");
5
39
  const assertions_1 = require("./assertions");
6
40
  Object.defineProperty(exports, "RhostAssert", { enumerable: true, get: function () { return assertions_1.RhostAssert; } });
7
41
  const expect_1 = require("./expect");
8
42
  const world_1 = require("./world");
9
43
  const reporter_1 = require("./reporter");
44
+ const snapshots_1 = require("./snapshots");
10
45
  // ---------------------------------------------------------------------------
11
46
  // RhostRunner
12
47
  // ---------------------------------------------------------------------------
@@ -14,7 +49,8 @@ const reporter_1 = require("./reporter");
14
49
  * Jest-style test runner for RhostMUSH softcode.
15
50
  *
16
51
  * Supports nested describes, it.skip/it.only, describe.skip/describe.only,
17
- * per-test timeouts, lifecycle hooks, and automatic world cleanup.
52
+ * per-test timeouts, lifecycle hooks, automatic world cleanup, and snapshot
53
+ * testing via `expect().toMatchSnapshot()`.
18
54
  *
19
55
  * @example
20
56
  * const runner = new RhostRunner();
@@ -43,13 +79,20 @@ class RhostRunner {
43
79
  // Execution phase
44
80
  // -------------------------------------------------------------------------
45
81
  async run(options) {
82
+ this._options = options;
46
83
  const verbose = options.verbose !== false;
84
+ const updateMode = options.updateSnapshots === true ||
85
+ process.env['RHOST_UPDATE_SNAPSHOTS'] === '1';
86
+ const snapshotFile = this.resolveSnapshotFile(options);
87
+ const snapshots = new snapshots_1.SnapshotManager(snapshotFile, updateMode);
47
88
  const client = new client_1.RhostClient(options);
48
89
  await client.connect();
49
90
  await client.login(options.username, options.password);
50
91
  const reporter = new reporter_1.Reporter(verbose);
51
92
  const result = {
52
- passed: 0, failed: 0, skipped: 0, total: 0, duration: 0, failures: [],
93
+ passed: 0, failed: 0, skipped: 0, total: 0, duration: 0,
94
+ failures: [],
95
+ snapshots: { matched: 0, written: 0, updated: 0, obsolete: 0 },
53
96
  };
54
97
  const start = Date.now();
55
98
  // Wrap top-level nodes in a root suite for uniform execution
@@ -60,8 +103,10 @@ class RhostRunner {
60
103
  children: this.topLevel,
61
104
  beforeAll: [], afterAll: [], beforeEach: [], afterEach: [],
62
105
  };
63
- await this._runSuite(root, client, reporter, result, [], 0);
106
+ await this._runSuite(root, client, reporter, result, [], 0, [], snapshots);
64
107
  result.duration = Date.now() - start;
108
+ snapshots.save();
109
+ result.snapshots = snapshots.stats();
65
110
  reporter.summary(result);
66
111
  await client.disconnect();
67
112
  return result;
@@ -86,6 +131,39 @@ class RhostRunner {
86
131
  const describeFn = makeDescribeFn('normal');
87
132
  describeFn.skip = makeDescribeFn('skip');
88
133
  describeFn.only = makeDescribeFn('only');
134
+ const personasFn = (names, testName, personaFn, timeout) => {
135
+ for (const personaName of names) {
136
+ const wrappedFn = async (ctx) => {
137
+ const opts = this._options;
138
+ const creds = opts?.personas?.[personaName];
139
+ if (!creds) {
140
+ throw new Error(`personas(): persona '${personaName}' not defined — ` +
141
+ `add it to runner.run({ personas: { ${personaName}: { username, password } } })`);
142
+ }
143
+ const personaClient = new client_1.RhostClient({ ...opts, ...creds });
144
+ await personaClient.connect();
145
+ await personaClient.login(creds.username, creds.password);
146
+ const personaWorld = new world_1.RhostWorld(personaClient);
147
+ try {
148
+ await personaFn({ ...ctx, client: personaClient, world: personaWorld, persona: personaName });
149
+ }
150
+ finally {
151
+ try {
152
+ await personaWorld.cleanup();
153
+ }
154
+ catch { /* ignore */ }
155
+ await personaClient.disconnect();
156
+ }
157
+ };
158
+ node.children.push({
159
+ kind: 'test',
160
+ name: `${testName} [${personaName}]`,
161
+ fn: wrappedFn,
162
+ mode: 'normal',
163
+ timeout,
164
+ });
165
+ }
166
+ };
89
167
  fn({
90
168
  it: itFn,
91
169
  test: itFn,
@@ -94,13 +172,14 @@ class RhostRunner {
94
172
  afterAll: (h) => node.afterAll.push(h),
95
173
  beforeEach: (h) => node.beforeEach.push(h),
96
174
  afterEach: (h) => node.afterEach.push(h),
175
+ personas: personasFn,
97
176
  });
98
177
  return node;
99
178
  }
100
179
  // -------------------------------------------------------------------------
101
180
  // Internal: executing the tree
102
181
  // -------------------------------------------------------------------------
103
- async _runSuite(suite, client, reporter, result, inheritedBeforeEach, depth) {
182
+ async _runSuite(suite, client, reporter, result, inheritedBeforeEach, depth, suitePath, snapshots) {
104
183
  // Skip entire suite if marked skip
105
184
  if (suite.mode === 'skip') {
106
185
  this._countSkipped(suite, result, reporter, depth);
@@ -112,6 +191,8 @@ class RhostRunner {
112
191
  const activeChildren = this._resolveOnly(suite.children);
113
192
  // Build the cumulative beforeEach/afterEach stack (inherited + suite-level)
114
193
  const combinedBeforeEach = [...inheritedBeforeEach, ...suite.beforeEach];
194
+ // Build the path for this suite's children
195
+ const childPath = suite.name ? [...suitePath, suite.name] : suitePath;
115
196
  // Run suite-level beforeAll hooks — if one throws, count all suite tests as failures
116
197
  const hookCtx = { client, world: new world_1.RhostWorld(client) };
117
198
  for (const hook of suite.beforeAll) {
@@ -130,11 +211,11 @@ class RhostRunner {
130
211
  const childWithMode = effectiveMode !== child.mode
131
212
  ? { ...child, mode: effectiveMode }
132
213
  : child;
133
- await this._runSuite(childWithMode, client, reporter, result, combinedBeforeEach, depth + (suite.name ? 1 : 0));
214
+ await this._runSuite(childWithMode, client, reporter, result, combinedBeforeEach, depth + (suite.name ? 1 : 0), childPath, snapshots);
134
215
  }
135
216
  else {
136
217
  const skip = !activeChildren.includes(child) || child.mode === 'skip';
137
- await this._runTest(child, skip, client, reporter, result, combinedBeforeEach, suite.afterEach, suite.name, depth + (suite.name ? 1 : 0));
218
+ await this._runTest(child, skip, client, reporter, result, combinedBeforeEach, suite.afterEach, childPath, depth + (suite.name ? 1 : 0), snapshots);
138
219
  }
139
220
  }
140
221
  // Run suite-level afterAll hooks
@@ -142,19 +223,29 @@ class RhostRunner {
142
223
  await hook(hookCtx);
143
224
  }
144
225
  }
145
- async _runTest(test, skip, client, reporter, result, beforeEachHooks, afterEachHooks, suiteName, depth) {
226
+ async _runTest(test, skip, client, reporter, result, beforeEachHooks, afterEachHooks, suitePath, depth, snapshots) {
146
227
  result.total++;
147
228
  if (skip || test.mode === 'skip') {
148
229
  result.skipped++;
149
230
  reporter.testSkip(test.name, depth);
150
231
  return;
151
232
  }
233
+ // Full path used as the snapshot key prefix and for failure reporting
234
+ const testKey = [...suitePath, test.name].join(' > ');
235
+ const suiteName = suitePath[suitePath.length - 1] ?? '';
236
+ // Reset snapshot counter for this test
237
+ snapshots.resetCounter(testKey);
152
238
  const world = new world_1.RhostWorld(client);
153
239
  const hookCtx = { client, world };
240
+ const snapshotCtx = {
241
+ manager: snapshots,
242
+ testName: testKey,
243
+ };
154
244
  const testCtx = {
155
245
  client,
156
246
  world,
157
- expect: (expr) => new expect_1.RhostExpect(client, expr),
247
+ expect: (expr) => new expect_1.RhostExpect(client, expr, false, snapshotCtx),
248
+ preview: (input, opts) => client.preview(input, opts),
158
249
  };
159
250
  // Run inherited + suite beforeEach — if one throws, count as a test failure
160
251
  for (const hook of beforeEachHooks) {
@@ -252,6 +343,44 @@ class RhostRunner {
252
343
  p.then(() => { clearTimeout(timer); resolve(); }, (err) => { clearTimeout(timer); reject(err); });
253
344
  });
254
345
  }
346
+ // -------------------------------------------------------------------------
347
+ // Snapshot file resolution
348
+ // -------------------------------------------------------------------------
349
+ resolveSnapshotFile(options) {
350
+ if (options.snapshotFile)
351
+ return path.resolve(options.snapshotFile);
352
+ const callerFile = this.getCallerFile();
353
+ if (callerFile) {
354
+ const dir = path.dirname(callerFile);
355
+ const base = path.basename(callerFile);
356
+ return path.join(dir, '__snapshots__', `${base}.snap`);
357
+ }
358
+ return path.join(process.cwd(), '__snapshots__', 'testkit.snap');
359
+ }
360
+ /**
361
+ * Walk the Error.stack to find the first file that is not the runner
362
+ * itself and not inside node_modules. Used to auto-derive the snapshot
363
+ * file path from the test file's location.
364
+ */
365
+ getCallerFile() {
366
+ const lines = (new Error().stack ?? '').split('\n').slice(1);
367
+ for (const line of lines) {
368
+ const match = line.match(/\((.+?):\d+:\d+\)/) ??
369
+ line.match(/at (.+?):\d+:\d+\s*$/);
370
+ if (!match)
371
+ continue;
372
+ const file = match[1];
373
+ if (!file)
374
+ continue;
375
+ if (file.includes('node_modules') ||
376
+ file.startsWith('internal/') ||
377
+ file.startsWith('node:') ||
378
+ /[\\/]runner\.[jt]s$/.test(file))
379
+ continue;
380
+ return file;
381
+ }
382
+ return null;
383
+ }
255
384
  }
256
385
  exports.RhostRunner = RhostRunner;
257
386
  //# sourceMappingURL=runner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ export interface SnapshotStats {
2
+ /** Snapshots that matched stored values */
3
+ matched: number;
4
+ /** New snapshots written for the first time */
5
+ written: number;
6
+ /** Existing snapshots overwritten in update mode */
7
+ updated: number;
8
+ /** Keys present in the snapshot file that were never evaluated in this run */
9
+ obsolete: number;
10
+ }
11
+ export type SnapshotStatus = 'matched' | 'mismatch' | 'written' | 'updated';
12
+ export interface SnapshotCheckResult {
13
+ status: SnapshotStatus;
14
+ /** The stored/expected value. Undefined for 'written' (no prior value). */
15
+ expected: string | undefined;
16
+ }
17
+ /**
18
+ * Manages a single `.snap` JSON file on disk.
19
+ *
20
+ * Lifecycle per test run:
21
+ * 1. `new SnapshotManager(filePath, updateMode)` — loads existing snapshots
22
+ * 2. For each test: `resetCounter(testName)` at test start
23
+ * 3. For each assertion: `check(nextKey(testName), actual)` inside `toMatchSnapshot()`
24
+ * 4. `save()` after all tests complete — writes new/updated snapshots to disk
25
+ * 5. `stats()` — retrieve final counts for the run summary
26
+ *
27
+ * Snapshot file format:
28
+ * A sorted JSON object mapping string keys → string values, e.g.:
29
+ * {
30
+ * "Math > add returns sum: 1": "5",
31
+ * "Math > iter lnum(1,10): 1": "1 2 3 4 5 6 7 8 9 10"
32
+ * }
33
+ *
34
+ * Key format: `"Suite > Sub > Test Name: N"` where N resets to 1 per test.
35
+ */
36
+ export declare class SnapshotManager {
37
+ private readonly filePath;
38
+ private readonly updateMode;
39
+ /** Snapshots loaded from disk at startup */
40
+ private readonly stored;
41
+ /** All key→actual values evaluated in this run */
42
+ private readonly touched;
43
+ /** Per-test snapshot call counter */
44
+ private readonly counters;
45
+ private _matched;
46
+ private _written;
47
+ private _updated;
48
+ constructor(filePath: string, updateMode: boolean);
49
+ /**
50
+ * Advance and return the next snapshot key for `testName`.
51
+ * Call `resetCounter(testName)` at the start of each test.
52
+ */
53
+ nextKey(testName: string): string;
54
+ /** Reset the per-test counter. Call this at the start of every test. */
55
+ resetCounter(testName: string): void;
56
+ /**
57
+ * Check `actual` against the stored snapshot for `key`.
58
+ *
59
+ * - **No prior value**: write it (returns `'written'`, always passes)
60
+ * - **Update mode**: overwrite with `actual` (returns `'updated'` if changed, `'matched'` if same)
61
+ * - **Normal mode**: compare; returns `'matched'` or `'mismatch'`
62
+ */
63
+ check(key: string, actual: string): SnapshotCheckResult;
64
+ /**
65
+ * Flush snapshot state to disk.
66
+ *
67
+ * **Normal mode**: merges new snapshots into the existing file.
68
+ * Existing values are never overwritten — failed snapshots retain
69
+ * their previous (correct) value until the user runs `--updateSnapshot`.
70
+ *
71
+ * **Update mode**: writes only the snapshots evaluated in this run,
72
+ * discarding any obsolete entries that were not touched.
73
+ */
74
+ save(): void;
75
+ stats(): SnapshotStats;
76
+ private load;
77
+ }
78
+ /**
79
+ * Format a human-readable diff between expected and actual snapshot values.
80
+ * Uses a simple line-by-line format (not a full diff algorithm — values are
81
+ * single-line MUSH results in most cases).
82
+ */
83
+ export declare function formatSnapshotDiff(expected: string, actual: string): string;
84
+ //# sourceMappingURL=snapshots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshots.d.ts","sourceRoot":"","sources":["../src/snapshots.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,aAAa;IAC5B,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;AAE5E,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,cAAc,CAAC;IACvB,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAMD;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,eAAe;IAaxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAb7B,4CAA4C;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,kDAAkD;IAClD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,qCAAqC;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IAEtD,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,QAAQ,CAAK;gBAGF,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,OAAO;IAStC;;;OAGG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAMjC,wEAAwE;IACxE,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQpC;;;;;;OAMG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,mBAAmB;IAiCvD;;;;;;;;;OASG;IACH,IAAI,IAAI,IAAI;IAwCZ,KAAK,IAAI,aAAa;IAetB,OAAO,CAAC,IAAI;CAYb;AAMD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAkB3E"}