Skip to content

Commit 1cc5ded

Browse files
authored
feat: add replaceWorkspaceWithFileProtocol and replaceRootWithFileProtocol (#18)
1 parent e6b5551 commit 1cc5ded

File tree

3 files changed

+125
-20
lines changed

3 files changed

+125
-20
lines changed
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import { join } from 'node:path';
2+
import { pathToFileURL } from 'node:url';
3+
import { createSnapshotSerializer } from 'path-serializer';
4+
import { expect, test } from 'vitest';
5+
6+
test('should work with __dirname', () => {
7+
expect.addSnapshotSerializer(
8+
createSnapshotSerializer({
9+
root: __dirname,
10+
features: {
11+
escapeDoubleQuotes: false,
12+
addDoubleQuotes: false,
13+
},
14+
}),
15+
);
16+
17+
const case0 = __dirname;
18+
expect(case0).toMatchInlineSnapshot('<ROOT>');
19+
20+
const case1 = join(__dirname, 'src', 'foo.ts');
21+
expect(case1).toMatchInlineSnapshot('<ROOT>/src/foo.ts');
22+
23+
const case2 = pathToFileURL(case0).toString();
24+
expect(case2).toMatchInlineSnapshot('<ROOT>');
25+
});
26+
27+
test('real world case: nodejs win32 error stack', () => {
28+
let stack: string;
29+
if (process.platform === 'win32') {
30+
expect.addSnapshotSerializer(
31+
createSnapshotSerializer({
32+
root: 'E:\\Project\\lynx-app',
33+
features: {
34+
escapeDoubleQuotes: false,
35+
addDoubleQuotes: false,
36+
},
37+
}),
38+
);
39+
stack = `× Error: Cannot find module 'E:\\Project\\lynx-app\\node_modules\\@lynx-js\\tasm\\build\\win32\\Release\\lepus.node'
40+
│ Require stack:
41+
│ - E:\\Project\\lynx-app\\node_modules\\@lynx-js\\tasm\\index.js
42+
│ at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15)
43+
│ at Module._load (node:internal/modules/cjs/loader:1051:27)
44+
│ at Module.require (node:internal/modules/cjs/loader:1311:19)
45+
│ at require (node:internal/modules/helpers:179:18)
46+
│ at encode_napi (E:\\Project\\lynx-app\\node_modules\\@lynx-js\\tasm\\index.js:48:17)
47+
│ at Object.fn (file:///E:/Project/lynx-app/node_modules/@lynx-js/template-webpack-plugin/lib/LynxEncodePlugin.js:145:71)
48+
│ at Object.fn (file:///E:/Project/lynx-app/node_modules/@lynx-js/template-webpack-plugin/lib/LynxEncodePlugin.js:145:71)`;
49+
} else {
50+
expect.addSnapshotSerializer(
51+
createSnapshotSerializer({
52+
root: '/usr/project/lynx-app',
53+
features: {
54+
escapeDoubleQuotes: false,
55+
addDoubleQuotes: false,
56+
},
57+
}),
58+
);
59+
stack = `× Error: Cannot find module '/usr/project/lynx-app/node_modules/@lynx-js/tasm/build/win32/Release/lepus.node'
60+
│ Require stack:
61+
│ - /usr/project/lynx-app/node_modules/@lynx-js/tasm/index.js
62+
│ at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15)
63+
│ at Module._load (node:internal/modules/cjs/loader:1051:27)
64+
│ at Module.require (node:internal/modules/cjs/loader:1311:19)
65+
│ at require (node:internal/modules/helpers:179:18)
66+
│ at encode_napi (/usr/project/lynx-app/node_modules/@lynx-js/tasm/index.js:48:17)
67+
│ at Object.fn (file:///usr/project/lynx-app/node_modules/@lynx-js/template-webpack-plugin/lib/LynxEncodePlugin.js:145:71)
68+
│ at Object.fn (file:///usr/project/lynx-app/node_modules/@lynx-js/template-webpack-plugin/lib/LynxEncodePlugin.js:145:71)`;
69+
}
70+
expect(stack).toMatchInlineSnapshot(`
71+
× Error: Cannot find module '<ROOT>/node_modules/@lynx-js/tasm/build/win32/Release/lepus.node'
72+
│ Require stack:
73+
│ - <ROOT>/node_modules/@lynx-js/tasm/index.js
74+
│ at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15)
75+
│ at Module._load (node:internal/modules/cjs/loader:1051:27)
76+
│ at Module.require (node:internal/modules/cjs/loader:1311:19)
77+
│ at require (node:internal/modules/helpers:179:18)
78+
│ at encode_napi (<ROOT>/node_modules/@lynx-js/tasm/index.js:48:17)
79+
│ at Object.fn (<ROOT>/node_modules/@lynx-js/template-webpack-plugin/lib/LynxEncodePlugin.js:145:71)
80+
│ at Object.fn (<ROOT>/node_modules/@lynx-js/template-webpack-plugin/lib/LynxEncodePlugin.js:145:71)
81+
`);
82+
});

src/createSnapshotSerializer.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { pathToFileURL } from 'node:url';
12
import { applyMatcherReplacement } from './applyMatcherReplacement';
23
import {
34
createHomeDirMatchers,
@@ -30,8 +31,10 @@ export function createSnapshotSerializer(
3031
} = options || {};
3132

3233
const {
33-
replaceRoot = true,
34+
replaceWorkspaceWithFileProtocol = true,
3435
replaceWorkspace = true,
36+
replaceRootWithFileProtocol = true,
37+
replaceRoot = true,
3538
replacePnpmInner = true,
3639
replaceTmpDir = true,
3740
replaceHomeDir = true,
@@ -83,6 +86,20 @@ export function createSnapshotSerializer(
8386
replaced = beforeSerialize(replaced);
8487
}
8588

89+
if (replaceWorkspaceWithFileProtocol && workspace) {
90+
// this is a polyfill for .replaceAll(string, string)
91+
replaced = replaced
92+
.split(pathToFileURL(workspace).toString())
93+
.join('<WORKSPACE>');
94+
}
95+
96+
if (replaceRootWithFileProtocol && root) {
97+
// this is a polyfill for .replaceAll(string, string)
98+
replaced = replaced
99+
.split(pathToFileURL(root).toString())
100+
.join('<ROOT>');
101+
}
102+
86103
if (transformWin32Path) {
87104
replaced = normalizeCodeToPosix(replaced);
88105
}

src/types.ts

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,64 +7,70 @@ export interface PathMatcher {
77

88
export interface Features {
99
/**
10-
* D:\\foo\\node_modules\\<PNPM_INNER>\\css-loader\\utils.ts
11-
* -> /d/foo/node_modules/<PNPM_INNER>/css-loader/utils.ts
10+
* `file:///foo/rspack/packages/core/src` -> `<WORKSPACE>/src`
1211
* @default true
1312
*/
14-
transformWin32Path?: boolean;
13+
replaceWorkspaceWithFileProtocol?: boolean;
1514
/**
16-
* file:///foo/rspack/packages/core/src -> <WORKSPACE>/src
15+
* `file:///foo/node_modules/.pnpm` -> `<ROOT>/node_modules/.pnpm`
16+
* @default true
1717
*/
18-
replaceWorkspaceWithFileProtocol?: boolean;
18+
replaceRootWithFileProtocol?: boolean;
1919
/**
20-
* /foo/rspack/packages/core/src -> <WORKSPACE>/src
20+
* `D:\\foo\\node_modules\\<PNPM_INNER>\\css-loader\\utils.ts`
21+
*
22+
* ->
23+
*
24+
* `/d/foo/node_modules/<PNPM_INNER>/css-loader/utils.ts`
2125
* @default true
2226
*/
23-
replaceWorkspace?: boolean;
27+
transformWin32Path?: boolean;
2428
/**
25-
* file:///foo/node_modules/.pnpm -> <ROOT>/node_modules/.pnpm
29+
* `/foo/rspack/packages/core/src` -> `<WORKSPACE>/src`
2630
* @default true
2731
*/
28-
replaceRootWithFileProtocol?: boolean;
32+
replaceWorkspace?: boolean;
2933
/**
30-
* /foo/node_modules/.pnpm -> <ROOT>/node_modules/.pnpm
34+
* `/foo/node_modules/.pnpm` -> `<ROOT>/node_modules/.pnpm`
3135
* @default true
3236
*/
3337
replaceRoot?: boolean;
3438
/**
35-
* /foo/node_modules/.pnpm/@swc[email protected]/node_modules/@swc/helpers/esm/_class_private_method_get.js
36-
* -> /foo/node_modules/<PNPM_INNER>/@swc/helpers/esm/_class_private_method_get.js
39+
* `/foo/node_modules/.pnpm/@[email protected]/node_modules/@swc/helpers/esm/_class_private_method_get.js`
40+
*
41+
* ->
42+
*
43+
* `/foo/node_modules/<PNPM_INNER>/@swc/helpers/esm/_class_private_method_get.js`
3744
* @default true
3845
*/
3946
replacePnpmInner?: boolean;
4047
/**
41-
* `${os.tmpdir()}/src/index.ts` -> "<TEMP>/src/index.ts"
48+
* `${os.tmpdir()}/src/index.ts` -> `<TEMP>/src/index.ts`
4249
* @default true
4350
*/
4451
replaceTmpDir?: boolean;
4552
/**
46-
* `${os.homedir()}/src/index.ts` -> "<HOME>/src/index.ts"
53+
* `${os.homedir()}/src/index.ts` -> `<HOME>/src/index.ts`
4754
* @default true
4855
*/
4956
replaceHomeDir?: boolean;
5057
/**
51-
* \u001b[1mBold Text\u001b[0m
52-
* -> <CLR=BOLD>Bold Text<CLR=0>
58+
* `\u001b[1mBold Text\u001b[0m` -> `<CLR=BOLD>Bold Text<CLR=0>`
5359
* @default true
5460
*/
5561
transformCLR?: boolean;
5662
/**
57-
* "" -> \"\"
63+
* `""` -> `\"\"`
5864
* @default true
5965
*/
6066
escapeDoubleQuotes?: boolean;
6167
/**
62-
* \r\n -> \n
68+
* `\r\n` -> `\n`
6369
* @default true
6470
*/
6571
escapeEOL?: boolean;
6672
/**
67-
* foo -> "foo"
73+
* `foo` -> `"foo"`
6874
* @default true
6975
*/
7076
addDoubleQuotes?: boolean;

0 commit comments

Comments
 (0)