@jsenv/snapshot 2.6.11 → 2.7.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.
- package/package.json +1 -1
- package/src/replace_fluctuating_values.js +2 -2
- package/src/side_effects/filesystem/spy_filesystem_calls.js +4 -0
- package/src/side_effects/hook_into_method.js +18 -3
- package/src/side_effects/render_side_effects.js +21 -8
- package/src/side_effects/snapshot_side_effects.js +9 -8
- package/src/side_effects/snapshot_tests.js +10 -9
package/package.json
CHANGED
|
@@ -21,7 +21,7 @@ export const replaceFluctuatingValues = (
|
|
|
21
21
|
stringType,
|
|
22
22
|
rootDirectoryUrl,
|
|
23
23
|
fileUrl,
|
|
24
|
-
|
|
24
|
+
preserveAnsi,
|
|
25
25
|
// for unit test
|
|
26
26
|
replaceFilesystemWellKnownValues = createReplaceFilesystemWellKnownValues({
|
|
27
27
|
rootDirectoryUrl,
|
|
@@ -51,7 +51,7 @@ export const replaceFluctuatingValues = (
|
|
|
51
51
|
if (stringType === "filesystem") {
|
|
52
52
|
return replaceFilesystemWellKnownValues(value);
|
|
53
53
|
}
|
|
54
|
-
if (
|
|
54
|
+
if (!preserveAnsi) {
|
|
55
55
|
value = stripAnsi(value);
|
|
56
56
|
}
|
|
57
57
|
value = replaceFilesystemWellKnownValues(value, {
|
|
@@ -37,6 +37,10 @@ export const spyFilesystemCalls = (
|
|
|
37
37
|
const fileDescriptorPathMap = new Map();
|
|
38
38
|
const fileRestoreMap = new Map();
|
|
39
39
|
const onWriteFileDone = (fileUrl, stateBefore, stateAfter) => {
|
|
40
|
+
if (!stateAfter.found) {
|
|
41
|
+
// seems to be possible somehow
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
40
44
|
// we use same type because we don't want to differentiate between
|
|
41
45
|
// - writing file for the 1st time
|
|
42
46
|
// - updating file content
|
|
@@ -29,6 +29,9 @@ export const hookIntoMethod = (
|
|
|
29
29
|
const callHooks = (hookCallbackSet, ...args) => {
|
|
30
30
|
hookExecuting = true;
|
|
31
31
|
for (const hookCallback of hookCallbackSet) {
|
|
32
|
+
if (!hookCallback.initCallback.installed) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
32
35
|
hookCallback(...args);
|
|
33
36
|
}
|
|
34
37
|
hookExecuting = false;
|
|
@@ -62,15 +65,19 @@ export const hookIntoMethod = (
|
|
|
62
65
|
allWantsToPreventOriginalCall = false;
|
|
63
66
|
}
|
|
64
67
|
if (hooks.returnPromise) {
|
|
68
|
+
hooks.returnPromise.initCallback = initCallback;
|
|
65
69
|
returnPromiseCallbackSet.add(hooks.returnPromise);
|
|
66
70
|
}
|
|
67
71
|
if (hooks.return) {
|
|
72
|
+
hooks.return.initCallback = initCallback;
|
|
68
73
|
returnCallbackSet.add(hooks.return);
|
|
69
74
|
}
|
|
70
75
|
if (hooks.catch) {
|
|
76
|
+
hooks.catch.initCallback = initCallback;
|
|
71
77
|
catchCallbackSet.add(hooks.catch);
|
|
72
78
|
}
|
|
73
79
|
if (hooks.finally) {
|
|
80
|
+
hooks.finally.initCallback = initCallback;
|
|
74
81
|
finallyCallbackSet.add(hooks.catch);
|
|
75
82
|
}
|
|
76
83
|
}
|
|
@@ -124,6 +131,7 @@ export const hookIntoMethod = (
|
|
|
124
131
|
};
|
|
125
132
|
object[method] = proxy;
|
|
126
133
|
}
|
|
134
|
+
initCallback.installed = true;
|
|
127
135
|
addInitCallback(initCallback);
|
|
128
136
|
const hook = {
|
|
129
137
|
disable: () => {
|
|
@@ -133,6 +141,7 @@ export const hookIntoMethod = (
|
|
|
133
141
|
initCallback.disabled = false;
|
|
134
142
|
},
|
|
135
143
|
remove: () => {
|
|
144
|
+
initCallback.installed = false;
|
|
136
145
|
removeInitCallback(initCallback);
|
|
137
146
|
},
|
|
138
147
|
};
|
|
@@ -220,7 +229,9 @@ export const METHOD_EXECUTION_NODE_CALLBACK = ({
|
|
|
220
229
|
// useless because are a copy of the args
|
|
221
230
|
// so the mutation we do above ( args[lastArgIndex] =)
|
|
222
231
|
// cannot be important for the method being proxied
|
|
223
|
-
args[lastArgIndex]
|
|
232
|
+
if (args[lastArgIndex] === callbackProxy) {
|
|
233
|
+
args[lastArgIndex] = lastArg;
|
|
234
|
+
}
|
|
224
235
|
};
|
|
225
236
|
});
|
|
226
237
|
}
|
|
@@ -230,7 +241,9 @@ export const METHOD_EXECUTION_NODE_CALLBACK = ({
|
|
|
230
241
|
return installProxyAndCall(originalCallback, (callbackProxy) => {
|
|
231
242
|
lastArg.context.callback = callbackProxy;
|
|
232
243
|
return () => {
|
|
233
|
-
lastArg.context.callback
|
|
244
|
+
if (lastArg.context.callback === callbackProxy) {
|
|
245
|
+
lastArg.context.callback = originalCallback;
|
|
246
|
+
}
|
|
234
247
|
};
|
|
235
248
|
});
|
|
236
249
|
}
|
|
@@ -239,7 +252,9 @@ export const METHOD_EXECUTION_NODE_CALLBACK = ({
|
|
|
239
252
|
return installProxyAndCall(originalCallback, (callbackProxy) => {
|
|
240
253
|
lastArg.oncomplete = callbackProxy;
|
|
241
254
|
return () => {
|
|
242
|
-
lastArg.oncomplete
|
|
255
|
+
if (lastArg.oncomplete === callbackProxy) {
|
|
256
|
+
lastArg.oncomplete = originalCallback;
|
|
257
|
+
}
|
|
243
258
|
};
|
|
244
259
|
});
|
|
245
260
|
}
|
|
@@ -246,6 +246,7 @@ const renderText = (
|
|
|
246
246
|
typeof value.stack === "string")
|
|
247
247
|
) {
|
|
248
248
|
onRenderError();
|
|
249
|
+
// return renderMarkdownBlock(text.value.stack);
|
|
249
250
|
const exception = createException(text.value, { rootDirectoryUrl });
|
|
250
251
|
const exceptionText = errorStackHidden
|
|
251
252
|
? `${exception.name}: ${exception.message}`
|
|
@@ -306,24 +307,36 @@ const renderPotentialAnsi = (
|
|
|
306
307
|
string,
|
|
307
308
|
{ stringType, sideEffect, sideEffectFileUrl, generateOutFileUrl, replace },
|
|
308
309
|
) => {
|
|
310
|
+
const rawTextBlock = renderMarkdownBlock(
|
|
311
|
+
replace(string, { stringType }),
|
|
312
|
+
"console",
|
|
313
|
+
);
|
|
309
314
|
// for assert we want ideally hummm
|
|
310
315
|
// colored in details block?
|
|
311
316
|
const includesAnsi = ansiRegex().test(string);
|
|
312
317
|
if (!includesAnsi) {
|
|
313
|
-
return
|
|
318
|
+
return rawTextBlock;
|
|
314
319
|
}
|
|
315
320
|
const svgFilename = `${sideEffect.code}${sideEffect.counter ? `_${sideEffect.counter}` : ""}.svg`;
|
|
316
321
|
const svgFileUrl = generateOutFileUrl(svgFilename);
|
|
317
|
-
let svgFileContent = renderTerminalSvg(
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
+
let svgFileContent = renderTerminalSvg(
|
|
323
|
+
replace(string, { stringType: "console", preserveAnsi: true }),
|
|
324
|
+
{
|
|
325
|
+
head: false,
|
|
326
|
+
paddingTop: 10,
|
|
327
|
+
paddingBottom: 10,
|
|
328
|
+
},
|
|
329
|
+
);
|
|
322
330
|
svgFileContent = replace(svgFileContent, { fileUrl: svgFileUrl });
|
|
323
331
|
writeFileSync(svgFileUrl, svgFileContent);
|
|
324
332
|
const svgFileRelativeUrl = urlToRelativeUrl(svgFileUrl, sideEffectFileUrl);
|
|
325
|
-
|
|
326
|
-
|
|
333
|
+
let md = ``;
|
|
334
|
+
md += "\n\n";
|
|
335
|
+
md += renderMarkdownDetails(`${rawTextBlock}`, {
|
|
336
|
+
summary: "see without style",
|
|
337
|
+
});
|
|
338
|
+
md += "\n";
|
|
339
|
+
return md;
|
|
327
340
|
};
|
|
328
341
|
|
|
329
342
|
export const renderFileContent = (text, { sideEffect, replace }) => {
|
|
@@ -11,21 +11,21 @@ export const snapshotSideEffects = (
|
|
|
11
11
|
fn,
|
|
12
12
|
{
|
|
13
13
|
sideEffectFileUrl,
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
outFilePattern = "./
|
|
14
|
+
outDirectoryPattern = "./side_effects/",
|
|
15
|
+
sideEffectFilePattern = "./side_effects/[basename].md",
|
|
16
|
+
outFilePattern = "./side_effects/[name]/[filename]",
|
|
17
17
|
generateOutFileUrl,
|
|
18
18
|
outDirectoryUrl,
|
|
19
19
|
errorStackHidden,
|
|
20
20
|
...captureOptions
|
|
21
21
|
} = {},
|
|
22
22
|
) => {
|
|
23
|
-
const
|
|
23
|
+
const name = urlToBasename(sourceFileUrl, true);
|
|
24
|
+
const basename = urlToBasename(sourceFileUrl);
|
|
24
25
|
if (sideEffectFileUrl === undefined) {
|
|
25
|
-
const sideEffectFileRelativeUrl = sideEffectFilePattern
|
|
26
|
-
"[basename]",
|
|
27
|
-
|
|
28
|
-
);
|
|
26
|
+
const sideEffectFileRelativeUrl = sideEffectFilePattern
|
|
27
|
+
.replaceAll("[basename]", basename)
|
|
28
|
+
.replaceAll("[name]", name);
|
|
29
29
|
sideEffectFileUrl = new URL(sideEffectFileRelativeUrl, sourceFileUrl);
|
|
30
30
|
} else {
|
|
31
31
|
sideEffectFileUrl = new URL(sideEffectFileUrl, sourceFileUrl);
|
|
@@ -42,6 +42,7 @@ export const snapshotSideEffects = (
|
|
|
42
42
|
if (generateOutFileUrl === undefined) {
|
|
43
43
|
generateOutFileUrl = (filename) => {
|
|
44
44
|
const outRelativeUrl = outFilePattern
|
|
45
|
+
.replaceAll("[name]", name)
|
|
45
46
|
.replaceAll("[basename]", basename)
|
|
46
47
|
.replaceAll("[filename]", filename);
|
|
47
48
|
const outFileUrl = new URL(outRelativeUrl, new URL("./", sourceFileUrl))
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { urlToBasename,
|
|
1
|
+
import { urlToBasename, urlToRelativeUrl } from "@jsenv/urls";
|
|
2
2
|
import {
|
|
3
3
|
takeDirectorySnapshot,
|
|
4
4
|
takeFileSnapshot,
|
|
@@ -22,9 +22,9 @@ export const snapshotTests = async (
|
|
|
22
22
|
{
|
|
23
23
|
testName = urlToBasename(testFileUrl, true),
|
|
24
24
|
sideEffectFileUrl,
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
outFilePattern = "./
|
|
25
|
+
outDirectoryPattern = "./side_effects/",
|
|
26
|
+
sideEffectFilePattern = "./side_effects/[test_basename].md",
|
|
27
|
+
outFilePattern = "./side_effects/[test_name]/[test_scenario]/[filename]",
|
|
28
28
|
rootDirectoryUrl,
|
|
29
29
|
generatedBy = true,
|
|
30
30
|
linkToSource = true,
|
|
@@ -35,11 +35,11 @@ export const snapshotTests = async (
|
|
|
35
35
|
throwWhenDiff = process.env.CI,
|
|
36
36
|
} = {},
|
|
37
37
|
) => {
|
|
38
|
+
const testBasename = urlToBasename(testFileUrl);
|
|
38
39
|
if (sideEffectFileUrl === undefined) {
|
|
39
|
-
const sideEffectFileRelativeUrl = sideEffectFilePattern
|
|
40
|
-
"[test_name]",
|
|
41
|
-
|
|
42
|
-
);
|
|
40
|
+
const sideEffectFileRelativeUrl = sideEffectFilePattern
|
|
41
|
+
.replaceAll("[test_name]", testName)
|
|
42
|
+
.replaceAll("[test_basename]", testBasename);
|
|
43
43
|
sideEffectFileUrl = new URL(sideEffectFileRelativeUrl, testFileUrl);
|
|
44
44
|
} else {
|
|
45
45
|
sideEffectFileUrl = new URL(sideEffectFileUrl, testFileUrl);
|
|
@@ -62,7 +62,7 @@ export const snapshotTests = async (
|
|
|
62
62
|
filesystemEffects,
|
|
63
63
|
});
|
|
64
64
|
let markdown = "";
|
|
65
|
-
markdown += `# ${
|
|
65
|
+
markdown += `# ${testName}`;
|
|
66
66
|
if (generatedBy) {
|
|
67
67
|
let generatedByLink = renderSmallLink(
|
|
68
68
|
{
|
|
@@ -103,6 +103,7 @@ export const snapshotTests = async (
|
|
|
103
103
|
const generateOutFileUrl = (filename) => {
|
|
104
104
|
const outFileRelativeUrl = outFilePattern
|
|
105
105
|
.replaceAll("[test_name]", testName)
|
|
106
|
+
.replaceAll("[test_basename]", testBasename)
|
|
106
107
|
.replaceAll("[test_scenario]", testScenario)
|
|
107
108
|
.replaceAll("[filename]", filename);
|
|
108
109
|
const outFileUrl = new URL(outFileRelativeUrl, testFileUrl).href;
|