@rhost/testkit 1.4.1 → 1.5.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 (70) hide show
  1. package/dist/cli/index.js +15 -4
  2. package/dist/cli/index.js.map +1 -1
  3. package/dist/cli/init.d.ts.map +1 -1
  4. package/dist/cli/init.js +107 -19
  5. package/dist/cli/init.js.map +1 -1
  6. package/dist/cli/lint.d.ts +2 -0
  7. package/dist/cli/lint.d.ts.map +1 -0
  8. package/dist/cli/lint.js +163 -0
  9. package/dist/cli/lint.js.map +1 -0
  10. package/dist/cli/mush-format.d.ts +2 -0
  11. package/dist/cli/mush-format.d.ts.map +1 -0
  12. package/dist/cli/mush-format.js +232 -0
  13. package/dist/cli/mush-format.js.map +1 -0
  14. package/dist/client.d.ts +43 -1
  15. package/dist/client.d.ts.map +1 -1
  16. package/dist/client.js +78 -5
  17. package/dist/client.js.map +1 -1
  18. package/dist/index.d.ts +3 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +10 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/offline/document.d.ts +8 -0
  23. package/dist/offline/document.d.ts.map +1 -0
  24. package/dist/offline/document.js +124 -0
  25. package/dist/offline/document.js.map +1 -0
  26. package/dist/offline/expect.d.ts +27 -0
  27. package/dist/offline/expect.d.ts.map +1 -0
  28. package/dist/offline/expect.js +90 -0
  29. package/dist/offline/expect.js.map +1 -0
  30. package/dist/offline/index.d.ts +5 -0
  31. package/dist/offline/index.d.ts.map +1 -0
  32. package/dist/offline/index.js +14 -0
  33. package/dist/offline/index.js.map +1 -0
  34. package/dist/offline/mock-client.d.ts +19 -0
  35. package/dist/offline/mock-client.d.ts.map +1 -0
  36. package/dist/offline/mock-client.js +36 -0
  37. package/dist/offline/mock-client.js.map +1 -0
  38. package/dist/offline/mock-world.d.ts +30 -0
  39. package/dist/offline/mock-world.d.ts.map +1 -0
  40. package/dist/offline/mock-world.js +64 -0
  41. package/dist/offline/mock-world.js.map +1 -0
  42. package/dist/offline/reduced-expect.d.ts +38 -0
  43. package/dist/offline/reduced-expect.d.ts.map +1 -0
  44. package/dist/offline/reduced-expect.js +61 -0
  45. package/dist/offline/reduced-expect.js.map +1 -0
  46. package/dist/offline/runner.d.ts +13 -0
  47. package/dist/offline/runner.d.ts.map +1 -0
  48. package/dist/offline/runner.js +174 -0
  49. package/dist/offline/runner.js.map +1 -0
  50. package/dist/offline/types.d.ts +78 -0
  51. package/dist/offline/types.d.ts.map +1 -0
  52. package/dist/offline/types.js +3 -0
  53. package/dist/offline/types.js.map +1 -0
  54. package/dist/reporter.d.ts +3 -1
  55. package/dist/reporter.d.ts.map +1 -1
  56. package/dist/reporter.js +20 -0
  57. package/dist/reporter.js.map +1 -1
  58. package/dist/runner.d.ts +39 -0
  59. package/dist/runner.d.ts.map +1 -1
  60. package/dist/runner.js +82 -15
  61. package/dist/runner.js.map +1 -1
  62. package/dist/validator/mush-format.d.ts +43 -0
  63. package/dist/validator/mush-format.d.ts.map +1 -0
  64. package/dist/validator/mush-format.js +484 -0
  65. package/dist/validator/mush-format.js.map +1 -0
  66. package/dist/validator/mush-lint.d.ts +22 -0
  67. package/dist/validator/mush-lint.d.ts.map +1 -0
  68. package/dist/validator/mush-lint.js +590 -0
  69. package/dist/validator/mush-lint.js.map +1 -0
  70. package/package.json +10 -2
