@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/client.d.ts CHANGED
@@ -31,6 +31,26 @@ export interface RhostClientOptions {
31
31
  */
32
32
  connectTimeout?: number;
33
33
  }
34
+ export interface PreviewOptions {
35
+ /**
36
+ * How to send the input to the server.
37
+ * - `'eval'` — wraps in `think`, returning the softcode result (default)
38
+ * - `'command'` — sends as a raw MUSH command, capturing all output lines
39
+ */
40
+ mode?: 'eval' | 'command';
41
+ /**
42
+ * Label shown in the preview frame header.
43
+ * Defaults to the expression/command string (truncated if long).
44
+ */
45
+ label?: string;
46
+ /** Timeout in ms. Defaults to the client's default timeout. */
47
+ timeout?: number;
48
+ /**
49
+ * Write the preview to stdout automatically. Default: true.
50
+ * Set to false to suppress output and only use the return value.
51
+ */
52
+ print?: boolean;
53
+ }
34
54
  /**
35
55
  * High-level client for interacting with a RhostMUSH server.
36
56
  *
@@ -79,11 +99,39 @@ export declare class RhostClient {
79
99
  * const lines = await client.command('@pemit me=hello');
80
100
  */
81
101
  command(cmd: string, timeout?: number): Promise<string[]>;
102
+ /**
103
+ * Evaluate an expression or run a command and print the raw server output
104
+ * to stdout exactly as a MUSH client would receive it — ANSI colours,
105
+ * formatting codes, and all.
106
+ *
107
+ * The output is framed in a labelled box so it is clearly demarcated in
108
+ * test output. The raw string is also returned so you can assert on it
109
+ * if needed.
110
+ *
111
+ * By default (`mode: 'eval'`) the input is wrapped in `think`, so it
112
+ * should be a softcode expression. Pass `mode: 'command'` to send a raw
113
+ * MUSH command instead (e.g. `'look here'`, `'score'`, `'@pemit me=hi'`).
114
+ *
115
+ * @example Softcode expression
116
+ * await client.preview('ansi(r,Hello!)');
117
+ * await client.preview('iter(lnum(1,5),##)');
118
+ *
119
+ * @example Raw command (room description, score screen, etc.)
120
+ * await client.preview('look here', { mode: 'command' });
121
+ * await client.preview('score', { mode: 'command' });
122
+ *
123
+ * @example Suppress auto-print and only use the return value
124
+ * const raw = await client.preview('ansi(b,test)', { print: false });
125
+ * expect(stripAnsi(raw)).toBe('test');
126
+ */
127
+ preview(input: string, options?: PreviewOptions): Promise<string>;
82
128
  /** Subscribe to every raw line received from the server. */
83
129
  onLine(handler: (line: string) => void): void;
84
130
  offLine(handler: (line: string) => void): void;
85
131
  /** Send QUIT and close the TCP connection. */
86
132
  disconnect(): Promise<void>;
133
+ private _collectEval;
134
+ private _collectCommand;
87
135
  private readUntilMarker;
88
136
  private drainBanner;
89
137
  private makeId;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAQA,uDAAuD;AACvD,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,MAAM,WAAW,kBAAkB;IAC/B,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;GASG;AACH,qBAAa,WAAW;IACpB,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,cAAc,CAAS;gBAEnB,OAAO,GAAE,kBAAuB;IAS5C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B;;;OAGG;IACG,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa9D;;;;;;;;;;OAUG;IACG,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA0BjE;;;;;;;OAOG;IACG,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAmB/D,4DAA4D;IAC5D,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAI7C,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAI9C,8CAA8C;IACxC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAanB,eAAe;IAQ7B,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,MAAM;CAGjB"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAQA,uDAAuD;AACvD,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,MAAM,WAAW,kBAAkB;IAC/B,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAMD,MAAM,WAAW,cAAc;IAC3B;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,qBAAa,WAAW;IACpB,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,cAAc,CAAS;gBAEnB,OAAO,GAAE,kBAAuB;IAS5C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B;;;OAGG;IACG,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB9D;;;;;;;;;;OAUG;IACG,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIjE;;;;;;;OAOG;IACG,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAI/D;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACG,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB3E,4DAA4D;IAC5D,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAI7C,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAI9C,8CAA8C;IACxC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAanB,YAAY;YA8BZ,eAAe;YA2Bf,eAAe;IAQ7B,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,MAAM;CAGjB"}
