-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathindex.js
125 lines (117 loc) · 2.96 KB
/
index.js
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
const fs = require('fs');
const path = require('path');
const extensions = ['js', 'jsx', 'ts', 'tsx', 'cjs', 'mjs', 'cjsx', 'mjsx'];
const readFromPackage = (dir) => {
const manifestFile = path.resolve(dir, './package.json');
let isExisted = true;
try {
fs.accessSync(manifestFile, fs.constants.F_OK);
} catch (e) {
isExisted = false;
}
if (!isExisted) {
return dir;
}
const detail = JSON.parse(fs.readFileSync(manifestFile, {encoding: 'utf8'}))
const entry = detail.module || detail.main;
return path.resolve(dir, entry);
};
const patchExtension = (p) => {
let isExisted = true;
try {
fs.accessSync(p, fs.constants.F_OK);
} catch (e) {
isExisted = false;
}
if (!isExisted) {
const ext = extensions.find((t) => {
const np = `${p}.${t}`;
let isNpExisted = true;
try {
fs.accessSync(np, fs.constants.F_OK);
} catch (e) {
isNpExisted = false;
}
return isNpExisted;
});
if (ext) {
return `${p}.${ext}`;
}
return p;
}
const stats = fs.statSync(p);
const isFile = stats.isFile();
const isDir = stats.isDirectory();
if (isFile) {
return p;
}
if (isDir) {
const ext = extensions.find((t) => {
const np = path.resolve(p, `./index.${t}`);
let isNpExisted = true;
try {
fs.accessSync(np, fs.constants.F_OK);
} catch (e) {
isNpExisted = false;
}
return isNpExisted;
});
if (ext) {
return path.resolve(p, `./index.${ext}`);
}
return readFromPackage(p);
}
return p;
};
/**
* alias plugin
* @description
* config example:
* ```
* {
* '@lib': '/some/absolute/path'
* }
* ```
* then `import { something } from '@lib/xxx'` will be transformed to
* `import { something } from '/some/absolute/path/xxx'`
* @param {object} config
*/
const aliasPlugin = (config) => {
const alias = config && Object.keys(config);
return {
name: 'path-alias',
setup(build) {
if (!alias || !alias.length) {
return;
}
const { logLevel } = build.initialOptions;
const outputLogs = logLevel === 'debug' || logLevel === 'verbose';
const main = (k, args) => {
const targetPath = config[k].replace(/\/$/, '');
const patchedPath = patchExtension(
args.path
.replace(new RegExp(`^.*${k}\\/`), targetPath + '/')
.replace(new RegExp(`^.*${k}$`), targetPath)
);
outputLogs && console.log(
`${new Date().toLocaleTimeString()} [plugin-path-alias] `,
args.path,
'=>',
patchedPath
);
return {
path: patchedPath
};
};
alias.forEach((k) => {
build.onResolve({ filter: new RegExp(`^.*${k}$`) }, (args) => {
return main(k, args);
});
build.onResolve({ filter: new RegExp(`^.*${k}\\/.*$`) }, (args) => {
return main(k, args);
});
});
}
};
};
module.exports = aliasPlugin;