@@ -0,0 +1,124 @@
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
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.compatibilityReport = void 0;
37
+ exports.parseDocument = parseDocument;
38
+ exports.parseDocumentFile = parseDocumentFile;
39
+ exports.loadFiles = loadFiles;
40
+ exports.loadGlob = loadGlob;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const validator_1 = require("../validator");
44
+ const mush_lint_1 = require("../validator/mush-lint");
45
+ const validator_2 = require("../validator");
46
+ Object.defineProperty(exports, "compatibilityReport", { enumerable: true, get: function () { return validator_2.compatibilityReport; } });
47
+ const expect_1 = require("./expect");
48
+ function extractAttrs(source) {
49
+ const attrs = [];
50
+ const lines = source.split('\n');
51
+ let current = null;
52
+ for (let i = 0; i < lines.length; i++) {
53
+ const raw = lines[i];
54
+ const trimmed = raw.trim();
55
+ const m = trimmed.match(/^&([A-Za-z_][A-Za-z0-9_.:@-]*)\s+([^=\s][^=]*)=(.*)$/);
56
+ if (m) {
57
+ if (current)
58
+ attrs.push({ ...current, value: current.value.trim() });
59
+ current = { name: m[1].toUpperCase(), object: m[2].trim(), value: m[3], line: i + 1 };
60
+ continue;
61
+ }
62
+ if (current && raw.match(/^\s+\S/) && !trimmed.startsWith('&') && !trimmed.startsWith('@') && !trimmed.startsWith('//')) {
63
+ current.value += ' ' + trimmed;
64
+ continue;
65
+ }
66
+ if (current) {
67
+ attrs.push({ ...current, value: current.value.trim() });
68
+ current = null;
69
+ }
70
+ }
71
+ if (current)
72
+ attrs.push({ ...current, value: current.value.trim() });
73
+ return attrs;
74
+ }
75
+ function parseDocument(source, filename = '<inline>') {
76
+ const attrs = extractAttrs(source);
77
+ const validationResult = (0, validator_1.validate)(source);
78
+ const lintResult = (0, mush_lint_1.lintContent)(source, filename);
79
+ const doc = { source, filename, attrs, validationResult, lintResult };
80
+ Object.defineProperty(doc, 'expect', { get: () => new expect_1.OfflineExpect(doc), enumerable: false });
81
+ return doc;
82
+ }
83
+ function parseDocumentFile(filePath) {
84
+ const source = fs.readFileSync(filePath, 'utf-8');
85
+ return parseDocument(source, path.resolve(filePath));
86
+ }
87
+ const MUSH_EXTENSIONS = new Set(['.mush', '.txt', '.installer']);
88
+ function walkDir(dir, out) {
89
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
90
+ const full = path.join(dir, entry.name);
91
+ if (entry.isDirectory()) {
92
+ walkDir(full, out);
93
+ }
94
+ else if (MUSH_EXTENSIONS.has(path.extname(entry.name)) || entry.name.endsWith('.installer.txt')) {
95
+ out.push(full);
96
+ }
97
+ }
98
+ }
99
+ function loadFiles(filePaths) {
100
+ return filePaths.map(parseDocumentFile);
101
+ }
102
+ function loadGlob(pattern, cwd = process.cwd()) {
103
+ const resolved = path.resolve(cwd, pattern);
104
+ const paths = [];
105
+ try {
106
+ const stat = fs.statSync(resolved);
107
+ if (stat.isDirectory()) {
108
+ walkDir(resolved, paths);
109
+ }
110
+ else {
111
+ paths.push(resolved);
112
+ }
113
+ }
114
+ catch {
115
+ // Pattern may be a glob-style path — do best-effort directory prefix walk
116
+ const parts = pattern.split('/');
117
+ const base = parts.slice(0, parts.findIndex(p => p.includes('*') || p.includes('?'))).join('/');
118
+ const baseDir = path.resolve(cwd, base || '.');
119
+ if (fs.existsSync(baseDir))
120
+ walkDir(baseDir, paths);
121
+ }
122
+ return paths.map(parseDocumentFile);
123
+ }
124
+ //# sourceMappingURL=document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document.js","sourceRoot":"","sources":["../../src/offline/document.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { OfflineDocument, OfflineExpectChain } from './types';
2
+ export declare class OfflineExpectError extends Error {
3
+ readonly matcherName: string;
4
+ readonly actual: unknown;
5
+ readonly expectedDesc: string;
6
+ readonly negated: boolean;
7
+ constructor(matcherName: string, actual: unknown, expectedDesc: string, negated: boolean);
8
+ }
9
+ export declare class OfflineExpect implements OfflineExpectChain {
10
+ private readonly doc;
11
+ private readonly negated;
12
+ constructor(doc: OfflineDocument, negated?: boolean);
13
+ get not(): OfflineExpectChain;
14
+ private pass;
15
+ noSyntaxErrors(): OfflineExpectChain;
16
+ noLintErrors(): OfflineExpectChain;
17
+ noLintWarnings(): OfflineExpectChain;
18
+ hasFunction(name: string): OfflineExpectChain;
19
+ hasAttribute(name: string): OfflineExpectChain;
20
+ attributeCount(n: number): OfflineExpectChain;
21
+ noUndefinedFunctions(): OfflineExpectChain;
22
+ noClobber(): OfflineExpectChain;
23
+ isPortable(): OfflineExpectChain;
24
+ hasDiagnostic(code: string): OfflineExpectChain;
25
+ maxAttributeLength(chars?: number): OfflineExpectChain;
26
+ }
27
+ //# sourceMappingURL=expect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expect.d.ts","sourceRoot":"","sources":["../../src/offline/expect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAEnE,qBAAa,kBAAmB,SAAQ,KAAK;aAEzB,WAAW,EAAE,MAAM;aACnB,MAAM,EAAE,OAAO;aACf,YAAY,EAAE,MAAM;aACpB,OAAO,EAAE,OAAO;gBAHhB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,OAAO,EACf,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,OAAO;CAWnC;AAED,qBAAa,aAAc,YAAW,kBAAkB;IAEpD,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADP,GAAG,EAAE,eAAe,EACpB,OAAO,UAAQ;IAGlC,IAAI,GAAG,IAAI,kBAAkB,CAE5B;IAED,OAAO,CAAC,IAAI;IAQZ,cAAc,IAAI,kBAAkB;IAUpC,YAAY,IAAI,kBAAkB;IASlC,cAAc,IAAI,kBAAkB;IASpC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB;IAO7C,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB;IAM9C,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,kBAAkB;IAS7C,oBAAoB,IAAI,kBAAkB;IAU1C,SAAS,IAAI,kBAAkB;IAU/B,UAAU,IAAI,kBAAkB;IAYhC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB;IAO/C,kBAAkB,CAAC,KAAK,SAAO,GAAG,kBAAkB;CASrD"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OfflineExpect = exports.OfflineExpectError = void 0;
4
+ const document_1 = require("./document");
5
+ class OfflineExpectError extends Error {
6
+ constructor(matcherName, actual, expectedDesc, negated) {
7
+ const not = negated ? '.not' : '';
8
+ super(`offline.expect\n` +
9
+ ` ● ${not}.${matcherName} failed\n` +
10
+ ` Expected: ${expectedDesc}\n` +
11
+ ` Received: ${JSON.stringify(actual)}`);
12
+ this.matcherName = matcherName;
13
+ this.actual = actual;
14
+ this.expectedDesc = expectedDesc;
15
+ this.negated = negated;
16
+ this.name = 'OfflineExpectError';
17
+ }
18
+ }
19
+ exports.OfflineExpectError = OfflineExpectError;
20
+ class OfflineExpect {
21
+ constructor(doc, negated = false) {
22
+ this.doc = doc;
23
+ this.negated = negated;
24
+ }
25
+ get not() {
26
+ return new OfflineExpect(this.doc, !this.negated);
27
+ }
28
+ pass(condition, matcherName, actual, expectedDesc) {
29
+ const success = this.negated ? !condition : condition;
30
+ if (!success) {
31
+ throw new OfflineExpectError(matcherName, actual, this.negated ? `NOT ${expectedDesc}` : expectedDesc, this.negated);
32
+ }
33
+ return this;
34
+ }
35
+ noSyntaxErrors() {
36
+ const errors = this.doc.validationResult.diagnostics.filter(d => d.severity === 'error');
37
+ return this.pass(errors.length === 0, 'noSyntaxErrors', errors.map(d => `[${d.code}] ${d.message}`), 'no syntax errors');
38
+ }
39
+ noLintErrors() {
40
+ return this.pass(this.doc.lintResult.errors === 0, 'noLintErrors', this.doc.lintResult.diagnostics.filter(d => d.severity === 'ERROR').map(d => `[${d.code}] ${d.message}`), 'no lint errors');
41
+ }
42
+ noLintWarnings() {
43
+ return this.pass(this.doc.lintResult.warnings === 0, 'noLintWarnings', this.doc.lintResult.diagnostics.filter(d => d.severity === 'WARN').map(d => `[${d.code}] ${d.message}`), 'no lint warnings');
44
+ }
45
+ hasFunction(name) {
46
+ const needle = name.toLowerCase();
47
+ // Quick text scan: name followed by ( is sufficient for this check
48
+ const found = this.doc.attrs.some(a => new RegExp(`\\b${needle}\\s*\\(`, 'i').test(a.value));
49
+ return this.pass(found, 'hasFunction', `searched ${this.doc.attrs.length} attr(s)`, `function '${name}' present`);
50
+ }
51
+ hasAttribute(name) {
52
+ const upper = name.toUpperCase();
53
+ const found = this.doc.attrs.some(a => a.name === upper);
54
+ return this.pass(found, 'hasAttribute', this.doc.attrs.map(a => a.name), `attribute '${upper}' present`);
55
+ }
56
+ attributeCount(n) {
57
+ return this.pass(this.doc.attrs.length === n, 'attributeCount', this.doc.attrs.length, `exactly ${n} attribute(s)`);
58
+ }
59
+ noUndefinedFunctions() {
60
+ const unknowns = this.doc.validationResult.diagnostics.filter(d => d.code === 'W005');
61
+ return this.pass(unknowns.length === 0, 'noUndefinedFunctions', unknowns.map(d => d.message), 'no unknown functions');
62
+ }
63
+ noClobber() {
64
+ const clobbers = this.doc.validationResult.diagnostics.filter(d => d.code === 'W006');
65
+ return this.pass(clobbers.length === 0, 'noClobber', clobbers.map(d => d.message), 'no register clobber warnings');
66
+ }
67
+ isPortable() {
68
+ // Check each attr body for portability
69
+ const restricted = [];
70
+ for (const attr of this.doc.attrs) {
71
+ const report = (0, document_1.compatibilityReport)(attr.value);
72
+ if (!report.portable) {
73
+ restricted.push(...report.restricted.map(r => `${attr.name}: ${r.name} (${r.platforms.join(',')})`));
74
+ }
75
+ }
76
+ return this.pass(restricted.length === 0, 'isPortable', restricted, 'all functions portable across MUSH platforms');
77
+ }
78
+ hasDiagnostic(code) {
79
+ const upper = code.toUpperCase();
80
+ const inValidation = this.doc.validationResult.diagnostics.some(d => d.code.toUpperCase() === upper);
81
+ const inLint = this.doc.lintResult.diagnostics.some(d => d.code.toUpperCase() === upper);
82
+ return this.pass(inValidation || inLint, 'hasDiagnostic', `searched all diagnostics`, `diagnostic '${code}' present`);
83
+ }
84
+ maxAttributeLength(chars = 7500) {
85
+ const over = this.doc.attrs.filter(a => a.value.length > chars);
86
+ return this.pass(over.length === 0, 'maxAttributeLength', over.map(a => `${a.name}: ${a.value.length} chars`), `all attrs <= ${chars} chars`);
87
+ }
88
+ }
89
+ exports.OfflineExpect = OfflineExpect;
90
+ //# sourceMappingURL=expect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expect.js","sourceRoot":"","sources":["../../src/offline/expect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { parseDocument, parseDocumentFile, loadFiles, loadGlob } from './document';
2
+ export { OfflineRunner } from './runner';
3
+ export { OfflineExpect, OfflineExpectError } from './expect';
4
+ export type { OfflineDocument, OfflineAttr, OfflineExpectChain, OfflineTestContext, OfflineSuiteContext, OfflineItFn, OfflineDescribeFn, OfflineTestFn, OfflineHookFn, OfflineRunOptions, OfflineRunResult, } from './types';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/offline/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACnF,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC7D,YAAY,EACV,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,SAAS,CAAC"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OfflineExpectError = exports.OfflineExpect = exports.OfflineRunner = exports.loadGlob = exports.loadFiles = exports.parseDocumentFile = exports.parseDocument = void 0;
4
+ var document_1 = require("./document");
5
+ Object.defineProperty(exports, "parseDocument", { enumerable: true, get: function () { return document_1.parseDocument; } });
6
+ Object.defineProperty(exports, "parseDocumentFile", { enumerable: true, get: function () { return document_1.parseDocumentFile; } });
7
+ Object.defineProperty(exports, "loadFiles", { enumerable: true, get: function () { return document_1.loadFiles; } });
8
+ Object.defineProperty(exports, "loadGlob", { enumerable: true, get: function () { return document_1.loadGlob; } });
9
+ var runner_1 = require("./runner");
10
+ Object.defineProperty(exports, "OfflineRunner", { enumerable: true, get: function () { return runner_1.OfflineRunner; } });
11
+ var expect_1 = require("./expect");
12
+ Object.defineProperty(exports, "OfflineExpect", { enumerable: true, get: function () { return expect_1.OfflineExpect; } });
13
+ Object.defineProperty(exports, "OfflineExpectError", { enumerable: true, get: function () { return expect_1.OfflineExpectError; } });
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/offline/index.ts"],"names":[],"mappings":";;;AAAA,uCAAmF;AAA1E,yGAAA,aAAa,OAAA;AAAE,6GAAA,iBAAiB,OAAA;AAAE,qGAAA,SAAS,OAAA;AAAE,oGAAA,QAAQ,OAAA;AAC9D,mCAAyC;AAAhC,uGAAA,aAAa,OAAA;AACtB,mCAA6D;AAApD,uGAAA,aAAa,OAAA;AAAE,4GAAA,kBAAkB,OAAA"}
@@ -0,0 +1,19 @@
1
+ import { RhostClient } from '../client';
2
+ /**
3
+ * Stub client used in offline mode.
4
+ * connect/login/disconnect are no-ops; eval/command return empty results.
5
+ * All expressions passed to eval() are recorded for inspection.
6
+ */
7
+ export declare class MockRhostClient extends RhostClient {
8
+ readonly capturedEvals: string[];
9
+ constructor();
10
+ connect(): Promise<void>;
11
+ login(_username: string, _password: string): Promise<void>;
12
+ disconnect(): Promise<void>;
13
+ eval(expression: string): Promise<string>;
14
+ evalAll(expressions: string[]): Promise<string[]>;
15
+ command(_cmd: string): Promise<string[]>;
16
+ preview(_input: string): Promise<string>;
17
+ sendNoWait(_cmd: string): void;
18
+ }
19
+ //# sourceMappingURL=mock-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-client.d.ts","sourceRoot":"","sources":["../../src/offline/mock-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC;;;;GAIG;AACH,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,QAAQ,CAAC,aAAa,EAAE,MAAM,EAAE,CAAM;;IAOvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAExB,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAE1D,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAE3B,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKzC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKjD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAIxC,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI9C,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CACxC"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MockRhostClient = void 0;
4
+ const client_1 = require("../client");
5
+ /**
6
+ * Stub client used in offline mode.
7
+ * connect/login/disconnect are no-ops; eval/command return empty results.
8
+ * All expressions passed to eval() are recorded for inspection.
9
+ */
10
+ class MockRhostClient extends client_1.RhostClient {
11
+ constructor() {
12
+ // Dummy options — no real connection is ever made
13
+ super({ host: 'localhost', port: 0 });
14
+ this.capturedEvals = [];
15
+ }
16
+ async connect() { }
17
+ async login(_username, _password) { }
18
+ async disconnect() { }
19
+ async eval(expression) {
20
+ this.capturedEvals.push(expression);
21
+ return '';
22
+ }
23
+ async evalAll(expressions) {
24
+ this.capturedEvals.push(...expressions);
25
+ return expressions.map(() => '');
26
+ }
27
+ async command(_cmd) {
28
+ return [];
29
+ }
30
+ async preview(_input) {
31
+ return '';
32
+ }
33
+ sendNoWait(_cmd) { }
34
+ }
35
+ exports.MockRhostClient = MockRhostClient;
36
+ //# sourceMappingURL=mock-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-client.js","sourceRoot":"","sources":["../../src/offline/mock-client.ts"],"names":[],"mappings":";;;AAAA,sCAAwC;AAExC;;;;GAIG;AACH,MAAa,eAAgB,SAAQ,oBAAW;IAG9C;QACE,kDAAkD;QAClD,KAAK,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAW,CAAC,CAAC;QAJxC,kBAAa,GAAa,EAAE,CAAC;IAKtC,CAAC;IAEQ,KAAK,CAAC,OAAO,KAAmB,CAAC;IAEjC,KAAK,CAAC,KAAK,CAAC,SAAiB,EAAE,SAAiB,IAAkB,CAAC;IAEnE,KAAK,CAAC,UAAU,KAAmB,CAAC;IAEpC,KAAK,CAAC,IAAI,CAAC,UAAkB;QACpC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpC,OAAO,EAAE,CAAC;IACZ,CAAC;IAEQ,KAAK,CAAC,OAAO,CAAC,WAAqB;QAC1C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;QACxC,OAAO,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;IAEQ,KAAK,CAAC,OAAO,CAAC,IAAY;QACjC,OAAO,EAAE,CAAC;IACZ,CAAC;IAEQ,KAAK,CAAC,OAAO,CAAC,MAAc;QACnC,OAAO,EAAE,CAAC;IACZ,CAAC;IAEQ,UAAU,CAAC,IAAY,IAAS,CAAC;CAC3C;AAjCD,0CAiCC"}
@@ -0,0 +1,30 @@
1
+ import { RhostWorld } from '../world';
2
+ import type { MockRhostClient } from './mock-client';
3
+ /**
4
+ * World proxy for offline mode.
5
+ *
6
+ * - create/dig/destroy/etc. are no-ops that return synthetic dbrefs.
7
+ * - set() validates the softcode value immediately and throws if syntax errors
8
+ * or lint errors are found — surfacing the problem at the exact callsite.
9
+ * - All other queries return empty/stub values.
10
+ */
11
+ export declare class OfflineWorldProxy extends RhostWorld {
12
+ constructor(client: MockRhostClient);
13
+ create(_name: string): Promise<string>;
14
+ dig(_name: string): Promise<string>;
15
+ zone(_name: string): Promise<string>;
16
+ destroy(_dbref: string): Promise<void>;
17
+ set(dbref: string, attr: string, value: string): Promise<void>;
18
+ get(_dbref: string, _attr: string): Promise<string>;
19
+ lock(_dbref: string, _lockstring: string): Promise<void>;
20
+ flag(_dbref: string, _flag: string): Promise<void>;
21
+ pemit(_target: string, _msg: string): Promise<void>;
22
+ remit(_room: string, _msg: string): Promise<void>;
23
+ force(_actor: string, _cmd: string): Promise<void>;
24
+ parent(_child: string, _parentDbref: string): Promise<void>;
25
+ addToChannel(_dbref: string, _chan: string): Promise<void>;
26
+ grantQuota(_dbref: string, _n: number): Promise<void>;
27
+ trigger(_dbref: string, _attr: string, _args?: string): Promise<string[]>;
28
+ cleanup(): Promise<void>;
29
+ }
30
+ //# sourceMappingURL=mock-world.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-world.d.ts","sourceRoot":"","sources":["../../src/offline/mock-world.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGtC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAIrD;;;;;;;GAOG;AACH,qBAAa,iBAAkB,SAAQ,UAAU;gBACnC,MAAM,EAAE,eAAe;IAIpB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAItC,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAInC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIpC,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAEtC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB9D,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAInD,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IACxD,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAClD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IACnD,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IACjD,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAClD,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3D,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1D,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IACrD,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAGzE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CACxC"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OfflineWorldProxy = void 0;
4
+ const world_1 = require("../world");
5
+ const validator_1 = require("../validator");
6
+ const mush_lint_1 = require("../validator/mush-lint");
7
+ let _nextDbref = 1;
8
+ /**
9
+ * World proxy for offline mode.
10
+ *
11
+ * - create/dig/destroy/etc. are no-ops that return synthetic dbrefs.
12
+ * - set() validates the softcode value immediately and throws if syntax errors
13
+ * or lint errors are found — surfacing the problem at the exact callsite.
14
+ * - All other queries return empty/stub values.
15
+ */
16
+ class OfflineWorldProxy extends world_1.RhostWorld {
17
+ constructor(client) {
18
+ super(client);
19
+ }
20
+ async create(_name) {
21
+ return `#${_nextDbref++}`;
22
+ }
23
+ async dig(_name) {
24
+ return `#${_nextDbref++}`;
25
+ }
26
+ async zone(_name) {
27
+ return `#${_nextDbref++}`;
28
+ }
29
+ async destroy(_dbref) { }
30
+ async set(dbref, attr, value) {
31
+ // Validate expression syntax
32
+ const vr = (0, validator_1.validate)(value);
33
+ const syntaxErrors = vr.diagnostics.filter(d => d.severity === 'error');
34
+ if (syntaxErrors.length > 0) {
35
+ const msgs = syntaxErrors.map(d => `[${d.code}] ${d.message}`).join('\n ');
36
+ throw new Error(`offline: syntax error in ${dbref}/${attr}\n ${msgs}`);
37
+ }
38
+ // Run lint on the attribute as a mini-document
39
+ const fakeSource = `&${attr} ${dbref}=${value}`;
40
+ const lr = (0, mush_lint_1.lintContent)(fakeSource, `${dbref}/${attr}`);
41
+ const lintErrors = lr.diagnostics.filter(d => d.severity === 'ERROR');
42
+ if (lintErrors.length > 0) {
43
+ const msgs = lintErrors.map(d => `[${d.code}] ${d.message}`).join('\n ');
44
+ throw new Error(`offline: lint error in ${dbref}/${attr}\n ${msgs}`);
45
+ }
46
+ }
47
+ async get(_dbref, _attr) {
48
+ return '';
49
+ }
50
+ async lock(_dbref, _lockstring) { }
51
+ async flag(_dbref, _flag) { }
52
+ async pemit(_target, _msg) { }
53
+ async remit(_room, _msg) { }
54
+ async force(_actor, _cmd) { }
55
+ async parent(_child, _parentDbref) { }
56
+ async addToChannel(_dbref, _chan) { }
57
+ async grantQuota(_dbref, _n) { }
58
+ async trigger(_dbref, _attr, _args) {
59
+ return [];
60
+ }
61
+ async cleanup() { }
62
+ }
63
+ exports.OfflineWorldProxy = OfflineWorldProxy;
64
+ //# sourceMappingURL=mock-world.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-world.js","sourceRoot":"","sources":["../../src/offline/mock-world.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { SnapshotContext } from '../expect';
2
+ export interface OfflineCounter {
3
+ behavioralSkips: number;
4
+ }
5
+ /**
6
+ * Offline-reduced version of RhostExpect.
7
+ *
8
+ * Behavioral matchers (toBe, toMatch, etc.) are skipped — they require a live
9
+ * server to evaluate. The expression is syntax-checked on construction; if it
10
+ * contains errors the next matcher call throws immediately.
11
+ *
12
+ * Shape is intentionally identical to RhostExpect so test files need no changes.
13
+ */
14
+ export declare class ReducedExpect {
15
+ private readonly expression;
16
+ private readonly negated;
17
+ private readonly counter?;
18
+ private readonly syntaxError;
19
+ constructor(expression: string, negated?: boolean, _snapshotCtx?: SnapshotContext, counter?: OfflineCounter | undefined);
20
+ get not(): ReducedExpect;
21
+ private checkSyntax;
22
+ private skip;
23
+ toBe(_expected: string): Promise<void>;
24
+ toMatch(_pattern: RegExp | string): Promise<void>;
25
+ toContain(_substring: string): Promise<void>;
26
+ toStartWith(_prefix: string): Promise<void>;
27
+ toEndWith(_suffix: string): Promise<void>;
28
+ toBeCloseTo(_expected: number, _precision?: number): Promise<void>;
29
+ toBeTruthy(): Promise<void>;
30
+ toBeFalsy(): Promise<void>;
31
+ toBeError(): Promise<void>;
32
+ toBeDbref(): Promise<void>;
33
+ toBeNumber(): Promise<void>;
34
+ toContainWord(_word: string, _sep?: string): Promise<void>;
35
+ toHaveWordCount(_n: number, _sep?: string): Promise<void>;
36
+ toMatchSnapshot(): Promise<void>;
37
+ }
38
+ //# sourceMappingURL=reduced-expect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reduced-expect.d.ts","sourceRoot":"","sources":["../../src/offline/reduced-expect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;GAQG;AACH,qBAAa,aAAa;IAItB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAExB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAN3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;gBAGzB,UAAU,EAAE,MAAM,EAClB,OAAO,UAAQ,EAChC,YAAY,CAAC,EAAE,eAAe,EACb,OAAO,CAAC,EAAE,cAAc,YAAA;IAS3C,IAAI,GAAG,IAAI,aAAa,CAEvB;IAED,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,IAAI;IASN,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IACtC,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IACjD,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAC5C,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3C,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IACzC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAClE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAC3B,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAC1B,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAC1B,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAC1B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAC3B,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1D,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAEzD,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;CAIvC"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ReducedExpect = void 0;
4
+ const validator_1 = require("../validator");
5
+ /**
6
+ * Offline-reduced version of RhostExpect.
7
+ *
8
+ * Behavioral matchers (toBe, toMatch, etc.) are skipped — they require a live
9
+ * server to evaluate. The expression is syntax-checked on construction; if it
10
+ * contains errors the next matcher call throws immediately.
11
+ *
12
+ * Shape is intentionally identical to RhostExpect so test files need no changes.
13
+ */
14
+ class ReducedExpect {
15
+ constructor(expression, negated = false, _snapshotCtx, counter) {
16
+ this.expression = expression;
17
+ this.negated = negated;
18
+ this.counter = counter;
19
+ const result = (0, validator_1.validate)(expression);
20
+ const errors = result.diagnostics.filter(d => d.severity === 'error');
21
+ this.syntaxError = errors.length > 0
22
+ ? errors.map(d => `[${d.code}] ${d.message}`).join('; ')
23
+ : null;
24
+ }
25
+ get not() {
26
+ return new ReducedExpect(this.expression, !this.negated, undefined, this.counter);
27
+ }
28
+ checkSyntax() {
29
+ if (this.syntaxError) {
30
+ throw new Error(`offline: syntax error in expression ${JSON.stringify(this.expression)}\n ${this.syntaxError}`);
31
+ }
32
+ }
33
+ skip() {
34
+ this.checkSyntax();
35
+ if (this.counter)
36
+ this.counter.behavioralSkips++;
37
+ }
38
+ // -------------------------------------------------------------------------
39
+ // Behavioral matchers — skipped in offline mode
40
+ // -------------------------------------------------------------------------
41
+ async toBe(_expected) { this.skip(); }
42
+ async toMatch(_pattern) { this.skip(); }
43
+ async toContain(_substring) { this.skip(); }
44
+ async toStartWith(_prefix) { this.skip(); }
45
+ async toEndWith(_suffix) { this.skip(); }
46
+ async toBeCloseTo(_expected, _precision) { this.skip(); }
47
+ async toBeTruthy() { this.skip(); }
48
+ async toBeFalsy() { this.skip(); }
49
+ async toBeError() { this.skip(); }
50
+ async toBeDbref() { this.skip(); }
51
+ async toBeNumber() { this.skip(); }
52
+ async toContainWord(_word, _sep) { this.skip(); }
53
+ async toHaveWordCount(_n, _sep) { this.skip(); }
54
+ async toMatchSnapshot() {
55
+ if (this.negated)
56
+ return;
57
+ this.skip();
58
+ }
59
+ }
60
+ exports.ReducedExpect = ReducedExpect;
61
+ //# sourceMappingURL=reduced-expect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reduced-expect.js","sourceRoot":"","sources":["../../src/offline/reduced-expect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { OfflineSuiteContext, OfflineRunOptions, OfflineRunResult } from './types';
2
+ export declare class OfflineRunner {
3
+ private readonly root;
4
+ describe(name: string, fn: (ctx: OfflineSuiteContext) => void): this;
5
+ run(options?: OfflineRunOptions): OfflineRunResult;
6
+ private _runJest;
7
+ private _registerJestNode;
8
+ private _runStandalone;
9
+ private _execSuite;
10
+ private _execTest;
11
+ private _countTests;
12
+ }
13
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/offline/runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,mBAAmB,EAMnB,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,SAAS,CAAC;AA+EjB,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAGnB;IAEF,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,mBAAmB,KAAK,IAAI,GAAG,IAAI;IAOpE,GAAG,CAAC,OAAO,GAAE,iBAAsB,GAAG,gBAAgB;IAatD,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,cAAc;YAQR,UAAU;YA2BV,SAAS;IA+BvB,OAAO,CAAC,WAAW;CAOpB"}