@plugjs/expect5 0.4.0
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.
- package/README.md +7 -0
- package/dist/cli.d.mts +2 -0
- package/dist/cli.mjs +96 -0
- package/dist/cli.mjs.map +6 -0
- package/dist/execution/executable.cjs +299 -0
- package/dist/execution/executable.cjs.map +6 -0
- package/dist/execution/executable.d.ts +87 -0
- package/dist/execution/executable.mjs +260 -0
- package/dist/execution/executable.mjs.map +6 -0
- package/dist/execution/executor.cjs +125 -0
- package/dist/execution/executor.cjs.map +6 -0
- package/dist/execution/executor.d.ts +35 -0
- package/dist/execution/executor.mjs +90 -0
- package/dist/execution/executor.mjs.map +6 -0
- package/dist/execution/setup.cjs +127 -0
- package/dist/execution/setup.cjs.map +6 -0
- package/dist/execution/setup.d.ts +31 -0
- package/dist/execution/setup.mjs +87 -0
- package/dist/execution/setup.mjs.map +6 -0
- package/dist/expectation/basic.cjs +216 -0
- package/dist/expectation/basic.cjs.map +6 -0
- package/dist/expectation/basic.d.ts +47 -0
- package/dist/expectation/basic.mjs +177 -0
- package/dist/expectation/basic.mjs.map +6 -0
- package/dist/expectation/diff.cjs +253 -0
- package/dist/expectation/diff.cjs.map +6 -0
- package/dist/expectation/diff.d.ts +27 -0
- package/dist/expectation/diff.mjs +228 -0
- package/dist/expectation/diff.mjs.map +6 -0
- package/dist/expectation/expect.cjs +211 -0
- package/dist/expectation/expect.cjs.map +6 -0
- package/dist/expectation/expect.d.ts +140 -0
- package/dist/expectation/expect.mjs +219 -0
- package/dist/expectation/expect.mjs.map +6 -0
- package/dist/expectation/include.cjs +187 -0
- package/dist/expectation/include.cjs.map +6 -0
- package/dist/expectation/include.d.ts +10 -0
- package/dist/expectation/include.mjs +158 -0
- package/dist/expectation/include.mjs.map +6 -0
- package/dist/expectation/print.cjs +281 -0
- package/dist/expectation/print.cjs.map +6 -0
- package/dist/expectation/print.d.ts +4 -0
- package/dist/expectation/print.mjs +256 -0
- package/dist/expectation/print.mjs.map +6 -0
- package/dist/expectation/throwing.cjs +58 -0
- package/dist/expectation/throwing.cjs.map +6 -0
- package/dist/expectation/throwing.d.ts +8 -0
- package/dist/expectation/throwing.mjs +32 -0
- package/dist/expectation/throwing.mjs.map +6 -0
- package/dist/expectation/types.cjs +212 -0
- package/dist/expectation/types.cjs.map +6 -0
- package/dist/expectation/types.d.ts +57 -0
- package/dist/expectation/types.mjs +178 -0
- package/dist/expectation/types.mjs.map +6 -0
- package/dist/expectation/void.cjs +111 -0
- package/dist/expectation/void.cjs.map +6 -0
- package/dist/expectation/void.d.ts +39 -0
- package/dist/expectation/void.mjs +77 -0
- package/dist/expectation/void.mjs.map +6 -0
- package/dist/globals.cjs +2 -0
- package/dist/globals.cjs.map +6 -0
- package/dist/globals.d.ts +23 -0
- package/dist/globals.mjs +1 -0
- package/dist/globals.mjs.map +6 -0
- package/dist/index.cjs +66 -0
- package/dist/index.cjs.map +6 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.mjs +41 -0
- package/dist/index.mjs.map +6 -0
- package/dist/test.cjs +229 -0
- package/dist/test.cjs.map +6 -0
- package/dist/test.d.ts +9 -0
- package/dist/test.mjs +194 -0
- package/dist/test.mjs.map +6 -0
- package/package.json +57 -0
- package/src/cli.mts +122 -0
- package/src/execution/executable.ts +364 -0
- package/src/execution/executor.ts +146 -0
- package/src/execution/setup.ts +108 -0
- package/src/expectation/basic.ts +209 -0
- package/src/expectation/diff.ts +445 -0
- package/src/expectation/expect.ts +401 -0
- package/src/expectation/include.ts +184 -0
- package/src/expectation/print.ts +386 -0
- package/src/expectation/throwing.ts +45 -0
- package/src/expectation/types.ts +263 -0
- package/src/expectation/void.ts +80 -0
- package/src/globals.ts +30 -0
- package/src/index.ts +54 -0
- package/src/test.ts +239 -0
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// expectation/include.ts
|
|
21
|
+
var include_exports = {};
|
|
22
|
+
__export(include_exports, {
|
|
23
|
+
ToInclude: () => ToInclude,
|
|
24
|
+
ToMatchContents: () => ToMatchContents,
|
|
25
|
+
includesMappings: () => includesMappings,
|
|
26
|
+
includesProps: () => includesProps,
|
|
27
|
+
includesValues: () => includesValues
|
|
28
|
+
});
|
|
29
|
+
module.exports = __toCommonJS(include_exports);
|
|
30
|
+
var import_diff = require("./diff.cjs");
|
|
31
|
+
var import_types = require("./types.cjs");
|
|
32
|
+
var ToInclude = class {
|
|
33
|
+
expect(context, negative, expected) {
|
|
34
|
+
if (expected instanceof Map)
|
|
35
|
+
return includesMappings(context, negative, expected);
|
|
36
|
+
if (expected instanceof Set)
|
|
37
|
+
return includesValues(context, negative, expected);
|
|
38
|
+
if (Array.isArray(expected))
|
|
39
|
+
return includesValues(context, negative, new Set(expected));
|
|
40
|
+
if (expected instanceof Object)
|
|
41
|
+
return includesProps(context, negative, expected);
|
|
42
|
+
throw new TypeError(`Invalid type for "toInclude(...)": ${(0, import_types.stringifyValue)(expected)}`);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
var ToMatchContents = class {
|
|
46
|
+
expect(context, negative, contents) {
|
|
47
|
+
let actual;
|
|
48
|
+
let expected;
|
|
49
|
+
try {
|
|
50
|
+
actual = new Set(context.value);
|
|
51
|
+
expected = new Set(contents);
|
|
52
|
+
} catch (error) {
|
|
53
|
+
throw new import_types.ExpectationError(context, false, "to be an iterable object");
|
|
54
|
+
}
|
|
55
|
+
const result = (0, import_diff.diff)(actual, expected);
|
|
56
|
+
delete result.error;
|
|
57
|
+
if (result.diff === negative)
|
|
58
|
+
return;
|
|
59
|
+
throw new import_types.ExpectationError(
|
|
60
|
+
context,
|
|
61
|
+
negative,
|
|
62
|
+
`to match contents of ${(0, import_types.stringifyObjectType)(contents)}`,
|
|
63
|
+
{ ...result, value: context.value }
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
function includesProps(context, negative, expected) {
|
|
68
|
+
if (context.value instanceof Map) {
|
|
69
|
+
return includesMappings(context, negative, new Map(Object.entries(expected)));
|
|
70
|
+
}
|
|
71
|
+
context.toBeInstanceOf(Object);
|
|
72
|
+
const actual = context.value;
|
|
73
|
+
const keys = new Set(Object.keys(expected));
|
|
74
|
+
const props = {};
|
|
75
|
+
if (negative) {
|
|
76
|
+
for (const key of keys) {
|
|
77
|
+
if (actual[key] !== void 0 || key in actual) {
|
|
78
|
+
props[key] = { diff: true, extra: actual[key] };
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
} else {
|
|
82
|
+
for (const key of keys) {
|
|
83
|
+
const act = actual[key];
|
|
84
|
+
const exp = expected[key];
|
|
85
|
+
const result = (0, import_diff.diff)(act, exp);
|
|
86
|
+
if (!result.diff)
|
|
87
|
+
continue;
|
|
88
|
+
if (act === void 0 && !(key in actual)) {
|
|
89
|
+
props[key] = { diff: true, missing: exp };
|
|
90
|
+
} else {
|
|
91
|
+
props[key] = result;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const count = Object.keys(props).length;
|
|
96
|
+
if (count === 0)
|
|
97
|
+
return;
|
|
98
|
+
const type = count === 1 ? "property" : "properties";
|
|
99
|
+
throw new import_types.ExpectationError(context, negative, `to include ${count} ${type}`, {
|
|
100
|
+
diff: true,
|
|
101
|
+
value: actual,
|
|
102
|
+
props
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
function includesValues(context, negative, expected) {
|
|
106
|
+
context.toBeInstanceOf(Object);
|
|
107
|
+
if (typeof context.value[Symbol.iterator] !== "function") {
|
|
108
|
+
throw new import_types.ExpectationError(context, false, "to be an iterable object");
|
|
109
|
+
}
|
|
110
|
+
const actual = new Set(context.value);
|
|
111
|
+
const values = [];
|
|
112
|
+
if (negative) {
|
|
113
|
+
for (const exp of expected) {
|
|
114
|
+
for (const act of actual) {
|
|
115
|
+
const result = (0, import_diff.diff)(act, exp);
|
|
116
|
+
if (result.diff)
|
|
117
|
+
continue;
|
|
118
|
+
values.push({ diff: true, extra: act });
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
} else {
|
|
123
|
+
for (const exp of expected) {
|
|
124
|
+
let found = false;
|
|
125
|
+
for (const act of actual) {
|
|
126
|
+
const result = (0, import_diff.diff)(act, exp);
|
|
127
|
+
if (result.diff)
|
|
128
|
+
continue;
|
|
129
|
+
found = true;
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
if (!found) {
|
|
133
|
+
values.push({ diff: true, missing: exp });
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const count = values.length;
|
|
138
|
+
if (count === 0)
|
|
139
|
+
return;
|
|
140
|
+
const type = count === 1 ? "value" : "values";
|
|
141
|
+
throw new import_types.ExpectationError(context, negative, `to include ${count} ${type}`, {
|
|
142
|
+
diff: true,
|
|
143
|
+
value: context.value,
|
|
144
|
+
values
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
function includesMappings(context, negative, expected) {
|
|
148
|
+
context.toBeInstanceOf(Map);
|
|
149
|
+
const actual = context.value;
|
|
150
|
+
const keys = new Set(expected.keys());
|
|
151
|
+
const mappings = [];
|
|
152
|
+
if (negative) {
|
|
153
|
+
for (const key of keys) {
|
|
154
|
+
if (actual.has(key)) {
|
|
155
|
+
mappings.push([key, { diff: true, extra: actual.get(key) }]);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
} else {
|
|
159
|
+
for (const key of keys) {
|
|
160
|
+
if (!actual.has(key)) {
|
|
161
|
+
mappings.push([key, { diff: true, missing: expected.get(key) }]);
|
|
162
|
+
} else {
|
|
163
|
+
const result = (0, import_diff.diff)(actual.get(key), expected.get(key));
|
|
164
|
+
if (result.diff)
|
|
165
|
+
mappings.push([key, result]);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
const count = mappings.length;
|
|
170
|
+
if (count === 0)
|
|
171
|
+
return;
|
|
172
|
+
const type = count === 1 ? "mapping" : "mappings";
|
|
173
|
+
throw new import_types.ExpectationError(context, negative, `to include ${count} ${type}`, {
|
|
174
|
+
diff: true,
|
|
175
|
+
value: context.value,
|
|
176
|
+
mappings
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
180
|
+
0 && (module.exports = {
|
|
181
|
+
ToInclude,
|
|
182
|
+
ToMatchContents,
|
|
183
|
+
includesMappings,
|
|
184
|
+
includesProps,
|
|
185
|
+
includesValues
|
|
186
|
+
});
|
|
187
|
+
//# sourceMappingURL=include.cjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/expectation/include.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Expectation, Expectations } from './expect';
|
|
2
|
+
export declare class ToInclude implements Expectation {
|
|
3
|
+
expect(context: Expectations, negative: boolean, expected: Record<string, any> | Map<any, any> | Set<any> | any[]): void;
|
|
4
|
+
}
|
|
5
|
+
export declare class ToMatchContents implements Expectation {
|
|
6
|
+
expect(context: Expectations, negative: boolean, contents: any[] | Set<any>): void;
|
|
7
|
+
}
|
|
8
|
+
export declare function includesProps(context: Expectations, negative: boolean, expected: Record<string, any>): void;
|
|
9
|
+
export declare function includesValues(context: Expectations, negative: boolean, expected: Set<any>): void;
|
|
10
|
+
export declare function includesMappings(context: Expectations, negative: boolean, expected: Map<any, any>): void;
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
// expectation/include.ts
|
|
2
|
+
import { diff } from "./diff.mjs";
|
|
3
|
+
import { ExpectationError, stringifyObjectType, stringifyValue } from "./types.mjs";
|
|
4
|
+
var ToInclude = class {
|
|
5
|
+
expect(context, negative, expected) {
|
|
6
|
+
if (expected instanceof Map)
|
|
7
|
+
return includesMappings(context, negative, expected);
|
|
8
|
+
if (expected instanceof Set)
|
|
9
|
+
return includesValues(context, negative, expected);
|
|
10
|
+
if (Array.isArray(expected))
|
|
11
|
+
return includesValues(context, negative, new Set(expected));
|
|
12
|
+
if (expected instanceof Object)
|
|
13
|
+
return includesProps(context, negative, expected);
|
|
14
|
+
throw new TypeError(`Invalid type for "toInclude(...)": ${stringifyValue(expected)}`);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
var ToMatchContents = class {
|
|
18
|
+
expect(context, negative, contents) {
|
|
19
|
+
let actual;
|
|
20
|
+
let expected;
|
|
21
|
+
try {
|
|
22
|
+
actual = new Set(context.value);
|
|
23
|
+
expected = new Set(contents);
|
|
24
|
+
} catch (error) {
|
|
25
|
+
throw new ExpectationError(context, false, "to be an iterable object");
|
|
26
|
+
}
|
|
27
|
+
const result = diff(actual, expected);
|
|
28
|
+
delete result.error;
|
|
29
|
+
if (result.diff === negative)
|
|
30
|
+
return;
|
|
31
|
+
throw new ExpectationError(
|
|
32
|
+
context,
|
|
33
|
+
negative,
|
|
34
|
+
`to match contents of ${stringifyObjectType(contents)}`,
|
|
35
|
+
{ ...result, value: context.value }
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
function includesProps(context, negative, expected) {
|
|
40
|
+
if (context.value instanceof Map) {
|
|
41
|
+
return includesMappings(context, negative, new Map(Object.entries(expected)));
|
|
42
|
+
}
|
|
43
|
+
context.toBeInstanceOf(Object);
|
|
44
|
+
const actual = context.value;
|
|
45
|
+
const keys = new Set(Object.keys(expected));
|
|
46
|
+
const props = {};
|
|
47
|
+
if (negative) {
|
|
48
|
+
for (const key of keys) {
|
|
49
|
+
if (actual[key] !== void 0 || key in actual) {
|
|
50
|
+
props[key] = { diff: true, extra: actual[key] };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
} else {
|
|
54
|
+
for (const key of keys) {
|
|
55
|
+
const act = actual[key];
|
|
56
|
+
const exp = expected[key];
|
|
57
|
+
const result = diff(act, exp);
|
|
58
|
+
if (!result.diff)
|
|
59
|
+
continue;
|
|
60
|
+
if (act === void 0 && !(key in actual)) {
|
|
61
|
+
props[key] = { diff: true, missing: exp };
|
|
62
|
+
} else {
|
|
63
|
+
props[key] = result;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const count = Object.keys(props).length;
|
|
68
|
+
if (count === 0)
|
|
69
|
+
return;
|
|
70
|
+
const type = count === 1 ? "property" : "properties";
|
|
71
|
+
throw new ExpectationError(context, negative, `to include ${count} ${type}`, {
|
|
72
|
+
diff: true,
|
|
73
|
+
value: actual,
|
|
74
|
+
props
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
function includesValues(context, negative, expected) {
|
|
78
|
+
context.toBeInstanceOf(Object);
|
|
79
|
+
if (typeof context.value[Symbol.iterator] !== "function") {
|
|
80
|
+
throw new ExpectationError(context, false, "to be an iterable object");
|
|
81
|
+
}
|
|
82
|
+
const actual = new Set(context.value);
|
|
83
|
+
const values = [];
|
|
84
|
+
if (negative) {
|
|
85
|
+
for (const exp of expected) {
|
|
86
|
+
for (const act of actual) {
|
|
87
|
+
const result = diff(act, exp);
|
|
88
|
+
if (result.diff)
|
|
89
|
+
continue;
|
|
90
|
+
values.push({ diff: true, extra: act });
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
} else {
|
|
95
|
+
for (const exp of expected) {
|
|
96
|
+
let found = false;
|
|
97
|
+
for (const act of actual) {
|
|
98
|
+
const result = diff(act, exp);
|
|
99
|
+
if (result.diff)
|
|
100
|
+
continue;
|
|
101
|
+
found = true;
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
if (!found) {
|
|
105
|
+
values.push({ diff: true, missing: exp });
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const count = values.length;
|
|
110
|
+
if (count === 0)
|
|
111
|
+
return;
|
|
112
|
+
const type = count === 1 ? "value" : "values";
|
|
113
|
+
throw new ExpectationError(context, negative, `to include ${count} ${type}`, {
|
|
114
|
+
diff: true,
|
|
115
|
+
value: context.value,
|
|
116
|
+
values
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
function includesMappings(context, negative, expected) {
|
|
120
|
+
context.toBeInstanceOf(Map);
|
|
121
|
+
const actual = context.value;
|
|
122
|
+
const keys = new Set(expected.keys());
|
|
123
|
+
const mappings = [];
|
|
124
|
+
if (negative) {
|
|
125
|
+
for (const key of keys) {
|
|
126
|
+
if (actual.has(key)) {
|
|
127
|
+
mappings.push([key, { diff: true, extra: actual.get(key) }]);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
} else {
|
|
131
|
+
for (const key of keys) {
|
|
132
|
+
if (!actual.has(key)) {
|
|
133
|
+
mappings.push([key, { diff: true, missing: expected.get(key) }]);
|
|
134
|
+
} else {
|
|
135
|
+
const result = diff(actual.get(key), expected.get(key));
|
|
136
|
+
if (result.diff)
|
|
137
|
+
mappings.push([key, result]);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
const count = mappings.length;
|
|
142
|
+
if (count === 0)
|
|
143
|
+
return;
|
|
144
|
+
const type = count === 1 ? "mapping" : "mappings";
|
|
145
|
+
throw new ExpectationError(context, negative, `to include ${count} ${type}`, {
|
|
146
|
+
diff: true,
|
|
147
|
+
value: context.value,
|
|
148
|
+
mappings
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
export {
|
|
152
|
+
ToInclude,
|
|
153
|
+
ToMatchContents,
|
|
154
|
+
includesMappings,
|
|
155
|
+
includesProps,
|
|
156
|
+
includesValues
|
|
157
|
+
};
|
|
158
|
+
//# sourceMappingURL=include.mjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/expectation/include.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// expectation/print.ts
|
|
21
|
+
var print_exports = {};
|
|
22
|
+
__export(print_exports, {
|
|
23
|
+
printDiff: () => printDiff
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(print_exports);
|
|
26
|
+
var import_logging = require("@plugjs/plug/logging");
|
|
27
|
+
var import_utils = require("@plugjs/plug/utils");
|
|
28
|
+
var import_types = require("./types.cjs");
|
|
29
|
+
var _opnPar = (0, import_logging.$gry)("(");
|
|
30
|
+
var _clsPar = (0, import_logging.$gry)(")");
|
|
31
|
+
var _opnCrl = (0, import_logging.$gry)("{");
|
|
32
|
+
var _clsCrl = (0, import_logging.$gry)("}");
|
|
33
|
+
var _curls = (0, import_logging.$gry)("{}");
|
|
34
|
+
var _opnSqr = (0, import_logging.$gry)("[");
|
|
35
|
+
var _clsSqr = (0, import_logging.$gry)("]");
|
|
36
|
+
var _squares = (0, import_logging.$gry)("[]");
|
|
37
|
+
var _slash = (0, import_logging.$gry)("/");
|
|
38
|
+
var _tilde = (0, import_logging.$gry)("~");
|
|
39
|
+
var _hellip = (0, import_logging.$gry)("\u2026");
|
|
40
|
+
var _error = `${_opnPar}${(0, import_logging.$gry)((0, import_logging.$und)("error"))}${_clsPar}`;
|
|
41
|
+
var _string = `${_opnPar}${(0, import_logging.$gry)((0, import_logging.$und)("string"))}${_clsPar}`;
|
|
42
|
+
var _extraProps = (0, import_logging.$gry)("\u2026 extra props \u2026");
|
|
43
|
+
var _diffHeader = `${(0, import_logging.$wht)("Differences")} ${_opnPar}${(0, import_logging.$red)("actual")}${_slash}${(0, import_logging.$grn)("expected")}${_slash}${(0, import_logging.$ylw)("errors")}${_clsPar}:`;
|
|
44
|
+
function printBaseDiff(log, diff, prop, mapping, comma) {
|
|
45
|
+
if ("props" in diff)
|
|
46
|
+
return printObjectDiff(log, diff, prop, mapping, comma);
|
|
47
|
+
if ("values" in diff)
|
|
48
|
+
return printObjectDiff(log, diff, prop, mapping, comma);
|
|
49
|
+
if ("mappings" in diff)
|
|
50
|
+
return printObjectDiff(log, diff, prop, mapping, comma);
|
|
51
|
+
if ("expected" in diff)
|
|
52
|
+
return printExpectedDiff(log, diff, prop, mapping, comma);
|
|
53
|
+
if ("missing" in diff)
|
|
54
|
+
return printMissingDiff(log, diff, prop, mapping, comma);
|
|
55
|
+
if ("extra" in diff)
|
|
56
|
+
return printExtraDiff(log, diff, prop, mapping, comma);
|
|
57
|
+
const { prefix, suffix } = diff.error ? (
|
|
58
|
+
// default style if error is the only property
|
|
59
|
+
fixups(prop, mapping, comma, diff.error)
|
|
60
|
+
) : diff.diff ? (
|
|
61
|
+
// label as "differs" if no error was found
|
|
62
|
+
fixups(prop, mapping, comma, diff.error, import_logging.$red, "differs")
|
|
63
|
+
) : fixups(prop, mapping, comma, diff.error);
|
|
64
|
+
dump(log, diff.value, prefix, suffix, diff.diff ? import_logging.$red : import_logging.$wht);
|
|
65
|
+
}
|
|
66
|
+
function printExpectedDiff(log, diff, prop, mapping, comma) {
|
|
67
|
+
if (typeof diff.value === "string" && typeof diff.expected === "string") {
|
|
68
|
+
const { prefix, suffix } = fixups(prop, mapping, false, diff.error);
|
|
69
|
+
log.warn(`${prefix}${_string}${suffix}`);
|
|
70
|
+
(0, import_utils.textDiff)(diff.value, diff.expected).split("\n").forEach((line) => {
|
|
71
|
+
log.warn(` ${_hellip} ${line}`);
|
|
72
|
+
});
|
|
73
|
+
} else if (diff.value === null || typeof diff.value !== "object") {
|
|
74
|
+
const { prefix, suffix } = fixups(prop, mapping, comma, diff.error);
|
|
75
|
+
const joined = `${prefix}${(0, import_logging.$red)(stringify(diff.value))} ${_tilde} `;
|
|
76
|
+
dump(log, diff.expected, joined, suffix, import_logging.$grn);
|
|
77
|
+
} else if (diff.expected === null || typeof diff.expected !== "object") {
|
|
78
|
+
const { prefix, suffix } = fixups(prop, mapping, comma, diff.error);
|
|
79
|
+
const joined = ` ${_tilde} ${(0, import_logging.$grn)(stringify(diff.expected))}${suffix}`;
|
|
80
|
+
dump(log, diff.value, prefix, joined, import_logging.$red);
|
|
81
|
+
} else {
|
|
82
|
+
const { prefix, suffix: suffix1 } = fixups(prop, mapping, false, "");
|
|
83
|
+
const { suffix: suffix2 } = fixups(prop, mapping, comma, diff.error);
|
|
84
|
+
const lastLine = dumpAndContinue(log, diff.expected, prefix, suffix1, import_logging.$red);
|
|
85
|
+
dump(log, diff.value, `${lastLine} ${_tilde} `, suffix2, import_logging.$grn);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function printMissingDiff(log, diff, prop, mapping, comma) {
|
|
89
|
+
const { prefix, suffix } = fixups(prop, mapping, comma, diff.error, import_logging.$red, "missing");
|
|
90
|
+
dump(log, diff.missing, prefix, suffix, import_logging.$red);
|
|
91
|
+
}
|
|
92
|
+
function printExtraDiff(log, diff, prop, mapping, comma) {
|
|
93
|
+
const { prefix, suffix } = fixups(prop, mapping, comma, diff.error, import_logging.$red, "extra");
|
|
94
|
+
dump(log, diff.extra, prefix, suffix, import_logging.$red);
|
|
95
|
+
}
|
|
96
|
+
function printObjectDiff(log, diff, prop, mapping, comma) {
|
|
97
|
+
const { prefix, suffix } = fixups(prop, mapping, comma, diff.error);
|
|
98
|
+
const value = diff.value;
|
|
99
|
+
const ctor = Object.getPrototypeOf(value)?.constructor;
|
|
100
|
+
const string = ctor === Object || ctor === Array ? "" : (0, import_types.stringifyValue)(value);
|
|
101
|
+
let line = string ? `${prefix}${(0, import_logging.$wht)(string)} ` : prefix;
|
|
102
|
+
let marked = false;
|
|
103
|
+
if (diff.values) {
|
|
104
|
+
if (diff.values.length === 0) {
|
|
105
|
+
line = `${line}${_squares}`;
|
|
106
|
+
} else {
|
|
107
|
+
log.warn(`${line}${_opnSqr}`);
|
|
108
|
+
log.enter();
|
|
109
|
+
try {
|
|
110
|
+
for (const subdiff of diff.values) {
|
|
111
|
+
printBaseDiff(log, subdiff, "", false, true);
|
|
112
|
+
}
|
|
113
|
+
} finally {
|
|
114
|
+
log.leave();
|
|
115
|
+
}
|
|
116
|
+
line = _clsSqr;
|
|
117
|
+
}
|
|
118
|
+
marked = true;
|
|
119
|
+
} else if (diff.mappings) {
|
|
120
|
+
if (Object.keys(diff.mappings).length === 0) {
|
|
121
|
+
line = `${line}${_curls}`;
|
|
122
|
+
} else {
|
|
123
|
+
log.warn(`${line}${_opnCrl}`);
|
|
124
|
+
log.enter();
|
|
125
|
+
try {
|
|
126
|
+
for (const [key, subdiff] of diff.mappings) {
|
|
127
|
+
printBaseDiff(log, subdiff, (0, import_types.stringifyValue)(key), true, true);
|
|
128
|
+
}
|
|
129
|
+
} finally {
|
|
130
|
+
log.leave();
|
|
131
|
+
}
|
|
132
|
+
line = _clsCrl;
|
|
133
|
+
}
|
|
134
|
+
marked = true;
|
|
135
|
+
}
|
|
136
|
+
if (diff.props) {
|
|
137
|
+
if (marked)
|
|
138
|
+
line = `${line} ${_extraProps} `;
|
|
139
|
+
if (Object.keys(diff.props).length === 0) {
|
|
140
|
+
line = `${line}${_curls}`;
|
|
141
|
+
} else {
|
|
142
|
+
log.warn(`${line}${_opnCrl}`);
|
|
143
|
+
log.enter();
|
|
144
|
+
try {
|
|
145
|
+
for (const [prop2, subdiff] of Object.entries(diff.props)) {
|
|
146
|
+
printBaseDiff(log, subdiff, (0, import_types.stringifyValue)(prop2), false, true);
|
|
147
|
+
}
|
|
148
|
+
} finally {
|
|
149
|
+
log.leave();
|
|
150
|
+
}
|
|
151
|
+
line = _clsCrl;
|
|
152
|
+
}
|
|
153
|
+
marked = true;
|
|
154
|
+
}
|
|
155
|
+
log.warn(`${line}${suffix}`);
|
|
156
|
+
}
|
|
157
|
+
function stringify(value) {
|
|
158
|
+
if (typeof value === "string")
|
|
159
|
+
return JSON.stringify(value);
|
|
160
|
+
return (0, import_types.stringifyValue)(value);
|
|
161
|
+
}
|
|
162
|
+
function fixups(prop, mapping, comma, error, color, label) {
|
|
163
|
+
if (error)
|
|
164
|
+
color = color || import_logging.$ylw;
|
|
165
|
+
const lbl = label ? `${_opnPar}${(0, import_logging.$gry)((0, import_logging.$und)(label))}${_clsPar} ` : "";
|
|
166
|
+
const sep = mapping ? " => " : ": ";
|
|
167
|
+
const prefix = prop ? color ? `${(0, import_logging.$gry)(lbl)}${color(prop)}${(0, import_logging.$gry)(sep)}` : `${(0, import_logging.$gry)(lbl)}${prop}${(0, import_logging.$gry)(sep)}` : label ? `${(0, import_logging.$gry)(lbl)}` : "";
|
|
168
|
+
error = error ? ` ${_error} ${(0, import_logging.$ylw)(error)}` : "";
|
|
169
|
+
const suffix = `${comma ? (0, import_logging.$gry)(",") : ""}${error}`;
|
|
170
|
+
return { prefix, suffix };
|
|
171
|
+
}
|
|
172
|
+
function dump(log, value, prefix, suffix, color, stack = []) {
|
|
173
|
+
log.warn(dumpAndContinue(log, value, prefix, suffix, color, stack));
|
|
174
|
+
}
|
|
175
|
+
function dumpAndContinue(log, value, prefix, suffix, color, stack = []) {
|
|
176
|
+
if (value === null || typeof value !== "object") {
|
|
177
|
+
return `${prefix}${color(stringify(value))}${suffix}`;
|
|
178
|
+
}
|
|
179
|
+
const circular = stack.indexOf(value);
|
|
180
|
+
if (circular >= 0) {
|
|
181
|
+
return `${prefix}${(0, import_logging.$gry)((0, import_logging.$und)(`<circular ${circular}>`))}${suffix}`;
|
|
182
|
+
}
|
|
183
|
+
const ctor = Object.getPrototypeOf(value)?.constructor;
|
|
184
|
+
const string = ctor === Object || ctor === Array ? "" : (0, import_types.stringifyValue)(value);
|
|
185
|
+
const keys = new Set(Object.keys(value));
|
|
186
|
+
let line = string ? `${prefix}${(0, import_logging.$wht)(string)} ` : prefix;
|
|
187
|
+
let marked = false;
|
|
188
|
+
if (Array.isArray(value)) {
|
|
189
|
+
if (value.length === 0) {
|
|
190
|
+
line = `${line}${_squares}`;
|
|
191
|
+
} else {
|
|
192
|
+
log.warn(`${line}${_opnSqr}`);
|
|
193
|
+
log.enter();
|
|
194
|
+
try {
|
|
195
|
+
for (let i = 0; i < value.length; i++) {
|
|
196
|
+
const { prefix: prefix2, suffix: suffix2 } = fixups("", false, true, void 0, color);
|
|
197
|
+
dump(log, value[i], prefix2, suffix2, color, [...stack, value]);
|
|
198
|
+
keys.delete(String(i));
|
|
199
|
+
}
|
|
200
|
+
} finally {
|
|
201
|
+
log.leave();
|
|
202
|
+
}
|
|
203
|
+
line = _clsSqr;
|
|
204
|
+
}
|
|
205
|
+
marked = true;
|
|
206
|
+
} else if (value instanceof Set) {
|
|
207
|
+
if (value.size === 0) {
|
|
208
|
+
line = `${line}${_squares}`;
|
|
209
|
+
} else {
|
|
210
|
+
log.warn(`${line}${_opnSqr}`);
|
|
211
|
+
log.enter();
|
|
212
|
+
try {
|
|
213
|
+
const { prefix: prefix2, suffix: suffix2 } = fixups("", false, true, void 0, color);
|
|
214
|
+
value.forEach((v) => dump(log, v, prefix2, suffix2, color, [...stack, value]));
|
|
215
|
+
} finally {
|
|
216
|
+
log.leave();
|
|
217
|
+
}
|
|
218
|
+
line = _clsSqr;
|
|
219
|
+
}
|
|
220
|
+
marked = true;
|
|
221
|
+
} else if (value instanceof Map) {
|
|
222
|
+
if (value.size === 0) {
|
|
223
|
+
line = `${line}${_curls}`;
|
|
224
|
+
} else {
|
|
225
|
+
log.warn(`${line}${_opnCrl}`);
|
|
226
|
+
log.enter();
|
|
227
|
+
try {
|
|
228
|
+
for (const [key, subvalue] of value) {
|
|
229
|
+
const { prefix: prefix2, suffix: suffix2 } = fixups((0, import_types.stringifyValue)(key), true, true, void 0, color);
|
|
230
|
+
dump(log, subvalue, prefix2, suffix2, color, [...stack, value]);
|
|
231
|
+
}
|
|
232
|
+
} finally {
|
|
233
|
+
log.leave();
|
|
234
|
+
}
|
|
235
|
+
line = _clsCrl;
|
|
236
|
+
}
|
|
237
|
+
marked = true;
|
|
238
|
+
}
|
|
239
|
+
if (value instanceof String) {
|
|
240
|
+
const length = value.valueOf().length;
|
|
241
|
+
for (let i = 0; i < length; i++)
|
|
242
|
+
keys.delete(String(i));
|
|
243
|
+
}
|
|
244
|
+
if (keys.size) {
|
|
245
|
+
if (marked)
|
|
246
|
+
line = `${line} ${_extraProps} `;
|
|
247
|
+
log.warn(`${line}${_opnCrl}`);
|
|
248
|
+
log.enter();
|
|
249
|
+
try {
|
|
250
|
+
for (const key of keys) {
|
|
251
|
+
const { prefix: prefix2, suffix: suffix2 } = fixups((0, import_types.stringifyValue)(key), false, true, void 0, color);
|
|
252
|
+
dump(log, value[key], prefix2, suffix2, color, [...stack, value]);
|
|
253
|
+
}
|
|
254
|
+
} finally {
|
|
255
|
+
log.leave();
|
|
256
|
+
}
|
|
257
|
+
line = _clsCrl;
|
|
258
|
+
marked = true;
|
|
259
|
+
}
|
|
260
|
+
if (marked) {
|
|
261
|
+
return `${line}${suffix}`;
|
|
262
|
+
} else {
|
|
263
|
+
return `${line}${_curls}${suffix}`;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
function printDiff(log, diff, header = true) {
|
|
267
|
+
if (!header)
|
|
268
|
+
return printBaseDiff(log, diff, "", false, false);
|
|
269
|
+
log.warn(_diffHeader);
|
|
270
|
+
log.enter();
|
|
271
|
+
try {
|
|
272
|
+
printBaseDiff(log, diff, "", false, false);
|
|
273
|
+
} finally {
|
|
274
|
+
log.leave();
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
278
|
+
0 && (module.exports = {
|
|
279
|
+
printDiff
|
|
280
|
+
});
|
|
281
|
+
//# sourceMappingURL=print.cjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/expectation/print.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": ["prop", "prefix", "suffix"]
|
|
6
|
+
}
|