-
Notifications
You must be signed in to change notification settings - Fork 0
/
original-code-require-override.ts
87 lines (72 loc) · 2.57 KB
/
original-code-require-override.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
// Note: Needs to be before transpilation hook because of cinder/babel
import { readFileSync } from 'fs';
import Module from 'module';
import { dirname, join, resolve } from 'path';
import globby from 'globby';
import config from '@monorepo/config';
const packageJsonDirs = globby.sync(
config.workspaces.map((workspacePath) => join(workspacePath, 'package.json')),
{
onlyFiles: true,
},
);
const workspacedPackageNames = new Map();
for (const jsonFilePath of packageJsonDirs) {
const dir = dirname(jsonFilePath);
try {
const json = JSON.parse(readFileSync(jsonFilePath, 'utf8'));
if (json.exports === undefined || typeof json.exports === 'string') {
continue;
}
if (json.exports['module'] !== undefined) {
continue;
}
const monorepoOriginalPath = json.exports['monorepo-original'];
if (monorepoOriginalPath !== undefined) {
if (typeof monorepoOriginalPath === 'string') {
const mappedResolvedRequirePath = resolve(dir, monorepoOriginalPath);
workspacedPackageNames.set(json.name, mappedResolvedRequirePath);
} else {
for (const [relativeRequirePath, mappedRequirePath] of Object.entries<string>(
monorepoOriginalPath,
)) {
const packageResolvedRequirePath = join(json.name, relativeRequirePath);
const mappedResolvedRequirePath = resolve(dir, mappedRequirePath);
workspacedPackageNames.set(
packageResolvedRequirePath,
mappedResolvedRequirePath,
);
}
}
} else {
for (const [relativeRequirePath, mappings] of Object.entries<string>(
json.exports,
)) {
const mappedRequirePath = mappings['monorepo-original'];
if (mappedRequirePath === undefined) {
continue;
}
const packageResolvedRequirePath = join(json.name, relativeRequirePath);
const mappedResolvedRequirePath = resolve(dir, mappedRequirePath);
workspacedPackageNames.set(packageResolvedRequirePath, mappedResolvedRequirePath);
}
}
} catch (err) {
if (err.code !== 'ENOENT') {
// eslint-disable-next-line no-console
console.error(`Failed to read ${jsonFilePath}\n`, err);
}
continue;
}
}
const { require: oldRequire } = Module.prototype;
Module.prototype.require = function require(filePath, ...other) {
const patchedFilePath = (() => {
if (workspacedPackageNames.has(filePath)) {
return workspacedPackageNames.get(filePath)!;
} else {
return filePath;
}
})();
return oldRequire.apply(this, [patchedFilePath, ...other]);
};