This repository was archived by the owner on Aug 4, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 111
Expand file tree
/
Copy pathresolve-id.js
More file actions
86 lines (69 loc) · 2.31 KB
/
resolve-id.js
File metadata and controls
86 lines (69 loc) · 2.31 KB
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
import { statSync } from 'fs';
import { dirname, resolve, sep } from 'path';
import defaultResolver from './default-resolver';
import { EXTERNAL_PREFIX, PROXY_PREFIX } from './helpers';
import { first } from './utils';
function getCandidatesForExtension(resolved, extension) {
return [resolved + extension, resolved + `${sep}index${extension}`];
}
function getCandidates(resolved, extensions) {
return extensions.reduce(
(paths, extension) => paths.concat(getCandidatesForExtension(resolved, extension)),
[resolved]
);
}
export function getResolveId(extensions) {
let resolveUsingOtherResolvers;
function resolveId(importee, importer) {
const isProxyModule = importee.startsWith(PROXY_PREFIX);
if (isProxyModule) {
importee = importee.slice(PROXY_PREFIX.length);
} else if (importee.startsWith('\0')) {
return importee;
}
if (importer && importer.startsWith(PROXY_PREFIX)) {
importer = importer.slice(PROXY_PREFIX.length);
}
return resolveUsingOtherResolvers.call(this, importee, importer).then(resolved => {
if (resolved) return isProxyModule ? PROXY_PREFIX + resolved : resolved;
resolved = defaultResolver(importee, importer);
if (isProxyModule) {
if (resolved) return PROXY_PREFIX + resolved;
return EXTERNAL_PREFIX + importee; // external
}
return resolved;
});
}
resolveId.setRollupOptions = function(options) {
const resolvers = (options.plugins || [])
.map(plugin => {
if (plugin.resolveId === resolveId) {
// substitute CommonJS resolution logic
return (importee, importer) => {
if (importee[0] !== '.' || !importer) return; // not our problem
const resolved = resolve(dirname(importer), importee);
const candidates = getCandidates(resolved, extensions);
for (let i = 0; i < candidates.length; i += 1) {
try {
const stats = statSync(candidates[i]);
if (stats.isFile()) return candidates[i];
} catch (err) {
/* noop */
}
}
};
}
return plugin.resolveId;
})
.filter(Boolean);
const isExternal = id =>
options.external
? Array.isArray(options.external)
? options.external.includes(id)
: options.external(id)
: false;
resolvers.unshift(id => (isExternal(id) ? false : null));
resolveUsingOtherResolvers = first(resolvers);
};
return resolveId;
}