package/dist/client.js CHANGED
@@ -49,6 +49,12 @@ class RhostClient {
49
49
  if (/[\n\r]/.test(password)) {
50
50
  throw new RangeError('login: invalid password — must not contain newline or carriage return characters');
51
51
  }
52
+ // The MUSH `connect` command is space-delimited: embedding a space or tab
53
+ // in the username would let the caller silently substitute a different
54
+ // character name and password (space-splitting injection).
55
+ if (/[ \t]/.test(username)) {
56
+ throw new RangeError('login: invalid username — must not contain spaces or tabs');
57
+ }
52
58
  const sentinel = `RHOST_LOGIN_${this.makeId()}`;
53
59
  this.conn.send(`connect ${username} ${password}`);
54
60
  this.conn.send(`@pemit me=${sentinel}`);
@@ -66,6 +72,79 @@ class RhostClient {
66
72
  * await client.eval('encode64(hello)') // => 'aGVsbG8='
67
73
  */
68
74
  async eval(expression, timeout) {
75
+ return this._collectEval(expression, this.doStripAnsi, timeout);
76
+ }
77
+ /**
78
+ * Run a MUSHcode command and collect all output lines until the
79
+ * internal sentinel is received.
80
+ *
81
+ * @example
82
+ * const lines = await client.command('look here');
83
+ * const lines = await client.command('@pemit me=hello');
84
+ */
85
+ async command(cmd, timeout) {
86
+ return this._collectCommand(cmd, this.doStripAnsi, timeout);
87
+ }
88
+ /**
89
+ * Evaluate an expression or run a command and print the raw server output
90
+ * to stdout exactly as a MUSH client would receive it — ANSI colours,
91
+ * formatting codes, and all.
92
+ *
93
+ * The output is framed in a labelled box so it is clearly demarcated in
94
+ * test output. The raw string is also returned so you can assert on it
95
+ * if needed.
96
+ *
97
+ * By default (`mode: 'eval'`) the input is wrapped in `think`, so it
98
+ * should be a softcode expression. Pass `mode: 'command'` to send a raw
99
+ * MUSH command instead (e.g. `'look here'`, `'score'`, `'@pemit me=hi'`).
100
+ *
101
+ * @example Softcode expression
102
+ * await client.preview('ansi(r,Hello!)');
103
+ * await client.preview('iter(lnum(1,5),##)');
104
+ *
105
+ * @example Raw command (room description, score screen, etc.)
106
+ * await client.preview('look here', { mode: 'command' });
107
+ * await client.preview('score', { mode: 'command' });
108
+ *
109
+ * @example Suppress auto-print and only use the return value
110
+ * const raw = await client.preview('ansi(b,test)', { print: false });
111
+ * expect(stripAnsi(raw)).toBe('test');
112
+ */
113
+ async preview(input, options = {}) {
114
+ const mode = options.mode ?? 'eval';
115
+ const timeout = options.timeout;
116
+ const doPrint = options.print !== false;
117
+ // Always collect raw output (never strip) for preview
118
+ const raw = mode === 'eval'
119
+ ? await this._collectEval(input, false, timeout)
120
+ : (await this._collectCommand(input, false, timeout)).join('\n');
121
+ if (doPrint) {
122
+ const label = options.label ?? (input.length > 60 ? input.slice(0, 57) + '…' : input);
123
+ printPreviewFrame(label, raw, mode);
124
+ }
125
+ return raw;
126
+ }
127
+ /** Subscribe to every raw line received from the server. */
128
+ onLine(handler) {
129
+ this.conn.on('line', handler);
130
+ }
131
+ offLine(handler) {
132
+ this.conn.off('line', handler);
133
+ }
134
+ /** Send QUIT and close the TCP connection. */
135
+ async disconnect() {
136
+ try {
137
+ this.conn.send('QUIT');
138
+ }
139
+ catch {
140
+ // already closed
141
+ }
142
+ await this.conn.close();
143
+ }
144
+ // -------------------------------------------------------------------------
145
+ // Private: core collect helpers (shared by eval/command/preview)
146
+ // -------------------------------------------------------------------------
147
+ async _collectEval(expression, strip, timeout) {
69
148
  if (this.paceMs > 0) {
70
149
  await new Promise((r) => setTimeout(r, this.paceMs));
71
150
  }
@@ -80,22 +159,14 @@ class RhostClient {
80
159
  const resultLines = [];
81
160
  while (true) {
82
161
  const line = await this.conn.lines.next(ms);
83
- const clean = this.doStripAnsi ? stripAnsi(line) : line;
84
- if (clean.includes(endMarker))
162
+ const clean = strip ? stripAnsi(line) : line;
163
+ if ((strip ? clean : stripAnsi(line)).includes(endMarker))
85
164
  break;
86
165
  resultLines.push(clean);
87
166
  }
88
167
  return resultLines.join('\n');
89
168
  }
90
- /**
91
- * Run a MUSHcode command and collect all output lines until the
92
- * internal sentinel is received.
93
- *
94
- * @example
95
- * const lines = await client.command('look here');
96
- * const lines = await client.command('@pemit me=hello');
97
- */
98
- async command(cmd, timeout) {
169
+ async _collectCommand(cmd, strip, timeout) {
99
170
  const id = this.makeId();
100
171
  const endMarker = `RHOST_CMD_END_${id}`;
101
172
  const ms = timeout ?? this.defaultTimeout;
@@ -104,30 +175,13 @@ class RhostClient {
104
175
  const lines = [];
105
176
  while (true) {
106
177
  const line = await this.conn.lines.next(ms);
107
- const clean = this.doStripAnsi ? stripAnsi(line) : line;
108
- if (clean.includes(endMarker))
178
+ const clean = strip ? stripAnsi(line) : line;
179
+ if ((strip ? clean : stripAnsi(line)).includes(endMarker))
109
180
  break;
110
181
  lines.push(clean);
111
182
  }
112
183
  return lines;
113
184
  }
114
- /** Subscribe to every raw line received from the server. */
115
- onLine(handler) {
116
- this.conn.on('line', handler);
117
- }
118
- offLine(handler) {
119
- this.conn.off('line', handler);
120
- }
121
- /** Send QUIT and close the TCP connection. */
122
- async disconnect() {
123
- try {
124
- this.conn.send('QUIT');
125
- }
126
- catch {
127
- // already closed
128
- }
129
- await this.conn.close();
130
- }
131
185
  // -------------------------------------------------------------------------
132
186
  // Private helpers
133
187
  // -------------------------------------------------------------------------
@@ -154,4 +208,33 @@ class RhostClient {
154
208
  }
155
209
  }
156
210
  exports.RhostClient = RhostClient;
211
+ // ---------------------------------------------------------------------------
212
+ // Preview frame renderer
213
+ // ---------------------------------------------------------------------------
214
+ const USE_COLOR = process.stdout.isTTY !== false;
215
+ const c = (code, s) => USE_COLOR ? `\x1b[${code}m${s}\x1b[0m` : s;
216
+ function printPreviewFrame(label, content, mode) {
217
+ const termWidth = (process.stdout.columns ?? 80) - 2;
218
+ const frameColor = mode === 'eval' ? '36' : '33'; // cyan for eval, yellow for command
219
+ const modeTag = mode === 'eval' ? 'softcode' : 'command';
220
+ // Header line: ─── preview [softcode]: <label> ─────────────
221
+ const headerLeft = ` preview [${modeTag}]: `;
222
+ const headerFull = `${headerLeft}${label} `;
223
+ const headerPad = Math.max(0, termWidth - headerFull.length);
224
+ const header = c(frameColor, '─'.repeat(3) + headerFull + '─'.repeat(headerPad));
225
+ // Footer line: ─────────────────────────────────────────────
226
+ const footer = c(frameColor, '─'.repeat(termWidth));
227
+ process.stdout.write('\n' + header + '\n');
228
+ if (content === '') {
229
+ process.stdout.write(c('90', ' (empty output)\n'));
230
+ }
231
+ else {
232
+ // Prefix each line with a subtle left margin
233
+ const lines = content.split('\n');
234
+ for (const line of lines) {
235
+ process.stdout.write(' ' + line + '\n');
236
+ }
237
+ }
238
+ process.stdout.write(footer + '\n\n');
239
+ }
157
240
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,uBAAuB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CAChB;AAID,qBAAa,cAAc;IACvB,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAE3C,OAAO;IAIP;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,KAAK,SAAqB,GAAG,cAAc;IAI5D;;;;;;;;OAQG;IACH,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,cAAc;IAUvD;;;;;;OAMG;IACG,KAAK,CAAC,cAAc,SAAU,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAYvE,oEAAoE;IAC9D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,kEAAkE;IAClE,iBAAiB,IAAI,uBAAuB;CAS/C"}
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,uBAAuB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CAChB;AAID,qBAAa,cAAc;IACvB,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAE3C,OAAO;IAIP;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,KAAK,SAA6B,GAAG,cAAc;IAIpE;;;;;;;;OAQG;IACH,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,cAAc;IAUvD;;;;;;OAMG;IACG,KAAK,CAAC,cAAc,SAAU,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAYvE,oEAAoE;IAC9D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,kEAAkE;IAClE,iBAAiB,IAAI,uBAAuB;CAS/C"}
package/dist/container.js CHANGED
@@ -61,7 +61,7 @@ class RhostContainer {
61
61
  * Build it first with: `docker build -t rhostmush:latest .`
62
62
  * (run from the rhostmush-docker repo root)
63
63
  */
64
- static fromImage(image = 'rhostmush:latest') {
64
+ static fromImage(image = 'lcanady/rhostmush:latest') {
65
65
  return new RhostContainer(async () => new testcontainers_1.GenericContainer(image));
66
66
  }
67
67
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"container.js","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;GAcG;AACH,2CAA6B;AAC7B,mDAIwB;AASxB,MAAa,cAAc;IAIvB,YAAoB,OAAyB;QAHrC,YAAO,GAAgC,IAAI,CAAC;QAIhD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,kBAAkB;QACvC,OAAO,IAAI,cAAc,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,iCAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,CAAC;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,UAAU,CAAC,WAAoB;QAClC,MAAM,IAAI,GAAG,WAAW;YACpB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;YAC3B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAErC,OAAO,IAAI,cAAc,CAAC,KAAK,IAAI,EAAE;YACjC,OAAO,iCAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QACzD,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,KAAK,CAAC,cAAc,GAAG,MAAO;QAChC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI;aACpB,gBAAgB,CAAC,IAAI,CAAC;aACtB,gBAAgB,CACb,qBAAI,CAAC,iBAAiB,EAAE,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAC9D;aACA,KAAK,EAAE,CAAC;QAEb,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC;IACpC,CAAC;IAED,oEAAoE;IACpE,KAAK,CAAC,IAAI;QACN,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,kEAAkE;IAClE,iBAAiB;QACb,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACtE,CAAC;QACD,OAAO;YACH,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YAC5B,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC;SACzC,CAAC;IACN,CAAC;CACJ;AAvED,wCAuEC"}
1
+ {"version":3,"file":"container.js","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;GAcG;AACH,2CAA6B;AAC7B,mDAIwB;AASxB,MAAa,cAAc;IAIvB,YAAoB,OAAyB;QAHrC,YAAO,GAAgC,IAAI,CAAC;QAIhD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,0BAA0B;QAC/C,OAAO,IAAI,cAAc,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,iCAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,CAAC;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,UAAU,CAAC,WAAoB;QAClC,MAAM,IAAI,GAAG,WAAW;YACpB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;YAC3B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAErC,OAAO,IAAI,cAAc,CAAC,KAAK,IAAI,EAAE;YACjC,OAAO,iCAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QACzD,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,KAAK,CAAC,cAAc,GAAG,MAAO;QAChC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI;aACpB,gBAAgB,CAAC,IAAI,CAAC;aACtB,gBAAgB,CACb,qBAAI,CAAC,iBAAiB,EAAE,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAC9D;aACA,KAAK,EAAE,CAAC;QAEb,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC;IACpC,CAAC;IAED,oEAAoE;IACpE,KAAK,CAAC,IAAI;QACN,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,kEAAkE;IAClE,iBAAiB;QACb,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACtE,CAAC;QACD,OAAO;YACH,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YAC5B,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC;SACzC,CAAC;IACN,CAAC;CACJ;AAvED,wCAuEC"}
@@ -0,0 +1,86 @@
1
+ import { RhostClient } from './client';
2
+ /** A single parsed command from a softcode deploy file. */
3
+ export interface DeployCommand {
4
+ dbref: string;
5
+ attr: string;
6
+ value: string;
7
+ }
8
+ /**
9
+ * A snapshot of object attribute state captured before deployment.
10
+ * Shape: `{ [dbref]: { [attr]: value } }`
11
+ */
12
+ export type DeploySnapshot = Record<string, Record<string, string>>;
13
+ export interface DeployOptions {
14
+ /**
15
+ * Optional test function. Called after all commands are applied.
16
+ * Return `true` (or resolve) to indicate success; return `false` or throw to trigger rollback.
17
+ */
18
+ test?: (client: RhostClient) => Promise<boolean>;
19
+ /**
20
+ * Dry-run mode: snapshot objects and report what would be applied,
21
+ * but do not send any commands to the server.
22
+ */
23
+ dryRun?: boolean;
24
+ }
25
+ export interface DeployResult {
26
+ /** Number of commands applied (0 in dry-run). */
27
+ applied: number;
28
+ /** Whether the test function was called. */
29
+ tested: boolean;
30
+ /** Result of the test function, or null if no test was provided. */
31
+ testPassed: boolean | null;
32
+ /** Whether a rollback was performed. */
33
+ rolledBack: boolean;
34
+ /** true when dryRun option was set. */
35
+ dryRun: boolean;
36
+ /** The snapshot taken before applying commands. */
37
+ snapshot: DeploySnapshot;
38
+ }
39
+ /**
40
+ * Parse a softcode deploy file into a list of `DeployCommand` objects.
41
+ *
42
+ * Supported line formats:
43
+ * `&ATTRNAME #NN=value` — set an attribute
44
+ *
45
+ * Lines starting with `#` or `@@` are treated as comments and ignored.
46
+ * Blank lines are ignored.
47
+ *
48
+ * @example
49
+ * const cmds = parseDeployFile(fs.readFileSync('mycode.mush', 'utf8'));
50
+ */
51
+ export declare function parseDeployFile(content: string): DeployCommand[];
52
+ /**
53
+ * Capture the current state (all attributes and their values) of the given
54
+ * dbrefs. Returns a `DeploySnapshot` suitable for passing to `restoreSnapshot`.
55
+ */
56
+ export declare function snapshotObjects(client: RhostClient, dbrefs: string[]): Promise<DeploySnapshot>;
57
+ /**
58
+ * Restore object attribute state from a snapshot.
59
+ *
60
+ * For each dbref in the snapshot:
61
+ * - Attributes that changed are reset to their original value.
62
+ * - Attributes that did not exist before deployment (i.e. appear in
63
+ * `currentDbrefs` but not in `snapshot[dbref]`) are wiped.
64
+ *
65
+ * @param currentDbrefs Optional list of dbrefs currently tracked, used to
66
+ * detect and wipe attrs added during deployment.
67
+ */
68
+ export declare function restoreSnapshot(client: RhostClient, snapshot: DeploySnapshot, currentDbrefs?: string[]): Promise<void>;
69
+ /**
70
+ * Deploy softcode commands to the server with automatic rollback on failure.
71
+ *
72
+ * Flow:
73
+ * 1. Snapshot all target objects.
74
+ * 2. Apply each command (unless dryRun).
75
+ * 3. Call the optional test function.
76
+ * 4. If the test fails or throws, restore the snapshot (rollback).
77
+ *
78
+ * @example
79
+ * const cmds = parseDeployFile(fs.readFileSync('mycode.mush', 'utf8'));
80
+ * const result = await deploy(client, cmds, {
81
+ * test: async (c) => (await c.eval('smoke_test()')).startsWith('OK'),
82
+ * });
83
+ * if (result.rolledBack) console.error('Deployment failed — rolled back.');
84
+ */
85
+ export declare function deploy(client: RhostClient, commands: DeployCommand[], options?: DeployOptions): Promise<DeployResult>;
86
+ //# sourceMappingURL=deployer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployer.d.ts","sourceRoot":"","sources":["../src/deployer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAMvC,2DAA2D;AAC3D,MAAM,WAAW,aAAa;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAEpE,MAAM,WAAW,aAAa;IAC1B;;;OAGG;IACH,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IACzB,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,MAAM,EAAE,OAAO,CAAC;IAChB,oEAAoE;IACpE,UAAU,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,wCAAwC;IACxC,UAAU,EAAE,OAAO,CAAC;IACpB,uCAAuC;IACvC,MAAM,EAAE,OAAO,CAAC;IAChB,mDAAmD;IACnD,QAAQ,EAAE,cAAc,CAAC;CAC5B;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE,CAkBhE;AAMD;;;GAGG;AACH,wBAAsB,eAAe,CACjC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,cAAc,CAAC,CAWzB;AAMD;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACjC,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,cAAc,EACxB,aAAa,CAAC,EAAE,MAAM,EAAE,GACzB,OAAO,CAAC,IAAI,CAAC,CAqBf;AAMD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,MAAM,CACxB,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,aAAa,EAAE,EACzB,OAAO,GAAE,aAAkB,GAC5B,OAAO,CAAC,YAAY,CAAC,CA4CvB"}
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseDeployFile = parseDeployFile;
4
+ exports.snapshotObjects = snapshotObjects;
5
+ exports.restoreSnapshot = restoreSnapshot;
6
+ exports.deploy = deploy;
7
+ // ---------------------------------------------------------------------------
8
+ // File parser
9
+ // ---------------------------------------------------------------------------
10
+ /**
11
+ * Parse a softcode deploy file into a list of `DeployCommand` objects.
12
+ *
13
+ * Supported line formats:
14
+ * `&ATTRNAME #NN=value` — set an attribute
15
+ *
16
+ * Lines starting with `#` or `@@` are treated as comments and ignored.
17
+ * Blank lines are ignored.
18
+ *
19
+ * @example
20
+ * const cmds = parseDeployFile(fs.readFileSync('mycode.mush', 'utf8'));
21
+ */
22
+ function parseDeployFile(content) {
23
+ const commands = [];
24
+ for (const rawLine of content.split('\n')) {
25
+ const line = rawLine.trim();
26
+ if (!line)
27
+ continue;
28
+ if (line.startsWith('#') || line.startsWith('@@'))
29
+ continue;
30
+ // &ATTRNAME #DBREF=value
31
+ const m = line.match(/^&([A-Za-z0-9_]+)\s+(#\d+)=(.*)$/s);
32
+ if (m) {
33
+ commands.push({
34
+ dbref: m[2],
35
+ attr: m[1].toUpperCase(),
36
+ value: m[3],
37
+ });
38
+ }
39
+ }
40
+ return commands;
41
+ }
42
+ // ---------------------------------------------------------------------------
43
+ // Snapshot
44
+ // ---------------------------------------------------------------------------
45
+ /**
46
+ * Capture the current state (all attributes and their values) of the given
47
+ * dbrefs. Returns a `DeploySnapshot` suitable for passing to `restoreSnapshot`.
48
+ */
49
+ async function snapshotObjects(client, dbrefs) {
50
+ const snapshot = {};
51
+ for (const dbref of dbrefs) {
52
+ const attrsStr = await client.eval(`lattr(${dbref})`);
53
+ const attrs = attrsStr ? attrsStr.split(' ').filter(Boolean) : [];
54
+ snapshot[dbref] = {};
55
+ for (const attr of attrs) {
56
+ snapshot[dbref][attr] = await client.eval(`get(${dbref}/${attr})`);
57
+ }
58
+ }
59
+ return snapshot;
60
+ }
61
+ // ---------------------------------------------------------------------------
62
+ // Restore
63
+ // ---------------------------------------------------------------------------
64
+ /**
65
+ * Restore object attribute state from a snapshot.
66
+ *
67
+ * For each dbref in the snapshot:
68
+ * - Attributes that changed are reset to their original value.
69
+ * - Attributes that did not exist before deployment (i.e. appear in
70
+ * `currentDbrefs` but not in `snapshot[dbref]`) are wiped.
71
+ *
72
+ * @param currentDbrefs Optional list of dbrefs currently tracked, used to
73
+ * detect and wipe attrs added during deployment.
74
+ */
75
+ async function restoreSnapshot(client, snapshot, currentDbrefs) {
76
+ for (const [dbref, originalAttrs] of Object.entries(snapshot)) {
77
+ // Restore changed / deleted attrs
78
+ for (const [attr, value] of Object.entries(originalAttrs)) {
79
+ const current = await client.eval(`get(${dbref}/${attr})`);
80
+ if (current !== value) {
81
+ await client.command(`&${attr} ${dbref}=${value}`);
82
+ }
83
+ }
84
+ // Wipe attrs added after the snapshot
85
+ if (currentDbrefs?.includes(dbref)) {
86
+ const nowStr = await client.eval(`lattr(${dbref})`);
87
+ const nowAttrs = nowStr ? nowStr.split(' ').filter(Boolean) : [];
88
+ for (const attr of nowAttrs) {
89
+ if (!(attr in originalAttrs)) {
90
+ await client.command(`@wipe ${dbref}/${attr}`);
91
+ }
92
+ }
93
+ }
94
+ }
95
+ }
96
+ // ---------------------------------------------------------------------------
97
+ // Deploy pipeline
98
+ // ---------------------------------------------------------------------------
99
+ /**
100
+ * Deploy softcode commands to the server with automatic rollback on failure.
101
+ *
102
+ * Flow:
103
+ * 1. Snapshot all target objects.
104
+ * 2. Apply each command (unless dryRun).
105
+ * 3. Call the optional test function.
106
+ * 4. If the test fails or throws, restore the snapshot (rollback).
107
+ *
108
+ * @example
109
+ * const cmds = parseDeployFile(fs.readFileSync('mycode.mush', 'utf8'));
110
+ * const result = await deploy(client, cmds, {
111
+ * test: async (c) => (await c.eval('smoke_test()')).startsWith('OK'),
112
+ * });
113
+ * if (result.rolledBack) console.error('Deployment failed — rolled back.');
114
+ */
115
+ async function deploy(client, commands, options = {}) {
116
+ const { test, dryRun = false } = options;
117
+ // Unique dbrefs from the command list
118
+ const dbrefs = [...new Set(commands.map((c) => c.dbref))];
119
+ // 1. Snapshot
120
+ const snapshot = await snapshotObjects(client, dbrefs);
121
+ // 2. Apply (skip in dry-run)
122
+ if (!dryRun) {
123
+ for (const cmd of commands) {
124
+ await client.command(`&${cmd.attr} ${cmd.dbref}=${cmd.value}`);
125
+ }
126
+ }
127
+ const result = {
128
+ applied: dryRun ? 0 : commands.length,
129
+ tested: false,
130
+ testPassed: null,
131
+ rolledBack: false,
132
+ dryRun,
133
+ snapshot,
134
+ };
135
+ if (dryRun || !test)
136
+ return result;
137
+ // 3. Test
138
+ result.tested = true;
139
+ let testPassed = false;
140
+ try {
141
+ testPassed = await test(client);
142
+ }
143
+ catch {
144
+ testPassed = false;
145
+ }
146
+ result.testPassed = testPassed;
147
+ // 4. Rollback if test failed
148
+ if (!testPassed) {
149
+ await restoreSnapshot(client, snapshot, dbrefs);
150
+ result.rolledBack = true;
151
+ }
152
+ return result;
153
+ }
154
+ //# sourceMappingURL=deployer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployer.js","sourceRoot":"","sources":["../src/deployer.ts"],"names":[],"mappings":";;AA+DA,0CAkBC;AAUD,0CAcC;AAiBD,0CAyBC;AAsBD,wBAgDC;AA1KD,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E;;;;;;;;;;;GAWG;AACH,SAAgB,eAAe,CAAC,OAAe;IAC3C,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QAE5D,yBAAyB;QACzB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAC1D,IAAI,CAAC,EAAE,CAAC;YACJ,QAAQ,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;gBACX,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;gBACxB,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;aACd,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,8EAA8E;AAC9E,WAAW;AACX,8EAA8E;AAE9E;;;GAGG;AACI,KAAK,UAAU,eAAe,CACjC,MAAmB,EACnB,MAAgB;IAEhB,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,KAAK,GAAG,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACrB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC;QACvE,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;;;;;;;;GAUG;AACI,KAAK,UAAU,eAAe,CACjC,MAAmB,EACnB,QAAwB,EACxB,aAAwB;IAExB,KAAK,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5D,kCAAkC;QAClC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;YACxD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC;YAC3D,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;gBACpB,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC,CAAC;YACvD,CAAC;QACL,CAAC;QAED,sCAAsC;QACtC,IAAI,aAAa,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,KAAK,GAAG,CAAC,CAAC;YACpD,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC1B,IAAI,CAAC,CAAC,IAAI,IAAI,aAAa,CAAC,EAAE,CAAC;oBAC3B,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;gBACnD,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E;;;;;;;;;;;;;;;GAeG;AACI,KAAK,UAAU,MAAM,CACxB,MAAmB,EACnB,QAAyB,EACzB,UAAyB,EAAE;IAE3B,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAEzC,sCAAsC;IACtC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE1D,cAAc;IACd,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEvD,6BAA6B;IAC7B,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QACnE,CAAC;IACL,CAAC;IAED,MAAM,MAAM,GAAiB;QACzB,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM;QACrC,MAAM,EAAE,KAAK;QACb,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,KAAK;QACjB,MAAM;QACN,QAAQ;KACX,CAAC;IAEF,IAAI,MAAM,IAAI,CAAC,IAAI;QAAE,OAAO,MAAM,CAAC;IAEnC,UAAU;IACV,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,CAAC;QACD,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACL,UAAU,GAAG,KAAK,CAAC;IACvB,CAAC;IACD,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;IAE/B,6BAA6B;IAC7B,IAAI,CAAC,UAAU,EAAE,CAAC;QACd,MAAM,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC;IAC7B,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC"}
package/dist/expect.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { RhostClient } from './client';
2
+ import { SnapshotManager } from './snapshots';
2
3
  export { isRhostError } from './assertions';
3
4
  export declare class RhostExpectError extends Error {
4
5
  readonly expression: string;
@@ -8,6 +9,11 @@ export declare class RhostExpectError extends Error {
8
9
  readonly negated: boolean;
9
10
  constructor(expression: string, matcherName: string, actual: string, expectedDesc: string, negated: boolean);
10
11
  }
12
+ export interface SnapshotContext {
13
+ manager: SnapshotManager;
14
+ /** Full test name path, e.g. "Suite > Sub > Test Name" */
15
+ testName: string;
16
+ }
11
17
  /**
12
18
  * Jest-style expect wrapper for RhostMUSH softcode evaluation.
13
19
  *
@@ -15,13 +21,17 @@ export declare class RhostExpectError extends Error {
15
21
  * const ex = new RhostExpect(client, 'add(2,3)');
16
22
  * await ex.toBe('5');
17
23
  * await ex.not.toBe('42');
24
+ *
25
+ * @example Snapshot testing (requires runner context)
26
+ * await expect('iter(lnum(1,10),##)').toMatchSnapshot();
18
27
  */
19
28
  export declare class RhostExpect {
20
29
  private readonly client;
21
30
  private readonly expression;
22
31
  private readonly negated;
32
+ private readonly snapshotCtx?;
23
33
  private _cached;
24
- constructor(client: RhostClient, expression: string, negated?: boolean);
34
+ constructor(client: RhostClient, expression: string, negated?: boolean, snapshotCtx?: SnapshotContext | undefined);
25
35
  /** Negation accessor — returns a new RhostExpect with negation flipped. */
26
36
  get not(): RhostExpect;
27
37
  private resolve;
@@ -70,5 +80,21 @@ export declare class RhostExpect {
70
80
  * List has exactly n words (space-delimited by default).
71
81
  */
72
82
  toHaveWordCount(n: number, sep?: string): Promise<void>;
83
+ /**
84
+ * Compare the evaluated result against a stored snapshot.
85
+ *
86
+ * **First run**: the value is written to the snapshot file and the test passes.
87
+ * **Subsequent runs**: the value is compared to the stored snapshot. A mismatch
88
+ * fails the test and shows a diff.
89
+ * **Update mode**: pass `updateSnapshots: true` in `RunnerOptions`, or set the
90
+ * `RHOST_UPDATE_SNAPSHOTS=1` environment variable, to overwrite stored values.
91
+ *
92
+ * `.not.toMatchSnapshot()` is not supported and will throw.
93
+ *
94
+ * @example
95
+ * await expect('iter(lnum(1,10),##)').toMatchSnapshot();
96
+ * await expect('table(name,age,role)').toMatchSnapshot();
97
+ */
98
+ toMatchSnapshot(): Promise<void>;
73
99
  }
74
100
  //# sourceMappingURL=expect.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"expect.d.ts","sourceRoot":"","sources":["../src/expect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAO5C,qBAAa,gBAAiB,SAAQ,KAAK;aAEnB,UAAU,EAAE,MAAM;aAClB,WAAW,EAAE,MAAM;aACnB,MAAM,EAAE,MAAM;aACd,YAAY,EAAE,MAAM;aACpB,OAAO,EAAE,OAAO;gBAJhB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,OAAO;CAWvC;AAMD;;;;;;;GAOG;AACH,qBAAa,WAAW;IAIhB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAL5B,OAAO,CAAC,OAAO,CAAiC;gBAG3B,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,MAAM,EAClB,OAAO,UAAQ;IAGpC,2EAA2E;IAC3E,IAAI,GAAG,IAAI,WAAW,CAErB;YAMa,OAAO;IAOrB,OAAO,CAAC,IAAI;IAYZ,gCAAgC;IAC1B,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3C,gCAAgC;IAC1B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAStD,iCAAiC;IAC3B,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjD,iCAAiC;IAC3B,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhD,+BAA+B;IACzB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9C;;;OAGG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAajE;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAMhC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAKhC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAKhC;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjC;;OAEG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D;;OAEG;IACG,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,SAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAK7D"}
1
+ {"version":3,"file":"expect.d.ts","sourceRoot":"","sources":["../src/expect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,eAAe,EAAsB,MAAM,aAAa,CAAC;AAElE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAO5C,qBAAa,gBAAiB,SAAQ,KAAK;aAEnB,UAAU,EAAE,MAAM;aAClB,WAAW,EAAE,MAAM;aACnB,MAAM,EAAE,MAAM;aACd,YAAY,EAAE,MAAM;aACpB,OAAO,EAAE,OAAO;gBAJhB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,OAAO;CAWvC;AAMD,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,eAAe,CAAC;IACzB,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;CACpB;AAMD;;;;;;;;;;GAUG;AACH,qBAAa,WAAW;IAIhB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IANjC,OAAO,CAAC,OAAO,CAAiC;gBAG3B,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,MAAM,EAClB,OAAO,UAAQ,EACf,WAAW,CAAC,EAAE,eAAe,YAAA;IAGlD,2EAA2E;IAC3E,IAAI,GAAG,IAAI,WAAW,CAErB;YAMa,OAAO;IAOrB,OAAO,CAAC,IAAI;IAYZ,gCAAgC;IAC1B,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3C,gCAAgC;IAC1B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAStD,iCAAiC;IAC3B,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjD,iCAAiC;IAC3B,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhD,+BAA+B;IACzB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9C;;;OAGG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAajE;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAMhC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAKhC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAKhC;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjC;;OAEG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D;;OAEG;IACG,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,SAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU1D;;;;;;;;;;;;;;OAcG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;CAgCzC"}