@sharpee/transcript-tester 0.9.61-beta

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 (137) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/LICENSE +21 -0
  3. package/dist/cli.d.ts +11 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +367 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/condition-evaluator.d.ts +30 -0
  8. package/dist/condition-evaluator.d.ts.map +1 -0
  9. package/dist/condition-evaluator.js +314 -0
  10. package/dist/condition-evaluator.js.map +1 -0
  11. package/dist/fast-cli.d.ts +13 -0
  12. package/dist/fast-cli.d.ts.map +1 -0
  13. package/dist/fast-cli.js +363 -0
  14. package/dist/fast-cli.js.map +1 -0
  15. package/dist/index.d.ts +17 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +48 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/navigator.d.ts +27 -0
  20. package/dist/navigator.d.ts.map +1 -0
  21. package/dist/navigator.js +303 -0
  22. package/dist/navigator.js.map +1 -0
  23. package/dist/parser.d.ts +19 -0
  24. package/dist/parser.d.ts.map +1 -0
  25. package/dist/parser.js +453 -0
  26. package/dist/parser.js.map +1 -0
  27. package/dist/reporter.d.ts +41 -0
  28. package/dist/reporter.d.ts.map +1 -0
  29. package/dist/reporter.js +386 -0
  30. package/dist/reporter.js.map +1 -0
  31. package/dist/runner.d.ts +44 -0
  32. package/dist/runner.d.ts.map +1 -0
  33. package/dist/runner.js +977 -0
  34. package/dist/runner.js.map +1 -0
  35. package/dist/story-loader.d.ts +31 -0
  36. package/dist/story-loader.d.ts.map +1 -0
  37. package/dist/story-loader.js +169 -0
  38. package/dist/story-loader.js.map +1 -0
  39. package/dist/types.d.ts +204 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +8 -0
  42. package/dist/types.js.map +1 -0
  43. package/dist-esm/cli.d.ts +11 -0
  44. package/dist-esm/cli.d.ts.map +1 -0
  45. package/dist-esm/cli.js +332 -0
  46. package/dist-esm/cli.js.map +1 -0
  47. package/dist-esm/condition-evaluator.d.ts +30 -0
  48. package/dist-esm/condition-evaluator.d.ts.map +1 -0
  49. package/dist-esm/condition-evaluator.js +311 -0
  50. package/dist-esm/condition-evaluator.js.map +1 -0
  51. package/dist-esm/fast-cli.d.ts +13 -0
  52. package/dist-esm/fast-cli.d.ts.map +1 -0
  53. package/dist-esm/fast-cli.js +328 -0
  54. package/dist-esm/fast-cli.js.map +1 -0
  55. package/dist-esm/index.d.ts +17 -0
  56. package/dist-esm/index.d.ts.map +1 -0
  57. package/dist-esm/index.js +21 -0
  58. package/dist-esm/index.js.map +1 -0
  59. package/dist-esm/navigator.d.ts +27 -0
  60. package/dist-esm/navigator.d.ts.map +1 -0
  61. package/dist-esm/navigator.js +300 -0
  62. package/dist-esm/navigator.js.map +1 -0
  63. package/dist-esm/parser.d.ts +19 -0
  64. package/dist-esm/parser.d.ts.map +1 -0
  65. package/dist-esm/parser.js +415 -0
  66. package/dist-esm/parser.js.map +1 -0
  67. package/dist-esm/reporter.d.ts +41 -0
  68. package/dist-esm/reporter.d.ts.map +1 -0
  69. package/dist-esm/reporter.js +342 -0
  70. package/dist-esm/reporter.js.map +1 -0
  71. package/dist-esm/runner.d.ts +44 -0
  72. package/dist-esm/runner.d.ts.map +1 -0
  73. package/dist-esm/runner.js +941 -0
  74. package/dist-esm/runner.js.map +1 -0
  75. package/dist-esm/story-loader.d.ts +31 -0
  76. package/dist-esm/story-loader.d.ts.map +1 -0
  77. package/dist-esm/story-loader.js +131 -0
  78. package/dist-esm/story-loader.js.map +1 -0
  79. package/dist-esm/types.d.ts +204 -0
  80. package/dist-esm/types.d.ts.map +1 -0
  81. package/dist-esm/types.js +7 -0
  82. package/dist-esm/types.js.map +1 -0
  83. package/dist-npm/cli.d.ts +11 -0
  84. package/dist-npm/cli.d.ts.map +1 -0
  85. package/dist-npm/cli.js +367 -0
  86. package/dist-npm/cli.js.map +1 -0
  87. package/dist-npm/condition-evaluator.d.ts +30 -0
  88. package/dist-npm/condition-evaluator.d.ts.map +1 -0
  89. package/dist-npm/condition-evaluator.js +314 -0
  90. package/dist-npm/condition-evaluator.js.map +1 -0
  91. package/dist-npm/fast-cli.d.ts +13 -0
  92. package/dist-npm/fast-cli.d.ts.map +1 -0
  93. package/dist-npm/fast-cli.js +363 -0
  94. package/dist-npm/fast-cli.js.map +1 -0
  95. package/dist-npm/index.d.ts +17 -0
  96. package/dist-npm/index.d.ts.map +1 -0
  97. package/dist-npm/index.js +48 -0
  98. package/dist-npm/index.js.map +1 -0
  99. package/dist-npm/navigator.d.ts +27 -0
  100. package/dist-npm/navigator.d.ts.map +1 -0
  101. package/dist-npm/navigator.js +303 -0
  102. package/dist-npm/navigator.js.map +1 -0
  103. package/dist-npm/parser.d.ts +19 -0
  104. package/dist-npm/parser.d.ts.map +1 -0
  105. package/dist-npm/parser.js +453 -0
  106. package/dist-npm/parser.js.map +1 -0
  107. package/dist-npm/reporter.d.ts +41 -0
  108. package/dist-npm/reporter.d.ts.map +1 -0
  109. package/dist-npm/reporter.js +386 -0
  110. package/dist-npm/reporter.js.map +1 -0
  111. package/dist-npm/runner.d.ts +44 -0
  112. package/dist-npm/runner.d.ts.map +1 -0
  113. package/dist-npm/runner.js +977 -0
  114. package/dist-npm/runner.js.map +1 -0
  115. package/dist-npm/story-loader.d.ts +31 -0
  116. package/dist-npm/story-loader.d.ts.map +1 -0
  117. package/dist-npm/story-loader.js +169 -0
  118. package/dist-npm/story-loader.js.map +1 -0
  119. package/dist-npm/types.d.ts +204 -0
  120. package/dist-npm/types.d.ts.map +1 -0
  121. package/dist-npm/types.js +8 -0
  122. package/dist-npm/types.js.map +1 -0
  123. package/package.json +49 -0
  124. package/src/cli.ts +385 -0
  125. package/src/condition-evaluator.ts +382 -0
  126. package/src/fast-cli.ts +403 -0
  127. package/src/index.ts +26 -0
  128. package/src/navigator.ts +365 -0
  129. package/src/parser.ts +488 -0
  130. package/src/reporter.ts +409 -0
  131. package/src/runner.ts +1152 -0
  132. package/src/story-loader.ts +168 -0
  133. package/src/types.ts +244 -0
  134. package/tsconfig.esm.json +11 -0
  135. package/tsconfig.esm.tsbuildinfo +1 -0
  136. package/tsconfig.json +22 -0
  137. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,453 @@
