-
Notifications
You must be signed in to change notification settings - Fork 2.7k
/
cache.js
127 lines (105 loc) · 4.09 KB
/
cache.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
126
127
/* @flow */
import type {Reporter} from '../../reporters/index.js';
import type Config from '../../config.js';
import buildSubCommands from './_build-sub-commands.js';
import * as fs from '../../util/fs.js';
import {METADATA_FILENAME} from '../../constants';
const path = require('path');
const micromatch = require('micromatch');
export function hasWrapper(flags: Object, args: Array<string>): boolean {
return args[0] !== 'dir';
}
async function list(config: Config, reporter: Reporter, flags: Object, args: Array<string>): Promise<void> {
async function readCacheMetadata(parentDir = config.cacheFolder): Promise<Array<Array<string>>> {
const folders = await fs.readdir(parentDir);
const packagesMetadata = [];
for (const folder of folders) {
if (folder[0] === '.') {
continue;
}
const loc = path.join(parentDir, folder);
// Check if this is a scoped package
if (folder.indexOf('@') > -1) {
// If so, recurrently read scoped packages metadata
packagesMetadata.push(...(await readCacheMetadata(loc)));
} else {
const {registry, package: manifest, remote} = await config.readPackageMetadata(loc);
if (flags.pattern && !micromatch.contains(manifest.name, flags.pattern)) {
continue;
}
packagesMetadata.push([manifest.name, manifest.version, registry, (remote && remote.resolved) || '']);
}
}
return packagesMetadata;
}
const body = await readCacheMetadata();
reporter.table(['Name', 'Version', 'Registry', 'Resolved'], body);
}
const {run, setFlags: _setFlags, examples} = buildSubCommands('cache', {
async ls(config: Config, reporter: Reporter, flags: Object, args: Array<string>): Promise<void> {
reporter.warn(`\`yarn cache ls\` is deprecated. Please use \`yarn cache list\`.`);
await list(config, reporter, flags, args);
},
list,
dir(config: Config, reporter: Reporter) {
reporter.log(config.cacheFolder, {force: true});
},
async clean(config: Config, reporter: Reporter, flags: Object, args: Array<string>): Promise<void> {
async function getPackageCachefolders(
packageName,
parentDir = config.cacheFolder,
metadataFile = METADATA_FILENAME,
): Promise<Array<string>> {
const folders = await fs.readdir(parentDir);
const packageFolders = [];
for (const folder of folders) {
if (folder[0] === '.') {
continue;
}
const loc = path.join(config.cacheFolder, parentDir.replace(config.cacheFolder, ''), folder);
// Check if this is a scoped package
if (!await fs.exists(path.join(loc, metadataFile))) {
// If so, recurrently read scoped packages metadata
packageFolders.push(...(await getPackageCachefolders(packageName, loc)));
} else {
const {package: manifest} = await config.readPackageMetadata(loc);
if (packageName === manifest.name) {
packageFolders.push(loc);
}
}
}
return packageFolders;
}
if (config.cacheFolder) {
const activity = reporter.activity();
if (args.length > 0) {
for (const arg of args) {
// Clear named package from cache
const folders = await getPackageCachefolders(arg);
if (folders.length === 0) {
activity.end();
reporter.warn(reporter.lang('couldntClearPackageFromCache', arg));
continue;
}
for (const folder of folders) {
await fs.unlink(folder);
}
activity.end();
reporter.success(reporter.lang('clearedPackageFromCache', arg));
}
} else {
// Clear all cache
await fs.unlink(config._cacheRootFolder);
await fs.mkdirp(config.cacheFolder);
activity.end();
reporter.success(reporter.lang('clearedCache'));
}
}
},
});
export {run, examples};
export function setFlags(commander: Object) {
_setFlags(commander);
commander.description('Yarn cache list will print out every cached package.');
commander.option('--pattern [pattern]', 'filter cached packages by pattern');
}