]>
Commit | Line | Data |
---|---|---|
ca87d95b C |
1 | // Thanks: https://github.com/dwyl/decache |
2 | // We reuse this file to also uncache plugin base path | |
3 | ||
4 | import { extname } from 'path' | |
5 | ||
07880c36 | 6 | function decachePlugin (libraryPath: string) { |
ca87d95b C |
7 | const moduleName = find(libraryPath) |
8 | ||
9 | if (!moduleName) return | |
10 | ||
11 | searchCache(moduleName, function (mod) { | |
12 | delete require.cache[mod.id] | |
ca87d95b | 13 | |
07880c36 C |
14 | removeCachedPath(mod.path) |
15 | }) | |
ca87d95b C |
16 | } |
17 | ||
18 | function decacheModule (name: string) { | |
19 | const moduleName = find(name) | |
20 | ||
21 | if (!moduleName) return | |
22 | ||
23 | searchCache(moduleName, function (mod) { | |
24 | delete require.cache[mod.id] | |
ca87d95b | 25 | |
07880c36 C |
26 | removeCachedPath(mod.path) |
27 | }) | |
ca87d95b C |
28 | } |
29 | ||
30 | // --------------------------------------------------------------------------- | |
31 | ||
32 | export { | |
33 | decacheModule, | |
34 | decachePlugin | |
35 | } | |
36 | ||
37 | // --------------------------------------------------------------------------- | |
38 | ||
39 | function find (moduleName: string) { | |
40 | try { | |
41 | return require.resolve(moduleName) | |
42 | } catch { | |
43 | return '' | |
44 | } | |
45 | } | |
46 | ||
47 | function searchCache (moduleName: string, callback: (current: NodeModule) => void) { | |
48 | const resolvedModule = require.resolve(moduleName) | |
49 | let mod: NodeModule | |
50 | const visited = {} | |
51 | ||
52 | if (resolvedModule && ((mod = require.cache[resolvedModule]) !== undefined)) { | |
53 | // Recursively go over the results | |
54 | (function run (current) { | |
55 | visited[current.id] = true | |
56 | ||
57 | current.children.forEach(function (child) { | |
58 | if (extname(child.filename) !== '.node' && !visited[child.id]) { | |
59 | run(child) | |
60 | } | |
61 | }) | |
62 | ||
63 | // Call the specified callback providing the | |
64 | // found module | |
65 | callback(current) | |
66 | })(mod) | |
67 | } | |
68 | }; | |
69 | ||
70 | function removeCachedPath (pluginPath: string) { | |
eb66ee88 | 71 | const pathCache = (module.constructor as any)._pathCache as { [ id: string ]: string[] } |
ca87d95b C |
72 | |
73 | Object.keys(pathCache).forEach(function (cacheKey) { | |
74 | if (cacheKey.includes(pluginPath)) { | |
75 | delete pathCache[cacheKey] | |
76 | } | |
77 | }) | |
78 | } |