1
+ "use strict";
2
+ /**
3
+ * Transcript Parser
4
+ *
5
+ * Parses .transcript files into a structured format for testing.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.parseTranscriptFile = parseTranscriptFile;
42
+ exports.parseTranscript = parseTranscript;
43
+ exports.validateTranscript = validateTranscript;
44
+ const fs = __importStar(require("fs"));
45
+ /**
46
+ * Parse a transcript file from disk
47
+ */
48
+ function parseTranscriptFile(filePath) {
49
+ const content = fs.readFileSync(filePath, 'utf-8');
50
+ return parseTranscript(content, filePath);
51
+ }
52
+ /**
53
+ * Parse transcript content string
54
+ */
55
+ function parseTranscript(content, filePath = '<inline>') {
56
+ const lines = content.split('\n');
57
+ const transcript = {
58
+ filePath,
59
+ header: {},
60
+ commands: [],
61
+ items: [],
62
+ goals: [],
63
+ comments: []
64
+ };
65
+ let inHeader = true;
66
+ let currentCommand = null;
67
+ let lineNumber = 0;
68
+ for (const line of lines) {
69
+ lineNumber++;
70
+ const trimmed = line.trim();
71
+ // Empty lines
72
+ if (trimmed === '') {
73
+ if (currentCommand && currentCommand.expectedOutput.length > 0) {
74
+ // Empty line in output - preserve it
75
+ currentCommand.expectedOutput.push('');
76
+ }
77
+ continue;
78
+ }
79
+ // Header separator
80
+ if (trimmed === '---') {
81
+ inHeader = false;
82
+ continue;
83
+ }
84
+ // Comments - add to both comments array (legacy) and items array (for annotation context)
85
+ if (trimmed.startsWith('#') && !trimmed.startsWith('#[')) {
86
+ const commentText = trimmed.slice(1).trim();
87
+ transcript.comments.push(commentText);
88
+ // Also add as item for annotation processing
89
+ transcript.items.push({
90
+ type: 'comment',
91
+ comment: { lineNumber, text: commentText },
92
+ });
93
+ continue;
94
+ }
95
+ // $ directives ($save, $restore) - these are standalone directives
96
+ if (trimmed.startsWith('$')) {
97
+ // Save any pending command first
98
+ if (currentCommand) {
99
+ finalizeCommand(currentCommand);
100
+ transcript.commands.push(currentCommand);
101
+ transcript.items.push({ type: 'command', command: currentCommand });
102
+ currentCommand = null;
103
+ }
104
+ const directive = parseDollarDirective(trimmed, lineNumber);
105
+ if (directive) {
106
+ transcript.items.push({ type: 'directive', directive });
107
+ }
108
+ continue;
109
+ }
110
+ // Header lines (key: value)
111
+ if (inHeader && trimmed.includes(':') && !trimmed.startsWith('>')) {
112
+ const colonIndex = trimmed.indexOf(':');
113
+ const key = trimmed.slice(0, colonIndex).trim().toLowerCase();
114
+ const value = trimmed.slice(colonIndex + 1).trim();
115
+ transcript.header[key] = value;
116
+ continue;
117
+ }
118
+ // Command input
119
+ if (trimmed.startsWith('>')) {
120
+ // Save previous command
121
+ if (currentCommand) {
122
+ finalizeCommand(currentCommand);
123
+ transcript.commands.push(currentCommand);
124
+ transcript.items.push({ type: 'command', command: currentCommand });
125
+ }
126
+ currentCommand = {
127
+ lineNumber,
128
+ input: trimmed.slice(1).trim(),
129
+ expectedOutput: [],
130
+ assertions: []
131
+ };
132
+ continue;
133
+ }
134
+ // Directive or assertion tags (both use [ ])
135
+ if (trimmed.startsWith('[') && trimmed.endsWith(']')) {
136
+ // Try to parse as directive first
137
+ const directive = parseDirective(trimmed, lineNumber);
138
+ if (directive) {
139
+ // Save any pending command first
140
+ if (currentCommand) {
141
+ finalizeCommand(currentCommand);
142
+ transcript.commands.push(currentCommand);
143
+ transcript.items.push({ type: 'command', command: currentCommand });
144
+ currentCommand = null;
145
+ }
146
+ transcript.items.push({ type: 'directive', directive });
147
+ continue;
148
+ }
149
+ // Not a directive - try as assertion (must be attached to a command)
150
+ if (currentCommand) {
151
+ const assertion = parseAssertion(trimmed);
152
+ if (assertion) {
153
+ currentCommand.assertions.push(assertion);
154
+ }
155
+ }
156
+ continue;
157
+ }
158
+ // Expected output lines
159
+ if (currentCommand) {
160
+ currentCommand.expectedOutput.push(line); // Preserve original indentation
161
+ }
162
+ }
163
+ // Don't forget the last command
164
+ if (currentCommand) {
165
+ finalizeCommand(currentCommand);
166
+ transcript.commands.push(currentCommand);
167
+ transcript.items.push({ type: 'command', command: currentCommand });
168
+ }
169
+ // Parse goal segments from items
170
+ transcript.goals = parseGoals(transcript.items);
171
+ return transcript;
172
+ }
173
+ /**
174
+ * Parse a directive tag like [GOAL: name], [IF: condition], [NAVIGATE TO: "Room"]
175
+ */
176
+ function parseDirective(tag, lineNumber) {
177
+ const inner = tag.slice(1, -1).trim(); // Remove [ ]
178
+ // [GOAL: name]
179
+ const goalMatch = inner.match(/^GOAL:\s*(.+)$/i);
180
+ if (goalMatch) {
181
+ return { type: 'goal', lineNumber, goalName: goalMatch[1].trim() };
182
+ }
183
+ // [END GOAL]
184
+ if (inner.toUpperCase() === 'END GOAL') {
185
+ return { type: 'end_goal', lineNumber };
186
+ }
187
+ // [REQUIRES: condition]
188
+ const requiresMatch = inner.match(/^REQUIRES:\s*(.+)$/i);
189
+ if (requiresMatch) {
190
+ return { type: 'requires', lineNumber, condition: requiresMatch[1].trim() };
191
+ }
192
+ // [ENSURES: condition]
193
+ const ensuresMatch = inner.match(/^ENSURES:\s*(.+)$/i);
194
+ if (ensuresMatch) {
195
+ return { type: 'ensures', lineNumber, condition: ensuresMatch[1].trim() };
196
+ }
197
+ // [IF: condition]
198
+ const ifMatch = inner.match(/^IF:\s*(.+)$/i);
199
+ if (ifMatch) {
200
+ return { type: 'if', lineNumber, condition: ifMatch[1].trim() };
201
+ }
202
+ // [END IF]
203
+ if (inner.toUpperCase() === 'END IF') {
204
+ return { type: 'end_if', lineNumber };
205
+ }
206
+ // [WHILE: condition]
207
+ const whileMatch = inner.match(/^WHILE:\s*(.+)$/i);
208
+ if (whileMatch) {
209
+ return { type: 'while', lineNumber, condition: whileMatch[1].trim() };
210
+ }
211
+ // [END WHILE]
212
+ if (inner.toUpperCase() === 'END WHILE') {
213
+ return { type: 'end_while', lineNumber };
214
+ }
215
+ // [NAVIGATE TO: "Room Name"]
216
+ const navigateMatch = inner.match(/^NAVIGATE\s+TO:\s*"([^"]+)"$/i);
217
+ if (navigateMatch) {
218
+ return { type: 'navigate', lineNumber, target: navigateMatch[1] };
219
+ }
220
+ // Not a directive
221
+ return null;
222
+ }
223
+ /**
224
+ * Parse a $ directive like $save <name>, $restore <name>, or ext-testing commands
225
+ */
226
+ function parseDollarDirective(line, lineNumber) {
227
+ const trimmed = line.trim();
228
+ // $save <name>
229
+ const saveMatch = trimmed.match(/^\$save\s+(.+)$/i);
230
+ if (saveMatch) {
231
+ return { type: 'save', lineNumber, saveName: saveMatch[1].trim() };
232
+ }
233
+ // $restore <name>
234
+ const restoreMatch = trimmed.match(/^\$restore\s+(.+)$/i);
235
+ if (restoreMatch) {
236
+ return { type: 'restore', lineNumber, saveName: restoreMatch[1].trim() };
237
+ }
238
+ // Any other $ directive is a test command (ext-testing)
239
+ // Valid test commands: $teleport, $take, $move, $kill, $immortal, $mortal, $state, $describe, etc.
240
+ const testCommandMatch = trimmed.match(/^\$(\w+)(.*)$/);
241
+ if (testCommandMatch) {
242
+ return { type: 'test-command', lineNumber, testCommand: trimmed };
243
+ }
244
+ return null;
245
+ }
246
+ /**
247
+ * Parse goal segments from items array
248
+ */
249
+ function parseGoals(items) {
250
+ const goals = [];
251
+ let currentGoal = null;
252
+ let goalStartIndex = -1;
253
+ for (let i = 0; i < items.length; i++) {
254
+ const item = items[i];
255
+ if (item.type !== 'directive')
256
+ continue;
257
+ const directive = item.directive;
258
+ switch (directive.type) {
259
+ case 'goal':
260
+ if (currentGoal) {
261
+ console.warn(`Line ${directive.lineNumber}: Nested goals not allowed. Closing previous goal.`);
262
+ goals.push({
263
+ ...currentGoal,
264
+ endIndex: i - 1
265
+ });
266
+ }
267
+ currentGoal = {
268
+ name: directive.goalName,
269
+ lineNumber: directive.lineNumber,
270
+ requires: [],
271
+ ensures: [],
272
+ startIndex: i + 1
273
+ };
274
+ goalStartIndex = i;
275
+ break;
276
+ case 'requires':
277
+ if (currentGoal && directive.condition) {
278
+ currentGoal.requires.push(directive.condition);
279
+ }
280
+ break;
281
+ case 'ensures':
282
+ if (currentGoal && directive.condition) {
283
+ currentGoal.ensures.push(directive.condition);
284
+ }
285
+ break;
286
+ case 'end_goal':
287
+ if (currentGoal) {
288
+ goals.push({
289
+ ...currentGoal,
290
+ endIndex: i
291
+ });
292
+ currentGoal = null;
293
+ }
294
+ break;
295
+ }
296
+ }
297
+ // Handle unclosed goal
298
+ if (currentGoal) {
299
+ console.warn(`Unclosed goal: ${currentGoal.name}`);
300
+ goals.push({
301
+ ...currentGoal,
302
+ endIndex: items.length - 1
303
+ });
304
+ }
305
+ return goals;
306
+ }
307
+ /**
308
+ * Parse an assertion tag like [OK], [OK: contains "foo"], [FAIL: reason]
309
+ */
310
+ function parseAssertion(tag) {
311
+ const inner = tag.slice(1, -1).trim(); // Remove [ ]
312
+ // [OK] - exact match
313
+ if (inner === 'OK') {
314
+ return { type: 'ok' };
315
+ }
316
+ // [SKIP]
317
+ if (inner === 'SKIP') {
318
+ return { type: 'skip' };
319
+ }
320
+ // [OK: contains "text"]
321
+ const containsMatch = inner.match(/^OK:\s*contains\s+"([^"]+)"$/i);
322
+ if (containsMatch) {
323
+ return { type: 'ok-contains', value: containsMatch[1] };
324
+ }
325
+ // [OK: not contains "text"]
326
+ const notContainsMatch = inner.match(/^OK:\s*not\s+contains\s+"([^"]+)"$/i);
327
+ if (notContainsMatch) {
328
+ return { type: 'ok-not-contains', value: notContainsMatch[1] };
329
+ }
330
+ // [OK: matches /regex/flags]
331
+ const matchesMatch = inner.match(/^OK:\s*matches\s+\/(.+)\/([gimsuy]*)$/i);
332
+ if (matchesMatch) {
333
+ try {
334
+ return {
335
+ type: 'ok-matches',
336
+ pattern: new RegExp(matchesMatch[1], matchesMatch[2])
337
+ };
338
+ }
339
+ catch (e) {
340
+ console.error(`Invalid regex in assertion: ${tag}`);
341
+ return null;
342
+ }
343
+ }
344
+ // [FAIL: reason]
345
+ const failMatch = inner.match(/^FAIL(?::\s*(.+))?$/i);
346
+ if (failMatch) {
347
+ return { type: 'fail', reason: failMatch[1] || 'Expected failure' };
348
+ }
349
+ // [TODO: note]
350
+ const todoMatch = inner.match(/^TODO(?::\s*(.+))?$/i);
351
+ if (todoMatch) {
352
+ return { type: 'todo', reason: todoMatch[1] || 'Not implemented' };
353
+ }
354
+ // [EVENTS: N] - exact event count
355
+ const eventsMatch = inner.match(/^EVENTS:\s*(\d+)$/i);
356
+ if (eventsMatch) {
357
+ return { type: 'event-count', eventCount: parseInt(eventsMatch[1], 10) };
358
+ }
359
+ // [EVENT: true|false, N?, type="..." key="value"]
360
+ // Format: [EVENT: true, 1, type="if.event.pushed" target="y09"]
361
+ // [EVENT: false, type="if.event.destroyed"]
362
+ const eventAssertMatch = inner.match(/^EVENT:\s*(true|false)\s*,\s*(.+)$/i);
363
+ if (eventAssertMatch) {
364
+ const assertTrue = eventAssertMatch[1].toLowerCase() === 'true';
365
+ const rest = eventAssertMatch[2];
366
+ // Check if there's a position number before the type
367
+ const positionMatch = rest.match(/^(\d+)\s*,\s*(.+)$/);
368
+ let eventPosition;
369
+ let propsStr;
370
+ if (positionMatch) {
371
+ eventPosition = parseInt(positionMatch[1], 10);
372
+ propsStr = positionMatch[2];
373
+ }
374
+ else {
375
+ propsStr = rest;
376
+ }
377
+ // Parse key="value" pairs
378
+ const eventData = {};
379
+ let eventType;
380
+ const propRegex = /(\w+)="([^"]+)"/g;
381
+ let match;
382
+ while ((match = propRegex.exec(propsStr)) !== null) {
383
+ const [, key, value] = match;
384
+ if (key === 'type') {
385
+ eventType = value;
386
+ }
387
+ else {
388
+ eventData[key] = value;
389
+ }
390
+ }
391
+ if (eventType) {
392
+ return {
393
+ type: 'event-assert',
394
+ assertTrue,
395
+ eventPosition,
396
+ eventType,
397
+ eventData: Object.keys(eventData).length > 0 ? eventData : undefined
398
+ };
399
+ }
400
+ }
401
+ // [STATE: true|false, expression]
402
+ // Format: [STATE: true, egg.location = thief]
403
+ // [STATE: false, player.canSee(egg)]
404
+ const stateAssertMatch = inner.match(/^STATE:\s*(true|false)\s*,\s*(.+)$/i);
405
+ if (stateAssertMatch) {
406
+ const assertTrue = stateAssertMatch[1].toLowerCase() === 'true';
407
+ const expression = stateAssertMatch[2].trim();
408
+ return {
409
+ type: 'state-assert',
410
+ assertTrue,
411
+ stateExpression: expression
412
+ };
413
+ }
414
+ console.warn(`Unknown assertion format: ${tag}`);
415
+ return null;
416
+ }
417
+ /**
418
+ * Clean up a command before adding to transcript
419
+ */
420
+ function finalizeCommand(command) {
421
+ // Trim trailing empty lines from expected output
422
+ while (command.expectedOutput.length > 0 &&
423
+ command.expectedOutput[command.expectedOutput.length - 1].trim() === '') {
424
+ command.expectedOutput.pop();
425
+ }
426
+ // If no explicit assertion and we have expected output, default to [OK]
427
+ if (command.assertions.length === 0 && command.expectedOutput.length > 0) {
428
+ command.assertions.push({ type: 'ok' });
429
+ }
430
+ // If no assertion at all, default to [SKIP]
431
+ if (command.assertions.length === 0) {
432
+ command.assertions.push({ type: 'skip' });
433
+ }
434
+ }
435
+ /**
436
+ * Validate a transcript for common issues
437
+ */
438
+ function validateTranscript(transcript) {
439
+ const errors = [];
440
+ if (transcript.commands.length === 0) {
441
+ errors.push('Transcript has no commands');
442
+ }
443
+ if (!transcript.header.story && !transcript.header.title) {
444
+ errors.push('Transcript should have a title or story in header');
445
+ }
446
+ for (const cmd of transcript.commands) {
447
+ if (!cmd.input) {
448
+ errors.push(`Line ${cmd.lineNumber}: Empty command`);
449
+ }
450
+ }
451
+ return errors;
452
+ }
453
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Transcript Test Reporter
3
+ *
4
+ * Formats and displays test results with colors and diffs.
5
+ */
6
+ import { TranscriptResult, TestRunResult } from './types';
7
+ /**
8
+ * Report options
9
+ */
10
+ export interface ReporterOptions {
11
+ verbose?: boolean;
12
+ showDiff?: boolean;
13
+ color?: boolean;
14
+ }
15
+ /**
16
+ * Report results of running a single transcript
17
+ */
18
+ export declare function reportTranscript(result: TranscriptResult, options?: ReporterOptions): void;
19
+ /**
20
+ * Report results of running multiple transcripts
21
+ * Note: Individual transcripts should already be reported as they run.
22
+ * This function only shows the aggregate summary.
23
+ */
24
+ export declare function reportTestRun(result: TestRunResult, options?: ReporterOptions): void;
25
+ /**
26
+ * Get exit code based on results
27
+ */
28
+ export declare function getExitCode(result: TestRunResult): number;
29
+ /**
30
+ * Generate a timestamp string for filenames
31
+ */
32
+ export declare function generateTimestamp(): string;
33
+ /**
34
+ * Write test results to a JSON file
35
+ */
36
+ export declare function writeResultsToJson(result: TestRunResult, outputDir: string, timestamp: string): string;
37
+ /**
38
+ * Write a human-readable report to a text file
39
+ */
40
+ export declare function writeReportToFile(result: TestRunResult, outputDir: string, timestamp: string): string;
41
+ //# sourceMappingURL=reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EACL,gBAAgB,EAChB,aAAa,EAGd,MAAM,SAAS,CAAC;AAKjB;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,gBAAgB,EACxB,OAAO,GAAE,eAAoB,GAC5B,IAAI,CAmBN;AAiJD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,GAAE,eAAoB,GAAG,IAAI,CAmCxF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAKzD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAS1C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,aAAa,EACrB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,MAAM,CAmBR;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,aAAa,EACrB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,MAAM,CA0ER"}