skuba 3.17.0-beta.3 → 3.17.0-beta.4
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/jest/moduleNameMapper.js +75 -0
- package/jest/moduleNameMapper.test.ts +75 -0
- package/jest/transform.js +19 -0
- package/package.json +2 -1
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
const path = require('path');
|
|
2
|
+
|
|
3
|
+
const { pathsToModuleNameMapper } = require('ts-jest/utils');
|
|
4
|
+
const {
|
|
5
|
+
sys,
|
|
6
|
+
findConfigFile,
|
|
7
|
+
readConfigFile,
|
|
8
|
+
parseJsonConfigFileContent,
|
|
9
|
+
} = require('typescript');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Set a default `src` module alias for backward compatibility.
|
|
13
|
+
*
|
|
14
|
+
* TODO: drop this default in skuba v4.
|
|
15
|
+
*/
|
|
16
|
+
const DEFAULT_PATHS = { src: ['src'], 'src/*': ['src/*'] };
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @returns {unknown}
|
|
20
|
+
*/
|
|
21
|
+
const getConfigFromDisk = () => {
|
|
22
|
+
const filename =
|
|
23
|
+
findConfigFile('.', sys.fileExists.bind(this), tsconfigName) ||
|
|
24
|
+
'tsconfig.json';
|
|
25
|
+
|
|
26
|
+
return readConfigFile(filename, sys.readFile.bind(this)).config;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
module.exports.createModuleNameMapper = (getConfig = getConfigFromDisk) => {
|
|
30
|
+
try {
|
|
31
|
+
const json = getConfig();
|
|
32
|
+
|
|
33
|
+
const parsedConfig = parseJsonConfigFileContent(json, sys, '.');
|
|
34
|
+
|
|
35
|
+
const paths = Object.fromEntries(
|
|
36
|
+
Object.entries(parsedConfig.options.paths ?? DEFAULT_PATHS).flatMap(
|
|
37
|
+
([key, values]) => [
|
|
38
|
+
[
|
|
39
|
+
key.replace(/\/$/, ''),
|
|
40
|
+
values.map((value) => value.replace(/\/$/, '')),
|
|
41
|
+
],
|
|
42
|
+
...(key.endsWith('/*')
|
|
43
|
+
? [
|
|
44
|
+
[
|
|
45
|
+
key.replace(/\/\*$/, ''),
|
|
46
|
+
values.map((value) => value.replace(/\/\*$/, '')),
|
|
47
|
+
],
|
|
48
|
+
]
|
|
49
|
+
: [
|
|
50
|
+
[
|
|
51
|
+
path.join(key, '*'),
|
|
52
|
+
values.map((value) => path.join(value, '*')),
|
|
53
|
+
],
|
|
54
|
+
]),
|
|
55
|
+
],
|
|
56
|
+
),
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
const prefix = path.join('<rootDir>', parsedConfig.options.baseUrl || '.');
|
|
60
|
+
|
|
61
|
+
const moduleNameMapper = pathsToModuleNameMapper(paths, { prefix });
|
|
62
|
+
|
|
63
|
+
return Object.fromEntries(
|
|
64
|
+
Object.entries(moduleNameMapper).map(([key, values]) => [
|
|
65
|
+
key,
|
|
66
|
+
Array.isArray(values)
|
|
67
|
+
? values.map((value) => path.normalize(value))
|
|
68
|
+
: path.normalize(values),
|
|
69
|
+
]),
|
|
70
|
+
);
|
|
71
|
+
} catch {
|
|
72
|
+
// Bail out here to support zero-config mode.
|
|
73
|
+
return pathsToModuleNameMapper(DEFAULT_PATHS, { prefix: '<rootDir>' });
|
|
74
|
+
}
|
|
75
|
+
};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { createModuleNameMapper } from './moduleNameMapper';
|
|
2
|
+
|
|
3
|
+
describe('moduleNameMapper', () => {
|
|
4
|
+
const act = (paths?: unknown, baseUrl?: string) =>
|
|
5
|
+
createModuleNameMapper(() => ({
|
|
6
|
+
compilerOptions: {
|
|
7
|
+
baseUrl,
|
|
8
|
+
paths,
|
|
9
|
+
},
|
|
10
|
+
}));
|
|
11
|
+
|
|
12
|
+
it('expands wildcard paths', () =>
|
|
13
|
+
expect(act({ 'src/*': ['src/*'], 'lib/wip/*': ['lib/wip/*'] }))
|
|
14
|
+
.toMatchInlineSnapshot(`
|
|
15
|
+
Object {
|
|
16
|
+
"^lib/wip$": "<rootDir>/lib/wip",
|
|
17
|
+
"^lib/wip/(.*)$": "<rootDir>/lib/wip/$1",
|
|
18
|
+
"^src$": "<rootDir>/src",
|
|
19
|
+
"^src/(.*)$": "<rootDir>/src/$1",
|
|
20
|
+
}
|
|
21
|
+
`));
|
|
22
|
+
|
|
23
|
+
it('expands non-wildcard paths', () =>
|
|
24
|
+
expect(act({ cli: ['cli'], 'src/': ['src/'] })).toMatchInlineSnapshot(`
|
|
25
|
+
Object {
|
|
26
|
+
"^cli$": "<rootDir>/cli",
|
|
27
|
+
"^cli/(.*)$": "<rootDir>/cli/$1",
|
|
28
|
+
"^src$": "<rootDir>/src",
|
|
29
|
+
"^src/(.*)$": "<rootDir>/src/$1",
|
|
30
|
+
}
|
|
31
|
+
`));
|
|
32
|
+
|
|
33
|
+
it('expands duplicate asymmetric paths', () =>
|
|
34
|
+
expect(
|
|
35
|
+
act({
|
|
36
|
+
jquery: ['node_modules/jquery/dist/jquery'],
|
|
37
|
+
'jquery/*': ['node_modules/jquery/dist/jquery/*'],
|
|
38
|
+
}),
|
|
39
|
+
).toMatchInlineSnapshot(`
|
|
40
|
+
Object {
|
|
41
|
+
"^jquery$": "<rootDir>/node_modules/jquery/dist/jquery",
|
|
42
|
+
"^jquery/(.*)$": "<rootDir>/node_modules/jquery/dist/jquery/$1",
|
|
43
|
+
}
|
|
44
|
+
`));
|
|
45
|
+
|
|
46
|
+
it('respects a base URL', () =>
|
|
47
|
+
expect(act({ cli: ['../cli'], 'app/*': ['app/*'] }, 'src'))
|
|
48
|
+
.toMatchInlineSnapshot(`
|
|
49
|
+
Object {
|
|
50
|
+
"^app$": "<rootDir>/src/app",
|
|
51
|
+
"^app/(.*)$": "<rootDir>/src/app/$1",
|
|
52
|
+
"^cli$": "<rootDir>/cli",
|
|
53
|
+
"^cli/(.*)$": "<rootDir>/cli/$1",
|
|
54
|
+
}
|
|
55
|
+
`));
|
|
56
|
+
|
|
57
|
+
it('respects no paths', () =>
|
|
58
|
+
expect(act({})).toMatchInlineSnapshot(`Object {}`));
|
|
59
|
+
|
|
60
|
+
it('falls back on undefined paths', () =>
|
|
61
|
+
expect(act(undefined)).toMatchInlineSnapshot(`
|
|
62
|
+
Object {
|
|
63
|
+
"^src$": "<rootDir>/src",
|
|
64
|
+
"^src/(.*)$": "<rootDir>/src/$1",
|
|
65
|
+
}
|
|
66
|
+
`));
|
|
67
|
+
|
|
68
|
+
it('falls back on invalid config', () =>
|
|
69
|
+
expect(act('INVALID')).toMatchInlineSnapshot(`
|
|
70
|
+
Object {
|
|
71
|
+
"^src$": "<rootDir>/src",
|
|
72
|
+
"^src/(.*)$": "<rootDir>/src/$1",
|
|
73
|
+
}
|
|
74
|
+
`));
|
|
75
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
const { defaults } = require('ts-jest/presets');
|
|
2
|
+
|
|
3
|
+
const TS_JEST_NAME = 'ts-jest';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Resolved path of the `ts-jest` preset.
|
|
7
|
+
*
|
|
8
|
+
* This allows Jest to resolve the preset even if it is installed to a nested
|
|
9
|
+
* `./node_modules/skuba/node_modules/ts-jest` directory.
|
|
10
|
+
*/
|
|
11
|
+
const TS_JEST_PATH = require.resolve(TS_JEST_NAME);
|
|
12
|
+
|
|
13
|
+
// Rewrite `ts-jest` transformations using our resolved `TS_JEST_PATH`.
|
|
14
|
+
module.exports.transform = Object.fromEntries(
|
|
15
|
+
Object.entries(defaults.transform).map(([key, value]) => [
|
|
16
|
+
key,
|
|
17
|
+
value === TS_JEST_NAME ? TS_JEST_PATH : value,
|
|
18
|
+
]),
|
|
19
|
+
);
|
package/package.json
CHANGED
|
@@ -7,11 +7,12 @@
|
|
|
7
7
|
"engines": {
|
|
8
8
|
"node": ">=12"
|
|
9
9
|
},
|
|
10
|
-
"version": "3.17.0-beta.
|
|
10
|
+
"version": "3.17.0-beta.4",
|
|
11
11
|
"main": "lib/index.js",
|
|
12
12
|
"typings": "lib/index.d.ts",
|
|
13
13
|
"files": [
|
|
14
14
|
"config/**/*",
|
|
15
|
+
"jest/**/*",
|
|
15
16
|
"lib*/**/*.d.ts",
|
|
16
17
|
"lib*/**/*.js",
|
|
17
18
|
"lib*/**/*.js.map",
|